diff --git a/2022/day03/Makefile b/2022/day03/Makefile new file mode 100644 index 0000000..e0add74 --- /dev/null +++ b/2022/day03/Makefile @@ -0,0 +1,111 @@ +# AOC daily Makefile - GNU make only. +# +# Copyright (C) 2021-2022 Bruno Raoult ("br") +# Licensed under the GNU General Public License v3.0 or later. +# Some rights reserved. See COPYING. +# +# You should have received a copy of the GNU General Public License along with this +# program. If not, see . +# +# SPDX-License-Identifier: GPL-3.0-or-later +# + +INPUT := input/input.txt +SHELL := /bin/bash + +CC := gcc +BEAR := bear +CCLSFILE:= compile_commands.json + +LIB := aoc_$(shell uname -m) +INCDIR := ../include +LIBDIR := ../lib +LDFLAGS := -L$(LIBDIR) +#LDLIB := -l$(LIB) -lm +LDLIB := -l$(LIB) + +export LD_LIBRARY_PATH = $(LIBDIR) + +CFLAGS += -std=gnu11 +CFLAGS += -O2 +CFLAGS += -g +# for gprof +# CFLAGS += -pg +CFLAGS += -Wall +CFLAGS += -Wextra +CFLAGS += -march=native +# Next one may be useful for valgrind (some invalid instructions) +# CFLAGS += -mno-tbm +CFLAGS += -Wmissing-declarations +CFLAGS += -Wno-unused-result + +CFLAGS += -DDEBUG_DEBUG # activate general debug (debug.c) +CFLAGS += -DDEBUG_POOL # memory pools management + +VALGRIND := valgrind +VALGRINDFLAGS := --leak-check=full --show-leak-kinds=all --track-origins=yes \ + --sigill-diagnostics=yes --quiet --show-error-list=yes + + +TIME := \time -f "\ttime: %E real, %U user, %S sys\n\tcontext-switch:\t%c+%w, page-faults: %F+%R\n" +export PATH := .:$(PATH) + +.PHONY: clean all compile assembly memcheck memcheck1 memcheck2 part1 part2 ccls bear org + +all: README.org ccls part1 part2 + +memcheck: memcheck1 memcheck2 + +memcheck1: aoc-c + @$(VALGRIND) $(VALGRINDFLAGS) aoc-c -p 1 < $(INPUT) + +memcheck2: aoc-c + @$(VALGRIND) $(VALGRINDFLAGS) aoc-c -p 2 < $(INPUT) + @#@valgrind -s --track-origins=yes aoc-c -p 2 < $(INPUT) + +compile: aoc-c + +cpp: aoc-c.i + +assembly: aoc-c.s + +part1: aoc-c + @$(TIME) aoc.bash -p 1 < $(INPUT) 2>&1 + @$(TIME) aoc-c -p 1 < $(INPUT) + +part2: aoc-c + @$(TIME) aoc.bash -p 2 < $(INPUT) 2>&1 + @$(TIME) aoc-c -p 2 < $(INPUT) + +ccls: $(CCLSFILE) + +clean: + @rm -f aoc-c core* vgcore* gmon.out aoc-c.s aoc-c.i README.html compile_commands.json + +aoc-c: aoc-c.c common.c + @echo compiling $< + $(CC) $(CFLAGS) $(LDFLAGS) -I $(INCDIR) $^ $(LDLIB) -o $@ + +# generate pre-processed file (.i) and assembler (.s) +%.i: %.c + @echo generating $@ + @$(CC) -E $(CFLAGS) -I $(INCDIR) $< -o $@ + +%.s: %.c + @echo generating $@ + @$(CC) -S -fverbose-asm $(CFLAGS) -I $(INCDIR) $< -o $@ + +# generate README.org from README.html (must cleanup !) +org: README.org + +%.org: %.html + @echo generating $@. Cleanup before commit ! + @pandoc $< -o $@ + +# generate compile_commands.json +$(CCLSFILE): aoc-c.c Makefile + $(BEAR) -- make clean compile + +bear: clean + @touch .ccls-root + @$(BEAR) -- make compile diff --git a/2022/day03/README.org b/2022/day03/README.org new file mode 100644 index 0000000..0b50ed0 --- /dev/null +++ b/2022/day03/README.org @@ -0,0 +1,121 @@ +** --- Day 3: Rucksack Reorganization --- +One Elf has the important job of loading all of the +[[https://en.wikipedia.org/wiki/Rucksack][rucksacks]] with supplies for +the jungle journey. Unfortunately, that Elf didn't quite follow the +packing instructions, and so a few items now need to be rearranged. + +Each rucksack has two large /compartments/. All items of a given type +are meant to go into exactly one of the two compartments. The Elf that +did the packing failed to follow this rule for exactly one item type per +rucksack. + +The Elves have made a list of all of the items currently in each +rucksack (your puzzle input), but they need your help finding the +errors. Every item type is identified by a single lowercase or uppercase +letter (that is, =a= and =A= refer to different types of items). + +The list of items for each rucksack is given as characters all on a +single line. A given rucksack always has the same number of items in +each of its two compartments, so the first half of the characters +represent items in the first compartment, while the second half of the +characters represent items in the second compartment. + +For example, suppose you have the following list of contents from six +rucksacks: + +#+begin_example +vJrwpWtwJgWrhcsFMMfFFhFp +jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL +PmmdzqPrVvPwwTWBwg +wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn +ttgJtRGJQctTZtZT +CrZsJsPPZsGzwwsLwLmpwMDw +#+end_example + +- The first rucksack contains the items =vJrwpWtwJgWrhcsFMMfFFhFp=, + which means its first compartment contains the items =vJrwpWtwJgWr=, + while the second compartment contains the items =hcsFMMfFFhFp=. The + only item type that appears in both compartments is lowercase =p=. +- The second rucksack's compartments contain =jqHRNqRjqzjGDLGL= and + =rsFMfFZSrLrFZsSL=. The only item type that appears in both + compartments is uppercase =L=. +- The third rucksack's compartments contain =PmmdzqPrV= and =vPwwTWBwg=; + the only common item type is uppercase =P=. +- The fourth rucksack's compartments only share item type =v=. +- The fifth rucksack's compartments only share item type =t=. +- The sixth rucksack's compartments only share item type =s=. + +To help prioritize item rearrangement, every item type can be converted +to a /priority/: + +- Lowercase item types =a= through =z= have priorities 1 through 26. +- Uppercase item types =A= through =Z= have priorities 27 through 52. + +In the above example, the priority of the item type that appears in both +compartments of each rucksack is 16 (=p=), 38 (=L=), 42 (=P=), 22 (=v=), +20 (=t=), and 19 (=s=); the sum of these is =157=. + +Find the item type that appears in both compartments of each rucksack. +/What is the sum of the priorities of those item types?/ + +Your puzzle answer was =7878=. + +The first half of this puzzle is complete! It provides one gold star: * + +** --- Part Two --- +As you finish identifying the misplaced items, the Elves come to you +with another issue. + +For safety, the Elves are divided into groups of three. Every Elf +carries a badge that identifies their group. For efficiency, within each +group of three Elves, the badge is the /only item type carried by all +three Elves/. That is, if a group's badge is item type =B=, then all +three Elves will have item type =B= somewhere in their rucksack, and at +most two of the Elves will be carrying any other item type. + +The problem is that someone forgot to put this year's updated +authenticity sticker on the badges. All of the badges need to be pulled +out of the rucksacks so the new authenticity stickers can be attached. + +Additionally, nobody wrote down which item type corresponds to each +group's badges. The only way to tell which item type is the right one is +by finding the one item type that is /common between all three Elves/ in +each group. + +Every set of three lines in your list corresponds to a single group, but +each group can have a different badge item type. So, in the above +example, the first group's rucksacks are the first three lines: + +#+begin_example +vJrwpWtwJgWrhcsFMMfFFhFp +jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL +PmmdzqPrVvPwwTWBwg +#+end_example + +And the second group's rucksacks are the next three lines: + +#+begin_example +wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn +ttgJtRGJQctTZtZT +CrZsJsPPZsGzwwsLwLmpwMDw +#+end_example + +In the first group, the only item type that appears in all three +rucksacks is lowercase =r=; this must be their badges. In the second +group, their badge item type must be =Z=. + +Priorities for these items must still be found to organize the sticker +attachment efforts: here, they are 18 (=r=) for the first group and 52 +(=Z=) for the second group. The sum of these is =70=. + +Find the item type that corresponds to the badges of each three-Elf +group. /What is the sum of the priorities of those item types?/ + +Answer: + +Although it hasn't changed, you can still [[file:3/input][get your +puzzle input]]. + +You can also [Shareon +[[https://twitter.com/intent/tweet?text=I%27ve+completed+Part+One+of+%22Rucksack+Reorganization%22+%2D+Day+3+%2D+Advent+of+Code+2022&url=https%3A%2F%2Fadventofcode%2Ecom%2F2022%2Fday%2F3&related=ericwastl&hashtags=AdventOfCode][Twitter]] +[[javascript:void(0);][Mastodon]]] this puzzle. diff --git a/2022/day03/aoc.bash b/2022/day03/aoc.bash new file mode 100755 index 0000000..0fdf1f1 --- /dev/null +++ b/2022/day03/aoc.bash @@ -0,0 +1,70 @@ +#!/usr/bin/env bash +# +# aoc.bash: Advent of Code 2022, day 2 +# +# Copyright (C) 2022 Bruno Raoult ("br") +# Licensed under the GNU General Public License v3.0 or later. +# Some rights reserved. See COPYING. +# +# You should have received a copy of the GNU General Public License along with this +# program. If not, see . +# +# SPDX-License-Identifier: GPL-3.0-or-later + +. common.bash + +export LANG=C +declare -a tot=(1 2) + +# get priority value for an item +# $1: character +prio() { + local -n _val="$1" + local _char="$2" + + printf -v _val "%d" "'$_char" + if [[ $_char > "Z" ]]; then # a-z + ((_val += (1 - 97) )) + else # A-Z + ((_val += (27 - 65) )) + fi +} + +parse() { + local input half1 half2 result="" + local -i len half i j=1 prio part1=0 line=1 + + while read -r input; do + (( len = ${#input}, half = len/2 )) + half1="${input:0:half}" + half2="${input:half}" + result="" + + #printf "[%d] l=%d h=%d [%s / %s]\n" "$line" "$len" "$half" "$half1" "$half2" + + #c="${half1//[^${half2}]}" + #prio prio "${c:0:1}" + #(( part1 += prio )) + + for ((i = 0; i < half; ++i)); do + c=${half1:$i:1} + if [[ $result != *$c* && $half2 == *$c* ]]; then + echo "found $c" + result=$result$c + prio prio "${c:0:1}" + (( part1 += prio )) + #printf "%d prio(%c)=%d tot=%d\n" "$line" "$c" "$prio" "$part1" + fi + done + ((j++, line++)) + echo + done + echo "result=$part1" +} + +solve() { + res="${tot[$1]}" +} + +main "$@" +exit 0 diff --git a/2022/day03/common.bash b/2022/day03/common.bash new file mode 100755 index 0000000..c220552 --- /dev/null +++ b/2022/day03/common.bash @@ -0,0 +1,67 @@ +#!/usr/bin/env bash +# +# common.bash: Advent of Code 2022, common bash functions +# +# Copyright (C) 2022 Bruno Raoult ("br") +# Licensed under the GNU General Public License v3.0 or later. +# Some rights reserved. See COPYING. +# +# You should have received a copy of the GNU General Public License along with this +# program. If not, see . +# +# SPDX-License-Identifier: GPL-3.0-or-later + +# shellcheck disable=2034 +export cmdname=${0##*/} +export debug=0 +export res + +shopt -s extglob +set -o noglob + +usage() { + printf "usage: %s [-d DEBUG] [-p PART]\n" "$cmdname" + exit 1 +} + +checkargs() { + local part=1 + while getopts p:d: todo; do + case "$todo" in + d) + if [[ "$OPTARG" =~ ^[[:digit:]+]$ ]]; then + debug="$OPTARG" + else + printf "%s: illegal [%s] debug level.\n" "$CMD" "$OPTARG" + exit 1 + fi + ;; + p) + if [[ "$OPTARG" =~ ^[12]$ ]]; then + part="$OPTARG" + else + printf "%s: illegal [%s] part.\n" "$CMD" "$OPTARG" + exit 1 + fi + ;; + *) + usage + ;; + esac + done + # Now check remaining argument (backup directory) + shift $((OPTIND - 1)) + + (( $# > 1 )) && usage + return "$part" +} + +main() { + local -i part + + checkargs "$@" + part=$? + parse "$part" + solve "$part" + printf "%s: res=%s\n" "$cmdname" "$res" +} diff --git a/2022/day03/input/example.txt b/2022/day03/input/example.txt new file mode 100644 index 0000000..f17e726 --- /dev/null +++ b/2022/day03/input/example.txt @@ -0,0 +1,6 @@ +vJrwpWtwJgWrhcsFMMfFFhFp +jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL +PmmdzqPrVvPwwTWBwg +wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn +ttgJtRGJQctTZtZT +CrZsJsPPZsGzwwsLwLmpwMDw diff --git a/2022/day03/input/input.txt b/2022/day03/input/input.txt new file mode 100644 index 0000000..46aefe5 --- /dev/null +++ b/2022/day03/input/input.txt @@ -0,0 +1,300 @@ +ZNNvFWHqLNPZHHqPTHHnTGBhrrpjvmwfMmpfpjBjwpmw +sbdzQgzgssgbglRtmjlwhjBlfrSrMt +zgsCRzJbsdRVQCDbcgLGWWLnZNGVLLZMNZnq +tvHhRtZGMvMHvfsrBBCTRbwbccRc +qznnlpzzDppWlDpQpCrcrwnBNwTZnBTZrn +PdVZJJqVZdllDPFtMjMgLjGMHvSgMF +csbhhVDDvzlVDcbccGGvfRjDHCjNLRHRCLfmnZfR +dFrStSTTmrrrHVfV +MMgQMMTMVTdgWtwTPwSgWSgGbbppJzlplvhBlPbzhlhbzG +FDJSTtSGhpPFDmFTZDpTFPmCBBrHqsCBhgBlqqrqrlRrHH +dQwMtfdzVwWfwctwnfnQCHllzRrsNzrrgNlCgqsr +fLfQnVjfwQfMdfvfnVvWDvtJPFGDpvZGbZpmbSPP +TzzCrJcDrTDdLDCJDvGNPCFqlZWlvNvWpq +RRHfjsQBFsjgjBQsWqGpNvZQqQlPPQPN +VnHBnRVssnnjsSfBwbMSrrbTwJTcwSDF +HJCgHCCFFFVGJWTlbqDdlqTDDpgl +cZccSmLrfZcrmmzSQftdpDtTHdbQTDMQ +NZZccrrBwZRPNNzmcLSSjJhGhVWCnsFnHBjGChsJ +qwwwJHTHqdFDtZBFPfFBZFzM +gVRcLnnWVgggnnnQgVWWNZtZrBfLBzZzBrMPPrZvPv +GQgQSVRtsVnNRGSCdpmwspmbmDpHmhwd +bhNgNfgwpbLMhCZMGQBmDm +FrcHrSllcqcFFMGLBDQlMDTGlT +FVSddRSJRjLwbjJPJw +wzhhrTwwTrSsdHQjjSHnBjQj +gRDCmVgRgMvtMfVMRBBBhWCHQQHGJHZJQZ +NtgVgttVbMNmvsNlpcrLhLTNPw +MCgjsfnscgjjgnGgJHHqHDgdHbGr +QSSmRFPpRtPFQLQRmPzvBzzzDWqrqWWHJGGNrJJbdtVWHJDV +BdSFdLQzRFlSLmQplffwncfscChhcsMj +GfVmfnmJVnNVFhnhGmbmhpHvqjrzHZBjfvrtBHHZrwBt +ddWQldlMdWMlQsLWTLQgMNwBrvjrZjNrwzZjswHqrv +QQdTRcgTRPDlMQlQPQdhcNNnbJmbGpVnGchFmm +CjjZCCZfvWZRHHhRtwhvPN +mrnqlqMqBlSSLnBTLBwmHPPWhPPHtFRPWzwt +rBVTrrMMSMLQBrndGcddWQbbdZfCZJ +LFtdjHjLjLqHqstLTjFLFqNMnMhhZdDDNMVbWdDDbhnZ +CrBpBGnzrzmczcllrphCZZWJMDWRbbZNMDMR +GwgvzpzvrcmBrnfHjTgqTsgHjF +rMPPZcplCZlZPwtSwhtBwCQQzB +FvDGffLqqmQFwmmhzt +TjJjJfHHVDVnHVgZZlQppcVscP +hVcqHwhgwwwjHjjGWbvrbBGrsWVWGn +CttPRpMmPDTWbWltlLBnGl +pZmDFMmPMfnZwqqwfcqJdHgz +bSJWhWJCbGGWJPStWTgRQwzDjgQQjsDW +nFBBVQVrVBrNFMFZVpBBZFZrDgdTldgsRsslsljsRzTRjzns +rMcZcHcBQPvbbHGP +mSfmwqfmzrfHwFfmrwvPHqPmMFRlMDDZBCVVRCVZVlZpMRRR +TWjdTWhTsssLTGsJNWhTQddjRMDMtNNBSCDBllMMBVtDMVRZ +QhWTQcdhjThsdGbTLGjWHmffnmHwnwHrwqmmfcwS +LmrsMQnnpfmMLllvTvqvFFzvFHNN +WGRFVWdwZWZvCbJzcvJNzw +VjGhDtWGSFRGjVVSFdjjDPBfspPnnMBLPLrrpMMm +qqqCCJjtqtqCtqLZspHWBdSrWWSzzbzHFWBldb +GhwwcwPFVDcNFRRGwwzmlBrBWvllrvSzlrcd +DGGhQNNDhTpZZqqLQFQQ +QfZmgQQZCCMLfNrgprdNvvdrTg +hhttsBmBDcFRBlJshJcRrnjnTvNqpddNNqvndp +JtsGJGtGGJJJHDbctllhZHmMwMQSPVPzHSLMPZmV +DScSjZcNBZqjDDcLLfFtPfCfjfPvfv +pTmRlWhdMwTLGwCf +mRdWCVVglWrCmVHVrVCmdrbSzNcBDBqBZDNHqssscNzqNc +sPMHGFMsrPNCPnNS +ffJzllbzpZBllttBtfglgBTbSCVCmmrNFmmbFNvCFLLb +cpZqpfgZZJtJqJJJfWHWhHdHWHjcdRdFHD +ZZPfppvzMrlNBFcvFB +shJgstJwWLVJwcrFFVFrBVNNqFFB +HwWJdLHWWLcQgssHwwSQSQtQzCnZZMpZCmdzZCzpPzpCPRCj +QCpLRbsCCQQLbQzCBQDQBBfTTffWtTctJVRNVtnfwtWV +GvlqqlGlmMrdsvrhmlcTvwJtwNwTvfJfcWTW +lMhgqGhddjqFFCzBBpbsSQpD +JJwGJwVQQwVSsSMhQMQgHfgfTtrrfVTNgNNfrt +dFDWCDdFppvDFmWWWnJTPllHmHlgrqrgggtH +DzFbWjdRpbdFCjjRbnFbQBGhhQBBJZwMhScwZwJz +HttvHpHmpJWtHmFNvlvdMSVdPMtLVCCMMMfcfL +GjgzhGSGSSdCcRMVjMdc +QshbnghgnGDnqsFrNSJFrsNs +wJpjMwzjzdVbzPPVpbCHnqGnBqnsBrNCwgrC +ftTLLDTQtLTGTGtFrgHrvqgQnrvQsCHH +fTcFFfLSfFFcGFllcFhPJPjWWJSjSWzMWPdS +ZjNdmjVQVZmvNNZNNZHWZmWtsJnwTpJJswpWwGqJhJqGpp +FcRRcDblDMLRcRMLFFMDGsJnqhwpqTTJGwnsfnlp +LRBrcLbbgLFgBbFqDvdHQvCCjNzzzVrZdV +BdbLWrgdvgWvVJgWnDfNhVnqhCCpDpcq +tSQPSTSGPMmlMPtQQPJGtGQRCcnqqfnRhCcChDqnCfRScf +jTssPsjMQMmszPjlTtsJdFBFrJzrbJdHZFHdWH +vCccctvvTTtZcgLGcZTbssbMWnpMpmLWqnNjpfPPfPjMPp +wwBBlRBBwDDVFRhFlRhdRRVWPnnpMpffmmffrpWqVNPm +ddhddRzHlQHFJcGsCztTgbNzST +fJctfpVWcnfRLfrRwP +vmmnvDQDZTNTmGGTqTMTvMqwBdLjBvRzBRrRBRLjjBPzBB +GMnmqSTFFQqttcbcJWgsSt +rHNfmfRsmfRGfDNcRmcmMQlLCGSnQwwPPCSnzQlSCl +bsJTBsVhFsVpqFWFgPCwnQwBZzwQzZLlzn +qggTTqvqgqbbTTFqVqgWqvNmmMMRdffftNfMDMmscR +rFWQFszrwjsjFWvshPTCmLZLSTLwSLlgSP +BQbcqVHNVqVpVpmClJgJJHSmZLJm +qBNNNVdDMGBpDcDWsvdQsFrFnjttfj +qGhmttmzhtMvhbrLdSHbdSHRzb +WCBgQJJpjCQlgdHZrfPRPSRbNg +jBTTDjlnjnJDJTQCVntcwtwMSvqcGFDhcvsh +ZTrnTqMWWWnfrddMGJPgPLlPbw +VvmGRVpBpNNmvNvjVjtpNpCNLLLJHHBdgLPdwsdsbLlwwlwb +GmCVSCRVGmpCRVvttmpDrQZfhnzhzqnDWnrZZTQq +DQBZHHtWHzSvZvDQWchgqsqqhrrhhcqrcZ +jdMfwlFfFlTfndwpjjwGnNrqhPTmPSPTPPhmgrPSrh +jlGbwGMdlnJpGFGjpnFCSJzzDDtWHCBBQBvtVC +RrbBWBRRWSRsBBVvsPHZDwSjjPdnHwtPtH +fTgfzMmNJpmJgfllgpjVQtDDndVQpdnHVtPp +gGmlNclTGmGFhLVcVrvLqrvc +QcpCTVCZVcCwLcCVvHvvVsCcNzNNSbPRzsDRDSBlsNNzDRtb +fggMfJqgrWFpmjWMggmrfMWNSbRSPBDbNtJRtPJzlStBbN +gdnmpWGnZvdQCvdv +tqqcLqqDDqNtDrqHrrPWlTlTWZTMzTFzQlMPSZ +pfnpmmppmppRGjwbjmnjwspWbQQQTMWZbCTSZCSQlCllZF +gmpVnGmmmpjDvVLBFqqvrH +LqBvJHZvbHGBHrBtGGQTmSVprVzhpVPDPQzQ +CRdRgwCfhTVDzSdQ +fRCcjgSMjfNgMMLGbGZtvBbGHv +HgvtDDzDpvwgvvqdHPZWdMssTTddSs +rJFrGNFVQmNFVmRnWhhsrTbhwhZTrdTd +VQGBBBVNQClpcBvBwD +PWlSzZGmdmGmlGmhggBpvMjvMjFgPJ +TtLRDtQQfTVcQQQRtBsJFFccFjWhJJFMBs +HqVCNtWHCDwdnlGwGqSr +RwdRJgCJRGGmdMbcGbdnTnTtttLLnptMtMtMqZ +DWsWPFrPqVPPLVCB +zQWWsslsQHFhDSszDSFQzJJJmvcgblRgmNvCJmvNgw +tpmFrWTtRpRTtggsSlnQpsnnlSHPsn +bZwZjNNZGLSrVsGndPPV +NvrcjCfbvvLBDBWfWFgRRm +WWFMgWmMhhwDcMMMDcmLWLtQwwsjbsQHvZHbRjZfsZzH +PTCplTCdSJJCpvPGNSvsbsfHtbQZzdHjQtjjsj +vNGJPpqJvJvqghgFgWFmLD +RlRpLTZCjWRjRWwpRsjHjbSbqMqMvvnbnGMnGGqQCq +gddfDNczmgPthNcDdgPVnbbzbnJrJJGSSVJJQS +BmDmcDmcmhffdBHlRwjRLpwlWQ +prQlfzlWRPzgQWzlMPMRppssHHsDsHjwnHHbWDwwbwjL +vFBJJtZNShJvZFtdSqtmqjTDVHVGDHbwVHDVsDnThH +vcjBZZdZqvCfpzRfcgRp +cggpqgRlSpNsgNggbjjj +ZZSSJVLVLFDZWNGjCWWbCjsF +vZLvfZQQfQtJVJDQShLrLfMmnldmwqwTqqMcMTMTndrm +bQBMtBPddtMFbJFhRGzMfzvnRGRSvWnW +TmHTqlVHwVpQqjmwGvSgSpnLpzfWGWSn +TTrDQCDrrTmDCCCVHHQZBdZFPdsNdFBtFDhtFB +fjpQvNZcGhGGTtQS +DVJzvbVmHbbtSTSTRStzTM +VDvmqllmJfjWlnplNs +ZmdHZJjvQLdRjpmLJrqqZBhhtCschPfBPcrDfPffCD +MWWSMMwnwlSgzWFFgSwzVwzqcfDCfChCbbtssbfDChcD +NMqFTwGqMwgwwgjHRdHRjdmQmQTm +TTqWPCWRhTWqPNjPJMNtrlbJFttQwwrBrlbwlc +GfpSDGZvpQffSHDgggDZrHctFmrHncnnwwbBtBrt +SQGfLsSLZsqMTRNMPT +HdBdnBZJTZBBmsfwwBlh +MjCVjzwqWrfzplzW +vVbqCjjRgjwMbnbGHJScScZHLL +dwwwtCdznvDDFrMrrw +GmWLQmgQmHgcdGcsTgTDqDbSfFWfMDMfbSNqvr +QhTLmVQHLmdLTjGGVptRnZpZBZVRpPpP +CzjFpzRHdtBFBCqNqSbJZWcQJTSbQjMTWZ +wGwVLlGrdVGwDnwsgfMSZvJMbWJcWlvbbMSc +rDfsgggrGnGngsPwdVLfDnmDtzzFNCPHtzCtFHpBRqhPztzR +mrgWzBcDtVCcQcCCdscf +LRJhjRjPZvqSRGhGjLgMCdHpMNwQCpMHpHMS +GRvGJRJjqPZbvGGhRjnqLJWtgFgtzTzDrFnTWrlTlllW +cbmcddlffvbTfvFflpZzsMVNznNVlnqnzqHMNM +StWJBQRWLRWNPNMCswRVHC +BJQBhSWhjSthJQGGWWggJDDDfbdbbfHbddbrFrddvFvv +jFqvqvWZWDtBJrrlrq +TzGcbHcrmVzMGNSmTcGDtBthJCNtsJDlBCghgP +bTrnTccnLSrrTHbnwfLjfdvRRwZFdwfR +drHVrdVDfsDbVsdVDbVqRwbZZwCRCCCJlJThwRgT +jFPcFpBSvtNPzSFcjcQpcQjpThZCRltGRRRJhwCwGhwgwhRm +SQSzPBjjPPSvLqqssdnqLZLMsM +bQTWlWlvQclNwwWlCCLStCRSSjStpj +zVZZDdBnBmgzVsjsLthSpshdCL +DfBnrmBmgzHBfDHmnGrNFCwQvTPvqCTwqTFGbF +srSWJnrbmlWlbhzsWszSvPGwvgDhcjdjjfvhjvGv +BRRQFLtNfQNMpqpQHDjdDjDcZZcvwZZHPH +NLCNCtRQfRttRFRCTqMBqQQrzrbzrlJmVVbsSWmVrTbSzJ +RHLfLcSRTFSghLRHGbwZmMZddgJswZsbMm +ptqjtCzzQztqCjDlBGpDpbMZdwmMbZsdwNmdJpbs +tttzCVllDCtDQnQBVHGHWvWTLWcLSLHf +FVlNnPqbGTHftghggJqf +zLcZWZpWWrcrZLLZDWrwMcrhBFBttChBmBgptChhtFftmf +LZZLrDrrDDMrcwrDwsWFzdTlnGQPQQVbdbnsvnvsVQ +BbPNMJNbQvDbvPLwHflczlwwzf +pZjWZGZjFGdgpnVgZhghdmcflrlswzzcstlrLwhtwc +WZSdqFjqSqSWdGFjZpdMTTDNTvLCRRLLqRQMCN +FqgFGtbgTvRwrLqhvw +JCCWJWCdJMQNNsSWsMPQRDDLDSDLwTrrvnwfDvnD +HdPJlBBHCCQdBMWdTtVbgHczGVGjmtzG +PLlZDLZDsFCvbDQv +HVcTmVmJqVzqczfzbjvvCFMRfCsWjMvR +cqHzTqJTTTTzzmnmrctrBlLlvSlgLdZvSwSlpw +SbMMNJjmgMnJdSSbjVFZVSQrlQfWVQVWZh +PtqDqPGcLHzHpqLcRzRsfQFfZlfRfZfRFVsl +cTDLcqGCzDTqzzDLDzqPTtJvbBJMnmvjbdlmJNvmdgNC +tDJDlZVqJGbvHNQbNFFsFPmLns +ppczpzpffGwfBNLGmn +WShzgTTpWzhWztJJGJSvtvvtjq +TbZFTFScnCZFQRTCqQdBjdJqjBqjjQDB +rmmLpLLfzrlmslMBHvdRddNDDJDrqD +MWwLPzmWfpsMmmlMPMWLwRTZTZnnTcVCcZFCwSnZ +SqmClqHssNWCqPTcWcGhBTchVV +ZnnnDflRpBVTTVhPBZ +DpgfvnvMfCsqlMtSll +ZzLMRZpLMwwppZqnQGvQgBSvlNVlBFFNFVrg +HcqhTmhmdDTPFTJgTTFBSgJN +mccPdDDHbssbtwZMqpbzCRGM +TgqnTltgWqLRSRnlqddngFfrvHvrBTfCCFrFVTvVCf +cwNJmPzQwNzczzNsJGhhHfhrfvVHGvtvVVfC +jjtbtDswcmPWlbgRnRdMZL +TmpTBBwvspTptRmsmTGLQDGRHGgVGLSQSMHQ +ZlPWqjWrzjPqdrlzbrbrwfrWLHVMLnHDMVDQnLQfQfVngQLS +zNwbrrFWbFJpmpmvvt +RMQQMwHMMzcFsWsDrWfcpJpS +LLhZmGVLhVlTZfWWfWpCrDsGSp +VLVTnqjjZngtQRFjvzDM +gmRBpjrpRvCfRCrBgvjHShnbnngbgSJnNsHMHS +ZDPTwGWtqwHhSnbcMNJw +DWGGqtVVqldWZzMzWmvjrjprLRFjRVvvff +tCzVzsVtDFzssnSsgdqJdCNqJhmgmpqq +PZccPGvQfRLMQwNdhpwhNh +jLrcbRjPZBrcPdjRHFlWnVtBFslSWznW +vvvbJbWrLvFWHzZzZRhB +chtwTmCNlRRZzRPT +hmcCssCswrMDGMSrsr +LStGBsQLlllhzMzs +dzVZDNWRDdZNDTZTPvWVhhphpMlfMccRmfnlMlRn +VFvgTrNPdFWNNFNFTzTFFSjSQBCqrtQwSBGLLBGwGL +qGJSJhWStdSfWvSvtGRRnzRDDggrgvnzsmRP +lTTLpcljjGlLlLNBpjwFQDQmRnrRDPrPscRrDDng +NCNjFlHNCTVjpwGqGSVbJddqZZJM +MbWdgvHFlMvmzTzShvmm +tqjqpLsNsrrsjstNLpQrGVhVBzrhVcfmchDcTPVVmc +RqwjqjqsGjjGGQNjGpQZpqRFJgmMHwdbFWgnHMFdwmmCFW +HHHLcCcVHjTHglsB +wDSRwzzRpMSdNSPSwSpRbqvgBsdqlgTvBFBjgFvvgB +RpbzPssDMWwNRbRNRPDsDhJthLQVGLJcctQCJQfQJCLm +WsZgbNgZVCCWbVVVmgZbCCRPccGnzPBqJjzWJBJPzvBvGz +SpfThHtrHFBPPzJvPntj +QHDhhrhpTQpHhQHnfwnTCNlbZCCDLNllZlVsNCNl +QtzJFRQLMRnZcZsfcphlPQ +qSBbjmWSCNmVldSqqSqmjCSZshfwfrPPZZfcPVZfhgsgPg +HqBbHqBGSlNBbltnLLHFJMtRvRTD +tcGtDdMcttttHNBlMctldlwjwwqqCLCwDwZjFCZhmnwC +VrJgvWWsPvRgVgrJQvfQfzgVzZwCbLZmnmwCwZqmnhjZbnLj +sJpffsRWWRJVWWpHltSpnMHGcMTl +zNqRbqSbfdcTLLfS +ZVPzPnVvdLwLDPfF +VWnzQCVWZVMzQRHgqgqrHGtGMp +PbHpWfWPvRfbzWPFfRpPDtBwSHMwCBgDwBjDtMMM +hTTdZQlcnTcmqVTdcddrDgBSwsjjBgqBtsCgMD +hlldTmdJJmJdZvzfFfNJFJgRzR +PJWvJBbWsfLQWsLvmCqHCcNLHqHLLcwDqV +dQztrZrdwHhptqDH +ZrMGjgMSrdzQGQRJPvGGbm +RmjljZChlDZBCRRvlmNSLSqMNLzwLvppwQSQ +sTnVnPrVGsGTPddJrfgQgqLgGpMNQtgNtNzg +sbbTfTdcJPnHbsJfHsdcmDDmmqBZlClmjBRDCZ +CJmHLmHFFCFbHsbJsJqvqhQqLDhQZvnQDZnn +wGwppTjdWPdgFpGcScBqNnNqNhQlDqnDlZZW +pGcgGgTpGjFdwpSFVgSdpPjrMCMffzJzRzztRfHCRsVmtbsz +CgBClZfCflPflNZRvfQswwmwmwQsQhgppdhm +qbzDGrjLLNLDHDqtJmmhhmQdhwpQhhbp +NLGqVqjDjjGrMFrvFWPBRBZnCvfFnT +tbrrHsgsVmmmbtgwVsQRqjJMmqMjQfJfLFLD +ZvlBGzdvjGfRFJQJ +dBppnnBBhdzZncBPlznpnNdWHSsbWthbSCgHrVfgSSwVgr +VRvMtRVFHQLvMRQFQtBctrthshTTgCmhTrgWhWZsZZ +lzJlGBSPPhzjgZsTCr +wJlpJPfDSpwBnddqJDdpPpcvMFHFMvNbvnNMFHHRVVbR +CPShbbdlGCdQqlRPGPdlDWDFzjtFjggCDJgWczfF +mrHrTrrBMBsmNsrwsBpnfpggDDcjjDDpjzFJzzjtJz +BvsNvBLHrrrNvwBTNNsNGbdQhlPGGfqhhRGqLGdl +PSSlPtlStGhPNMtwPMPJzDddnbnDNTDDnJqjbz +FFVHRwVLvFvVrVHrZcLmRHggjDmdDnDnznnznzQjzdmJddbn +WrvgRgcRcRrrcRvgcVrHVrwCCSfsCsGsllhMSSSSMttlSCpG +hBPJqVZTqqPSlGlfddfddZvl +JWWMJCpnMrmztzdjnzld +RbWsrwMrpbRspbWgpwhLJPccNVqLLPSVgVPV +hcTrWqcfhwGfWrWMjHjGvDHPmJMDzF +ZtlsnZZtLBSbSssnbndjDJJFHFHJPHPsHMTHHM +ntRZtSbtZgZStTqchwQfRwNpcq +GfLqrsqQGgPgjjQGVcNvTpTpNFcWPvPPpT +bRnRLnMZFdCMcpvT +RnRhzRlmlhhHhhmhRsqLrfzrGVSrGBSGrL +fbMffwdZsncrGcfG +qDBjSSLqhLBSmDbjqNhqTLjCGrCHGrvcGWcpWcrGWnCrpm +STLDqbhTLqNTNSRhlwZlJlRQFFRwMdPQ +TVVGNFggcjPPJzwvQlRRwRvSlcSc +frsBbWhtSRzSLfRf +qDCqddbsWrqzhsdNmdJNJHjTggFFVV +NTWTDrSdFTLtPTGf +lZqjHlVRvRltLtRWFMtFLL +qvjWzzvVbZpjqllggscdchwDrCphwsdhrD