diff --git a/03/Main.idr b/03/Main.idr new file mode 100644 index 0000000..d0cbb27 --- /dev/null +++ b/03/Main.idr @@ -0,0 +1,56 @@ +import System.File.ReadWrite +import Data.String +import Data.List + +data Item = I Char + +Eq Item where + (I a) == (I b) = a == b + +Show Item where + show (I a) = show a + +-- Define the priority of item +priority : Item -> Int +priority (I char) = + if isUpper char then + ord char - 38 + else + ord char - 96 + +-- Spiit a list in half +splitHalf : List a -> Maybe (List a, List a) +splitHalf list = + let len : Int + len = cast $ length list + halfLen : Int + halfLen = div len 2 + resultLen : Nat + resultLen = cast halfLen + in if len `mod` 2 == 0 + then Just (take resultLen list, drop resultLen list) + else Nothing + +data Backpack = B (List Item) (List Item) + +-- Parse a backpack from a string +parseBackpack : String -> Maybe Backpack +parseBackpack input = + let items = map I . unpack $ input + in do (left, right) <- splitHalf items + Just (B left right) + +-- Get the duplicated items +duplicatedItems : Backpack -> List Item +duplicatedItems (B left right) = nub $ intersect left right + +main : IO () +main = + do file <- readFile "input" + case file of + Right content => + let backpacks = catMaybes . map parseBackpack . lines $ content + priorityTotals = foldl (+) 0 . map (foldl (+) 0 . map priority . duplicatedItems) $ backpacks + in do putStr "part 1: " + printLn priorityTotals + Left err => printLn err diff --git a/03/input b/03/input new file mode 100644 index 0000000..a2ac077 --- /dev/null +++ b/03/input @@ -0,0 +1,300 @@ +pqgZZSZgcZJqpzBbqTbbLjBDBLhB +wHptFFsHttHFLMDQDFTbbj +fVfvsstwPHwNwfNGfHWRSnlpClcJzCWCzddSrddg +bdgHbZJHgMHgJgJctDtVssVcpFtq +rNNQqBSzTcBPTDsP +GWNNrhGnNnWNzRfnRQRbhCdqHMbdmbZddbmCmd +BSBDzrSwrqccDDwbfcBjsRwggClslTRWGWGMFlsF +dnhVhLJtzNZdgCRlsTGWCRJG +ZHZdNzptLNtPhPdnprPbbDBrSqrSQPjbqD +rlSwlrGvwTTSwSggCJGQJdhVgJGQ +jcrHrMWfNHNzQgVH +WbfjmBMrBrrmLtqMbwwsPTvPpwvBPFPsws +NRNcHzbzbMRcNPjPrrlBPlbtBl +CZwVCCpWggqprwtlHlssHtPr +WpmLghCVCqCnmVTLnccRQvvQQHDhNQzzzc +NvGTmNGDJsrCmCWPHpCP +nqfVfnFQnZQfFqzMZBPtppcBPPCBptcrbF +fhRSSVfqMZZhMnQfjVzShNNlLvldsNDdvvljGpllDT +JGRNWRGJbGmCGRbLmGpqShhcQpQgCcncScSQ +FFdtjvvpvVFnQhhnQhgf +ltvjjtjHlzBtWRmNPLZRHLpH +FFCJFsvgLsjLgWzJFWJgGwBDbwnbwlDddqffnjnlnd +pTpTMQpMZHQhZQpHPZMmTMlwhDNNddbnDqdDwwlbVNVd +SHpmrHPZHQpmvFrqsFvgCsRq +TtWpWhQlVZrVptJhtrtdbLPDPbjFbCCWCvFFbLSN +zMGlnlsgSSvjjGSF +msznlgcwMnRwznmBqTZQJrddhfQJtBJtZQ +mwTwLftmqqSHWfCfLHjWftBthNNNVrlcFRVNrNrRTrMgrRNg +pvJPJQPGPPzbpVpVlMBVchFl +bzQPQbQQdsDZPDGJnBGnPGnjHDttqqqqmCjftLCmWmfftC +ZNpfdHcccTfdwfMFNjBttMgMbBnvlvjBmB +QVPsGzhbszRLRrgvtgjWgljlRtgt +VJrVLsSrzLzGPChVGzbrrfpTSHFfDDHSdpZFfHpDTZ +NPpvDbmbsmdbNvQvDdWQpmWSnnQCLBnCcQSCnnLlwCBlZz +jggrtGTFhtGfjhDVjrjgMftFwnZcwwBCnzzVwBBwSZcVwLSw +JfHftHhgftgFJWPdPDWRPDvPJv +ZSLLZJGglDSVNDGGGgGgngGmHrfLzmHvvjfjwLhHvLfHHr +QqFWszFMTQFdFPMqBmWBHvfhCwCjhHff +pTsdppTMPtqqdbnlNVzJVbSSnbZR +gBqDccrrJDwmpTWHHTdWMPWWZFHF +RNfnfSwRjlLSWjQMHWvQZtvH +GRLbnzNnzVRLCqhwzwBmJrmc +CcGnZGnGlRncsspmFmmcmGRJJzCDTzjLBSDfqjwDDzDLDB +hHrNdPWhrbPdhPgVWvvrgWdfwjfNzSqfqjLqzfBTzJzJTz +HHQhhvMWbbdRswmlsmwsQc +rrwhpZPrccRpQdcFDJNqhtqtqMLhqfMh +lTtTllgbzTlJsmDMvbLbsf +VVWBTgzlzgGnngrtQRQRtCtwZRQB +HGnGvVdLhlFcmvPWmT +jwBLqZgjrtjqmFsQTscPQs +ZBNZtwLwztLpMrfZBLMdbdnfSRVVfnGbnfDVGh +LmBBBzQrBgBhmmggmtdVdhJNMHNdhsHNDd +ScSZbRplCcMnSpvCfCCZcpPwtJPNtHPHNVVNtPddwlNH +CpvpZGfnffSpnvRSSbcfScQBWrMWmjrmFFBzTGQWjMmL +sljSjSgsjcCLllsjVgSjCtspQwvNNhdFwFQvwpbtmhwhpN +hDqqWzGRHHfRrJnrWrfWfHBdFmBFmBbdBGBpwmFdFpww +TDnDHZrWWHhTjPClClSP +wGNQGQDGjqqmwHHs +MWvvrzgfsdWsvMrSdqJqcpgHgnqLFLnjpH +fvsPMsPdrTZhChNDhbhPVN +sbMgDDtttVvpMtcJsgcGGBBfGLBSLclQTGPS +CWHWzhhRRHjqRmSGPfBSzJfSBnBB +HjjRHWFWhRRwHNmCCRHhhFdNDNrdptMstJvsbMDtVptd +RnSwRsLsnSswjDDDBJPrJv +cpzCzlczHTJVQhvBQlDVDj +WmGzqTmHSsffqqnJ +vQSPHMwpmpQMLGfTPVLRPRVP +hsWhnncsJqbGjGfcfBMMRR +sqdNWqqghbsJslgsJqgWllMWDppSvNCHQHDSSHrHrHCSvvCQ +ZWWnWMmmndQZmffcdZcmssQqrsptVwwTtQHTCTHH +SvvrPzvvFDzGzTszpGGwHT +vrRLjjrPhLjrjPDSfdcMZnmdcmJcfcRf +HpqWhDJjzmcTSbmMBVBb +nCzfLtFnZZrcbcVVfTBfsc +FtRFzgrRtnRzrFwzDjljpjgHNJDlNlhN +gtNRRSSrRmjshHmm +PQDMwPwMppcQQcvCFlhLhGmjflctlnHGjf +QwDMFFdtwFDQJZZZNqSqJSqBgBqTNJNg +cddzbbzQflTDcDfRbcfbJVsplVsChNghHNsSsVpn +FBWFWjFFCjWPBSPPJsVpppPSVH +CrCwvjWvmqmvrBvFwZRGQQDDcGTcfbddZdRc +ZBQqdGLFmmzDmTZz +PvrVMvGgWmwSmllglS +NrfGnvWWPhfpspsGvLJBsFBbqJCbdQcLBq +DrwTrlfGThhQTpDdWSWgdgwLLgBSZH +bqbPRVRmzJCLWSgCzCLH +jRtbNVtNjNqRqsJtbjbMDQHQGlchfQpfsTcHpGHr +tMnRcnpDcZtpQDSCCsGGHvcGPGqGsr +mzJmjWJNlbfmbhzVCCPmZrCZqPGCgZ +JWhzjJBdWnMLZtSBTw +tvdLttzvtHLztnQpssdTPbMqbqMTdTss +jhSRGNjjSjhSDCNhRgRgclNjmfZTPnbTMqJJfqqsbMflTfMs +WnCjcjDRCChSNSCNDjNhGVDtQvVLHzFrpFwFrHFQQwQpzp +fLbLLLLQhVPhBVmDwmCfwsdwwDps +GNtctFTSrrJqGGpHFcTJFTwsslwmlmWsdsqRRCmqwdWs +ppctFTTSgHcSrGrrTGFcrrnhhQbPLbQZgzLvQQVVvZvLhv +mBBWnnBbBCtssmRThRDllR +wfwFQcpHFpddFrwpGcHSHdcjQZZlqqDTTjZqssRhWllssj +dWfrcSGFpgrSzFgMbCPNPLtCtVMV +llLlGLJJMjJMGVSvVMSLRRHvjCZtgZccttnmbCtdCcmCCztn +sBQNqPhsrrqrrwrsppsHswsZcmnNCzdZtbgntcNgcctnCt +WWFBBsPwpWPwBBHpFFrWGRMRLlJfJVMJRJLWSJ +vgMvQnPMntnSQPSgMvSMpNJfJDNNRpfZmGQmbDND +HlbjHHBLjCHGZGpfJLpfwm +qdHWqBbbbjrTzdqFqssvtPMSSFFg +TGDfDHSgtTzPPbnCtnNtVn +WQrWMFpMWMQbCVNPRWVWWv +pdpMMrhrprQshlMFjZpdjZMgmlGJJGlGDBmgmHgmJCSBHG +zWWBjZZjWPFFPPnBCVdsqmnCdSLn +rJvpbvbpGgTGrNJGGpRRhsCqSsLhnsmTVnSLTLHh +gNNNJDbpvGNfvNSDPPWQWWPZZWtjlQfc +RRVbWWWvvZVWmsFSsDNbHsDSsg +CrTwJQJpJpCCwvlJQTTPsfzDgfwNhszfszFhzFDh +ttQJtvjpPvcqTllJTPtPRGMGRGLWdVZLVZjWdMjj +NnPCTQWMMQNNNWwWnMzpHczzsZcCscddHdGs +mqRgqqVlLgqmfVzcGpzzSHGZcgcz +tjmZjZmhqftlJRJhlTMPTPQbrPBBWnhnnT +hvTQqpvTqjvhpjnCqmCnSDSFDWFFLSSSWDnSVL +tZwGgsfPcltgcZltRgNSDSSSSldmWMLWFVHd +GrZtwRPbGwwPcGRsZGtRtgQJJhCjpzmTBTvJzJrjvzQp +rwmwqDWwfDtztnFGBB +LPdpdVcdPGvPVgZsPtlhTTtthHBhHF +dRdCjvpCRpjvCMZgvLgRVJJSWMqmbwQJbMWGWQNbbQ +CMCcMcDGzBGPmBmznTNbnGbrswNTwTvN +SSHVWZphqWWJJzNsbnFwFVNjbz +flLQqHzzgtQdcDRB +mdzvFtllBgFttGnvfMwMVRRZCThSNZVhMd +pDTrDHjWWJPqjDjDSMqNwSZRZhNSRNCZ +jpcTpQPWLLpDTLcTrPjPDcjzzFLFzvgLzlzfvGFgfmgFzF +fQVVPzBpFVVrtrsJ +PldSLNSmWwMCcCMMcCNN +mSPlldllmPdRnLRwmbnLwmwvTjBTghTHQjfgjpZHpfHHfZbZ +pmfMcfprMqMrZZJcMZMGWTsFCVCTVPPsVTWCGPDP +vrvvvLRbBNNBbvBbjBHbQhgDslPTWsPTlFDsFTFwTWlDVQ +hgjznNBjHHgrhRHgrRLRnRfSSJmdqMfffzqJptdmmmdd +nRnPlCRPWPMFqwPLwq +tBGfbSbHtBVQgrbrqfTFFLvTNLLNGTGMLdws +bgHVtBDtqnqqlJRD +SdSJrHssFBSVsNtMMdRWnTRhRl +vcvfDvgvcwvFRlbnwWRlMhtn +DDDqcqFZQPgcgcfvDjLDfVrsSVrHBLJVpLpCSppGpS +gJGTFLTdrpLdBcWBvnllvlMvMC +RRqbbQhwNZZwQRPrSZWnvHSZWSvSZC +fQDNRsrsQzfbDrbsqwdtpgJVjdJdpVfJFLFF +DzWqFvqpqFSCSzGRGmwfntGjmR +cbhZNJQBtgMHJbJcNcrmfhrRrswmfRwnVrhG +bJNgbNdJBBPMHbcMNMWWvSFpDLFvCStqpLdv +sLsHTsTbRLRwqssHwHjFrPDwJDppzFDJmmcrPJ +BnZGBlMZnQSgSnvVSMmJzPDCzFcrLPPJmpDG +BgBffVLhQLgvnBRRssfqdfHbHdNT +HRPVmjqBqVjVRRPmcPmJjbDgLDDshbfRLlfbfLbhlL +rtTzSMSMFpTzfgDzzgsLfLHZ +rNpGpSSHwMTrrdHGNtTPmVjnGGjVjmBGmmBjJB +DBqDQDQHSFlHsFnN +MfLfwwLMWGLrWMMnpSlsnGJJlbFVjV +gRhMZzhrFLWQvTPqTPcvvh +NwwsHwtnFCtzcPdbvrQbBqclQq +VmZLLTLfVpwMBrVVqqMM +mgJDjTgWgLWDppJZJTWZmSRzCtRHhGGwHNzshGFFCSRt +RGCCDRdFZdRCMzzGCDGCmGHMfqbNNNLQLfFqnnqnNQqVPnQn +glgcrwrJjJccBwdSfnSnVqrqQVVnNq +jvtBsjstgstjltBcWzTGGddHTWDTZCmDGm +HJHGZZHnctSSDhZtmZ +MjjQFSvQlRjSdRqdqvVSqCCPtpRpPPDfDmfPbbpphC +SNsWqMNvFFqdqVMgwwBHrGHnHgcWTJ +jBcbjSmSBbbCcPcMjmbzFPhDMDfrfGRhGQRMnGQfdrDh +wHlqwlqpwZqcwVlqHtJVJLTdhndTDnhffftTGDTTDdTG +JNllcwpZZlpZJjNzSzSCNjSmFN +FhwRPzmPWmQQmwFPGGMGGRPnRHHVfDbvJlvDlHSvDTDfVHbD +NpjcpCdqpZZvwvJVfDdDHT +twZtqrBrBQBMBPGn +fBFGjbLLFblmbWFmVfBvrvMdMdncnrdNbdQNTr +shZHHRZhtsqJZhHhgZzgJzVJrrSSvrMdMQrNTvMNJQNrdn +szHwgtHtwPzPLpVFpVPLlfLC +mrsrtrWjljjjvwwgNnZfDHJDqTqrHL +FccMPFQcpczpdMPhMqJngNfqfnFgDnnFfg +BdMpdcDPcpjBmlBmVWts +VvwTTlfVlblwwSsbfTdzVqjhzVjpjjqjqpzV +rwCWFGmJrNCmMRHmwRFPmHQQhBLBzdLqBjhLBHZdQB +rFwDrMNRJDJFPRmCvcTcbDsvstTgfTsg +zhRzdRRChHCFGPDRvWRWvWvHpZpscrrmrZrJcmspJmJZFfpM +wQqLtQLtnjbjVnVjbBgjbBnbMZMZJlVpZfJprsMprmGZZZml +jQjjNBLLwjtQBtwwdGGDCHhNzzWDzTPD +DzzQnCMMznFnCdnFFlHtlmhVRtmVVmVhSF +PWrPPRTfLJJtfbtBfV +wsrggZsTwTTWGvDppQMRjjMCjMZp +fTjzZVTlbffCMvjgMpSFWBNBWSFsvBsNNccF +nJdwdPRQqGqbGJQbmmQQhRSBBBSsPPHWNSWFBtDNBsHH +nnQhwwQGdLqqwnZbpfjMfzpzLbLj +jgTgCwgjMgGLhvRrHrHwhvhV +bqSsSsZFZBlFsBlTSppVvVvnVHHvHnhp +qFlbPbFFsWFsBlFWbsbsmzTcMjLmtfcCmcWtgzgm +rrHbfBLbfMcghcmrcCzg +RDStDtvdZRQdJSQWWWdvFSgNvVcnghhmnnzhVPhczPch +ZtJpJttSZStwtttFDQmLGTlqMLqGfwTTGLfTGG +MrfLWwfBwgghvLmNvmHHHGGQHQSSscscVvTV +dDjZjDPJtFRzjdTTsqVjTpqHsGrT +JbFtlbPRJCzffBrgnlMWmg +ZFsbbVLLdZppLFpcJjCCQJlGcQCMZq +TwRtRBdBClCTGlcJ +rwBvBzDvwNNDHLHzfHssdHhS +gdhgftTNGTbpqJqjjgRJ +lcBcMLFzMzLFMzFzPjRBQjQPQpSqhpbp +mzzmZHZZnZwLhtGfddVsNCCnGG +lblbPGSGrTLRwqZLvP +FffCCFzFCWzzvmjRJnRTnZZNJCTqCR +gdhztVjhHMsGvrGVVB +ZJZjJGHZhDJRFJHjDZjhPNFgFmrnVmgVVzVBscnzSg +bwlWtMwtbqdCvlQCplmsqgnVVScnVgmnmzNs +WMWltTtvvCdwCCRPPfTHGcJDfGZL +svqQJLvSSZrZZZCFCBDPDCMTDpPwMWDPCwRw +GnlnGbdldjhzzhpPDTWjmtMwPmWW +HzVbGnnbchblbnbzcQTZBZrQrFSHvLBBJv +MmgMmVpcRDlvbvpHJF +GSGTLTwhwwhzQqTqwjFlbdvdbrlrbrrDnDvHlQ +zLNNNtwGFCMsWsCWNR +tSTDDDftSqSsTDnTtCWNrbFsNJJvbzJbvJ +dhRdVHdMGRgPJbjNPbzgvr +VllQmQdhRHLhhHmLlGzSqSQDDcDBnnBnqDfSct +zBzJWZBLZNNGLsbTvLbmbT +QdtQwfdnPdPTbsRQGhRvbl +pgtPgPjVDnpVnDtPTFFrJJTBCcpcrpCW +GnWMfBfdCGMbjRNpnzvvNLRNVv +FShJDJJscwwszNjvNjNNqZ +tJmccwlcFlFcHlPcHFfdrbBGBGfjCGTfBCPf +GhlcQsZNQZWhpcGhwlPmqnnqnjJjLRnqzJsJLJ +VTMtTtDTbvbMTfvdJqngjmqzdjmJjCLm +vHtbHTDBFvffBPGwLLZBQNNl +bDphJrpbpnBbDrdBvJdDFBMtMlfgtsFSstfGPPgggPGP +RZmNjTZQNVHQHNGSgMsfPlShSs +VmchTLZQLjVLjmTVmQVhTmwVrWJqbDqddBrpnWbvnqrqcnJB +jWWgThWtgSvSSWlJtlShllPcHVnJHPbMHPcPVPbVZrHM +fGdfRsRdNwfRQhnpcZdVhVpbPh +fGhwNBqNjqStFqtj +TSTBrSDlQlTDrrQclrBSLffPvcfcdVjVMGGPLjLL +qnbnbngFGhhhPfjjVffjff +RRWbmgpnmqlrCwwSrwmG +mZZTsdBZVZBZLVHdFmsNnCrCVQQbWvWjWNCnbg +QSffDGwGGrPGWrgN +hflwzltflDpMpDSllcMDhSShdsdZQdLZZdHTssZzmqLzFmLB +LLRJRshLfsJfWnLBTlTBlFzNrnrBBl +qmmVwmdHqmqGHZdHbbqSScdZQTjjpTFFVBBrlDrzDFBTjFjF +wZZwmcbvHgqTmGccmvdCLhCPJsJCPWgMLPtJsJ +TWbbbNbJJjJbqTjtJJjTQCtnGSBndMGCcSZSQwCB +mcfRfrcmrDRrPsdQSGZQGnsSQMnB +DDRLDRDFPpgmpcgPghpfgvRTjbhTVjHljJjzlVzVTlbHll +rPlPrPllBGgJgdJfHgfjJt +pppZVfFDWssMfFVVFMpsMMVmHCRLdcZCRtvLRdCtCJdHRttH +mDMfDFDmnMMmsMFznDFpzswbNbPGwwSGBrGrhrTzThSl +qDNFfCCNWLfWWhqhDGPMMZVwgpCpMbJwJCvV +RdstRRvdtmtPVpppVbVtrp +zzncSRdsTdQTczQBsLvvHNhDWGjDHNLDSG +bNNpcfJcCtNpHFsJsGGjLGzmLjLmGzlFGW +qwqZdnQnQwnhhzmnMWjmNlMzLr +qhwwQSwStJbHNftS +WlfWSwDftzRltBWVlRDlsmBJPcsZPmcJnmPmFhrn +dLQbQbvGTddTvbjQCbLbhmCrZZPPsshPPPrJZrnF +QgFjQHHbMvdRMVllSqfSlf +MDPJBWWPggVlPVDMSljdZNNpwjwbHZpNbDdH +mGmzcThGrtntHhthzGctRbNRNwRNzZwfdZpjpdRj +ThtcvvtThFcnqFQSHgBSVJll +hVqhFLBngHVFtJjtLCBJVSbbPNNbSmfLLTSNSrrLTb +vsdZZpvQdczlMdMvzlcvvdQprbGGTfSbWmzPTgmmGTbmmfGP +vgRZZMgwdgsQZdMBqVhjhJqBhJtRhq +bgFQbMMbTbQhghddFTFGnmSmsNdzHvzSSzlcHsls +fZDjVtfZLqwpqtCfCjCjlvqScrvzqHSzszzSnczr +jpftjCfWCjCfCRZZlpCpjRWQBRTQQbgBBTMbghgbbPGJBJ +VZZrbBVwbbbVVvgbntnggNRJqRRNNccMcNqJcJ +jfDPfDdGGhDGfGFPCcZQqMpRNJhqTcMc +LPfffPHGPDjPFGWSdHPFjWtlBlwvlwBlbtmLltsmvtZb +TTfJDfrJTSrHMcVMJDTfMcMDBQBPwnPlznPszFVBFgzFgnsn +CqtmWNNGBPzwbbwm +htdCthhWGtWWGNZqcZpJjwwHHHMcHZDM +VvjQjQCZLbbSbTPpSHtFzsHzppMfzz +DJrJWBcDcWJWmmcgGRGRGWGDzHHwzdfRHpMztMpfdFdFdzdM +DmBgGDqJNhGcccWmcZLjTPLVLTQhPtvvTZ +qfhvwNDQqwDGdGZZGwPTTw +STsJgsRtJMZPjlsmdpbs +SCTTHTWHNVfHQqqq +djCDgllgjJjDRRNgRlDdBgtpQHfhQTrLLrGBtzrQhpBH +SVcsMGcPSbqSPmLTPHHQTHrftPTr +VcWnsScqSScWcZbMMcSVGbNNlgDRlgCCNgwWvvRJdNdj +mgPllfRgvNmPGQGGsmQNWlpFtnBPFShncTFShtFShnjS +tLLzMJJwwbbdrrMLqLVJMzVZFnpTTFpnCSSpShCjBJhpThph +HMdVwbbLMbDMDVlmDsgtNtNRfgsm +hNsgsgzNZRghPhZBdssPQfzDmQSmmzQGJWzfCDJJ +bblVHvvHHTljwFCfGrvmfmmJBmGQ +THMMFVwqTPRdZptMBP +QvcPGSvQLjmcQWSGWWGjLCNhhqpCdBCNCbJNdVWpCh +rwtLlzZggLHnHlwHRDdVqBbCdqqVVhbqVnVh +zRDzwRrwlRlRTgrDtllmQGLcPjGLccFmTcGSQc +RWlgQlbcWBwzsJggTfhh +GrnLjHLjmLjjGSLjSDmfJJpfThhfSWJPqJqhwz +vLvDDnDNrCVjCmNDbFlBVZdVRQlRbWcb +mTlwFngwmlLlvsmLHmHsLJhJFfcbdpbNcjCNCbpccb +tZRzBRzBBRQzPqGRqrVQtjjfbCMcfMfCMMjVjfCJNd +SDBBPtZZTdnnwSvg +nddNNMMPNBnBNnBTQSShlSHghlDHBr +VcccVmqJsJsjlTmzTDggmHHT +VqLtFCqFJfVtVjsNgPNNMMWNwgtNvn