diff --git a/3.rkt b/3.rkt new file mode 100644 index 0000000..0457de9 --- /dev/null +++ b/3.rkt @@ -0,0 +1,39 @@ +#lang curly-fn racket + +(require "scripts/aoc.rkt") + +;; solution for day 3 + +(define prios (string->list "_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")) + +(define (part1 input) + (for/sum ([line (in-list input)]) + (define len (string-length line)) + (define h1 (substring line 0 (/ len 2))) + (define h2 (substring line (/ len 2) len)) + (define g1 (list->set (string->list h1))) + (define g2 (list->set (string->list h2))) + (define both (set-intersect g1 g2)) + (index-of prios (first (set->list both))))) + + +(define (part2 input) + (displayln (length input)) + (for/sum ([i (in-range 0 (length input) 3)]) + (define l1 (list-ref input (+ i 0))) + (define l2 (list-ref input (+ i 1))) + (define l3 (list-ref input (+ i 2))) + (define g1 (list->set (string->list l1))) + (define g2 (list->set (string->list l2))) + (define g3 (list->set (string->list l3))) + (define both (set-intersect (set-intersect g1 g2 ) g3)) + (index-of prios (first (set->list both))))) + +(define (parse fname) + (file->lines fname)) + +(module+ main + (define input (parse "inputs/3")) + (answer 3 1 (time (part1 input))) + (answer 3 2 (time (part2 input))) + (displayln "meow")) diff --git a/inputs/3 b/inputs/3 new file mode 100644 index 0000000..0761a34 --- /dev/null +++ b/inputs/3 @@ -0,0 +1,300 @@ +WwcsbsWwspmFTGVV +RHtMDHdSMnDBGMSDvnvDjtmpTpjTFggpmjmTFggTjmpP +vtCSGRMBDzHddvBHBzRhrlcZhlLzWNlqblhzcr +shhszHNHHZWqSzVNdClMjlFjBBbNTB +tQQGmnrMnJnGfmvrRRPCjlbljFBdjFCjTjnP +mRwtfGrMmJtwRDvQJQrJpMLSzVDHzhzHZqZzqSzcWVWH +WsWWgrtgsrhTQtsFcWPcRMCCTvqvMvqNNqMMHlMq +bBJrBGbzzLJznJrbSDGGJLqmlvqMqvlmLHRqRZZRNZ +bzJfDGVSzVrJGwjVGPPpQthdPsPpjdphsc +pJpCCBSWlczWWBWMHdMmMsFmpddrgF +wfVqZZGVQvzsMqmMgHjm +vDZGvPttQTVtGDQDDDGwbSCcSJSCJWTcRRSRczRJ +HLVHsVWLwbWswbpWFWrrmThfTPNnhNSDDNhDfznTnhnS +pBRcvGvvBtpGcqqQvgcphPfzfDGhzdzPDzDDhnhS +ZQRvqBptjJgZCtJqqMMMLHWwMWZWHHFFHm +PvPFPvLLLSvNFvQNWNPvrPLrZjwhMttTwtTtQZBwqjqtZqwM +HJDDbHjgppzCDCmzpgzsGbCsTMZqZllqhJBhMTtVBBhMtMth +zgGncmGGzHCnHDpDgDCGsmFLLPFjPRRWLRjdcjrcdRLd +zHnWzntnBRWTSBzRBddpFvZVcHpLFvjvLppvHP +MmmWmNGQhbCpZVLLbccvpj +QDMCGrNWfwNznBJsJzDBdg +tcRcZccZmdZJctRcjrlhNNDfrdNdSfNsNT +QHQpBVvMpRMwgBgvnHRFlhrSsgNFThgTFFflNS +vvHpVBBBGBppHvpLvHGbjmmtCqWLJJZRzZZZZb +ZBtTDZRWsTsDZVWVZDmjpbLbpSSzmLpWrbrS +MFNNFvvwFHwlhmNrCStLNtjzrb +vwffwcHwflGqGflHJfDBBZtQVBgZQJtBBsnT +pTJcmMJTspmpMZZJJZHCQQMzPBlQdWWWFzWP +LDnwrdnDnqjfqgvfDjrfFlBBPFHFSHPQCBvQSSWB +nLbjgLjdbrwVRcppsscJVRRR +mHnfggmMtpHPPBCs +PJjlQQRrJhJNPPTtBsCbCCTlpptd +rSSDhNQwShRRjhmMPmzMDfPmfLzL +HzLFBgrCthtFrrhFSCCCvBQNRVmJJJmnpnddmppddVtJ +MPZsjDWPjZsVzNTzpVdRdZ +qMfjWfwclsPsjwzqHgLFhwGFwHrFFrSC +llllmSbhNmSbNzlPmRNCcgLLchHHpTGsCTQGpT +dVjBrvBBVLJQsLpC +frZBWBDMFndStFsSwzlPlq +vmTVVtmJHwCwDllttTsrcPcMrfqPMMpjMq +LQGBRgGGRNgGgBhgzHfpjPqsMjpLcLjrPLpq +BdgzgSRGBnNHJtJlVStVmt +FbDQsFjPVHFZFSbrVjSVvMJlGBJhDcqBBllJGccJnh +RfTCTTpmppfgwCpwpLwRMnMGMlcPGqhddPcJnl +zgLPLNCCpLggzmTzTWmVrjVvrNvjjjvbVHQZZH +RBjjpwmRszBdvhLdSvpVpV +GrbfbJWmQJGWrGZZQMbSLggfCgSHhCSgShghSC +DWNDZQcrbWQrZJZGQQZPsztzBsPmBTzwcwRwjT +rlvgglvZqbrbWbWWdvdmPHBBNMNJGqjGRRnHnPBJ +cDFDcfcCDhLzsCfLDVpGPRJMPsRJMPNRnjHHGJ +DCfMVDFVScVMVQlgmZgdmWQQmS +nWTWWgwNgGDdBZBVcvDzzJccVlCzHD +RLppMMLpRqfMtMjtMCHJFSpzHSvSpczJdl +RdLRbQRjsRMrMRRMfbQLqPjbmnQgQWWwZmggnNTgnnWwhBhn +TmzjMjrmjmjBmHLvGPpbvWGqJzJJ +CfScwNDssDVCccdNVcNDQfbqJLqSLPpJpJJvJPpGTWJb +nddCQTfQVVrHmjMnrMFM +WHDnTwvwcwZmWwQTnBtgbVLLbgfSlTfrfb +CPPGdJRzNhNpzPJtMgBLbgtlLLfLMz +GJptpdFRhJwDmFHDjvnD +PNcWDNnNDcLjDDcSRWtQFfzzzQgPgsssZtPZ +MGhJRJGGrlpVGVHVCqqGqBQvzFzFfBvZvvtZtvFzvZvQ +JmJplCrlMNdmjbNbWR +pqpqFJPPSswJshNghg +zTHHrrbLzDQHccfhqmDshgCwfmqm +rtqqtTTHtzGLPWBdnGBSWGSS +gmNvgVqjjqzfMRgrRtPcft +WswSQwWWHGCsHQhlGGLLJRbLMRfRGcMb +dQCRCWhhwCwFwQshhRTmmBmFjFTTVNpqTnTj +FZvqSWqjjZvvrNSvbblcbslDppDHbcsS +MmwLTwPmBwmLJJmLlWzWnDllHcHzcDHM +QRwtQtLTwwQBTPfFfZdFvqqrFGWjrh +MqlnnNvJJZnNNdJZZLvLJnMzjjCTCChgWjccWqcjhcgcWR +tbddSHDBbHgHhHTCjh +mffBfbpsFSdQQDbQsrlJvwJNLLJMrrlsJr +RjqbNRRbDDqHndbcHDqdRHcChsffCQJJssZGpzpCpJphJd +VrMmSbrWVMtMtLmQGCfZWJZCfpZfJW +PgSPgTvSSHjjBbvbvq +whclNQQfcCFCcrJRjmmHNWsmLs +PPzMbqBPLVtnTppPTPzHJrGWJRRvsjjjRHssRb +PtgPVZTtTLMtBzqPqttPVMClcdDcgCCfCQDSdSgCwlhh +DrcrsvcNtLWSFPSFszbM +HqTdHJdQhGJBHQHWWDTnnPzbMMzPnS +hdwfqdhQJfjlccrfvNDLfl +BBPCWvjvTLrHTHHPCTndfwhbdnnZZfDhJwfJVb +msmgNMMcgmgczlmmgQNlddpVDDZpZpDfhZfJwsJF +mmQmMgSgzmqSRllGmgjPHrvvwHttjLrLRWWB +RwvDvhjhMvwlFNwNwCWCCWWLZcbGGZLGJVrppbZVcjmpmJ +tfnfsStnPPfTfgnPSSzPflJZZZrlZJVzLLmZJrzVmG +nPHqgfsHQnffqgSTldHTPnPHWMRFFqqFhNNNCwNCFMMhDMhh +FmwFHmnlGJfnlSlmrfsSvWgZNWNvLvtqLqDJhWJD +BVVTTMqRWvRZRbhW +pMBPCzVPQcQsGqSFmPFwSF +TcpTpwqZqMpZqlZCpZlwDjjcPNdgdPjHHHdvhHQgvv +zQFBRbmsQbLLBnGBvFdPghddNgHjNSSj +QnszWVzLfsLGbnGQbwpVtMrwZTqpCqpppr +WrZmrJcGwZdGZZmHdJcwGWcZsdFFLqTtLVtSTLtvvLtLLqSs +fnpCCQClfpQlzbbpQpflBpjhLVSTvFhjqtstVsjtstFVMs +QBQRnbCRpnPngnbggCzzRClZwJHFHDwZJPJGWHwmNGHPZr +fDhjvftQtDwgPhdRcRRP +bbNSgllVNMCWVnbWmcdFdmmFdpFpRrPPPw +NBzBglNzBvvGZDJQ +rGbbtStjSdbGtDpjjJbbRRbdrcCsCCrFqhllrFHsFsCvqCWH +TzgMMgmTVgzzTMLLfMHvTFsFCqHTvFsTvshF +gLMPBgQmQmNzVZLPzPppjbRhhddGBGSttbpR +zMJTpMzpVczHbCzVJVFCpJPngnBqVZqsRZZPnjqRgmjR +wttwNdfLQwLhwhhDDhWvgRmnPqsQqjnBPSZRgjPS +DdLwGGvNvhlvrrMFlFTcZrpC +llBQWMScQlSSBjMrvrrPpFHFBDFDFJTmTtFFmF +nzZzfVgzCNtnJppDHPnPpp +LdRNfVdzbzCCjcvllMcsbtjj +pWFwpFhprTnFfWwZrsBDmsqBvZvjjv +VbcHCthtzQtNqBsvsZvQmQsj +cltzzVcJSMtRWdhJLhRwdh +lmmmLRdZnjBlGgVhNSVvRMWN +bDwCqCGPbwpPwDPPpCpqpPbScvMSMSDWgVcSShNNVfgWWv +bTpzqJHPFFJqbTHswLlGlBntGnjQtGBZTT +pVjVlDDhmRPlHlHPWzWVWrVrcWztVdzv +GCqGGGJSFbnLJLLfrLfPrLdgrrgfWd +PbJSQGSsGnbMbqSFGBMMbsGTNwpTRwppDRsjwlNpsmHwDl +GcnPbbbLqDPDBPPDlQ +JtTChNfRpNJMTCfMTlJVsdVHvDddHBVmQm +TzlffWNfjTfjjCjfTtRrLgbnbbnSSwbnLzZZzr +hggWzjLhzhLhjzVWgpCpTFFHtCJFTJTHHHdG +lvSBvNNSNSSmlbwmMJCGtJQCHmdT +cfSlSSlvBDBPnlPPDZLsgtggZZVVfhzRgV +gGVJGvVVZZLvQLWQppccpctpNptMhnhSjjnM +fzQBsBzmwPzdQrRbSFNFnsSDchjnFhMN +bCwQRbbCJvlGCHgL +NMgdHVSqgQcVHmlllLDjlCLdjL +whTRJtJTnthWBlLLLmlFtVmV +wRhnGTpzzTRnVbzzWWbJwbhNQrZHfpNgMQpfZQHHNZZHHQ +qNNlMdbNrlVsQQfswQNCmW +LJzBvSdLSHpDJzzzHJnHnzFQCCmmswmfwBGhsQfWfCwW +HzSvHppDDRvgHzzcnqTrTtllZdRrbRVVZZ +TWVVVFVPpjVFtRfPBmmzMMPCvmLm +hDDrwndQQbbhZDMSMvcflMLmfnBL +grdggqsbrhdJJJrhbwbbsZGHVNHtTWpVBFVTTTVTHtNg +tLbvnTCzCVnzzwVTJVlwltMFvQFQRFFrQPBFdNgrMBNF +pShsqqmGjZfZccsqSfbdNBMMRQGBPgMdPMPF +HhspDpjhSjbcSmcqhZDcZZjTttLVwlTJJVWtnWVlWHCltL +DwQBvwBnBrSVRrZM +JWWGRssgRsFgzsFPJrNHVMHrlVrPSMNjHH +gspgFzRCFWLJpgqqRWgqpCJwnQCnhQvwcTdcdddnwbDfhf +fMMCwFDGNNMTdTDLlVlZZmdZBdBtVr +jjpjtbpRcPvSPnPnpPnvPPPnbZlmrWmLWHmHBWHlrmrmlZWl +jqjjnPqngtQfGFftFq +qnzhhbzzqGgsqGtnwcJrlCMlCjvcCCcrCRrvCv +mVSNZdTQdVVWmVFHQrpCjpjDRvjMRjdLRt +WBHZTHHTFWWNNBNHQTZPsPggghfgsnsgsffthszJ +sDwpdMgvHrZgwbdggzZZgPhFNFFcjPPqhLhjMlPqLq +JffJfnJGtBtCQQRBJZTQJJGfcNjqCLcFhFWCPLjhFLPjcPhl +VZZVmtGQQZmHrwgddppb +NNNlpjbVpGglNbvpTwBQQvfWvfBrWvBW +JthDJsLhhHPcGcqPshJsshSBwCWwfWSLCfSfSSRBrfWB +dhDtZqGmctZDtZHqDGVgVgNbbbFjndMFNlFg +jqDVzzDMdDwsVQLCZVCRWLGBQC +bbHFbSSpFbFHJHStJNbtJprZlCGLQsLGZRBLRQLQpLBClZ +SmFmTPJvFTNbmmsMdqqjscwz +RqMbHGJRJpgJgGgQjgrLTrTzjcrTrrLg +lwfwdhnflPlbCsVVjhCSbV +fwnNtwmlFZpbFZtM +QNSQrLTNrLNQRRrfHFrSjqhblWtSltqlWqtWWl +DvgBgnzgcvVZMljv +DGJdjBPDngDnDjBpBmFpTRmRFLRRmmCmHH +dtgSdTqdlvdJJvFqTvSqJqqRMPBtLHPBnWbsbWbsbWtWtWHV +DjfCfmcpNrwZQCmmNrDZNZNpsHLHWBBbHVVcGGGbHGBbMVMB +fpNjCfzLNZjTllvzdSgFgJ +nHBfZmHTRwsZffjBnHfmRZHtLtdNPPlWvddWLWJlJldCldLC +zwrbphMMVFzMwdCWNPlCbPdDCD +hccMSpqShMSrhZTBwmTqHjqZmf +NJGGLwGsTSsNlJZhmtgCVlbWQWlQMtCbvb +pDjppDBRdjzqpHqDSDzjVMCCrCrWtgQWdtdQQCdb +fHpfRBPRzDpBFSqcSBRBSNhPNwwNNswJLhmmLNGJZL +RZbsPgnVDzTJcdGjDGmD +NwfQHQtpfppQhjVVjqVNJJTN +tLLtwSptVCSWpvVtRnrbWbMgFPMsgZss +VsQjSwwVSwsZzsvdscZvfrhPRpqBrBrbpzMrrTMh +JtNDTmtGJTmLCGFDCHtDhMMBRhqqRbPrfrbNRrbR +GDWLlDnFgZdTSTWv +gfQHRRpQgRqNSBtjqwjztzjtnL +FvsPgvDlFcmvmTLlBMVztnLwWLzL +cvZGDcvbPcmbTbrcDDPgvbTJdJfJHRhZSRSpRRfHdSpSZd +FGHHHWvBWrHHrWVZJvVtcSrtrTcrtcjMTjStSM +swpwfRhRmmmRQDzcJlcqMSMMqtbMTz +dQDRDDRQfmmQDNsLfwRJvZJWFWVnPWvvPddBnC +zVhHvhMVTnMJgcTzMcfGJtfBWRtBRqJWtqJb +hlZjZSQCZtfBbGjqbb +SQDNwplrDVnhDcVHgT +HHZmttZVLVMQQJwMfcDRfDbbMN +phWvTgBqqgBWsTPTzhWzhzfNGNNwfqfcDwJRRbNcJcbl +FnTsvnhppTPFTBpPzPvpBBpFVmtfCjfmjtCmFdStLmtdfjSd +hMTPPMNlLZNSGNbRBB +gjmrsrttsCnsCsttVsjvttvtZGFHdbZGWWWdZSWddBHHnSWH +BmvptjsrfjBgsvvfgmfQchMpMqqhcQPMMPMhLQ +dJHGnrJJpGpDpFzzDmfsfSSCbfTfMbbRDb +vLcwtWNgtVtSNWmTmTMCmhNhTRfM +jqVgqVvWwwLwwgqZgjVSrPGzHHHqFnrHnFGHJGdr +QcQcdgbzwJnzfgVnVwdHQbdBrrpplHvmhLjrlTphppLrjl +MsPssfSZMWGWqWssSNPqrmmLBvjhqTvhjBprhB +GRDDZMFNMGFCSNWFPDMMFWNnwVtdVdQfcgtddwQwzRJfQd +pMqCMBGpMMCnwnpBMGBlbVRFJFWsJzRdzHlWzzJdJsJd +jLLZjDgPbNPZTDbvftvZgzRFsRzRrRRHWFsJsFJc +TZZLDPjtmDmbqQGwQnVM +RjnNhBnnNNmJmBNhrqGpsHbHtstgTtTjqb +WVMfWwQTzWZDMtlsfldqpplstf +WVTWSTzwQWSSvQVZCQPTSZPvBcnmcvnrhmNcRFncNLRLJmnB +lffQcnNTQBBcwqsdcqjSspcWtD +MPMGrHGMMTqWTtDg +VGRGLrJHZzLHPzTNTmmBfZQFTNBQ +lQBPPrBrlnqBgSRhgZZZrLJr +VNcWMDZbJHhWfWff +VwvMwMvdwvdwjcwdwDDqsqsZQqPPzqzldPQtps +VVJcZJVrRSdcsddfsvvbvFZBnngBMzMZFD +hLLqLpqqWWphWjhlGlCHDFgzbvFBbgBFtnQpnngg +HlhlmmHBTqTHHmlLqjTGhHhPdwdmsdcSNSfNJRrRcfwVJdrr +HmhvmRzzHHrRMBJBjNJGDJRnJD +cbqcPqLWZwsgQWZwWPwWgPPbntJnrNftNNNBtNJJNDBNqdjB +lgwWgggQcWSzrlTHMHlp +FZhQpClCWLBlrNDZvrwrrNSH +ztTfjMjJjgsGrqvzDGwG +bMjfnjndjnJtfgMTwPjFhQhCLdQCFWQQLWQhch +PtrqPrrMCPChzCtLFRbtNgbdTjbF +GdZGvJSWWDGplFjbjLjLSTlL +vspvnZsVppBdBnBpDCszhzMsMzzPzPhcPC +PdCtdfCMfGmtfmtBSWrMQwSlwWwJNQ +qTqbcjqHTZTbcDqczTjjZvWrQvVWJQSVQZZSVVrJNr +qbqjRFTcHTcDFgcczRqFrPsGGGgnhtGssCdnffGmsP +vVbcMvqjjjmHCBCBBmBSSH +PzzLTrcrwQgfLGrJBHSGFSCHtRFBJt +cfsPrLDwQNgsrTNTQgLwVpWnVWvMNvqjjqvpMvlj +jbqZNjLbZQvcfhhQ +CWdCDWWMCgmJDnJmdQVzMSchvfcQVFShzf +WPgWGRWRHdPBsttrHvNtrl +MCJCCMCqcCqJsnssjQRlTvQQQQqTvqfQ +HGVmwmLVlZRzcGZG +FcchHmDFpFbDMDMbntsJ +vfNvvttvDRcrvRNRNTLDNRcVsFhwVBVTwbbFFVbVhbJMBB +CJGgSJHdgPPSnQnjnddHGGFMSMwMMsmsFMMFhFShMWMM +dGCdjgzHCPPGlHDDqJtqRcqJlpfR +CwtqqvwLwnwhtRLtdRnwnnRhPHpLLppTPPpTVfTHzJWVLTWB +sGDsZDllDrMFZVmGgsmDMlmHpJBHpcJFPPTHfJJPzfTHWz +srgVlGSgZVGGrRvwQwdqwtCvnS +MLPgDrgLzThhCTgg +GVfCbvVbVvhBHlmhvhHv +ZqRQffRwtNZWVZfZSMsSssncnDCDnL +VwBNhNNmhJswqjJsRzPgDvSgJvtgvgDt +rRMblbHFfRrSWvPPPgMzLW +ZFpFpCcprGfbrGfGCHclZfnGqmsjmBdNVjQqRBnqBsVNQwBh +VLQlZWQbcPgcPmWbgmDWLQzdpGMTTqdpMTNsbGsNpMSqdq +HChrwfffhJtfHwJTsDqThhDMpTGsjj +HvffCrtBzclQZvQD +dCBVJJmrJDlBdQJWZTTsWbdWThWpbM +FHjSPjwqwssSgqTMGbGWhTMHMMZG +FwLvLfLjjSPqFqgzwffFSvrlDJvrQrDVrnmBvrJsQm +hZCRbddrgrRSVgcGZjjLFGLZFQFp +nzPvMsPvtmvPNssPMqpcWVjGGcGLlqGcGN +TBzmTmzmVmrBSBRrRgdR +bwZZmwfFmcfCRswNWNBsjC +VDSdglSStRCCTNCD +VVVppGHGlrQnnGJbMmnmCh +nFhgnFVNtgtFVssgdgVtVtsqJPTNJvDSNqTZZzbzTDDzDq +HqLHqcwlBjLzPvPJCCvJ +HGrlHqlllHBppRrlwWFnnWfFFVhMnnWdFhfn +FsMFVszjggMMzWlPJlPPlLQsJv +nqnBSNlfZqSvLHnHvWLQTW +hShpfCCSRtfjgFjMzdjlpr +jsbDsQnnwPsFbZgSltWGdgJgpnSp +SCVvLhLRrzCNBhrCvddMJpWdWGvJGlgtpv +cHLBBVCcCNHrbcSQFwQTbDws +rMlbLgrRgpwTDbflcnHtSScwHdJdwHJB +CQCjjZPzGGzCzZQvBVBNdQNSJVcJ +jsPhCzhPqFZzZzChFlsbRRLrMfTbbcLTpD +dqjzmmmQBjBHCmWrgVGWrrrvrpgVpM +PLJnTFbJnhTDzrGgMlvrFMzF +SssPcDttntDSsLcCzHBmmwcmZQqH +fFfFSPHllPRpRfnmmFfHvHjgbsBQjsptBdBTTddjsDdt +ZqLJCLCZzzTgWjdzDjzb +ZhNLMrNcGrchLqcCVMqRvlSnFnRnmmGRggnPnP +HMCMCMrHfwMHtFwTtgHHbVjjbsRZDwDVRbZqjhBD +cDpmpdpNLNDcdZjZqZBNBqssRR +SLJSdPcznSvdvDcHFCftFTFWCTHnWt +NlMmlPClmdGldRZHJs +tgJJcJQcntHBsnBt +TfSgQhhccczSVQqrgSgTjFWqLWmwLFNJLWWPPwqM +GGwTHqWVdnTTVVqgngzzqHzGFbJspFccRsjDpDcjsRFDsdjR +rtLflllZSrhQPLBtQStZvhjDNjbcDNDRNFjCsCDCFs +mPLBQPtvtQZtBlLSmMqVGwHbVMqTHWmz +VvJCrqTvPvQrCpRNVRFGfZfmfG +HMzsdWsjhZSsJJZNZf +wHlbjnlzWCvqJBQlrD +FnVRRsVdSnSnFSRqTVdqBBDBhrDdmcddMcMQMhzm +HtZvJwHlgjlGlHJLNjJrMmrcmDQfDLczDrMhhh +vGGpJjttvlZljZllZvJZvwGqsSTRWSCpnCWTVPVmWWTWWn +wSHCNwwmcSMLSDFcwwSSHQvZnQjLZffZjZZbVZjVVb +JqsNJJGGqprJNtpWhGhspfnffTnTvZvVbZnTrfBQvV +GsWhdGtPWpghJRqhtNPmClczSlDglHMlczmwCH +TzRpjVRjFpVLTTdgrTgrGsZwrZZwgg +vQfSBdbDbMbQNBJrlhmGnrgrgwZhvm +SHSCbdbddcVWqqFPCLqR