diff --git a/1/README.md b/1/README.md index 60d34d6..7017918 100644 --- a/1/README.md +++ b/1/README.md @@ -1,8 +1,9 @@ -# [Day 1](https://adventofcode.com/2022/day/1) :gift: +# [Day 1](https://adventofcode.com/2022/day/1) +:gift: +Today's language: **awk** + **GNU-coretils** ```shell # Find the Elf carrying the most Calories. How many total Calories is that Elf carrying? awk -f day1-1.awk input.txt # Find the top three Elves carrying the most Calories. How many Calories are those Elves carrying in total? ./day1.2.sh ``` - diff --git a/2/README.md b/2/README.md index 9f05b59..d23594f 100644 --- a/2/README.md +++ b/2/README.md @@ -1,5 +1,6 @@ -# [Day 2](https://adventofcode.com/2022/day/2) :gift::gift: - +# [Day 2](https://adventofcode.com/2022/day/2) +:gift::gift: +Today's language: **C++** ```shell # What would your total score be if everything goes exactly according to your strategy guide? g++ main.cpp -o day2 diff --git a/3/.gitignore b/3/.gitignore new file mode 100644 index 0000000..f530505 --- /dev/null +++ b/3/.gitignore @@ -0,0 +1,2 @@ +day3 +.clangd diff --git a/3/README.md b/3/README.md new file mode 100644 index 0000000..69fc786 --- /dev/null +++ b/3/README.md @@ -0,0 +1,8 @@ +# [Day 3](https://adventofcode.com/2022/day/3) +:gift::gift::gift: +Today's language: **C** +```shell +# Find the item type that appears in both compartments of each rucksack. What is the sum of the priorities of those item types? +gcc main.c -o day3 +./day3 +``` diff --git a/3/main.c b/3/main.c new file mode 100644 index 0000000..a588292 --- /dev/null +++ b/3/main.c @@ -0,0 +1,92 @@ +#include +#include +#include + +#define char_bits long unsigned int + +int convert_char_to_priority(char c) { + if (c >= 'a') { + return (int) c + 1 - 'a'; + } + else { + return (int) c + 27 - 'A'; + } +} + +int find_set_bit(const char_bits* bits) { + for (int bit = 0; bit < 64; bit++) { + if (*bits & (1ul << bit)) { + return bit; + } + } + return -1; +} + +int main() { + FILE* p_file; + p_file = fopen("rucksack_items.txt", "r"); + if (p_file == NULL) { + printf("Could not open file"); + exit(1); + } + int lineCount = 0; + char* p_linebuffer = NULL; + size_t linebufferLength = 0; + ssize_t lineLength = getline(&p_linebuffer, &linebufferLength, p_file); + int priorities = 0; + int groupPriorities = 0; + char_bits bitsLine1, bitsLine2, bitsLine3 = 0; // each bit is one char(item), where a is 1, A is 27 + + while (lineLength > 0) { + char_bits currentBitsHalf1 = 0; + char_bits currentBitsHalf2 = 0; + assert(lineLength % 2 == 1); // even backpacks + null + lineCount++; + int backpackLength = (lineLength - 1) / 2; + + char_bits* lineBits = NULL; + switch(lineCount % 3) { + case 1: lineBits = &bitsLine1; break; + case 2: lineBits = &bitsLine2; break; + case 0: lineBits = &bitsLine3; break; + default: printf("Error in switch-case"); exit(1); + } + // set all the bits for the correct bitsLine + for (int i = 0; i < backpackLength; i++) { // first half + int prioritiy = convert_char_to_priority(p_linebuffer[i]); + currentBitsHalf1 |= (1ul << prioritiy); // set bit of the item + } + for (int i = backpackLength; i < 2*backpackLength; i++) { // second half + int prioritiy = convert_char_to_priority(p_linebuffer[i]); + currentBitsHalf2 |= (1ul << prioritiy); + } + + *lineBits |= currentBitsHalf1 | currentBitsHalf2; + currentBitsHalf1 &= currentBitsHalf2; + int priority = find_set_bit(¤tBitsHalf1); + if (priority < 0) { + printf("Error in line [%06d]: Could not find duplicate character. Backpack length: [%06d], line content: '%s'\n", lineCount, backpackLength, p_linebuffer); + exit(1); + } + priorities += priority; + if (lineCount % 3 == 0) { + bitsLine1 &= bitsLine2 & bitsLine3; + priority = find_set_bit(&bitsLine1); + if (priority < 0) { + printf("Error in group [%06d]: Could not find group badge item type.", lineCount / 3); + exit(1); + } + groupPriorities += priority; + bitsLine1 = 0; bitsLine2 = 0; bitsLine3 = 0; + } + /* printf("line[%06d]: lineSize:[%06zd], priorities:[%06d], groupPriorities:[%06d], content: %s", lineCount, lineLength, priorities, groupPriorities, p_linebuffer); */ + lineLength = getline(&p_linebuffer, &linebufferLength, p_file); + } + free(p_linebuffer); + p_linebuffer = NULL; + fclose(p_file); + + printf("The sum of priorities of the duplicate items is: %06d\n", priorities); + printf("The sum of priorities of the group badges is: %06d\n", groupPriorities); + return 0; +} diff --git a/3/rucksack_items.txt b/3/rucksack_items.txt new file mode 100644 index 0000000..37c2369 --- /dev/null +++ b/3/rucksack_items.txt @@ -0,0 +1,300 @@ +BccTFfTPTsffdDDqsq +lGGLQwFhDgWdqvhW +wbLNjGjlwLFrpSbllrHnHHRmmJVBmZJRRVcBTc +vvGLllBBLtllJnJFMZNjFcNG +bdhrhTgmhRrpLJMMNJgNffnf +qhRmTpzpzVzmTTbmVhWWWpVvDtsLVlwBVHvSsDCvvBDl +sLlhhthVRndBZzwBdV +PfmsPsqsGFqrSQpqBDDwpddDDM +mFjvSFrjPSvLJWvbRssN +gWnWQtMMDQbQvMDjjcwsvqcwsSSqZq +HzPJTtmtZJJsqfBJ +hCFPrNNPVNzFtQhdQMWRhhDd +sNhmsQZdNdsztNpHGCdjcBcwCvGvCv +brSlRfFFppHwfTpf +MbRlRpqMnqRpMhVtsQQQVWsM +HsdttdfHrHrwdhftMHMSDnJFwlQSgQZQZggZSW +LjCTqBCmmmTqgFQQFQjlnnDJ +GCTLBCmTBDBDPTTzqLCBpVcctcHbtbrcMMsdsdtcPtdb +QnJLdNLfLRQjpLlPflfQnlnswRvwsHVWVHWVVDZwWHcrwV +zFbgtqCBhtgBhsDZVDNHwvDv +zgCGCFCFGtMpJjlGTnlnLN +ZFhJZbvZVmFpFnJbnZFbLnbHPrjjQdBdCrMPQMQHrrrrVC +gTzlqmNlTflmtTRHdDPqMjHDMrjdQd +wcRSwglcNSwgWmNzwNlJZLpphbbnFhvLWhnphb +lRRrcbRfQmwwBLSLlvjjSvvFtS +WbghzhHWbsdHhVtGLVSSvLFJtSGC +WWbWzPHDqPfBqRZrmqnZ +frgLHMcHLrSZHPHcHrPNmMJtTCTCbJfhdwVbfJwwTbdd +DpDWRjQvqjDGFWhdVwQCnJgTnTbT +vvqggRsRpcssPrcsrN +MccbcZjmbbNSbjllbRqrhstVTMtqRtssTW +qJdwCLdCzQQzwHLQLTtsTtsTRVTVWWTJst +GdnpFHzwQCdpvpbccPbSbq +CbQhZpTbTgMMgptzrdGtGzlVNlrh +FWvmmRHSmjqnSjqnSjPqjnmNLGVGJlGWLlLrLWlVrGzNGW +FwvvBjmBnqmVvFnvnVPMDspDQTfZMCMTgDQTCB +VmrsHllHVLTdZtRclL +bjwMNQGCjGjjPwpRQnRLTtRQFvcdvt +MbWgjMDpNLMjNpwGpjbPWgfsHsqsHSrrHHJsgBSBzB +HFlwVhfLBZZLTLFHwqWCqWwQpWwSpqWC +PttsNjdtPtcmcDTnDdtjjDMpCCCCmSmqqGqmvMvbCqpC +jndRrTtPdgNPPnLrVhVLHhVJHffV +NJZVqHNNNJNqCdqZZVjtzCDMtzrtrFhhMFsPCS +TbwgwWRdQgfggQgvMPDSPszhSbSDszFs +QpRmWglwTQgGWTvGRvQRdwnjNNqqqBqVlcqVVNncVVHV +gqBFHLFDNCBClHgbLFbllLggVSTWJVWWpjvJpSSWJjBjZvjW +mczdshQcsGftdmcwcfhdzQVrhJZJTZhTVTDjpWpZvvWT +twGdRtcGnRgDqFRC +fsPjCjgRpwjPpsGgQwPfSZcdSZdWVHzSzcdzHRWz +MBLTTBMvbMmvJTLvTDvczNdZNHdHcJNzNqSZVG +rTlDlbBbrsjCCGnG +FsmBPtzHdmmvcvdWpcWCvM +RMJGjGGJJGLDRNJJnfGRRSvplTDccrTwSWClvCrwww +nnRqNGJLVLRRZNNZzBHMHVFVmzBFbhmb +MmTSpBMBCCMsbbrVvwwSLb +RffNRFRThtqHhHHqZNrLVvwQtsGvssdvvsGb +DThHghZfgqhFWRNHhhRWqMCnMzzznlPnBlgzMpnPCz +GhlMNMdpMZHHhhRLLjqSjjqvvmSh +PcTJDBDcBnBbTFcDwnPTQSLqLrqvWjwWLqRSvsRmWm +PDcDJbQTFBCBcncgQPcDgnHgVmppHVMddmZglzVHdMmt +BqFJqJGpBVnJqnjjmwvrNwVPHPrd +ZMbQmhWstZScWjdswwwHNdzHvj +ZZtQCtgZQWSbMMhmMSWQfGfGDBpRJnJqTFFJBgTR +tVcPGGqwgJPqtJtqZZwcZffsfrcNWBnSWWFrfhWBnz +dRMCMQLvNssBWFFR +pvjjQvmDMpHLdPPtgPPTssTHsq +WDBlFBbGdmBrqWjhWcqZCq +RPSRPtncngwgwzhCwghC +cssVsPpVncQMRsVQpRPnRcfJfTTmTdDBLbFlDblTDDDLJf +CZgCCzgzsCDZDzbbBclgvcjcnnjFBqgv +VLGThLWhWdThlWRHVTLTTjNjjdjrnBNBcrNcqmqqcc +VTRWLhpLWHRMPGRGRplVhSfttJpZzwstsbDtwbJzZt +fqhZRLhwZwVSLbCMCJdJCHQGZWdW +ztvpjtpcvgzppPvjvPlDQLnMlHDGWnQDLQWDdJ +PpsPzjPzgLrjzBgLggzrmrVSrTSfSqFVFmVhffFm +qMFDRLNRRJJphbhSgStpptbj +rZrPZZNCCCGrlfsCzBbgstBwtvbtvbvBth +CfVrdndzZGrfzrzdrGddPnNCFMRDJWRDDnRWDFqFDJJFTJJT +dMDbndBMQWnnbDstnMbMQQwspFgsFFjRrqCCFrrprqrgjc +SlLzZmHZSTVGSPVmSPlSmrpFvFjjpgrpgFcvrcFcWG +PHZZTmNVHSWJlHPNLSzPLLHwDBJtbDbnnnMffDbwtnMndQ +tHBzNCztLBRBtrjvSjfnjvvzfpjj +gQwWqlnqWqJgJnDplfflddjdsfdpFf +gcwwmnDccTPWWgJbZNNbZHZCRRTrLB +ZhjgtrJNfDNpqbhqQmqpmb +cFLcwGGHwcGdwFCQjnnnVcmqmjCp +HvvlzjWHjFWTggWStDrDZT +GPjjQtPQbjwWqrmnsjmnqn +SNGdfLLGdlldZSSRWznFsNqFRnqsWs +DdMpMfZMhfZMpDfbDQQbGQVgccgcVt +hHGGGTlddWGgpRdcvwDCDwzgLJzCwzwgwL +MFSbZSnnFJWwQBNMzw +tSjrSFSfqjqqttPnssqjssbhGmWGhcmvldcmhHRhGRhTRf +qdBjBTNndbnqnLmtZmZvvtLvHd +hDJCpfnGhJfDPzGzzCnGPmpZZVLZvHttZHQLHgZLHt +JDrfCDJhGMhFhPzMrCCnrGSwswswFsblTqRlRwjcjRsqBT +tJPRSZCSJJCnmvvvQMrpqLVwqLqMcCCM +hhGGGfsdfTGlfggjMLVVFsMVwMMbqbLF +hdTGGhGhdhfhhwlgNfdhZnZtHHRNtZHnnZmHHzmn +HlgRZglZDWZgfVbdznHddTvV +MhShhQMSFShFPPQplMPmwppwbzdtVbFtfvfbzVbvbTntzbVT +lMwpmJLLLNGwBrcZCjrGCGrD +qjjWRLjNjtGRRWTCghNwsgwcbwmC +HPMBpVGMPMvvVBPswmhTbCwgmsVThT +vDSMSvflBlHpvMMfSSpMFWZdtZWdGWGddqfFtRqQ +ZmnGQfnZgdmRGQGvgnnmHCbbchhpMLrpcbLpdLpzbz +NBFPBWFsSVNJlFqLDLwcwrPLzzCwhp +qlWJqqWFJJjNqJWsFVsVqqRCggtmvvjQZgQnZQmvmHRt +RdCsJbdsVJtRvdzBzrBcjzMTqT +wNSNnnHhnwhHfBHqHjBDJMJr +GnSPLwlFwwLWSwpNWLSNpVZtvPsVJsmRCmtgsvsRsv +GPMwMMPCBPwBGsCGGWqBsslQhVQFccphvhWpmcFhVLmV +rbNnHLLHfHfZFfQQQZml +DzSDNtrztbgCMMBLLCsBts +rTtrVbrrhbbGGhbbbbRqccdBcdBcvRvBSRRV +fDqQDqLFQgQgZFMlFNRgvCNvRRvHvRBHHR +mfPqmFsqqsbJJtGtbt +vNHvgsSGSFDHvspvtSGwJwJNJrllhwhcnwJlwm +dqWdWfQdqQVWwnfMnlcfwzMs +VqQQqBRTqsBQWLppZLpFSHZbvvDt +gdcldHQlQndnHMzCjvCFrzjSFtbLtv +NJGmZZJZGTDsWWJNmDVmsCrSvfPrvTtSPbFFCFFvCT +BDDsmJZVBJwBRsGGDmZNBGqMdnghhcwgbngpqqMgnpgc +VhhvVwmvmwTPCwPwmDRgDCsgWSnfRMSWSM +ptHZZtlZzqbZttHbzrFqnDSMShMgSRRMngDWgrGh +hBttqBhBzlFhtHvTJQJTcvBQJPPv +FjfzfGjsjBfQfMLBNg +VlrppVwrpVSdScwTjVnCCQLQNCMBhWgV +jvtSrSjjtSZpqtHPDPJqRzGR +ZSmbSDswfCDDHBFFvWHJ +jcjcVjltntQMltnVrdNnNjdQgFzWHqzBWGWQvzHwgqqJGz +nccLllwwhLCCSLTmmRTP +HBSnnJSfHvBfNWMNrvnMrZlblFbsbHwsPFVHTsHFls +VLmDLhRgRbZFRwjZ +zQDmCLLDDLGttGGgtLvvVSfqJBSVftSnrJnN +CgGhbgVMNgVVbjrrtcfTDTfvTscrTvSSss +qqFzFBzsPZHmddmsmvWSnHJnncDfWnDJvv +ZwdPqdqpdPlPwdRlsdBqBMjNQjGVgbQgQhGVCCtgbR +CGFTTMLGPgmPfGfCwTPSSFNQDLNQnscQNccWdQLqvqds +pbJlzhZRHtjrbrbjHHrplRWVNsNvddZNWDQVVcnQVscs +pzJtlJlBhJJHJjHhfPfTTFMDmMPBMSgm +gzCBPDDzgvLvgPLgNThPlVZccJTmrZNV +sndSnpsdMSnRMRpjShhNJZJhJjrVcTljTZ +SRRsdnGwRSpptnfMSSpdQtfdWqvbwFgbDJJzCzqqWqWbLWWz +BDnsPDlmmwcnCLLLwPtFTtTtFRqjRrrSVFqn +dfhhzMGzWJhpMWhHWggTHJVFVSSqbqqjdRRtvqqvFrtF +JMGfHffhQhQTNcTTBLCQmm +bfZBvvRRRzFfFFLRvFzZCcQlScchLlGNhSQGGVQh +mwJqTbsHmjbTNcNhQGGJGcVS +mPTgtsnPjwHHmmmbbRDgfpdgBpzvZD +lSnRStHtTZdjrHjnqJglbqgchhDCPCPc +swFBzvBNLpBBsvszvDJhCzgDDCgbbJQzDq +VswvBFmvpSrShmRRMn +vWBBSrWnZfCWVchwhbcjVN +RdHQQpRPJZLTtJgNcNGgbhGh +zpzDzTdqQRqRzzlRDsBBnBfMmCCSZDBS +ZtGSZVpPDtVbQjbwBDzbbL +WcFvTFnTMnnMcnhmQhmhBbBQzCQjVb +RRWsgvgnfqgpGVNg +WJTrJJCzLqCqBTWLsCCqzmPPQrjwHQQGpwGHHmRPVw +bMvnDFnFSbSlGgnpmGQVpRjV +DZSdFZdQZZclsscWqWLhcBhs +PzLlRRNjjRQzvPNQsvddlZfchhWWZJHSlhChDhHhcc +MMfngVwtpVMqVrwrMBgmtGqCHDWqJSDJWhHHSSSJJHHD +tBgnMTMMrgVmrBwMmGfnNjjsdLbbbTQvjNTNsQLz +ZZBZRmPmgpgZGLWLQWslSWmLQL +DnHJJjzqrJffrDnHzJjnMbQWSltttSbStvFQSstSvCLF +MzJDnfzHwHlljJJnqrMjfPGdBRpRBGBRhwVdGGRTBG +CnZCpMFNnFvvNdpHVrWghgtFVFlLRWhh +cBsSBsGcjGcJZDrggtgtVDVrgWmh +wTBJbcbzffJbZccjSbSjBfccNCNMPqqPPdvnHvTvnMTNdnvQ +vMgPmvQmWDMpGpjBbMMH +CcVJNcdNgdhtCVpjBBRppfRTGbph +sFsgNlcdFlJFFwFstNJcvzDWZqqWvqLqzLzmzDwQ +LLVLVsPPVVPCLLrjCNNNgmRdJNdCdfMJpB +DTZZHTWbwwpWbSWDBmJMSFFNmgRRBggf +ZvzDWqDnDwnZTpzZTzWvphPtqhQsltVtPhPhsQrPch +zDgWmDgrpCLmwgWTrjlJBQRJjbFGrcbQ +hSMvqvHtqsdVHlJDcclMBjRMQJ +sqvHsSstSdqhVVvZdqVHZDgwWpZZLLmfmmwfNfWCgmLg +SQWcTnWVWbZWWBcVPnZVbnrNrMFMdqFNqdMqqFhrDQvq +plGLlLGpJLhCGrRqGDDDrdzNGr +wgflHCCCJmpLjCLHtjjgLCtBZswnsTBPVPVsBcPTbZBBSh +vvlMQvvdjdGtVCTJlVJVfJ +FLrFqwwZgNrFWqZwgqrZBLWcBTtppztVbfRJztJbztfztT +WNmmFJwwrFFnNmDgmjdGQMdHMsPvPjsHDG +hGmZHdSRdMmhMZSHlvbTvRbRlVtCTlCR +znnfzgPPDpPfDcgnZTJvJNCZbJVCcNJV +nrLLfQznprrppgprWrnPzQzLSjGsZmHmhBdsqWhdhBMWhdqd +zhtNFSFwRFLCsNrNNBdl +BmQBPjDpBTDgHllgHc +npBjjpQpjGbMnmPpjPQWpwZhtbzJfhwvwtSwhhFFbh +PZcZbcPlbSprcQbbdCwWRSttgtgvWfjC +TGVLVHHmTVHGDTDnGDhgWjwvCjwwwRLLgBjWBR +CHTGsnHVVcJPPcNsNJ +tTqGSSGPGfVfTpqGTbbcVWJLdjtvdzjJthCjlhdlzQ +wwFBZMmZBmgnjzlCWBBjBLjv +rNMsDZnMMWSfDcDWPR +vLzbsczhLmmnlNvrNQHfWd +SMSFqMwjFFDVSZwVTMDjSQlQfNlRrQRWdQfRrWrqHN +CPTwGZDTFCPSjFTSPSFbPgpLscPczmcBLbfgpb +QnQnpFjsbFcSSvCMNvqVSrqq +WfzfTfzzPgHTfwfWtgRLMJDvjMmMVtvDJJCVtqmC +wfWRgPzdgRTWBBWHPBHHBRLTlcZdhjnbZQcGZGpsnphjshbG +pHzPTsBHzqqtQCZZshlWjf +DFFbnvJMDMljjtQjfCbQ +dgJFDGwgmGlMSggGdgdDDlvLNTzpBzLzzwpTBLzqPBczLT +jccNVNdwnclRwlbwlVjdcpJSpGpSllBHgGHZpJpppf +mDThTmsnDsSBpZfmmgBf +MrFrhCshqvWvnWzTWQtzVbRRQwQRNQjdwQ +tBnLJfnQtzRCffmNjSRjZjNZSRrP +dVdMVMvMghHzPhzZhHND +dGWGgplWGVMdMMzCTsbLtLTCLpnT +ftNfNDdSBdrMTdrjMM +cHgHGHzGgJhrPLqSrrJTqp +mVFnQnhQGHFznFhBBbSDRBlSVBBRfS +VqqPBPcPbQHgfrrpcSDR +tpMnsztnGnthhzTtGTGTzzWgJNDlMfSRlRDgRNRrDRHfrg +zWtTFWzTwphChnCzFhzWZGGvBvLqmVmbVQqjqjmBPqBLCP +ZZgZnhrmwmnmgmvrghPmgTGcTSGSMSldgcCQCSqW +LzFLDBfHzHCCqCFGcSlS +HBjRJDLpHpJsJVJqsnhP +PqrqmvmrwzznnPDpjVpDLfDtPGLt +sdRhRWFhShhFccZZsSsNbsNcjCtLpMVWCjptGCfMftBDLMtG +bVZcsdlhdNSbZRSshRcbbqlmnqHmmwzrJlzzgQlmvz +pnrcNGqmrGqnchGhqdWdTlldtQtlMsTq +DvSLgzLSMfbgggCLCwbSSLLtfsWTQTsWllssdltRQQtttQ +bCCzzPPgDPjPvwSzDbwpVNnpnjjrhpnVZGMhcp +jWbGtDdqCqZjdHwcwZMBVQmcvZ +PnTflPRRrlgLTTRlTzFPPQQBcNvHBncQpHMwHNBMwm +fFFRrFLJgRcJglgRzTzrLqWCjtqGGDsjCjdbGdqdhJ +GwbvGqMsDMbpMGzzgRzgpBLjhcch +WFTFNZTZSCcBggBFcrss +CJWWlsWlCtqGJmMGwJ +CGCVhprTrthCZTCNtVGtZDZNdlPPdPwmmvrcbmPmdQRvQWmw +LfzLzssfgHjLFjFLfjMfHsLHmPwdcQWQQlscwlPdQclbPvlw +LBFHjgMzqqjfJqLMzffHzqgHhhJDZSGVDVChCDDpDNNpNtDW +TbzVlmNTVVtnTSWNwDDrpGcwdp +fQQMFbhCfLgfQCsdDcHpsWpdSDsGrr +ghvPLQMfZhjjvPLhbQFQBZqJlTnnnVzRmtRzlmBl +JCLLLwVDwCQsNwwJHmfrMZpMfMMrfPQSMZpS +WlFlzFRnznthqWRGbMpVMbbMPtMjMj +vTnvzqllhdhqTwVBLcJHmmmC +tczhtcJJJbtclWrtJBWJBtJtpqPRSPfpBRgqRfPmpRqddSmM +HCvnsQLNCQwLnDsNHLwQfPSSpPSMfnPddRMmmGpp +wDQwjNwQNHjTHNFDCNmCFNWtWzhJbWbVrhtWccVFlrlV +sPRpCndBCGpCGHttSdvTbWvgdjST +wcmDwqcwmGDTNvjWtrbSrc +lwlVLVGqZGlLzVHHBBBCHBHRPCCz +wdmhffzzphrjqtzRbrrq +CRgGTGTFssZsllHNBlHsFJRjcrtjtPDPcbCtDrLcrjctrc +NHMRHTlFgGNwpQvMpwVvww +MPLJNPqmFWmDFjGS +nbsZtwbZlbZlGlFDDMpVlF +hvsbbbZtvfhhRZbZsfzMbMZbqcrqdrNrNqLgqhrLhJgddLNL +SnMLpRDGlZSZNlnMZpCwjLwzFrHBWCFWBBBr +TttvvtbtVcsJtRsvtQdzWJrBjCCHBWzrFFhCjC +VmvsQdgPbdgVTvgPMSDfPPZfDRRNDNMl +LjngLCNhDNFNhFDhcMqrqqZMcSZnHTMc +PPJwtGlfszGwWtzwQJBPGslJSqRTHZvgcRRZrMSTMMTtRTTc +llPPJWzQPmWmVNgDbLFCLb +NPFlLNBLprpdmmdPBmJnLrdjMVDjMSdqgggQTVDqWMdqVs +vZTbTZRwvvGRTRjWDqSqqQgDGsGq +vzZcfRRZbwbRHRtwZCChBmFNtJBPLBlBJJLpmFTP +pmvZmmTjQFfnvPPHHv +SczhzfbsLNhfccNFsWFRPrDnPDnVnW +BtBbSdtzLBwSLwBmTZpQMpZmZmfZ +PqPQZqtQQLDqrnqdjqdVwVbz +MGRGWMgJHGlRRHfSwfzCfCVVQzbwjrjn +JsmHmSJJmSMWMlTWQBFhLTvhDFZhBQDZ +sbgbbFGTTFNMbMNFWrjsrvWzHWPzPPpf +CVmhVqSqCZmJQhPpHzvZvtzWHjHP +CnmdCQCdnFTnNgRpwT +blZjhbZWVttjWjWLCLVVZCZQjMDQHsBsBQfMDQwjHDwBHH +NdcJdFcJqgpJpNnDQLMFsBnLSnnS +LJrJdJrzvdrrpcNdNcrVlZWbZzZVRhRtVlPttC +mhRtNNtrtBQQrtrBBmQlZwHHqHZSVHHGshSVDwhS +gpdPMTcsLscMccTpbLdHSfGfqwHZDHHqZqHZ +zbzvMpPLppLzLMjTBQRmssjBWRQjlmrN +VzzvggdvFdmffwmGpd +HNbnJTRTmCwwrRpR +LlTnWhLlhLJmLmtZtPcPcVFFPSZgZt +jHcZjHlHzLHHnSNSfL +pQWRrwPwrRWBWBPWBRrpdPmzhShsSFFNShLhnnvPtvSNNs +dzbmwVwbbBmGcqDbgllJCC +ndnvvzJDHvzHHHjnHjCCSDLgbSFwNFVbFVTL +mcQmQtpWTQGlmpTtMtqtpqTFsLcVSSscNCwLNLbwbbLNwV +pRZTQlhmtGWqqWnPHdnhjHrBjPPd +TtLpNHspTcLNNsLpthhsfmtjRSRlWWbzSwSRGwbWlWSSvlmS +qBJVnZZdJVZrZndbPbWwRzSMVGbbVS +QCdnBFBndBQDnrqrnqqNhpNNLpHthsThjGCTLL +phCgcdrFbPLpgrbFHqQqzzlbGWGqQbHW +SFTvTnVVMRnNTNfSHjHQMDlHwDWlQwDz +TZmTvsFNmvTtsggpdJLBBsCs +PBBWQjvsPsHVsNMcSzNDjcGggS +ZtrTfTrrrrdCqpdtLNnMLLqNcgMzgHLq +CZFmdTrJtbZrBvWHVVvHbPQW +djcrrBljMrTdCTcdCClClMlqRvtNqqSRwFbNbwvNBNpSzq +QhPmGJnPVGVHHNzSqpzFwztF +nhgPFmsnLPGLhPDJhGTcDjMfrMMjMZWfjfWj