From cab03d0a2f75b154083a55faa80e00dc29a4a4c4 Mon Sep 17 00:00:00 2001 From: Amneesh Singh Date: Sat, 3 Dec 2022 16:23:21 +0530 Subject: [PATCH] day3 Signed-off-by: Amneesh Singh --- Lib.hs | 8 +- day3.hs | 30 ++++++ day3.in | 300 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 337 insertions(+), 1 deletion(-) create mode 100644 day3.hs create mode 100644 day3.in diff --git a/Lib.hs b/Lib.hs index 6ea4ac2..7f87baa 100644 --- a/Lib.hs +++ b/Lib.hs @@ -1,4 +1,10 @@ -module Lib (split) where +module Lib (chunks, split) where + +chunks :: Int -> [a] -> [[a]] +chunks n xs + | null xs = [] + | otherwise = head : chunks n tail + where (head, tail) = splitAt n xs split :: Eq a => a -> [a] -> [[a]] split del = diff --git a/day3.hs b/day3.hs new file mode 100644 index 0000000..c789922 --- /dev/null +++ b/day3.hs @@ -0,0 +1,30 @@ +import Data.Char (isAsciiLower, isAsciiUpper) +import Data.List (intersect) +import Lib (chunks) + +main :: IO () +main = do + input <- readFile "day3.in" + putStr "Q1: " + print $ q1 input + putStr "Q2: " + print $ q2 input + +q1 :: String -> Int +q1 = + sum + . map (\x -> val . head . uncurry intersect $ splitAt (div (length x) 2) x) + . lines + +q2 :: String -> Int +q2 = + sum + . map (val . head . foldr1 intersect) + . chunks 3 + . lines + +val :: Char -> Int +val c + | isAsciiLower c = 1 + fromEnum c - fromEnum 'a' + | isAsciiUpper c = 27 + fromEnum c - fromEnum 'A' + | otherwise = 0 diff --git a/day3.in b/day3.in new file mode 100644 index 0000000..3142cf5 --- /dev/null +++ b/day3.in @@ -0,0 +1,300 @@ +jVTBgVbgJQVrTLRRsLvRzWcZvnDs +dhtmhfdfNlNNldfqmPCflqGbNZDHsDWcRzvczWsczZNzHz +tmwwwCCfbJSMbwMb +hsrZZhHlhrHmPPbMbDFDQdnQgLfMFDdDQQ +GpBtwtqrcCcjgnLgqfgDDgRn +cJwVwpCpGJctJtBcCrSCGrVJhlsbvSvTvbmHmmsWmHslmsHm +gCtWJvmfmGGwVVMhJw +nzRSpZbSVFFRDFSDzcplddqplqMhQMclMp +zFLszzRTDnZnbTZTRZsVNgCjrvfvgtvNmtfvLW +glRQRpQQtQtGtQws +TnmbLqvBFRFFLPBFnPbvRBhshTtHWhwzdwtHdsdzWhws +qmCLPNmCFnLBnmPPqVbFLRrJjVggDgJjlZVVDjDlDD +vRRgpWvPQFdTFDDNQs +bqtCmltmlbwqLVLZqwtmLBBTMcGBddTTBgFNGcZGMD +bbtmJmjlVlwblwwbwzbbvrrznvzShgRhRvhfWrWn +ZMhThfNcpbbMNNjsHpmpsRqsPmRs +wQjDgggQDPqqDlsD +SCwSzvLVCSVtQVgLnrccfdGdTdZfcZMtjJhG +wNnNmNHnNPPwwPGCrLSZZvdVVZvBtMMvdm +WQzlhzjzbBtMMlBrMl +szbgWhJjTTcsWTqgzsqcsGHfwNcwfwnHHrCGCPPGwr +CNsbpFCMSrmDhQHNNGmH +fQPPPcqvljQzjVDDgRBhGGqDgqqD +ZctlcVzcfltQtnrndbQMCM +NQjQjQvZvZjcvrrrNjgTQgBQwTJsJswJlbGstqqtmGhmwhqw +PWpHRzRnPHHSCnPFwlqhbtqGZClJqGqG +ZzVpMpWPHnVzzpWzDRzSZrcdDQdrQNrcQgQfjcNfjf +BSZMtdtZBzMFvhCbBJDbhDDC +qcqVVmccrmVcjrlHqTrjDJRPQhWvPWWfPvblffDf +cHTrbGwpmGwVjdFMnzpLznMztd +DGDGGbNgTgJQQLMRMMTNVzvPsPbdsfPVsdVVZfPf +lcCmmlpwwnwSjCHtFpCpHzCrZsVrBZZzdvDfVrsfZd +lSHwnjpFmppHqppttttcFmnhMLGNRLhTMDqJLQNLLQNLhJ +WqWfDWBjBjLbfcbbqGbWqQsrFFztsppMFCzgCJzJCrFpCM +VRlhdHZTZVRRmZwlmFrJwFpMMDDrrrtJwg +PPVddvvDZmRmHvndTHmLcbcjSjLQBGWGGQWSqP +HHvgvwHMPMwHwmcRfJNFchFGNNCm +BsTDsjzBCCBJGffN +jznSnSdqzqnQTbdDljQjQSMHWWvvgWvtZlrWpPfWwtPr +DJCJJCNjCDRfDfDRhDnNhfjFPgbGbddBTjFdTFTPbgGSdF +cmMcMVqBZVcwsGFgGqgWdFqb +vcZVzwmHVcrtrwMMvvmBHwNNCDpQRfhLhrNJNfJDDDRC +VWSSScsncpDRdnsWsVncVzTwMMMHtMTrLTLMMVHM +fjJvQqBCQNhfQlZZnqmFHLFMTFTzwzLzrHMB +CqfjjQZJPjjvpRppDPgbnSnP +tLnjNwjRWttdCwRLsfGzfzPbzbWbQQPT +cvvBvlBrFrlTffsbfTqZ +vmrFpsrvFMMMNwhtDwhN +wzgRNqwtgzMWtqGwCssBBSBZnSRsrQQS +bbjLTmpjpHcpVncVdmffPCDrjZDSDsZffDQC +pbVFncvvbpbbHJJHVdvqMGMJNwWlNlJMwqzlNM +TdszlzFsRQqFdRzqwwQGlFsGmmSBBdmdVVmgSZdSPZBBBmSD +HMCCMbJHJJLHSmSvZLBcSDBP +NWbhPjfrbbNfWCPjhNnGsNzsqpQszTQGRwGQzR +ppQpTNCPBTlNBVmNQTNrrrrtqsrWbGrVFWqhZb +DMvDHnjRvMDLghhhgbqZWbqFSS +vWvMRRJDLMnHLJjDwWnnndcllNTzBmClQBpBBzQQzCBzCJ +VsNZfPMnrCnlCnWtbvBbvwtTbZwT +JhJQdQhmRHDRdLmHJhljhphgGwtttmcvbwwTWtvtbGBttc +jqLpjSLDHlhnffCMzsqCPP +JzJdLRmmzJwrLLwLJwLTWwBrMrpHlFnScVVqccrBHSlc +tvQDQhjhvbqFqFSpjHSV +QbgZtsgfbNNQbgbsbQRfmWRJwJGWWTPRwqzR +MwvDgpwszSpSJPsssMccTQfTDfTQRTljfRfT +PmGbWhbVtZWPTqRrcTrrjTrt +NbZbWHBmVGmLbZVBVNLPsMBzwSSzMJMCsCzvnvSp +cTpgTnpzbZlJHTZm +jRrLVtqtvtrjqsHZhvpmBfJHmhhp +FqDsFLCwCVRDqwgNQcQMwnncnMpg +sCCtssdZdZJmMbNJDmtmJzLSrcGfHGLTHDHnGLrHTSSn +gQwRRWqwqgpggFWPjPpFnSTSnHNfLLQrccrLGHLL +qqlpqhjFwPgPwvvRgFlPdslZCzMZtVdtVdVMtJlN +BWVmPtRVRRWDNtZBVQzCfdscmfjcfdfzzSfz +MhgJLbGggHbqpGgpgJbrFJdjwsCChCzllzCdjDSszCCD +grpDLFrbgpJnqJrHGFHGqMHBBPRWQTPWZBQVTQWnPNVvBt +gJfggdmHDgfJJWzCcbqvcqcmTG +hLZlRBZNlBlrpprzrWqvtHvvGtbvHT +sNLRjHZLNVnZZVLppnhNsMFJSjFPPQMjwgMPPfDMfS +mDDzHfrPBvJRJhpBRg +SsTSTwJwcbCtwssGFVWppgZRbLpLRNhpLhbLvg +ttVCGjTGrfJJMfjD +ffhcsTjnfqHLqvZSHvHB +CsgmPVmstsQVpRbHBvFbHBDMvZLZGB +ppgpmmRVpVPwPrrrTNlcrwrlWs +NDtssPNBjQtCtCcT +ZZqncfqhZqhJZFTJTllCGVljSl +ndrWbfZwWhngwbqbZnMZcwWhDmmLDmzvHPvzNLdmzsvBBHHP +FQtptwMppSFQRRQfSfvTrTJJJTrvLjMMJbgJ +CcDqWBWzbldcchDGCWBCBhdGrvhnrsrjjsJvLvghrjjnnjsJ +GDBldPDGqPGWVBBcwHFmSmbpSpNRwHFV +CwHwCFwtCmdCDflHDpwFnnvzhhNJhJNzmhzhhNMM +sTbZssPqScTrqSWSShdMvgMRRzdRRQ +brBrsWPTrdrWsPcBcTcGqDLDDHjFfDClwLLBfFlFlw +lNptNFWpbVMjlBgQgvdNBRQLrd +TsDCDfSCQqqQQqDq +TwTmwPPPzZSCccScJwpWZHljtbWMFFQVHpnj +fhFmwbrgnCcSnwtS +vZVVZvQZVPZsMnNSccMHPN +ddzvQJvQzBzWRTJzdRVSWGqbRbgmfbFFbmbgmpmlff +wdslVdQtdlBVHDrHBcBc +TJWvpncCcJzCWcRfWvJRRpfZHBDZZHmDZPBjZHjZrSfb +TRJFvvWpTRRWCpCgGtgtGQdlcNtsGlwg +rCHvRLJtCjpbRCLpptHMVCQgGlMndVlQGNcCMc +zZfzSmsfSsMzMccQMVcN +ssSmPmSmhwVhZBZsTBRJrtRjtbDvjvrTHLtJ +wswRCNHHhsrWFsGfGWFBGb +lLtngDPLgLJPttgWzQWlbCfBlmBFCW +DcDnVpcnnJPngjjcdpRhwNZSCZNdNdvr +NWNzWpfMRHfwsRNznPdjtdjJtPVPHVdJ +CSLTZBrGbSmClvBVdGzFVVcFdjjjnV +SrZhZbTvmmbbLvwQzMhsfhqqWwQR +vvZqwFBZvzZzrqltPsQstrGGpMcbbR +bhJdjJJmTRQMTMMPPM +mCmgLbdVVVLhVnJmLgJhBWZFDlqFvwZDlZBnBvWB +sMrcmQcHHsLLrSHZhvdCddvtJJFl +jzjjWplWpPRPDzPzfRGjqvdJqqqCtqdqDvdDqtwC +pPNWVpGGVVffPlnSMnMsTmgsQVLr +zGMMRbpGmqqqNRmmzbNfbzPRPlvThCTrHPnrHSVPlTHR +LSjjwgsjtTjhPhHhvC +dJZtJwFgtBLDZZbmNMGzMMqS +ZrnstppPWccnsFWpnZnRdjRtjbCtSSRjjjLLbG +JgBQPJvPgHHJvmmzwGGLdjHGSjShGHqdHL +wTJvPzmTJvzJQBfwNmTmlPsrVfnVFpcMVZprDpFrsrVc +ssGCtltsSdJJtQjPdvHvfbfvqLHqZtBfVb +pzRwwDwDTgzbqVTVvHqVWB +grzHnRpmFpDMnmzFhplJCjlsPdGJSjsFCdFs +CTGBBGCBlSTTSsnTMrQbNrBMtpVzNddWHWzVpHVtdHmwhphm +JqPZgMRFFvFZvDZMDFcFFfDchdtdPWpzpWhtHWwwhVzWpddW +ZfLZMcgqRDjgjcLccDRDLsbbrSBBlQGQBCTrCBnT +VjVGVqSqFLFVSqCjFJSsbfPprHbCCRRPccRWPW +wwnQmtwlvNmpZRsPsWWNbZ +DBhhhznhddldnvjMqJMTqDMGPSjF +TTJbsJPPBDsBVbJJGJBGWLfmWzgmDmzmLqmmLddQ +jHwVZZjwFZlzLzWZLMdLqM +HHHhjHplrHSpcCSvjlsNPbNRbRnVTrRsNNNJ +NzMMLZtwRmbwFnVDhnqD +SlsJsSdSJdNJnFphVHFjph +vlrsTlGPTgvvSBScGcBvfzmmLLCtMWNZRBQMzftf +tRFLmZZRLrtRvtvvrvvGgvtLNfwzMzNwgdznMpwwpnMpqHdz +hcsBsWTcQJhjbHMncNwzMqnzwl +VWSWWTJhWBVDTJsTVWQWTVVbZtCPSvrrGSLCRFRGtRZLPmmq +hbdFhdShGsFSGBlQhNhQMLLLlLJCvLLDtVJDLlwtwD +WcqWsmcWrmqcmtDHJjVHrJCjjt +WPWcnggssmzqzzzgfzZnWRqqdGpSNFdMSFdBMSFZhSFBZZhh +GNFNtRQMGjDjwfgDZjmz +bqDsPWWbsqVsdvvBJvBfmgfLLzSwzLcmzmfB +WPWrrVrrVJhVWJDVsqnPdRQllRQRNhQGMlFQFMplGl +mChChmSQGSGJrjPHCpPFtwgsFZjtFVZfgVwtdV +MBMqvDWMlTbzlRWzllDzblZfsrgdZffgrtwrswZfdZTd +DlcMvBbBMnqMDqcRqDBMWvLmCGrGLSJhnLHCCHHnPmSQ +tscfGqftGfDnnppJGDGCZLbzMVMwPPhsblzbjzzMMz +TWPTWWmHTmFRSBSvgBPwwwlVzhMdwblhbVjRLL +TTQNNWWgHWQHPBWTNPWNcqJtGCnfqfpQZJCZpQZn +CqzCGDQJCzzftfRqRzzMdvFpFpccdZFvFMtMbd +rNHwmHVmswsHVsPTLnbFSTbZZpFcpvSZZgpg +vPLhLLwHLhVVNVvQhBqDCBfhDzCffG +WsBbBbsWNhsPsCNssRWLPLpmLDDQHlJlnlzFnDDnzF +gcGfqggMqfjjGwrdDZzQFmpJQzZlFDMF +qdwqvjdTrwfvvBCPtpVvtR +RQdbbRHtHRvqZtwVcmwVwV +WnLNnqFDlDWzzNLLrjClwCZCGZcglGCccZ +LnTFfWBpffrfrhBqdsSBqhBJHb +sqsgJpDMrNQgGsFMsPCfjCPChPWjqSWSjh +RBnRnZVcwZllLwbwwLbZVLclhpjRttSdtjPhjWShWdphjCPd +HwHwVVwVnBVBmmGppNFzrrsgJJ +WpmDFlQlzmmgMMLMLQVTvTTSwNbmTVwTtHHw +jrhPDnDnnZfjPTNtHSVTcjccwt +CJqPfGnhGZCBfnPJCrBCqdLqMlQqDLlLRgLQFFRW +vZVvDZsvhDZhZvzgVcgVqPqmwWMqcw +bdTbdBBFQcdCdcGmcP +bmjQpHfbpzDJRjNhJZ +twRrwjFptprQjjjtQRdWCmNJTlNSCmZQcNlmlSST +VVDzMWDnDHMzLZDNNJSqqCJZZD +HHhhsfVHGbnwgjfrgdpgWj +GmszZGMrLmnmsfGVRcVlwtwccc +SSCgbNqSTgCCJMHCJtlVcwVbVljlclVfwf +HTCgHSgHQThMqWQQSgDnvBdsFDvrzdZsLdmLZZ +PRlMlBPPctVBlstzVLhsdwCqCdCNDjSDdWmMqdNw +fZrQQHFffgGFprSJSgvZrfnqjmWdnndCNGWmWDwNNDCG +rTvvpJZZrfpFSbQQvrrsssLRVPPtlRtRPThzTR +FqgHFFMRTRjRFRpRRjFtNdCtJCMnNNdrdMLdrQ +VhWSmwGwWVbGbvlwwlLZJLZSdJZtNCtnTSCJ +BmWwWWzhvVfwWhmhwlmvwlRqHpscHRTpTDRFfTsjDPjD +MJMgGqMFLPGgWVjpcmjZTpmZjZpJ +hdSzzlCtzNdtWSdndttflBmjpBRmvvpjnjcvBjmvHj +zdhCrfztrDSzfWzdChrhlhgPPPGDgqFFLGGFVVqqPVQw +ZQZNQRZzFdCCgfLcCGDfScjDcG +vsmwVHTmTfGcSHjcDS +tMsmMVlSWWzdWNnQNJ +GPRcQnwwQWwFFnrnnldSqzMfSCdfdldrJf +LpTsjmZTsBZjpmzhLLMdSJJSMhCC +ZsZBssBsDpDmmVBjCmDZHgnVNWvPQPNPGvNQncQPcRWn +pznzpzlGFrvGHGrnnMvDmBMfgfTmsBsTTghDsg +LJtWVCWLCNPcSbdcShWBgBThgTfjzwfhhz +VZZCdLCVNNCVbCLzFnRqGqlHprQZHRqr +dFTsQPdMFsMnWFPdSnwBltftttvlflNN +VLZhZLqghCgzqgrLrcgVgbCvtDDtwpqNpDtlBRflDwNqDpNw +cLmVhVcgbZrVhrhCLhczhQdJHTmPJJTjvTJsPFWFTW +SSwNPNHldNJSngHqBssQvBfccB +mMppmDprWpFGRGWmWrDrtGzQfcvvQZBBzzczqRQgRqRT +WtFtFvhvpLphNJJVSCbSNP +chpGMMzcwSSGnQFRQQFWcFWn +sgddTfjLqsWrRtLvQnJr +CsmlZgssbRdMhzCHDGpGGG +vHBrTzpMPTHMtbBRRJGtDsNB +QJWWVwnCZmQlWQWlLWCCmmLwRgtDdDbgngqtRdRGbDNDGtGq +LwmWQLJcWmwPrpvpjjrcjT +fcsWnWzhWcWgcbfbvtbHTRvpvHttmLtR +lNSjwjrDFjlFhlZlQTpLHvSHptvTSRtLmJ +NwjwrQDwFCZBCfWzqhqqzc +fgNJNRcvvWRfWRrZFldlwlFwfFllflDH +spQshQhpqhJsLpnQVLqBqlFwddHSdBFFjSFmwlFmwl +hppLsqPVLnpnzJPtqtPPJTCgNcrcNbrrGNcgRNrzcZbG +PWFdgDGCFPGhMtQqHBrpJqqW +nlllLNmnVNNLllVbVRLRsQMqqpccQQJcJtqcJcnBrc +NmvZLsNrbZNjNZVNGvdFFfwdDhPFdDzC +LpZpwgLsLSzDdjVGpS +bWBlHqqBhNJWNbJQFzGtCtDtGGjNGDgtGC +RBRbJggbWRRmhWqTcnnfnmZMTTsTcP +JJgzvfzpdzzJjJhgdfhvqfdScNsLwwGsrRbwRLbcbVrVRp +WDFBTTDtHTntltnCnnntCDwGlGGbSwNVSssrbwGVsVLs +nCHMDtCWWTCCHmmPDnZQgvfQgZNJJdvdMZQg +lFDgvlsGvvZGDsFZWgGvWrPqnmwwtqmMVSWrSqMM +hRpJhLQHhdTTVPmVSrqwtHmV +ctJJJfjLpjglZDGCGljF +CnnVMbhVRbQQZjBP +rlfsLFLtmLSJscttFfsdjZwZNNwBPWRjRNZBZBfQ +tFrmDFlDtmcltFvqVzDqQzGvCVCG +JzzJzVrmzJpCCmTFmjZS +HtDDtggWssqWfDgwDWvsfDBBchZjSnGGpCFjSFZjpGjFShZg +sbvbvfbbDblWtrNVNRzRlJPCzM +nlFnFWsWhrctWVdJPDPTnTNJPJQJ +fHqvHSqRqSHjBmqvmqqHCtJSTZGdMQJDPQDPPMdNTMZN +jzqmbtRRztmbLHcFpgWVsFphpcLV +PHZFZFVZZfHgpwjFtmgjtq +rpTrTNzzNdrTJwgMwqCBJzJz +vsTWbvccRcdRbrRnRRbRrcvVpGlGHZPspSVhSPPQGGZVHV +HWnDDjfPFccDPhfchnMMVWGzzpvGszCCGWWV +JNBtBTQJNwJQjTpRVRMvpLsQzsRR +JltNSrBjmrHfdPHnDlHg +ldCJHlZFspjzHMnp +zvcLQBQcQvhBwmcDppqbNpjMLnLDDn +BvcmQhWWRzPJJzWWWg +ggSTPZBwTPTPSTRwZPBnwPMLdVvBqzsqLzqqtVzqtzBszN +QRmhQhffCQhJcDfmpChQWJmJNNtzvqtLdvNsGtLqNGzvWqvG +HQFCDhDFCCQJQmZTZwTSSwrZnRFS +QbFlsMbgPWPlJWzsJsJZntvnvZtctHBfZvBZlD +VTqpTqmSrhVLqrpjNppgntfBgfjddHffZBdtcB +VCwpqqqNVgNVgMJJwbsWWGMGFR +GCwRjQlsCQrPrGMQPsRvpdvgnjgmVVmSStptgJ +DzNcZNHZZhzzHhDzDTLWhDzSdJSSpnnVSTSvJJmgvSdmmn +pfLNDppNWHqDWfWbzcHPRslCGbwRCPwQrGQPCF +hVLnDgCmbhltrmDlhbhVmcgFBWdSBSZZBFPwBLBPfWdPWZ +TNTjJNpjqGMTRRsTTCZddfWwFHFWHSSJSFPS +CGQqvQRTNzTpQsDtmcrgDQllhnQl +SWrtcHWjcWrPcwWrBwSPffnJNsqfMNCNqNfJFfSq +QLQvhBpbbvdvTdvpTdGDbDQqqqslsNMJlMMCqMfQnlfC +gThhpmDLbzBmGLptrmRZcwHWHZjVrW +gQvzQRvSSbvvJvQgfRrfbSpGqBPGwqwVjPBBwwjpRmjB +TcNHHVVtNsDHcMcdMBjqpBnGnwlGTwlPBl +MHsMDHFMdDtZddZdFdFrhhgbFFVvffrzzffrrS +QSFmrDSSQrqlfmDDHPRTdrrTPRbsTPTsNN +wBcclhhgwgMhWLLtVMgVvzRTNNjvbszzTdjNdsRbjp +nJgVMtBhwLBctmQHQlnCGqmQZZ +sggtjzzggfGmPbCMvRCMvTmT +RDqqhdQdDlcDpqVlLbSbZFSTTPllbCMv +hqpQWRhhdncDQcBsrwzjnfgtgGfgHs +MTrzlgMNQNggrrrPlzQDPCsFRfscTfFVhVftRsFFsScS +nWWHZHhZWJjjwjLjwbLbwHGSFppVfFVcGcFLfFSVttpf +jWhZZBhqBbwvZvBjZNNQrQQQzPMlzzglPB +jLVhJZQjwFCLRjQhPRZFLDzrGDHpDGsGqztGHststC +SBNlNmWnfvdLmlnvfNSbzrDTTzprdqrDpGqqpHrG +bNmSBnBmcfMmcmnlfcnNSnLhZPVVJhwjZRJPwjZMPjMZ +VpzBDgGTGVNNpSGzppMdTQwcvFdFMQdcdFwc +ZDsqfRftWtllmlWbLLtjFFMwMrjCcwfvMFvwcC +PHbDLHZtZJSJPpVgnV +bRvTdswLLSTvwswSbDhsDTvFmmGRVmJGZJnRcGGfFVJcqn +MWllQMllWHrjWPNplrllQMPZJmnnVmqJcNmVFFnJNFqVGC +PgpQrQjjzQWHzpBdvtwhwdSShBZTsT +MhTwjMTsTRFStjmSMqqppBrHpDrzHtPqbD +dllNcZWgldLvcsvvvvgvWddlHffqBHBBfPzbbqBpPHrpHNbq +VddvgWWdCZhnhsCSSCGT +LPjqHnDNqqHNllqLpqPCZCGRCssGdGrGFrPrgr +WVBztWTQSQMBQrGgRwwwCGgtwg +QJMTgvbTTWSzWWvSbVJTzJllJlHHhLpNqpHqjNjNHpjq +PCHCbPPPHPlTThBhjGTTNhMNTh +FrmfLqdqgfmfttqtWqfrqdhshchDBshDllDBcGDhGDWs +mqgdpvFmmdLdqqQCPHZZblvwZQZl +bQGqmngwwgSNrBWJWdHZmjfZWB +FlpRLCptFLMlLPRLlCCcCCMpjJZJHShWdWvBHHdcZdBWZvSv +FRPCDTTtFptVTnQnrGbwbS +LsdmnDMTLbzsbNtqcb +lJjCnHSvQRRwQQjRRHQbgWbqctNJPbcWrcPPgc +RhGSQGwBvvGShnGlHClwjmfpmfdmVmfFDBLDDZpmMf +ppDnPmwvNDjTjjcssT +qqfRHzdCPHWfhHHtTjjbbLLGZr +MhzqWdJCzqJWSJnpnpvvPSPP +NGWdQgDDHGJgQLznzzsJFFzvzB +twRCpZVjVWqVSqVwwjtZfrrfntfvznBssBncfLrc +jRRwCqwCZhlhZRpSZpjSqWwqmDMQdMmHPQQMHGdlHdTldNGd \ No newline at end of file