The encryption use a "Diana" reciprocal tabula recta.
alpha = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' # global
def Diana(s, k):
k = [alpha.index(c) for c in k]
return ''.join([alpha[(25 - alpha.index(s[i]) - k[i%len(k)])%26] for i in range(len(s))])
The "Diana" reciprocal tabula recta:
print(' A B C D E F G H I J K L M N O P Q R S T U V W X Y Z')
print(' ---------------------------------------------------')
for k in alpha:
print(k, '|', ' '.join(list(Diana(alpha, k))))
It's not really a Vigenère cipher, but rather a kind of Beaufort cipher.
Diana('HELLOWORLD', 'DIANA')
Diana('PNOBLADIBW', 'DIANA')
$K \equiv 25 - P - key \mod{26} \Longleftrightarrow P \equiv 25 - K - key \mod{26} $
Diana(Diana('HELLOWORLD', 'DIANA'), 'MINERVA')
DIANA MINERVA
EJBOB NJOFSWB +1
FKCPC OKPGTXC +2
... etc
Diana(Diana('HELLOWORLD', 'EJBOB'), 'NJOFSWB')
Diana(Diana('HELLOWORLD', 'FKCPC'), 'OKPGTXC')
For double encryption (and decryption) the pairs of keywords DIANA-MINERVA, EJBOB-NJOFSWB, FKCPC-OKPGTXC...etc are equivalent.
def index_coincidence( s ):
effectif = {} # effectif de chaque caractère
n = 0 # effectif total
ic = 0 # indice de coïncidence (résultat)
for c in s:
if c in effectif:
effectif[c] += 1
else:
effectif[c] = 1
n += 1
for c in effectif:
ic += effectif[c]*(effectif[c]-1)
ic /= n*(n-1)
return ic
def Kullback(t, n):
c = {}
for i in range(len(t)):
if i%n in c:
c[i%n] += t[i]
else:
c[i%n] = t[i]
ic = 0
for i in c:
ic += index_coincidence(c[i])
return ic/n
The original example of Kullback (S. Kullback - Statistical Methods in Cryptanalysis, p. 41-47):
The following cryptogram is known to be enciphered polyalphabetically with a number of alphabets between 40 and 50
txt = '\
HSKUS PMFHD UJJIX MSPTP OIPCI WKZVU \
YPPNE USAIG BOOGA OPGPR HBOUC SHPVG \
HQXZS ACKRK VBGHM VSFRY YTKHK VWZXV \
LIJHW ARLKF IJSLT MHKAH QTUVT XSMEC \
FCSKT GOOYB XZVLI JRYAC DWEJM SCAFP \
IEAXO KAQDW EXPYP QHDNO JIXNZ JGNUD \
OARFU ERJOY BDOKE IKDUV TDVEV LETDO \
AFROU NYNBD VQOBE GGSHQ HXOPU ZCOCU \
KKZLT PHKRT CCOAS BZUGB UBBUN OVTPO \
VMIZD EPQFV KZ'.replace(' ', '')
for n in range(40, 50, 1):
print(n, Kullback(txt, n))
The period is 43.
k = 'jlykydrxjwurqbyoofpkzctbdvveldcepufciylpgnjxvmrtfeymaouehyughrtinjoypsacqyfwlvq\
mmbsponbwfcpqrkxdxihvuaepjnajoivprbdszhvrkdoghspvbylcpbjvrevlxxwjducayrgwwsnlrwm\
cyrgweezpgfugtftucfjovmjxrdycnbhsncudutruhiwyofhtqsctzcldltuajdxxowamwbvlezyaodm\
ngjjfkgydaibdfvuziuaulicseoxwrwqpgrnzobwdzfcgjzrnhckmnnmmjxqrqqyemrlshxwdfzwtfjs\
rxxpbwofmjhjvxecxysdpcbcbnlndblirmusnwwqrkuelkoxeenimqkoyocctlyfccbczhocurwfkwfp\
ibgtfjvtkjmlypvrpbumvpehxjwpdvvaawaekrvrmfyjfgehkjjeuibrztnofgevrmlbedlvbmogxmsb\
ywspxxcyektzenausxhdinnnervvtnegqkldjimvctgalviswdkizcfzfttadostxnykrcmdtbflbbje\
sfjpbtokxxihihmwefxzogiblaavcztrzubxzdztxihvrokorxebpdumfthavvbpvaqzithpvovkuzpu\
dnjmxymdzsuqeyqtckqbpltigwpegsqsncxvuntydkjvdsbodhknfkowcwqkfjzkqyugenqfoherjxjh\
icebidyguxilymljgyiatfnkwymvwopcfulinuxxthzcapujmmdvobpekyidzwywszgfuoceeilhqpzx\
tstrckerakdhkupwmymuaihehwnmwqwdevpgknooicedsyitdotbvftltgumxccyucuhdpkwbuhatvzn\
prjcglfrmtlajoxjkhtuahllodwbkjfhcbsotiiqvchpnifvnzjbxvvfozzxaymcefwkathwhhlrsrtz\
wkohjihqzhnkdebkiupenpexjbnferwozpztzhbymrrixkwzyufbiozavmfizcbkwsyfvfmxmojrggvw\
qwmpkwfwzafozcrkgbgqovjmamehtkuhmutejfjyuncbnvhcwlolleubcyzcxjdrvycygnoalxxkkhhd\
mgnbmhkdqotairihimckizfofsulzgkwjayluapelpesaanbgrgybsolfzeunzzdtpjjxghawdmgmblf\
ndesoomeythuxrymwwpkvyadfivjyuyqhxgghbvpkppjgtltsqepertluycvnauzrtnsfdiklycdiqob\
iyzxnnovetjvahcrsozslacywgiaeikzdgmvgpdxtwbstfeglqmpjnkoksdootjnaotneibawkqqnvlr\
uwblphljetmhtzznolcgvmmzusrbmgmvgletifydfkiqexydnvqargqhbglxpxvxgeugkgwnujdpvxvi\
xfvditivyzdimlvobhrojjtxfanqmtjizmcqnggnzlngprhcgbizimzkayugacezynzghwcyubcknydb\
vvdpmoimxlpaosknkccgacbbktpuhixqfhvsrdgycivrfbckchfdcwpvqsrlvneyplvpddbpwnoidpiz\
fnyxzblfrxvpxicrqdtobhsrepiimjkybtwopvqxzngpllofsnrgvqjcsytiugesdjeuevdxcaeiatjh\
zfuhcourzureimopolqzwknpusbkesahzcdatujxvxfheodinukjkmwnksuoanuxljweeymytcgjtlss\
pfhyeifkiacncwwxjickpndipsczcjujsdsovzdhmsvvnnckysomwyuyjheljsgkdwyvnwpxgrbudbiq\
fqptdtyeedhjnsbcsnhqelihkgjdfbsfngfthoyegwndmmmopcruetgdqjucjsorvwswkhcrurgpjbvv\
kcrbexsnzsjtywgpqayrokilwaurqqfqxkbkiajkxevrshzttbicmtqsenwxvnohpwznzdyrkfsraxma\
ityvcowwhztdrrtqbemdzzdqrvincqrirappvqiymsaygjsfoqzgtvvrcmvwuwlohgmafxfwopjxmcww\
qtznlxupnlkdaaczkgzcwrehyxrjneyfxssxsprxagvszclquuviddyblzhwkeyhtahyzemnidibqrit\
ittgxttuieccotyztianhcopxkeayufslmqtvbvidhuwzaewivtlduyqbntifpzowpuablpaekjbczwq\
enxcoukjksopdsrjcopchkietsdvykadlfmsedgyiexqqxrsfwwrvuivhorhiiggccbkzlgwhifuwyyu\
xlfbdbxnoufivcujdbfqbgyesqpfzrrymfxvykdohhozsnzsxgaipwenuqqqjhftolyforkgcrsutjnd\
lfjegvlmqgcyrndqlquqakbcrivaxfvudqglvaxeajzvuaudfexfzpvqwxjkuwgevsoujfwjpvxbzkbi\
rgrdvrjswcufmgufoefogxewqrosjtrslduectfwxdzleavxlhxgamjxadhlbjfenyqhbcupyvkeqvew\
zzlxlryurtuatlzeiftldapmeagvzzpbythrldgmswbcvbddqzeqihphrrshrmtbvrmytjguuyprlwqm\
ondfnzblllgcoemstdagcqfrlbnjimqycprbhppudisgjtjrsupybgrylykvyenvvvogbfyjqommxirf\
qynaktowjcgmhojluqsqcomndyzadcvylyinmlcnhbpbpeoizdjnbsbvsaxxkxnavjornjmnuxhjeinl\
dkhrxquubzdwvliiwbrkuotiwtehoakcsekyronwaoquunacryuyuarpyeezfobyhrzivjuzdpsvzhaq\
yoyxqrnsyoocovjumxbtfsstzbvvhgqhlvuvbwgalgadztekywgmjymmhfzeigttvevgwttccboxzhcb\
akbeimmsbugjohtahnofcvfvuehkbagyykbuyvecogpnhpnncrjtejuiduavslnncqvagprqenefqhfh\
ykucqqkninzdzvomndozjzmbhaflolfrbidtqiqpkwuyythgoaqsvykcjikyfobdamgshwzqhidgzzty\
fgfucayolfwadprefahgoinhdghcxjtxrfbanrxfjnrbpbfxtnpunkhzjkprvkuaxttwdruklnxlhalc\
eccewtntworkblhgveyldvdlelosoqxuizkacggtnktkmecntyffpyzyaxfweodqohcytnbalwgqmafb\
smqnhdxdeadsniszcbshabbcdingketkmydjuudbtyvblkhqhaotvsyelsxdecbpwammarciiwgaefrd\
jewrxdnssubmwqyvrlwevtaqbekbpziygibswhirxezpikxdoutflinfaddvygyrizznaqtfjrcfojsg\
fmidggqpvhtpfhdvpsrbbltyoknruddawjanbhsmnpnonhonpwmfguxllbrmtgiixxjzzhmhyosncmzi\
bozvyzaoecymnrwhlmjteavzrwndnekubsptzcfcwixgbpzpubymyosdauyxkaifapjzqjppmfoakbqx\
eysimzafnccqqexrbfmsvbswftobitmidkouwdkhaslnkxklhjkrkcpzgqebclfyrhcnvobwvqmadtwq\
bksuiblhwyzotiudmrvtnzincsqbzbporlvpumkuionnbuvdzsalegingtdidgccamauxngmpzamlvqi\
xuoraoyhumcipjktyozwgifhffkrelttmqjgqbegjqwnaczkxrbcsyeogvwnqrgrldrijojrfichvtmc\
zsnadcprydgaeygcwxtzbbzjlbbfcuvrkzjwdgsxydmntkhnncdmjeoepehpnbamahnhktimeekstlws\
thqjbujyzslczdnkyocypyavkjcfitrukbzikcjusggzwptfzpufyvxfogppnyepmpaiijirqciydgbm\
fvowzfifavvqaspndqgrlropzwmrojykwwxlokiszakhlvjfqlezcazabcrzockgkwozpqpluntrtfad\
uovzybtekwjfbgihlfdqfmpwbucwffzahrqdgbqywcognjguuqiayxbtbkknfsshxxdmgkysunrcufbw\
iqvgzdnfwhxizigbafojbvoburrexzjuwtrqhnesqcdujxxlhbdzplawhbarkgeooxerbwfbejhzctsj\
kqhwrxyqfmdkdpexfcpfpanulpkpydxhggyvcxtvvteruzdyjpulgtnfjibavcaeipxyniepkwhhhiym\
uzqwkuwuhqafkbgrnzrmctwilbpxihmctukoeaoswfiwpdrpitqscgrzsxmbaapwdlxufellqyqcmzsz\
gsdgwjgtpzyyrykrtbrvwjqncbleoolxqazrujywlseaseijqnimszbisrcxjsicfgxwpbaaobgibhau\
sbhbiznlmnyyoiaoyvdfedrjwvneppykhtydsndiqqfjemssssimjmqahbeadcokxbartbhmjcpznhqx\
irqxgmaafgnfjayzdouxpwgsvcocokbagypxiophnuvoeghljdlioqvsnndmcztarlodkftiycbgiyco\
ngijtsonlnuikkolavhwtvtptgpswkwgvwrjkaumzhpcqfgslirjruccwamrdscnkrwnnsurpbgumguo\
uhfnlvpdbyeyagykdcjvmaqvohiqvzllzbktavyljfbjdnbshnufazlguupotyrfaxhlwkwkqdcocizt\
fasjcegmgltsegvchorqdvnfjawxcfnjxxltsqoqcbxyelngtwenrhfsheuxprjyvsbtsjagmxpzhbsv\
anaszqkicpzezpzgdxojhmoiqxjwwdedaplcdcltptxnpwmlqtrndtgxgbnsovjtjsptlpjktdwekogx\
cpzblllrjukfmdcvkbdsdqbncwranrvrhuvowesonwancxzmmadsovttmwovhxryywvjeaulmzpgvnxk\
nsddlztngbroluxqtomlcldylyrrgdirdenbwcoodxbcytplzqadktluzmacutpueioabiufndkancne\
jscnazwiigawdcheraajzyhysdykdalpxzledxbrarzosfsvanrdrtoebvtbaztoynnvjineygpxlsgu\
nguzrgrnpmectnidnqgouwmjgfosoynmlvzutgtqtmgpijmuqeputcegxrbrojbciyrihwhfrjrcbyyy\
gjnyxnttmbgkbuxxryirlnnoschlftborhyjdoviecadbsomfciifboapihxjvkobgkpzahmfehapcyw\
qsksdlvhyizwrottbrpekwykvtjtqxtdervidmexhfqcdvmpidiihrlrwxwtyopfrrvyngmpoplheedb\
jilenvcpqwigwzpwiowdfufkasjqrfjigpqulwmeecaragayjevqjhxftpukxjhrnwwjbgivzvfmwlwg\
lygzmxrgovikmvfoyapnkprpfqjxmqxgjiicypcreoaducmbpzkpprujelqewmydvwmhtdzkvfhlfghu\
wxkpvehlczxlryuzzxddemvghxbfnewbhhmifjnbxupoxbcwogeimjvavhilgcxcacaotowmyfymtyfy\
yswwmqnpfiumfeumyninfbmaftguzgrlzuoobexhvzvhnobvogaehztkrqmrcxduwyhczsqqxmmqdwts\
yrcgvzuczmqkccncnkeanibehpbnxcguhoaphpelmhxyuevolmbmshligxmwgxqeeusiorszjhygwyvi\
sgovrunerjrokphcozvmovrjqwrvbpngsrgdaqfotispgstjzqxuhzazignixlguyiigadbiakziqqwl\
euyfppsmmgpzoxlwzxhdhcaswdcwxduupmajifpvzwhgzwdhgdkvrxpmufzmddbahcptesitydobtgfu\
pfcscjpcdmgskvoovqstatqcaewagutoobvzuqzgcorjdwrqsenhzxqxukwptgozbkikotlbyoijlicb\
ivoqcedbykmufduumbfbnfypvfkucdmrhtwyoxkbplpzegiqexksltjhopmefclzdhfjtyqibcazbkjq\
dupgwhxtlghiyblaankegzwzsihmgvmmfwepuradmvlediotyntttdtuzvcumbsrrkdkpmreiouyrbrg\
ghzvpxinihkpikxzusguhvhvadtlgnhzzzcuxfordfxhfuyxcuseznushsjnhyoesnbcgpnlqmlfhqrl\
ptngsoteoiguxmzalnsdlcsjskczbqpoxafsmcyfvrgrtusmuesbkcipglladbvqoeznxzmgtvqqmflq\
newprxvbxwcpuavwdclxejvkxzrvzkrrntojlicxtrptqshapvuiszpqsajgyswcinctqkqekpkkbapk\
frrfdqqwcqvcqjxhyelfcqzcbiodtppoybkuevheeohirrzaatfqdsqpsjijaddujctoltduuysjboni\
lctvvsvtdfqxgfcyddxnjpnplwpokonwmfwwsvwuqcndcansmwkobcynnyrwkwgwasvtqmyxrtfewvxf\
uxkekkqbfamrmmjloneitkcjvvruxdmvknhdxeyqsoywtnkzemlmkdvstfnqaudmzczpkzkbdffmszox\
jkcmfatgwodtpchcfshbxxgxsiqkjrzblypeykshbdohfjajgbjcolcunomgkxpreoltvejualcybqgj\
bevryaplshlxkqoavirtlqstgzevsrxccdaoldgywisbftrakkfafrugvbqfwcgtisejzzxbhqplmtfl\
szycqtsjzafrxsaknvqwgkyawbcjqkwwltdfiedohurwaqrgtacdrhupzuciwffxhmvfhahwiqrawxzk\
khbhoqwjjhnnxkzjwtkblumoqarvcxiiihliwyltetqwltxlxkobbzgicbyptjiebthrsjlnzufahzfz\
djqhrfxvlqmrhazaqirffjkrospfeiirpvydhzfqyqmlrzuhlduntgnswjwsdpvqtqnillkpbhcjvpsu\
ylbkzuvgfohmuimczixsvbisvxpxbdyjjwubxgmwpbxipqcoftwjxizldzwhasalcfjpxdgufkmfujnx\
jynfumzjugoudxpghlsqaxvydivldytrotlgewgdlvaoduxtwovjenmrqiuwxcufddfvbhhpifozjzcg\
nvmcnwjdvwxobrbclyoxvpnghhhdntxafhkoxcvjsfjqtrxhhjydxkwjmsxfisyxjxiuruumpsmflklm\
gccofdztfoeuzgnajzziwxjhqnxbvvuhwrsxhzxosvnibxcxddpolkklswecgpotsmimntmnozlwbsrd\
tyslnprpinzinermbjbykrmkdyhlofkgclwzlrxmygsyiyjfsjajbhthejbynoigvauyijsytdawpjqj\
vlnhedoifwhvgucfwevsxcbbayvcphlbcezxfamozbmcqutczenwntdurjwygtkerplizyhhdlcubomj\
dpndzclzqoueharrdnpvrcqlciueizxnqghvxvtiddvlrtvhhrvxohkzfckjlcwiejhfedikxyvqmyps\
lahizndzhmvpoefhshjtnnrnlwdytedtpdubcarydtcxgdxxgfvibfmhzsjzjxurbzlcsxiqxihdyvsw\
ranmqgtxcdrwxhlfepgmgashqqnvjsqceduoxtsepkesgelastyfgdhoqmkpywthlumkzgbpyxmjpmoq\
vyksavpdceoyvffhpufbmtqbaggttjpngmpkvqscyoxemgzisttgibqtvejiiroiddxedfvntgspeabz\
wrlvjwmdftbwuancmyubqslcbhhmmdgjnxnqstgmkbnfueifvzqwpkzjasyungzhburhijyfbnozocru\
taxwrobrzcotngjthbrbuzwflfkiylunkejbdreecxihumeayjbmxcoknzecvhjipvykcpbkcrcrcpys\
vbldchacrnatqefyfnjnjiqxcaugqczzkdjrpppltykdqunjdgxmndnayaoercinantputebafavlugs\
hiuyxsmtxrcjwlptnltkwumyuaduomvlcefqjxtmxvxycpkskbsuxgcwwghaarydekwibizqanvigjzd\
dmcwtnofaomyiswtjjtzzrhqdxcdpwfzhrjgtjtkjulyjqltyxnodwpydknxlntruyjsypgyimusfdcu\
dsthlkhowxvxbipbjzvcncqcyeesgrljlbgbkeztqnygltzijcxhjoprdgqrcsmcvnhbalogxvqinfli\
repoonkcqpjnimrrobfwrwkgrkahvdklygskhnphlwutilrageydmzbhixouklepbrotmbjpwwdzrhdi\
qxjgwtoftzynkxphhkdoxipdxqghuyjzwbqvkmdacvtxrxrfdvnmtebxjoevozerfvahoeqpcxhhnlym\
ewwnyaacgdwtkvmqaqgexrupkfxpanpatsptnuemgjozugxxvuncgfjuzhagzkveyxilkptbgfbvrzzs\
ufchnsvvydigfxjbkbuccmxijodgjepircycpgakdtjfvlsdtourmgjzoyhtngacsfhccpdhbbxyoksb\
pggyjdtvwvctlnfiyqusyxpdyqpirkzmdyfoeiweqdjpdovcxskubnwxxvdfwmmipmdrtskjwbiqmqtx\
yvnpskoyrdywvyiskblqstpdbvykxvswqnmmcvwytgxrqogfnunsblsotemrfxnjssojsahdykgincgn\
nhaddhnwzsmmmwwnyceifujdhqhlesgczwhguwkjcccdtdbxcivhgcdozbhmdayajpdefawmdraisgxw\
thrmaeldzqwazyzsgfwvcusymzexzbplouylcztbvllgjlcyjrhtrkfgforfapqdvwzbfuuzoaiptgez\
jnrxalweciakcjyatgyyjsncoebxcmhdowupqqetkreapkudwabbpodebxyebzjawonzwjbxscsappaj\
aqctykgbokvibriqrcqezknybqmfwkaxqexuslvbuydxxsxsfsdvajarocibxjecgjsrjzevndtbaezp\
xlkrbglunoieyyduuyrmdupxniinuotjixqxdsdsbtlekpbzpnoayhatztoozismiwkwtlomhdriegpq\
dufhiikxpqjfidjlfwsuylqvdisrzzcmdzzgtnekoogleczqrfxsavztvyhmhkafcncdmdrghatlhzjo\
qxghheydbczwatftffitwqeyxvhxyiyahilxwbnjeeyeazugvhbdhpqqunuczuxowhdywqwmgbzsvmeq\
dvgtxjwtjejuiwnbantmcentjjjqhrnjbveygiakauzjsfivwozsoifyceacuewadtpndkjoajwkjhfu\
semyqsabqrubhstzwmxlzzclbfzatxkaejnfwjztozghoylmrgatqbtqvkzilvjrckokwuvikisxttvi\
xvjxlrladcofddjwpxtxtwykrtzozxwuhikblpastsmokjmhjrcslvcenyehdccpqdxyrwafnmvzyfsx\
wvdijogmwsxuamynyafdorqdkoitsgzlkxsfqpcdhkiujbpinchnzndmyorrjajlbnkjfzekskewguig\
hnhlcurhuyfwuqsyzxgittdwfcvnmwmdekrrturoxgjfcmvolqnzninqmrlecnqkknfpougaqmqvmdlj\
vkwenzqzrqvathqllmgfkjwyhotxvjayjgqvukrolscperrnklmfbooepjfchiuaoqbnuywintgcsign\
levnanaidtapgdjuozdmgvpdmmomhfmcuugvgjsmczkrpbjaotaghrqaxlqakcuixvqguqaguuiuzsmt\
muatsbwwpujismgtyfojrmamnucvsootwknelxqoknydhhrnwmlmrvdxoakmaqyowpoyiyivvrojkcit\
srgoeigxzittlgaxdsmfboyghugaotustbpeewinwpkheyzusqocghqxqfccesfxmwfsofynsijslref\
elwvxiuarxgasmowxgccgafkbfawlvmqehsjyrudcfrtshgkkplxbftphnirzaeyignncxlvhqazzgxh\
nqnodnlilqjzntjfjlvudydekwqhqtykoqgluskcjneouyumyglybyaffoeprjsjsiczmiwyrxveogde\
klyaixqybhtmgzdfbntcmhymynylwdeovwmneyjawyenaccryuakgolgcgintwqscsaeohehkcibolpk\
fnkvztklppthbtvewuvxrlnmyogwkwqgputhnygicyerqezkmejdhesihjgnydkpyjwtggvjnuebntqu\
vwpnotggkbzevqtmqbxnfcawjuquyrbrgjhdhdqeleyfxjtgrbcwlznntwhgpdenuhzobhhdrpaijlpi\
gimannjjksuwxxcdfxuyhchumudorcedfchdomjgkkmjjrnwuclrkvrmrunrymtbsytmwhweoodstpkk\
indptrrucldfkohajokhijietzdicpbhciuwbgkkfahsobchsmjdaiexgqzyzgpkxudapxcjrlbtyflr\
lwxzynouzwrkrksfwglolqnbwojtphvywavqxgxicenabqfjzcyfajjckjttsdzqotfewubivwajabpq\
epjknoxgdwoenfsmefzauxdgnxcfukjwcjheocfrpwzoyxsogepvbdumcqzpvmemoarfzchfefckdbyg\
vkblwhgwfmstkdvqyhfqbltkwytbkwrgxzfjmzecwdjgzqpkeubwrvqwywcrnxrhtrqwtgcxxotxmimp\
hudsgfeixdxnpqvdxupbrrbykulwsgjsyfduknfbcykskqdjtvfvfbothziwurbyhfzmpnxoadckiclb\
zxbcjcqwhcvjqwxlpfkqbjzqcxjujzkfhetjguleyiiknuhqeebgxbvfmhgebyorkqccxuhlwnkifboz\
aiucziofpxyccawhmgxkleciegrkylpvxaklgjhbjtbyfxdsntupbfshpeduihhoijmhpeivmdwiwgmx\
dltbddwedxstuljerjxqhviuxvbqsfbxfuokcdphinurpvhtkerzcgfvteokyfjzojnybdkkjassypkj\
pjogzlcsgkkaahxkkmbhuskpgsiliwcsdlloqpgqacurwiqnrrelosqvzdlogxohyaakkozyizttfkpi\
wbsoyqavrpsbahfvftbdoxsqwnhmnbmxwtucvydvcehddxuronhuwwyoqybokjxvtiuitzsoyvgkinfg\
nhrzsocmfqvezzslydybrtoupicqkfipxshwhowuwxnmlwcpcptgxmwdbdcjejvdrfnuphmnnrfodwdp\
rteddkbwnannacntbrqeyxeltwaofgbogkmcgxzauxksmeocvodblupceguyvljbamkndrwdawizooxi\
qhmyjoqvqkgbynwtiussorcznerywshrqgblxijeqrgkxsvqvyqeakdymkcuqeoaoqmdesxoajkxiwgp\
hxxerkpybrbrepczftvuxpssmsdravjkgglbftpcsgljbabaxgzalojwklktriilqoggbhhhkzwopvdt\
rwylbnoddanshbcopvhgcvrbhzrxncmbtjosaqkvsogjaluzqvcckjvymyqwrbjwusawyavesijkxebr\
rqybepwtwzrtkpxellymieklpgidcyvctqnjzytgrwmahtkjvourvzgfrmriqeaawvpnttltroocggxj\
rgdjayzniqbqfdngjvhihxqfhtlpwitjkikqbokajuavxfkahyqqfimkmfqdtytzkbqymmkmqykhrbyw\
hjhgvcrhjvkoxeimsylabexughvjfbmllogjqfgzoxhvhuswlelcqgyvrvudbzxqeebwxawhcqrfcqhd\
lufnvovwruwnbnyjyfnduvervjrngyadxikvulrkrqzxglrmhqeqxdxnnzctemhtygmxdlugknvocsil\
vwbhijyqcqdqeupyckeieocnnlixdnraupvrvewlcxzkgbttwfgugujkhklhhcpawprneptsicjichmu\
asombuuiwoqyaxotnreqfzliftdmqnczbslmdhwustnphjbansqttnilwzxwqixyqrxvcskrznjcrgxz\
ejtdshmgvlrahrgygalzxltmmiifffwsilykroyfezttadjwkzmrhetemurfdmciiebcvrprpdbxvhtw\
hefjluqbgfodrwxkvkpkuyyjdctafnxalfohyagkigzxdsbrclmrqjlnrnsnkpiqzqhvrrjekwfhqfev\
llpvxrhecfgliixlvcdynleiycpegnjrzfcbxregnkogcbxnmsxnbxnlnwlebdjiekwclutooaoqnchv\
twauzmgcrnppbqnddyyhwgpeiymaulcuogvbwxdfvkvbnrinxomkbykkvgtfsxsjrznmhdifhzwzzpyu\
abxvaadtmgnqziofyxopmiyctbxgrpyzzvvheeojsqmawehhjglkhsbvtnnmmatccowrpwrpymwwlvsr\
gzwchyfakksfqufqdczjkhgsehzqohfscuosfxxwjzebvboseyfwpepnmxrvyrzzxrxktdldgugqpizp\
vqteipyocepqimyceogmdvaxpmhvacjeeyksdpeecpxlgwhvjicdsiublfxtktdtpycdrjafijfpqton\
nnvxhxyntpmfmqwduphwpxjozixqglawddcjbkldnzlbrbldtgvtmnqxslauilurlxhprjktwzocrcfq\
rhxrrybyazdgpvfsijvdiuhjuadkeedryrigixnbcwhkxwnebwhjfetclprbnnildcahhybiauwugeif\
ezpniqfstnviukqvkzijkkfqyefqdlkkkfnjgfuevjbcttqlebrhptelnhpssvrieowwijkbdffqaail\
jgzihezkfhsgwudcqzaifjmqeinckiirzkupyloxhuzbzqlwadptvtorppityzuhguqbwnwgbpygoyzr\
xgqtahpfozbjsmdybpbhspiyrkhzywpcagbmhceopmhepvdhtqwkspfcyrkvteipbzvlitcbrboczhos\
ryxvfblgjqpbyuwtnbtmyuzjypllwipazornqorwmogcssilfibfoesmgghgkiravmfonidsfeqjgimv\
cnshafowoojlfkkljrdbxijzgujhsawefxqqmaoshdxzxsxcvfstmeehhmnayocdqduwcbogvlryqnmz\
eiyubialslkqwhcvpavpwmanirdjmzbdlsbggjyqxzjhwzsmrihxgjujwqisotzmianrqafjijhqmezh\
ybjoshhjizchhggsnbqodlweoceqmyqdsbqiehlcomfmcmghekuqscxeqkpnobfoqxobdvmrcnywbzcu\
rhfchgmmbcudoxjodxetoknbxhjxuqblmhcddbfrkitdegxugwqwrgvydizuklquqtdwgqbhlrkzzvpd\
zdzejamdfvwotxreselclwliqxugbgvgtvtdlrnpbpwbotpqiabnixighmgdopfntnqzmojpwzskdbcn\
qflefckqtddgxdkjotaghdchwcsvjgpkyrsuwshvwtmzgisujkqxaqkgqjszythhmmxhkyrqcthnzgyc\
qlpjqxtssehdavflplrbexjbwpstkjqtkqrrxrdyutjsgwvundvpwzrrqimxewxluuzytlltybyshpsr\
domrhwqinqmvebxigxwvxumwkzbafhvrqrcmedmkqipulrurfdtmvpruzakufiiwsenflwwxwmndeqhf\
ozcfxfjjjscorapzapjcaggejecqnwauclrpbzlztfkrvooqgvhswtbgghxdmuyguzjcarnurxmlgnea\
wltznyfwtkhsiiayfktshrjnqnojzixsmmknochvtkcvxhyhpdkeldbdhvmxthnxmgzdnkgaoromnqlb\
pauscxmnotygmjxegtahugznumllqqlhanghpfhhsmxrjynmyecassbnmfuikjtajmfwuwtfkpyfgorq\
gzmcchvzzmheejjlcklavsrprkilzbydpolhgjqnyukomknqpcvlgfqssjzczpbtjpoejirwavdflsry\
ptahumgxaqnbixegasqbkkdrqtoycipkmosaqrykuqlpulibrxukgqwghxjftemaxrjocitexhwnrsoa\
unfzgjgzaelgvnercqrrmyloelyidtnwefqtmuhcfkbtijhplxrexsnfmqtksulwdbbtyzoiwvyqeylt\
tepuqhymutssvobazpoktmxdywpslyhhfwaownvqrvfhihwcdudlhahgsgplcvshexbryhnoysjwcajj\
unmtydicfexzxqzhsnaehrhvilnrlvqqnuswomflotkceukosdcqbxpljbczyxvtqxfcunkfjxpxcfwu\
kfqpxezxibnzkchusrxvosjovmjgbtfxaovdgfflkzyvnmifctzvulgtukqhsqrxmmfgbroyfspqciqt\
bolpjaamequpeeeyeclqjxlmykmsvwsvgrnsgyyutohlqwshgxdgfjnpttcanpqlfaighgldylmafbbu\
ewngoujydzjxqekyfutvuirwqgxxzzcfpqcxsmlrltcccqbtjlizfherjdlmjxntlmiygzkixkpzxtiv\
losnalgzxsurnrktmnagtxrchvtchkpazcntduigueoqonaacigskiucgvraxthuylcwsljlkrfvtvir\
eogicbipcogrhesrspfscromahkyhayqoxmsmoucdymwpokptzznxtsrsditptjleqxhxmvgkqrxfgwp\
xcsckgaxbwovhhxvmipgktfxnanrsdygjpdjveqrqimugnywidaqfsczndmxkrncrlcrruwcorzwlowd\
spgaxxrojpcxtdxanxevpozrkqiejpxgqtydugvzdvzsjabhfdxrnvbihpwaffrgnikbhfkkthbneibo\
hunqxydcpohhypkcdoblxlpqazbiyxvmfpssjiwphkpceenxosjqvomzxszwjnazrghkmnymblgydjmc\
aatucmryxrxlkoovkirleaqbxzzzmlqbotfmnmeffvpnzwzrsoixgmrkzvnhbivrvtnjwatjjqezgrqw\
ojmauxguezmvpxxwlkhqeitfapjfwenubuncuvlyzebsocedqxefdaorrjqdfbbcwuwymggczvbqiyuc\
jhjohdyibrvpaqdhnreapdabwiicqtoasctbyyivsmapxbrdxfxcrvoykrtgcjfumvksxdhlbxtapenz\
ojhxfbrandslwzzooahqswzeldrgtnjkhdrolpqpvjlisikjngypyestrxenomyinmsipmpsbxxpewai\
cujkcrqbfrybjqkdidgpyhzoxeltuvanhyuolsoplvwysrkignwvkzmloyurqmnbxlngtlildzefvskc\
uslmjlknaiekvpsiopigsoflrtqulqntpwywxtskqjzpvwgibmzgvxrxqudmsqdjmsggvigaiexmtggu\
gveytulhsnpxqfkkvhnhdglexglqpfotvothuswpidcshsfhdahryoqwkpdwhppfwkxcnolnizawqpbj\
kihjdwlxceqqpxnydwmaaintckizvbrcmoaptmrjsbaioxvwhyrbhhojwmisnwtzysbwxbpjfpqnqmss\
ghwxgfbpekfbftihnzxsphgpgedzpjrdylbiwusdtaqgmgamnlrsrwlhfsybajpfuvawgkbwssgsxpno\
tfiqpcmlsnpxfjjkjnshsywsafgvgyseecltdcnpopjuwifljpjyketexnresoaybvtzuwtvfaigurbm\
ccatpcalbfvdiygsnmdjygkfeyavupdlbysifzkfjbliqbgbuyoxeoihmqshvsqqugwiexgvxeharuvo\
zbwdgjuznpgidtcgxlnqwmhldpwugjgqagddkbsiltgnoqhjrwhoabqtpbuinerbuxwxobpbxmunwtah\
fyeaagqilmqbplsmmqxrnyhcbzjtipyqjdridxzqleahqouaryteppgujbvqwlrkxdqgrdsoofdtckbt\
fudfidmivckgvkkqqlbtbyfruomhsftsjnyjveiyzuovsodyuyinxmgbwjjkwntoyosvanrdztwbiqrg\
qqnqfqsltmdkbqztknxovgbgncesbmxjsrattyruunqgrhgrwtegynzxwqijtgravaynqqveqlyiumlz\
mdlllmbbmaeqczprlvbzegpxyihmhnabxoqqzfjictlsuubsfshtnkgrzkgwrmuwntkkzkgevqxnlsjh\
bsjsydrybawrvjcdapfnmtebazhbpnuzjexfbxegghmtolcbiowpnlwxvqiheedmrtvukjfobirgfvnb\
eetvenrxbwkirwlpcdpefiuvbkcvmcdgykxrlmqqmhpgyjnyyuigkydvuvevojrnrehrgciaekdbgkud\
evadwjinrbhqkpdsczxkdsgsubtzieyedehqheypjiejndjttmxhwowlqzpmxfgcerctfqsyilrpvhwi\
xwfbjftwytykmtbjiyfylactubxgugipmmdxecahpqodwvacminyxtzirncxkqzfrfuvslqbpybncvfd\
sjmockkcrlvsrswqnvqrxachyfmnjlagybprbgyeoekaxvqfphisfjcptmplfkcomrzlraggneojqvjs\
fqbojfrqoomornrhpihftnpvipsfuelxhqcnkmnhtecmzgczatijxnregwsezgehqpeloarfnvrgwitp\
bomptldwwfbhhssojmjukoulmfuzydpgoudknzvqimmbmtvzdjzfmoeunhbjfmppebmyilzrakfhrthb\
btltiqgfejonoftcmuqixzssiytpbaypfltpmwakrfccuxgflgubpnawtcadueirtcwseuywlyneegem\
btinuocyervearfkllqbijljmftpksvcvmlwqgyahnvemgzsdwiueibshmhbkdhvgubpwbmoxdyxkqmo\
aocrwsdaxgxpcbgxjtigswffoubvnfzwlrhfyhyfrpwngzlqaamrjytjtuqhajybpyciollhcbsbhzrb\
ypbiunuenzcyeopbhnqsdmgjzprqbqsmvxjdsrqgtagbwqatqmfsykidqcrcosnhkagyebfmpyrhrqup\
jikddjrnuqtadclfzgintljtruemcebczmzhkmzdnqaamdcwdpzrktzcpdwsnjbebxpfjdsjcnloeywb\
rlivgrvpjhenujexxwcalkjwvehirtlrzrusfaeomvmdgvnretndtkvldajoigjjgtjphxcdnxsjolgs\
brnlmmaqaootstaozuswrpajfqwlyhveafbicdyikmydoojhvddymjfbhulbmduqrrunbauqodypovls\
rmnomhxgvylpcteloukjlwozfaalbzgbhgruztahupasutwicppuiecaslsyrrpgxdretifiqjarjtgn\
qpimtdzlqabruplnsbwmldcqyvzghzxvspevdibgdapciswwoxiwhglbbjmbysqtnjzjgjvibtopyavs\
zzswzfzgnasbngbywpelzbnziisnjcfmibavfehzeaiuztmxnxztgvtdtbcbiapuxicripsvfcptgmyb\
jtblgpxsqpsewycofqdxzlxagfibqvpddypghdjvmfwminvjqqedfymcietntboucymlktdbwlphktav\
gewamzxyldhztiipcoeqagqutloixsktsuftdjlhxwqegeywezydgscquillavegmiuzjtqafcqxjzop\
ymdcciudgljxsubfrxtyxzamtfopdcvffuctjqohroymgcfxfqjpyzsochmfblkkubhbngmogwdvxtpc\
amxxvsgwftimidsujanjlfqipzngbtixyqrtoezxkzwimdifvzluburfgfzfrzddjvaksqpbdzsikkdq\
krzqqyklayaowibrtfzzccfrfxntnxdpeazacjuzyocxhnochcocjwebpadlproikvpydcmphqhweffs\
fkfhmehkqccaicctvjtajxgsssneiwflgwaotmfavqfiesynqzcedbrnvvqskzzkvqwzrzthmqyinriv\
oxxfzpfwtciwwahfuqlesyfhewdrhuxnghvavwcydahdithhnuqahndthtnpnwrvzufitislbjixldxm\
gdotkekzjnnclbswnhcdfayifsicyccqypqrkeqmrizfglldqcgnsjpwdauvfrfunsbrdsdpxrxecccb\
wtbzngbktqvwbibapemauqdgybhpfgdjhouaewfektydnnstxaqenkcpzxbkcekzmbogiofxltzqbuqz\
aszvrvaoeciidllklfsubcqlfjwjkknjxlwkdeotzosyhlqupisqgpkozbukejhooepjmjryrgwqbqyl\
bjevuxjhzvetuxjszkrdblgtmcscxiwnujsnfrrydsanfawhbuigdkzzbdfqoezdnowaakiqszinujmk\
cxrmadlgyybkhujfpldkkjbeckajmrwfpsydsrpchrbzrxemyhrpmjkyvmyetgnzellgszmpotpjzxaw\
jzmepfwnyjgrbqyggbjornsfiajtlhbucqxhofvejvyltwifhxaemwmkbuitnuviaeoduhdwvlgxobve\
osrrgdjjzvurvdwhaafawocztqtmelprvflpzfvdhdgpndgsjdbtqfovdlvbdakekpjtjmetcwvskwgo\
ewrsupnzyfmilxcmjdjufkxmcznmgconaazhzveczsfcxwzxpuoiocptmdxjzbcjpqmpngiavaeckdkx\
kfwjaxciwvdjacmlxzqyypvngjqjfsaiuvpbinslvomovqeehyqygswvljlcxwhigpyuzwhnqnpckgza\
svtqnrtquctjsphubnqddgxoitnwqyjdypnsslobyeaxxgfhxmxkhytatghjafqwbzthafezbujjhwfl\
sabyszampnfkdqgsnueotpfmabqwxjnqguevutsdeabpeioopbxursewcubtejcsbixwfoogfcgtyuml\
sjrurxewauaudyyrszoogkpyljevauucepyjgjobtfdvrpdfaatdnpvhtybokhibxzzwgidxaniuxpdq\
kfcvrszhihndduhrbldsrfiotzuotlmivuwrrrltuubgtpqandrprkdqwfcvvcfuwrczakzcbzujsllj\
ncydletcigzlnblfjqcfpjbayrmsmhdhlnipxxvvbedvcprbeucxvloeqvgaumpannhkmsyoqdhsswjf\
losecagclpjwtahyufrfrnknibyugzoqirjzqvietnazhvpgarnykkmzmxgzddrbcxerizqvakttqkit\
ugyicsgfxuxgjgwoubbfqqhtmfysincxcewwpbjtotnawiaipuhkkzsnwhixiiqdgqqudujyhsydumxu\
hnzstbsxgwzkxdyjjiqvvnxoqbvtezmwjzkgvonvexjfgizquooebazjbnqcqflsnfdpojuczfifrjkj\
dnoyhktedrujcxhnbamxdrizgvnviwdaefpxcgywpxwltvqhxyqtghypcqqmrbccogprkrbgjkopiwfv\
qvaimqcwpylxbkaiqadnsxhpzzhiywwtpekcgmsyavsmkjmzmxuctlwgrvzetlsojcfpvhwghxjdarpu\
tnerwizxbtxpifknejnqpruesmhpsqudtrznnszquueiraabrrjxwmcjtyjsmowdgwmgwwwxtpovtuyh\
omwbkseoxzwowlejqyrvatugqocautbyaahsyiyaabnxeeqjskzydqfmdytehmnzixwykadgghuqofkt\
lnbfbqydhobgdojzocbglcwdejbhqvaguhldocfuyxgzzoillffahyoepilhawexaladwbdtaznukanb\
wyycgylauzrvaibffmnegvxafbamlzlnwugcolqvxpfxshhnwomeekxkhnkhivlqepyvbwzgtrztgzri\
jwwxlpwehcbfillixqacuwfcmnhlihjckeqojbidrluujkqmyozdshlmeyklddvxsctwltknovshgqhi\
uoixruvrcsmyzootvegkmjivvggeqdastabvntvenxzpedjyjosqdgndrjfzrgqcntrvnjhhwrqkuakf\
dxycngzrvdlercjepbjjqpquahphxpfkkrvlcnnygvwvqqxswunlswkjuwhtjyxpagdiupjposnancjs\
ysujnctsmbmaypkirrxbgrvseximpebvwimowullqlpxmsczmkswrtgbccuqsxdlrsksuuncdjwpbnnr\
uepispuzywprdzhtyvnwgvnxsoveuoezbwvmazpegvpjsmfsntdkkhsvteepxgttumatyarawhffqbfi\
rjslzhxwlaiczikpcppilabylvlzeeywqlrxbbnsuqxuvvjftqrxaxlzrnnptjlbconeerlqopdfpqhe\
skegnhrqctvqtwoinismwfeyuvvcvrxiithmqqddvpwvsrtjkngkfsmejizasofueavjiwanvqjbjowg\
drticxywloemxrqmpguqctejneajsaiszghqhfguliubxwinkkpwusarcfgpfbkoicjcwwpxyjzwpzal\
twamjzxslikwdfahfldmuaeoffyoovrwvxidkezazkeqtjootzwjibnbppuzetrncxkidvucocpkmkpg\
wesmhjfshwxrjcsmfarmvbbjwcbuokkijpuehounyvnyyugdvxbwcirmudmlwxztmlnphwukabjqhwec\
dxoxdvmjkwqsthdvxuvcapwlzqhgkszmdzgysimgncfgivsfkvrfdqujucmjecrgrlniwdurlrmcbntg\
cokwilihsfwkgytjflzudawfzfadocpccarffhczwcltbqogdxrnkidzxheetdvkwopexxghztuzsftl\
jyjzqvdlynuehngvdnngjfjoaughmgvodhbjyzxqzpeendedswfowgkchgglaynxdzntgnmtmvchdtet\
stomfhvnpshghhamjcygyycgcbjrzrwuexasiqoywsrnsasvuvrbexgllrgdmlbgsprytwpfcbbcphim\
fnutrxywvmqbnctmpnwdnpdkngmsykrtclbjjlccnrjdyibohpnuejcnbgzxuxgudbsydaywkutfnuey\
wtciqkgjhwxknejyswxfvkxtekewzruuhpaixvkghgrudbzoxbysdxjdgkxzuwwsdmgamccqdespesuu\
pthyjzleinrqnnjbdvzbecnijwdypfhzczqvcswvbpdxbvucziyfrnnjxwepkmshvvxxkkcteswxgkri\
xolxdeimaemxeeprkdcjtpvsxkzwlmwqxvnfptsfilcxfsdlcwlippsgyhzgekhngkiifoasraxxlgaw\
idqzdfmaxewmtiqdqnlruecfosznalopynyfmgkhiynpsynpuhugbuofmxywpeicaswgbdfmhxuldvtx\
hnceokoditonxzvhthbhhpjmwofapbkmzjlpswvexyvndmdqkrxfmdfmrlyrfhlxrzxusxuztnvxeofs\
iyyujoltagyjgzfuxsxnlnkikzhlrlwxvzphkmhypsslyfbagzgoxuxkvexxcbmoxnqepxjkvabucrex\
mamztjtlssemxtuuqllrpxeevroyoxplsrcktxyalzooredazvaqduxogsfkklgogadlcvwusokkecaa\
lbfcuqmoelfqtfmpaekelibqvgiqswwxpgvqjhcgwljelscohtjgjgfvaslfutflkcbepsikwawspbvb\
hweupjopsojdjdafcwyeftiiowzvvuplklnnjzrwwrcpwjzsttvyhrpyjbdxhlgsgznemajycdsviiyx\
imblqhfbcxuhavpwxnmrwpnysauyljxnladflvrpjzvqxsyshupmvfwfqklhgapraadjaeesbrtecysv\
ctxrrrwzakucyjcwtkoqaspiormvaeohrwddueqewbjewfdzszmmmgjyuxjdquvurlqtrjhytuiechkl\
zupedqyepiosdurqjnrvfbzbopipcexiplzfgdwvpmhibqyxjbffogrdgqlhiwgqhdewzwhnqsquvcaz\
meorgtcovxszozapgkeivcaavhnthaksybwcovwmftnamvngydjuwlfxkefdhcwczgeosrdkwwqjqdkh\
mysjawuhlvvkccmzgdugmeabdgxjjuaytnjnyowzrbwwsdlgyygbpajejsjopgjniotzsrvvgbyufulx\
bgucqpbqjnrmpkdmswsmryliikidetheblahlpinbvhisnymcoobnglzcrfupscgchoevyrmkbwadmkz\
agxchdwavochgowgkoxqmvdvxuiurquhxqbfjfkmfqqrdyhnliriziisplwnubtxmecswbtetmmmrdxl\
dxzjunnbgpssxluryxtbsnuldgqciaxkqnnxvxoskrjujkrnzsvjjukaxxnyzpncpjdhqmyhyblswsbs\
ictpsmnpxosovbglrvuevrhabyaspwguoixyeoyiqgebhtsbtphurmltrgxgdesytyqsakxfrrrztgax\
hqhrslnprxdeuhuysttsacrkjwtqqtowrmqcmhjidcmuyrfggqjfrhtqctjwzmcxdhusnhcorddariwl\
mtuigaozpnwctjdyypkmbbeyfbpybrbzaakekynaibxchpuemdsdlwbejtsovuhlvnnilhqrfuwtpmgo\
ysmmwcyctbkzxombnznefdyouacseyvotgjtjodhseaayqhjgwqikktyfneyacjaccfwnhygbazxnhzf\
qeujxvahrxknqsffptubppnturrncddrmnbtckjbidhhomalychzvfqbjhypeunhxvlfmhjgmkpxxzbx\
qrqoardkpjfynzwyhepzfsplvryjrlgalhcmvtlmatrnpqclbtnuonsdekoosbozbkamnxdnewishkdu\
sbunhaemtgmfjkhcshcthjzqogwlefhppejxfssufxmwfjtbarpzoacabpxvjhlyptjpmglmyudcwqrl\
aryyvgpxavtpvdcwlyauycjsagcwxtparuzqbtfzwfjrydmfeigzvuibwblfpxasonorwjkrcsbaxfrk\
iopqgbmuclwpcqzdmlgpkmdrqkvmlyijhmerwnjxumfmyawdloozqaejonnherwqhoacrbglxoxjcozd\
mumkpicbrardnnxqrgffxxujkorsifkcwdhgvcqpwrlrubabyfcweapidkbxwbajzxtniisvxwnciock\
phpqbuhmssvhqudhztwvoqwekwlexongcyowjiadxynhiovfzxunkrzmynexoasfgfinbxsmptkxxizg\
mfmzcblovutvzcypgjvcflxhxjiqtsztppzvmisugcezbeypsrslhlwquqchrtkzfocihqoxpyxxaojg\
bgbgirazdomfoysvsxvwhpssrpvunyhrawlexeddqsyyzzxefcscokkjummtkesvgafsehvspanjwila\
vglvrwnmxoqcgsxakdcdtyvrklfninyrnfajqfdyjenoyboknicvnrrnejcdgwvcratewyqgqmgfkyen\
qslswxfuppuuyzxjluhxqaljohgnnbacwdmkhmqxmrlbjefvjilistprchkinwhqtdpdfqfunyttdorf\
varloyqhrehsickmwwizwvoognntuhpktxcwnkwsqgjhnwonhitgecawwjvjuoypykjdzuykdplwvgfs\
cjzmewuypfjqwjosqvxxbwdwbwpqmsvjzugbrkfvhgvtzgcnbvdipsglffdogflklcvbhzkxebyeonmj\
zwgnbrwruhbzcrzxetnbylepxqdoqeugzfmvuinkxwihthutzvartidmneiigyvgflvmvixdfuyouwqc\
vcdpvcuhturulndkfooaxrxmyfspsbeyszbfzfwbrbvxzqwskbpkwetcunvvnfaddxlimphwhzvmcmrj\
laqkpsdcwpudnsmzviefkvabjocvradxdtdjitklmlwunxlkantukmoppypjpemuhtbsgvsowdrsayky\
cmfrenaaadoxazxevffjddfvutnelaqitsjadyqxioyivpizneersuhdrlssgjjljysfezmyvwlxgreg\
ihmfshclxyieryfhjdyoxzbbjrzzyytwnofxmgunqwqkfrthnhzpbgyoqywsvdmtyzqohoccxtsotxwo\
bwdhoqmllkqxdazgoabmlpytxgpqcaslwrwhwzkdspezasopsvnaldlrjqatycumqauozvwwlrublaka\
tcibomclkzufprddppbpixgiwsaqgqsxnznhcyvovkzdgjlkcmnidptvwgqzfgmatxsmfedlesghpgch\
cmtjzjxqvbvmthvmtghnvmtxwyzaopntksbiqgulqwrcpdmoxfrkwvbfbtpuazohxmcugfmwvusazday\
tmpinuftdknspzxqyrjnpuzdbbcbrwvnyywaxkmbfhzjeuvmunwizgnpmqoiytwlsbqqbozstghtppyv\
agoiyfenckeigjvakwqrivhhnlvpvrwkkelaxartagsxytclopstrjcatgxjsvhazknzaktumayuzbho\
syefjcdgwzuvnvjmzxwtlgivbyhlgcyoeryefayngnjodhamcwmqzffyjtgxydpsujlrqadkklvszrcm\
pqonrfosuftsidsjztihqauwnyvamjfzrvusvabplkgoxttqcuoakbscrdddtzvtyxlsunlizpboctld\
abslgtpdyobcjuxopddmsyrmjfwwynyqvbdhiiwhrytobqqdowwoumrjubvzjncqrwyyuvirjoatwovh\
ipqwifdnxrwetdtfzjihlynxsyegqllpogsaqjgbfldtrzqwrfgtuytoneczrvjsbnhegsgwpzbxdvbw\
qprpmlrrguxsumdplrxduamajumguvkbdfaifvtrgzksqlxmacoyuxtwilxubykkcvhnfqzlmnblfskj\
igoqazvccqpurjjgehnyaukovuncihelkffcjaoaagxhpahwoqosroxeplnozvdeacrxthhnlmlcaktd\
ygfuiciazmrkkybkkauhynhzfzlpjtjrjeetqbhyqpgyqueditewlonahnzmnzkzdpuoetctjjkzompn\
rythdazeowpcnautmjzugzpzngotsdmlhvdafixpvzmlrwxpulfulqumhweoxgqxylijryagmdzlewot\
hrtaonoqowljryqbacnfbotxlkhsovpppvfcxhdqnrfgynkuadxhaaxkjgdvhwrxkvqkrlrvgpyvvtup\
bwtspwwlgqsjncwaaznragnqaxhcigjsyjmiwlpnfkoxzbusmwaeksthbrcftfoijcylzwyzixdioano\
hoajmgzsgynrtsejpszjsfjfibnmfinbuwnukmixervpayhjcmobdfvoikcmslsstpowlodgejdsvxns\
haicgrqlrwamynfphgorrodfacnwxenmrwwhigldxiqnfrtagzfqfcdarronqhhrcuqmtjbltujobojg\
moefgxttmzszozzxeqqsbiymihwixmiotjhimrztivfkgydmszkmikiilpthejcolxhqkktqtmxqpelx\
xrtdzciqjcvpxvoiufrextwlfztxahyhbwiabefvfwopxovbopxqjwrmvuoefpfrxpeokhjnnoxjhibt\
wkdaocxjuufnbdujsrbpqebmayrflkodcvcstnyjngbpyfkzycirmvxgbquvmytxfvojsjwrrrhjvuuu\
ittetoobxwkkcyqyloefafrwqpvmtlksmyannppkdsgyjkgbpmdfdzftnactxtktxlbiyzvtjdzyifhl\
eemmyectxhaomiwsxvixzgoyxxyrhvugsgiihiuppqybzlajcywizxnsbuhskxphqzrggjhwwgpjtjqo\
qggknkerfwkuivhayyykzeydwvigmgnpmebktnjjowlofzhsmgsujkrhjngwobthvodejilmqbcxpvrp\
qixflbdossqhicnwvxxwyepoereeohwiirxnuwhporscfjqewqaycbhnlmsisatmyeguziltkotusfme\
zkqdluubwjypawrxnrttcguedptzummithpouybdejeapbmpgqhmwwgjibjfdjaqvpqlpbjvxnzeeogk\
yauowwcfdpaugzsxjsxzhynbnwofvgzjhmuvvtdslsiupoxtqueunwsdihgggsudobtnqgdworredmxt\
jtuwfjlkugmsobnxizbcouchbbdaugpnhbfywnvuezndijeeahotszyhwjddaivcctubqygayijshabx\
yifskfvvgtxnwnatolvphyjxpvbxzvqvxhhhparvscgddqfmbynbwbdcpbkiruvhhxvsekrkxucglpqe\
reppexxnejgoqanoaagspbwlyrcturkvthxaviuvumjigatispxivenewlkixmxgdjdfkzjuzayryohj\
dcaruvxvqwagkmfrqeajplhuyebvpjrmgvrnqpywnxhhjmrpomckkdsdlhwxohgnoqvosqwiuspmnnob\
xkcuuinoaplpudosepbgrnellcwpixpcqjxzmehvbzucqywhvlsjylgqbinrtmgvdjykokbcrysxshyj\
ywwgpwvgnxyjnljgbkovegqzrfcnbjvusighahjolxkjqpwpacwnpapifmrbbbhxjfuinapfkctwujhk\
dtxiccqwsckxtvehhuhhkclhqstbxnxpzmbdklmceavsfpdpniponorcmnzpmpffaitkyudzqrazeldt\
nbjxvthztjpzgnfyktfoiytytzxbdrrltcasgsrhbqylkztfteentnxvtkfdomuzwiaitxhwvqwyocbc\
cjutewfcnpcqjooadwfefgqrmonyuuaynymnosbwkfdkcdcckpcfsghzxmmebiumlcvojhvrtbtcxtqj\
csxiwabsfmgauyhblhyvidvkxxvohaenhvaulrzcuolnxunkdxywhuaevhjlfeonukzlbklrwsftuhok\
lddmsrgsooygpzyqbnarandhwhogovbihkoeakpvcvfimrnwbliqgfqdjpyackuiqpkfcbjfkgiovzhz\
bhgliknilhddhsmldpcdttbsfwdridufnpspzxwcachzyycjrjryesmcahyjnugiravwhxorewtvticu\
yaapowoovzagwnogpsqcqwpqvbcnmnpizpsdfnpdshhrivwyadazlvhxsxqnsbxrooaljsrkertxolyk\
ewigcwcblbqmkkmntpuukschydmtsbdxcnvylqyiklkoqvwuieqbakuhthjnymmkwsknqbiactfxfpgd\
uwuiknhtcrgiijbwvdxqndlxzgyzimpsarnqogbmacwuljfmlhxslqtbyalxkhwesggspaixbwvydyen\
sfztiigezyxspeqkrzhyvkruajoafcvymwhpnbodxdjnbnksenjzahlrfqgkjvykbdaohpbqmrplovnk\
mpxcgmlrftmlonzvebqgkeyooizdgwmaohkcplrtvhavobglrxutltinpidpvqqzsfcrvmuufgrkwzsn\
ewgnemabdjmslcqwtahjwfbkgqfylfvubztkgvxebczvidwzricmcrxucolevbguewxbpwcjsjyyaile\
tiqksvjfziavrbwjsjkiidthptdzzmxkysntlqwkzzyvjqanxxzfiwfknnlcuxnmvenkcjymtnedtthl\
keapojnddlmigxevfgzerxtwtsldicttcyelzmgjpxvgpbbejjxbhgykiwizxbysbqhddprwikblkvut\
tdxezgrffsbiwvihfntfkqycelrwqzxhsppgtjtujotlvdiwsnvqnmgzsyviaqbxtljdcjoomrqovzyb\
ykyhcpvpdumoisarqutnbaqtamklleopjymqykzekbzmjoklgjajvnnkezxrnmpjcnmbjbfgmdeekwzy\
lbnfywpepreorfrbcdfhmztxxuezcvscbuezgssjrtsqnupbfzkgheiywocvjaywzabszdeaqiqqdlig\
jrwxisxxiijaogesufkypkiqnikaalrvdcnpfdpyndaddcunbtjgwymybmeflxuhwcqhqlarqcihgmvb\
sewdssjfgjgfynhukglxksyhuhsfakmudaclgvuaatogwepmccnwbiesfqezgayuyswjwdilyxmfcjrg\
sbamjanltthfmcmgdyabvfoayfzohtgfhfrvrxdrrghakrgpiibfsotbgfbxkgxvhjuuntomolktqvdp\
narwzrvbqvlggpjptmsljwbeddxsbhghztmdvjnhbibwczrmdwolhkcneesdkeydfxtagutgtkkvwhqg\
sombhrsfotdkswqdxvcshqlhumfhuenrlcswmgllvfgigrfdlrbtbydvbzfcedquagzmwkgfhmkfwshn\
dlzthpgzzrabwacwilmyrempibfjegmwcfuoqjsexottbdvzltpxsuhutwoebqqqzctivahrzsbveltt\
vvipymerhikoclcnmidvjlqgihnydjfgqipayutvalgiwbsdovovbhcdafroappusgnokfldoolbplil\
oqcsspyajlncldlucounoxgnntrxbabcoqbyksknytwpyywynyafnmkyvssdtameskwzrqinstmjeumj\
xbwixzghraikijpfxsoyttlethhsckctbhbrwrmewbeegnnwkkouqytpktnzdsekabzrfmouexiprqax\
qdrferhnzfqjkmqkmkodnwjqqgoarekrbuucotzyirshlhkmteaxgscqwgpxmzhenwvtjnvxfmlyjncx\
ixnvhkbkotsnxjpzrnkbrwjhzkkraybsthcdjbfysxqwzaqttuydsfuskucdlwavrxtbdilczppqxbzk\
njvtokvgtcylssmhgayutdiimlhaxdwosrhgzkeaqgquoxpcergpcoyhyzjaofhrfamncsjsaislplau\
wbfqyzipfqjcafagpyfgfzoajxngiiivkdgznerrqgidggrcqzhhlgqzkssanrnhxfgcdyvasgfbegje\
blasjvhzmwrftcubaepoafucvdfwbtagjdtiftjwbmevnvgltcndwttudfaigolakrptwxasnofjbfic\
zwobhrrwnqtvwwmxckzwlzibvvbiyrahpeovnxxoruxyviwajbifledngmpzdhvajpecijmgujdwdqxv\
cqwrgrkhvargmbbciokpustjxpoyhsdtcgldtigvyaoawffkiusbibtecgvnkkjudnaonftescteoduk\
jhnuxaxjblbwsykrrkhdeneaabjdssekxudmuwcowgqphbcsglrqwwyspcoyfkhonstzibdjeiisdyum\
kclfdnvkdphodzboqzqxxnteuaocicjaqljhhgvwapuvpzwypjfwtcypokcnaogvsdcwsryxueleoawo\
avsxtfydugcvyzbnopmoukjeyigjcqfmhholmjxrlzbdralgqrlggmiamlbxbaadzrrxvjpbkcmmgnwu\
lplmajcllnebjssbctmfyvelqtzdjkxkeuvifcrouzisvuhutivvoghyvrekhpcwkjqpxiclgugptgua\
riqgqcmdjswjntocwgxswhkraasodnxghxacslawriqobxrvhozmozbahxzslhvzbwkpbmhyzqwdyvoi\
gvalyksekffwhcjaurtcctsfvvetkugzyjkfgfgeraugprlxcmvkrndzqooyqrcswucbzizsvrnlmwpa\
aiqicvxvkyqogctnqnfftvdtrbnlvlblptywwlpwwsqtgrzvzxojhdtshwqdcaaytadajepsotpcieel\
xpjcmlpncvinxeerddqtrxygvrersecbdcxyeaauzpiadmpdppdgmnsodkoornkmvzvnophvagpchpib\
fxwdhridlioqkugqowfqksejljkmnycbocxfikifanrfzmabzkchabalromiyientdywvjctpctsdawg\
flydwjenrciwooyrqvryrhslzhptdvcgbqeavbtataortibdleuebybnhkearyjlgadmdhsewcuntcif\
ocirolnkgcayzotbibtrlytesqfvxsrswnmeclhlgdixpqipsvsgfkqvuwemkflyohrcuycnnlrctwwe\
ldlsbntflgjacmdggarifbocfrkrdpckagqbbnjghjneqkcxnnumflfnupfgcdghnubfhatyfluebmwz\
qonedcoifhhwnwgyanmhkhbfcogkzwtkrkybwfbgjtkfysphakmsjbtxftdimelmjginyqxyhekiiozn\
bokjbythkejhkjasefdszyvrnatfpuuaavnokvnmzmpjlhkyignpxkqrfwcgbaebzunoikzmsjfmdegw\
lveirfsbkudouxklijvuirayjbuzycnmlhvdkvbbhysvpembjknrcdyappauyjryeehmdhuhkgpdmprq\
yipgqvsshifepyzjuqgfooujntegphdnovalvhphxbyebijptgpetnbbixnsizjjqpmehwwptmpzneam\
vxwqjamfryqaoqixpiumjbldnjrldkootcaqsjiyaswwttjhmnzrkojgxponhbfiwfyinoqofvqhtkxl\
dajmlvxjniaexuzqnzalvtqpjaohekkqeovnnnvhvtwnjzzvvzdtmgqtxnybgthgomfbvdhqgrsmuchk\
jffytutxscudlsgdjtybtgwydvjmeamlpqfaorsbfvqekjcjijwygtszuzeyouawxrspzmhralazhcpm\
lxraeynclmkqwvshmizypyvtdduvaykhxtzftrxxgvpyknuiftgoumnjslmoiinsxstirxecoqffiolv\
bgwqsdffvcvnascjabqfqppbgewvpoosebscmeafoecbbivkujxdntcnvvpxrejkrsanalapmgdpgqjm\
mxvcctvyyuqfekslpmosqqgijjnhizmusjeqpqmedktaygceighgetlmzkhyjyevchkyiogvuhbsvszg\
xrdkdurxxosqebclegppcqaeunlxnmcykwtnocwvzdrtsmwltvawsfmkkxqcuxnzpghwchthhvovwbxp\
sdlupjrdkrtpoejnproramchbcamftlnddvshdbcblrohyljfpeqjcswjoukvpydceepbekferrecngl\
wgqrapvzvqeqnywxexitirvfeqhzdssmsyfeodxqmxcfkxkaskuhlgrbspocfhhjvuwrptoejuauezmk\
ecpsmwqwqihagekdyumpgrvtvmfkpnuurgaejifuqiwjzhlxdgixtkskkfelieomofnsuaifvvyvianv\
pjfhfrqbzxsmzdhvfrnjdngaemmhghxptrcojhvdlsrysteofxirkvheoyizzwvpuglzuzaqxqqklaiy\
ntaincarsjsnievtorxrgkddpmuzjtmsciywhobqhcnwhmbnukkwdthrfyvqrfzjqmerxtbdykayrocd\
farhnlunujaincspbeqppxnouptxcpnuvhnzzqnsjcjtlgpxhuikxcijxwzcuwbtuvylwjuyujrsjzui\
hjarwtocofaeajucxwgsfkgwitzaeqqaemtmdcmhfnigbwhxekpdfwrfxrjgjtfvqcohqpsenqlqafjc\
oqbzrrrogyxdkvbrzhyoncznkoastytdvojvtcmnclupwwxjqntweahzlkulsenzgtqaxqthjwbvrnzq\
rmcwvmoiuzzvlzyykttpzidghksrtlbrfgexjlnwyhrhqwllyfadkdtiewkrnrukcynhywnatuooyxdg\
gnejccjrdordncwjyclfxpplfmblgvewwtjltkjjfnxygdyydwgtpasyuurwhgiwiybpicytsjqfejac\
laqjjagxprtdfytorsuycvjekibfowlvzyqbjxkdajvqtorvinrxybnnacpfodsybmjzxhdlkxxdbekn\
oyxwcdsrhxejxelgkbdnavursmpfswtwnfgztrbodbfsmbvgtwwqskquznwspptfmjcckejnigrhalvx\
wauktntopaoyfrouomivqybaztupnwqlcacaibhtlvgkqdnvkumkoeyegqibdpzpswrzujnnpgkxacox\
wzculnwqhsfqsfkjnzxraezetybhmjfskhwxzbpfhbqfaferpslakbwkjiyzwrxpaccowagybvncbnyf\
zctzwtorpdjgcxxiuaajuijwtoivbzjdvbyipyvxmpwvpivwiiizbpobsqdiqfyyhtpxoifpglrnyvnq\
yrgpifchecitcczzffyfbgjirhhtwauhvhzodysrotlmqfbtuhmpckoylsvopuqafaamuyysjhrmldqw\
zbozvhcjqesiihnqjzcymeoownvzgiidffkktclqdzxgabxfredmmdgtbmflppatxwadxbtthowrrlmn\
gveqlffuipkvfraonxpkgkrzydtgzntqbdnkdsmkocchcjtptftubjeoscbumvzbilttbssqhororeia\
zklntkdvbaarecgnuvczweehymfststtphavvownjxiqhakcaenaurqrgpdghxaqnxbzghkbstvpnejp\
utghiikytvtcvwconkyjdvvnwpxzkrtiexkrjqcmslthxtehlxamnvwavmraxgxqguyognvogazvpezb\
qdwchjiwzarzxjxvzdrfllwdgupstelpifhtehkctgeekmryfmsimjrezdonxsrxyoqizqdzlqpsvrlq\
ndzrgkccgzklnwqptadvxvigwmpdqcrfkbrylpuczqtgxpqnyfbsrmsgahqwcahcdkitdpxtlovenemc\
stkaqlcflborxytqxgtjbpecjfnuyepzsbkrqufzudxwvzdhieofblttckrlbalreexhoqomuowzoknb\
lwjlahpwmporsdvaervdypbbqqxpkvysxizoialsfpdxqrhxcrcyktzaeekeaqgfpaojcsjtqnsggdkw\
rizibblilcxslmsdfeoihtfhrtkuphziudmiwrdajrcabglnbyzkralsdodykggvqswcwuviblsdjuop\
xludkjfdkwogdntkldbbdfhdmmeebpyuwlmmpsypnlffhnjtxersisxxkgdapqwkjrwlizlfyqjujblz\
qlvzmlmmzfbckqjlzibkueckojnkqtmzpanwkedvkksdjbfrtuszrygqknwspzwnghbqpeykdoiujedj\
rxnfkcxugfuazzdecnwolsyscafhzjqtdxploudimwdfcmehmijshszjmujqapqjiliollgaxzxyffxi\
offupbwzrhimwekqmlptstakymlppvabgorjxoqtkdldykwbpqkzbssdgwpxjkgzplqazyqieincquyy\
penygjlzuofxagvlltktgfljtmrlpvopwrvrthmlvcbvuaeposrbvdryopjokwrsfgyfdlftedkixari\
baschajywlavactbvnsxjazayamtqmmhmwusxrubsgzlrydunamroiavgmfjpomhusptmdgnqmwbwwor\
jxiejgynqkdjsshkuqtuzommkiaofmffhfzhzwagfzodambcmvnwgojgpiqfnnmqwhrkbqkvyliugdzb\
trafdxtuaebmvbrkfhbzuippupcohumrogahllglhijnjqqygcrgnfwazjvuykenrtwoifdeqsnkfkej\
mjzsstpwaccvzvctuypjahvusxqtzuozsmljlydpolvfgjovmxkrzelodcyvyeckmenlesvigklwnpuj\
rrwscxgugjkggbwtzgmxnppllfoixfdkktaqyzbnddqlhtbdmerqhnxnlfyjwdugexsdkdjqukwlrolx\
bmranfpjmynkosfdcnxiyqyvzinwgwkkdydnjkpvymyulaygydexepqjfvkdhhdempmfpetbjsdsmxdk\
eqybtpfnbgkwzkarlyiqduetiuabkvdduppfazvawzbpyqdfkeplbnnjpcfjpltkhwewbqnzigfegftp\
azfefpkgxjnonisoiefmgbvxwgpwdicfbzspzuatncxhrcjyqpcbqoztkjxslrpeusguppefoczmvlux\
mankznexcecfpdlzxjmtbzjnbazjisejvsbgbhnukmvskkzhkzdudyldgqqokabcqvxsqcmtxoqlpdhi\
qnptlqzizetujkwgaiwcoembvxxjshpafrqgsjkmmzcjaggfpxuqhztjtjsbqiuvrnacmrnchswpszra\
jfnerikpjunazyprslgusiwzevefobbrvhohqbgncdjbiwgszklvkgfgddrkscqahkujojrfnetdccbq\
oqnxpudigqnazqvktwrydivgrisizkvnlrakszcerdyogqretkabfxtjftxlkadrwwdposdlvkzmzfcb\
awvxbtgiyxhqspqqfrxjaidtrbspwkurobmolfslrufslwpbjcdtwwqlwpxbpkhymjpzzncqwpefadyy\
dkpysundtmlyzusgybmzlydclmuxyhibevudeabvsrrqphsjathmsmruxkfamaitulqcfvqaacxoybin\
ekchhesbrzjiwuhwemjaptejeazrmlsnfveglhrenbtqmszphbpakytrmzgssusjzdhwixlsblsgwcqb\
qztdeveysizdydacjocbbitskayhdxghtmodnbnbkkvlosgfcdanfesjhzxzkhvepxgnkxghlwrkncla\
zanhjlerujhgfnvildrjoivasaixayzgcfljunwlogwjenvctcwowvfbfoprvmdlnfflfzlstzbhccmq\
orrvqrkolwpykvrhxdrggomdwcimrwidshrlrypdujilrcratfianfzsmjhspqxxsndiytldrzrvwgzw\
mtdrypxxzydcastvaltklqzbhyaxqeznynrnaogorkyedulctaotiwjmxslgqpknlrblvumoruozwlnh\
kyrlthprheefdalsbmyivijczyixogfknjvczrkhhlxiiomhfgchfyauzvjxmatocttauxwjaauoeogd\
ugkpdbaoitwpioyipdbgchlkyzvvhsfvhvzeijhbzvdbnwfiwgdqmopvkzmjqwrovfypizmkaqfpswyu\
uhzdmckegchllrjpdmhmymhwhtkslbpnyadbrdlxleqdhdtypaiujtesxuzsavvliyerdkfjlybdxene\
ytdhfjtwqluhgbmirffssfsjnqojpalkysndulfrovwbnsfcswdsxwmweiztwkbjvpxtyiekbqscizgk\
jtbedrghvqsnqfarftvaovdiwtrpfnjqokbtcsmtjvoqtwbprtxloqfagswgzcdshxbadbabbtsyhfbl\
ngtpkkckpfzavdtpdpfhxrbjxibbmqajufzwnpfnpycckylzvvhfecnbdeofxwgzadbgiyxsejqtngux\
zvttsyaaqxqtsugufoxxsjpihxspjgwzhconbmahzmnwhksclwirdoudneafohmedewbwbvrklwholrg\
nqfpzwdgjpwxttgdhpgkfgwqgbgvllbcleqdhpeslfvjhgbdmnkpyvbnhguydsklmihzzzbdybsfpytn\
fbahbkbcrlokopcxygfvmtszsceijawrqpbyvemhhoeywpssfiocvkrbfwltkadwhtnhwexqckhxyxyw\
dyeenyqcvqtjfvlmzfdwiqefrawshwfentmtiaxoewjsgnemyjpjqoimrqzuosazqsvdwuyajboacayo\
jenosjagfkamruehukizpxhescalufschuovoxkblwliwnkyohqrjagrlrfddqcagkmgzcuwzhrznbkh\
zzhmbwvptjrpkspsahqlnqkimayunuepaahdvvjrwatrwdtuycdauhwyolurzncipiyrnhtdeanfuqdk\
wycshezgbjmanhstyumzrmtvhwpuwtvegtvlcxmisfthifnzvwbdrrqreeumwukpfrskcmjehdayvkow\
nkfxmnfsrqkmpmprquoosajmrstxqrgezqppesvcmjqzsylvcmbihfaqzmherryqxnlytaxdrqukswdr\
zhdflrvuswrvbsnxaxyjkyhotomopdyssycbodbkdfvuhymgkapbvscuaszzyiiuxolxulskmwzogujg\
sbbtcfpjkbsutmvksaizgehrqhibijtcyglpvqydcyzvjlnxphwrhzmkyusnuhdmnqkpizaxvwtxphxv\
yssvmbouwtkqmvqqnlramqiihovfdhlmzcrjpuzrcvawsiepezmzwqxfsspwfpsmieuxhxtfqmvxluhy\
uyhfsqbcnqierebpqgrisggjcjgmsfgslxhpbvtwtsxwlcpmnlaokhikrysglgetnltcpzylwanbahzz\
gkllnuafyttcsvcbrwriadthlamnxixnopgepscrmzvuhyiktalhfxlchalcnvzynabfrafiaqfrorgf\
qlwnxfpggexcsrzljgxkwtqnetplusdxzvzlvnvvdissakhcgjpanhvxqidkqbmgrridliyyaxejuezj\
mzbnewipetnwmoynnkqpfxrqfwnjhgnlqtngjgsdishbsrmhvqswmludqhclfgdtioriboaurczibquv\
ynoewqhunvnqamkztajgialdslcsywgmilkcavogvmgopvoivrqiynfqddlpbwfamjounnsifnbcjtif\
vrrmxqvzoofniymylquwazwaynvossjxjbqjprqgspzcjtydwukmgqgngdcurfjnxgasmkacmvlrrbsb\
gqekaffihvglmilqoxurlulzejvnctkfxeibgljfgjfikezgzofpyaxvbeoafegghqcpvmycdspjjxzl\
elbueawmpcternqzmxmbebkzjgduiyliwbxqaaxpzkhysevdvofclklfdacusgyrspvcayrtfmgyefyw\
hwgdprfgngebeoadhktcxrrnjippxkvmnmiihmsoyqckcwtjbvinyllehpgyfxzqdnffjnsnuiuadgxj\
xlrjecohiqfuifsxitucynnarpsckotoxbfrxznzejyeihvpzycoqonnhfsqqvuxcgzodznrmvisoowf\
xmqycguvmrjhipowaekavwdmhtputnhuqmadfjalqtmlqpqjuuakzhprornkrcdgyjvpxdwrxbueigsm\
zdgfvhjitvdzmjzldjjckcvfxnamqtxjhsnccovtgqfkqswhogztjnhrpjudxktnwfoajtzacttniela\
sidlaptdijbpiplmznktwnhskwdjsmrlrgcemspxubdonjolhlhonhgjdoqofexpfkdycoettkznjuhs\
qsvusjddzexkgtyklygcdnlfufeojkqclpcwhedxjdtchnaiakzuulvmobxejcwunrgwytuknjqwizxe\
zayzgidzjfbjpmzjhowownvpsywxcvsrrkdkabhbdpuwalnqabspumvrntomkfnczzpoplfmmsgoqyoq\
asicrpgthxguyarkkceypebdcjlwfsmttqdxydlcryjspmbmdemhdcqrrytvelbaplpdybivkrtbmhiz\
nrrzlhnfshyvltknjtkqdwuawscipjlrvgcgfaqvebnviywczzjzalutbfcgirwdqjqoyqetazmcckor\
qiganyoauhuytehnavzbweimptsmwudufykvzjvewewutfnijyomlgzoycpxhlvxegemoykvhgaifpas\
janfzhkriiqnxkutdeenylilropyrsypxnzjwadvkuikonkgqfvnbsaewbqwymkzqbqqdrfcmfqywbyh\
vlvpoowslwnqblarroyinitlvqdocfkhhoaslztdnuodwvwobdrbunewzakcdyfxtjanidcmpfntepbd\
qshuvtbnkrkmvycfhrhqjfocrhumnyccpasldcqmerwyqwfziffcvntmxzeijxkeqamsxnxprfkdtjiz\
cwfzobfgrbqwqcchqhkgvnwkaopprhsodycmxzupouaybqexdykhfvsdjepwqjiewvidgholzdwbzfvv\
qtopmucmtsstzqxnsgrotxhpjcmlcehsuuzapmsrptxrgqclgtpvdggvcyqzjrypewjhyspysjeakfhk\
tyhiappqxcjijtmtbmqiydirxmyyroeiwrlewxajcxqyilrgppcyqtksicxwynjhydlbklvqspifhgre\
sjcikjdiodmsnwshhpwqmyraekgzmwhrapusyszccmoefrcxbgrjtgygetwxgdoawqfydwjsiecewkea\
xhmgscjeamdybeqnpplsybqxqelarwnxatvxoqeuvvturpogtmtobiwotnfzquxwhnxkuhohrgvmfkyx\
wuqqdqcybwtkmnqjhhswswvdtdyggvhqfbtmdqjxnezkpqcsamanyrpfzvsedwqoalnyonadetwrzbvg\
wdkgbljceyzozjgmwumdasndgzagorukncwdpldqsemwswnibupsjjoekngkojsjqrfpskpfjjkfxrbu\
ladbfwwmlmexcqwtwabvwiqdmaianbceqlwwjsdzhnakwmoceflarhsvmlgyoptgpovulqktnvlaxbwh\
cxgwjhjqypsiwgnnzuyeahetgmgzlgwgubgcafazfxofqmuvpweynrctcjfpnwkgfazeptbxzlgksfnr\
kljtnkrffnjwpoeunoqjoztxiojmcmvuxhderzmauzcepmvkionhdtwveupxbtwvczgqdmbgioivwpay\
xrusbiyvljkhomortipazugavuoitetsxqxqguhsyoorzihsvnrmyycyqarhcfmqjkjhbgqagrnouxdb\
xsspfaaywpwjxllfzqqnvhfwqgbnmpthcgnqiitootrfimwhclgqzzyqhwhjlwwenajrweaptbnqpcbc\
spuxvkshdnnkuzdgaysanvjnuakzrxhgxdfsfabjesudsgtitellyipvdpmpvckqjqmoxyvgkcebjvtq\
xpxeccffwsueazgxjhuaynruojryeossutgcurtkmwulmbzhvwjltrihjomdajqmhfvcbpbjoimoarrg\
emlvdxyaubyhnhbzxrhmlomsniquowftqewegamgajsaiusvjhuuzntobeipcevobgvmbxhofjkgtivh\
emcvfwmuyubglzbkbqhetkabotczkryfujvecphruqgojhyxhleqtjmofecftxzilkgyagxzgzparrfn\
rblwbdextigeabsxfmtydfvgivdlvngddwmgdsgcaermmdsslihazeckkkwakolgvujsmnfsxtidgnes\
eegsswoyqhgfeefpwqvcayicwpcxjzxgrblgbdmauboelojqpmcaetqpjugkeiiognyqwyonqgazbbas\
uozbfmybjbvebuuscupkdzawngoqrjiginxcjgmxioriuhtmuzitdggwtqxpbslnnbgogvhhzkwjugiz\
hbwpdddubdbausfiubishgmfgolwavahcsyhbeyvdxqhrcvbvngjbwqddjdbcdmsjvzrooczvnaulywz\
kwwytwuhybafthvekenplixiprhnthezweburzgyjuieyddqdbcnnaixkzceyhwuabphslzdarxiwoyf\
ordgjcfkgkgdcnancqwmxlvdjsnvjuixccuwdugwgktnsfvcwfpnvbzkpaabitsiqtsnimkzkvtyxvkt\
iavwldtupllqvhatneaprtmvqeutovqewlhdydxbnukoxizrrdluyuhlvtacmfrakojfyennunndrzgm\
ttdhuhivoyyoxryrbetqyfmxhsjwprdahfmiajgxumemgmshveovwayahqcnpallsgdljfapdvnnxovx\
sanyjuthosadeewytykoenojfbpvpwofqtrvwrmnlfzllbtfvnzjrusvyaslpdjisjpsyiidwubkfrdy\
ppkzthhaynxbgkkuoaetquqmbrkdtmnuuzeumolhxcachdlakyzmdkvnanesvuiniekzyevwthvgnttp\
mrvnzkgrrhqleekhcxeqcghpvkkmqsqogygrataiarwkitnbjqywrbrxdnllrmzgvshbtrwljukmluna\
vhdlbfpopahseuaxhyyfgsivmxwtxyqdqpgwexyaustswjifxvefinqbgicldyotfwjjtqhsokbqzdqc\
xxtvnqnoczwylpnoxdonwebdpnromcnolzcnoyrrxeidkolpycjdolneikxfvrrccdyruhasdhjmmvdu\
mvyvsdxjimikuyrwpgkrxqowmgypbtvvdoaxvbiabdibrdexhzgtnmbhegvprxkockxpewhxgzkcopye\
yootsmsdafwinrbyclrcrwmpehrqclcxghijbnuwwdofzosxtqrichwvhcvchxyhszgolwsjpgwqfxyk\
diuzlzksudpckrexuhcufedtjqglnxorexhghlcswchnobfxgrzawhacdertlzcshaabsogsvhwljhcw\
yuahrbwbagbqxntdxxvrnviytqewvcsvqdwvbcgewtmdsghoqjhugwcfkxphqmblgbbkjtyzpwmvohiv\
fjlteacxnhpcakavnavuzmxwyxsyejjgcgjjgpddajeligbbpfdhaohapuyupbrmksvujgnacytjienj\
kjqfgqytcgrtnzstbevttrofzdjmzllynmduguppubyfcbxgpztfrricrztrwhevlephwwffetassbdv\
jrcchznojoljsansawoczwsppkkynmysrygwrzdnevyqkiakkdypqwdgblueoqbqwzepynnyasjichax\
dakefsoiimcvdtaacmwdnmwgozkjxnkhogvxdrhmdcpjbokrueviyyaghzfxubgxpjsdyiwiaixybesn\
alpirbcenbwftrtllbztpjxqhozyfvwxrdbiaanvadpxodjlovnqixzycjvidfedhcqocwyznsqizkdz\
hqmjccpwvuomcnqrodlirkekhyxeqagbladrbvohqfqbhmlhbfatwddmvpqrstwesehdpcatpfjbxdoz\
zdoqxyguruiqwjfpvubvqofejswcruoyzjcdwcxcbnmctdfhqavsjxeimvughuuyslcyrsbqywfokqgz\
nnksvprtwyyolnzhwxpvztkhnbggxyyozkfgcyfcbfkvwpqyespoelxqxiwcgdwoamhsogviynizmczr\
vwyettvibnqpvjdbpmraknpfojggzbbavqxcnbtkpxlwearcatlsovdfnxdcakhpadkotmrwflfomqri\
ijelffrdsemjnwebrbclwcagbatrucuehabwszcrwkwcgzcwimogchkpnbfekmxuenyzztpigwckttpy\
yemefqihhmojxnuktmninpujlgnjuwnghznovahafifyjnzcqejbraxgdmykzwfqlxnuxtszyzapxkag\
dahjhhtwnmqncrrbjbrizkxfdnsnwiikrvjfhzxwwopvmcnoitqvhqbkkbudvmxvaazydxsnbbzjcihi\
klvxuctgubcqvkeophajkpvfmoedxrqrcirytdeeoboapopdnyqslkkpnqiuoikvogogmxbkweyaytqv\
dixynmhmjywfxzchyinzbqpshgxdlwhunqisrghavvaqzjduqeaogrwyuactoiubvfwbsikmuimwaost\
ttkeimlwnlclqkuuodiipapaorlnwdmvsetbztvvlkhnnznclmxfsjrtdspqihpaorfxjtpdbwopzxzn\
gunlcqvcoprvkkgzvktefcfdcrfggywrgpnufnaiaowunkuxumabctkrcxfvzmpoetsctlgpksvarbrt\
ndgaajrjwmzdheybtgzgbksogksrojdjwxstzlpwkhyxcliluwjzcyzrkwpnslssisxddmjxfxivqpgg\
dlhrdnnqheshmylwyaeozszcgudqzxxvpsafcezbnaawqmggsxahyfjclrmfzsqkzcuhmzighcmrmypl\
eihuhjfjiyfeusjuzcdzkhuoudastuzmzftwrkyrkpxsnoscqirkocxsjaiwqslokeohxcumuoxkbqrm\
mzylztjtsaazlbacprcxvvcwweknuhlvmcplutdpoflgjsalzrjmckarusjiochgoacrwedsgamswooy\
zcbcprgqplbuavwpgoloqouklxmddbdxsburgedxyouaiasubmhvokgbbteylttpspxvvtgigvhujylx\
lukirsqqdmfniplzxlvwxbetghxuvrhjsouzbteujvhpjaxnchcbdvtodosvxzdkcuscjovkejvhpyvx\
rajmtcedbhrwpphlevkugshgjqkretukaidfowowhxbueztudtlzqstvbtiqjtjegsyppyzecnecirbi\
xpcesvzqjfkcbcigsgmbnafaldrxriequhlyxmyqarshykzazehshfsqgsldmhhqdyaspdcqbxchkgyz\
hknkosofphuebqgwzmfdgjjyuhvzlnfqzeqxgzpvlfbgkrrzugrxzrmzcozamfololjpximgxfsdnehk\
sqkbpgtbyehjgcelnxtbgjkxngpqfltrkygcayxkxwzpxzziyizciuhhawovcownfnncdqzbiakigjnt\
aopzyavaiqnppmupthsxslxzmmfnrmpzpjfjonnqrbrlxvxhlohatrxmuhmrobfsvpgteygcsxfsikdv\
wmfilygqtdbavcivnaqkzigqpudrwrjxhpashdjnklcmwwlwhfcckmfndlxazksgqrhmgipnpqyzdrig\
percajvfnppllbqeetpaferlcphwsbktschlglxoeufwlmqzqmvvtepebcqpnwqcvaikfrcldbtzvfmr\
prrfrvtjzidasjrbiccsqkxkwuiztqueizmsgcjsglpxhsuwqabzojsgzhhsufzmtjpewhpfiegbfuhs\
jvihpkeaecfulwfkckljjcczomqtyagpbaiyqzgbkzcidtnttyndpkcqkhkcjicrdobrpfjkxhoembkf\
glizcgghtxwnkhpqfslvjqogxoqdoerwyepevtjpprxaaekssvjxlwxcygydwnlfxnddpqbidddusjei\
hdsbciupluhqavtjfpqvbbelhsoqulfuvmwfsxmxcxmaoqhazxrvkljgzfabgotdieotkqolocihtbyu\
uyuehzbpupafzcaifpwbngvplhbmninmlyrvfzegoapqyqgdmqeffdlvtgggigrzidleqwwfvqvgfnyq\
icawkhlhangpqzmmexmkafnslcpdzlipcbvscjwrtnpixgouqbyvqgestzpxlemfcmivnjltgblpomko\
aljyvhqdfwffhinwrrvrzfuthadesjzchiervegnsvnsmqdivbtbzuitrgusnsuzammhgptkdwgubjhk\
ytzswyzkiiouswwproswdsnxwegxsddlaphaiiabmxxqogebutpnhcjmszkronrknvggnpohdbjswvze\
tfetjoqdhxvzccczmhzjojxvlkwneondaumswpylaacrkzulxskatrtktcqbqrwphjvyfxxvaqdsswfm\
ctqmxsoeiasgzuqxheusfcxbtdulhsovowwysomuefffwbgnmpxaqattukdgsdetplwmmjorjcmtthnk\
mtzaqwbkistxiiexkevpjeqxuyihktzgokoyfznjbnkioqgstynvdazennussfsbymuflcfttxccgfzb\
upjfngopuyklgevnfvxbwzgjtnebfkosqujelmxuyhytjywwjttkvcmfyfognxvucjcbnymjbfxhcumn\
pjfwhqutyvjcxyrjzhamczphluhuqlyojekrzwjqjoduqbjqhmxtpzggxqmympqoxyxcycdfmdlirdxz\
zmujafknqfnmzamsjoxxvgxyobetympjtpxaididjqblompbhyzwythzjirmickueibwzthdojflsuau\
yeqhovcfxlyubhxjopaueycrjtticjtcjdyiiawlliiioyrwlitlqqvhhkervighbnddvrnhnalnxruv\
snamwljhzefuaoycbkspmebpmwmepnnbgrmwdeftbfccgatxhaxrzjuwnowituedmpwhklyamnrnwkko\
xmdafedhgbqfnfszibisfhzmcgujwhmauswthryecpdhmzhlnsknfibbzdferpbncxxdskqurpcffmio\
ykryiewbsxdmghxfdutnqshccvyjvjgaosejjmneahgtzblxzwafxadcbnzmqfanddokqlpkzljrcjta\
flqntpfaekrxiedxlkyitidtukzjdynbiwwvxljoqagqgnexbpcjhdkfocypjbqddvcyesuckvmxixwd\
fwtvygdlsdrbkufccpbxgzqllqhneaqiaegsglxupywcmpbqimftgtwimmpwhaivjwreucvfvhwlcvss\
shfelaifitiatasljenlirjmnmtlvjmcmrbpxvswkekymiwpgqlvoouyqmytonljwpudjpdmroqqjczc\
pbnolxuduzwtrkzmmukvbopgoborddqygntlzeejdgqmjfstdxtbjdjntnucnkbkqkhjtvbfzlaipiuy\
zojenqkkarrmurklgtggfwjyndhhqgrcvjtickgovpsqapewbxaquqsyblcwmpfxungelecijfgxbkfr\
ztvwnxnhxdxsulxufjwhwpglhzplpshftfttabmsxpcxvjnuidfzdcqbhnyenyzjwfcgfrvxydxpcurj\
yqzeqihkydpagszghyodvyilxnvxtigqtfnjcqpzzgxkucfhtjanlalsuycwpzqlmacgqioubiprmlzk\
hjltwohnvqggimargvxrtyhxzcvqxsxaxilmitkmlcdjepfzohssnlxixyuglmbnpcaxcruaonmhsycu\
dcmwrqdqcttsjfwppvdqvegnebfsdhnurzmwwlmfxxndlhyydxcabpkwhadravieoxfdueprutubozt'.upper()
len(k), len(set(k))
from __future__ import division
import numpy as np
import pyopencl as cl
import pyopencl.array
from ccrypto import *
import time
PyOpenCL comes with IPython integration, which lets you seamlessly integrate PyOpenCL kernels into your IPython notebooks. Simply load the PyOpenCL IPython extension using:
%load_ext pyopencl.ipython_ext
Create an OpenCL context and a command queue:
ctx = cl.create_some_context()
queue = cl.CommandQueue(ctx)
This kernel translates all the characters of the buffer.
%%cl_kernel -o "-cl-fast-relaxed-math"
__kernel void translate(__global char *txt, int offset)
{
int gid = get_global_id(0);
txt[gid] = txt[gid] + offset;
}
translate.set_scalar_arg_dtypes( [None, np.int32] )
This kernel searches by brute force the trigram of the key at the position pos
which gives the maximum IC.
%%cl_kernel -o "-cl-fast-relaxed-math"
__kernel void best_trig_max_ic(__global char *k,
int sizek,
__global char *pw,
int sizepw,
int period,
int pos,
__global float *clic)
{
int gid0 = get_global_id(0);
int gid1 = get_global_id(1);
int gid2 = get_global_id(2);
char mypw[100]; // local copy of pw
for(int i=0; i<sizepw; i++) {
mypw[i] = pw[i];
}
mypw[pos%sizepw] = gid0;
mypw[(pos+1)%sizepw] = gid1;
mypw[(pos+2)%sizepw] = gid2; // pw for this thread
unsigned short eff[1600][26];
for(int i=0; i<period; i++) { // initialization
for(int j=0; j<26; j++) {
eff[i][j] = 0;
}
}
int ipw = 0;
for(int i = 0; i<sizek; i++) {
char t = (25 - k[i] - mypw[ipw] + 26)%26; // Diana
eff[i%period][t]++;
ipw = (ipw + 1)%sizepw;
}
float mean_ic = 0;
for(int i=0; i<period; i++) { // Kullback
float ic = 0.0;
float n = 0;
for(int j=0; j<26; j++) {
float tmp = eff[i][j];
tmp *= eff[i][j]-1;
ic += tmp;
n += eff[i][j];
}
mean_ic += ic/n/(n-1);
}
clic[(gid0*26+gid1)*26+gid2] = mean_ic/period;
}
best_trig_max_ic.set_scalar_arg_dtypes( [None, np.int32, None, np.int32, np.int32, np.int32, None] )
def triconv(n):
g2 = n%26
n = (n-g2)//26
g1 = n%26
g0 = (n-g1)//26
return g0, g1, g2
def Find_best_ic(ktxt, p, q):
start = time.time()
assert(p < 100)
k = np.array(list(ktxt), dtype=np.character)
clk = cl.array.to_device(queue, k)
translate(queue, (len(clk),), None, clk.data, -65)
# Key
pw = np.array(['E' for i in range(p)], dtype=np.character)
clpw = cl.array.to_device(queue, pw)
translate(queue, (len(clpw),), None, clpw.data, -65)
# array of ic
ic = np.full(26*26*26, 0.0, dtype=np.float32) # table des ic
clic = cl.array.to_device(queue, ic)
# traitement
for i in range(0, 2*len(pw), 3): # two rounds
best_trig_max_ic(queue, (26, 26, 26), None, clk.data, len(clk),
clpw.data, p, q, i, clic.data)
ic = clic.get()
max_ic = max(ic)
print(max_ic)
idmax = np.where(ic==max(ic))[0][0]
pw = clpw.get()
pw[i%len(pw)], pw[(i+1)%len(pw)], pw[(i+2)%len(pw)] = map(chr, triconv(idmax))
clpw = cl.array.to_device(queue, pw)
translate(queue, (len(clpw),), None, clpw.data, 65)
pw = clpw.get()
pw = b''.join(pw.tolist())
pw = pw.decode("utf-8")
delta = int(time.time()-start)
print('----- Elapsed time ',delta//60, 'min', delta%60, 'sec')
return max_ic, pw
Find_best_ic(k, 41, 37*43)
kk = Diana(k, 'NECESSARYFORONEPEOPLETODISSOLVETHEPOLITIC')
Stroke of luck, the key is in clear. Period verification:
for i in range(1585, 1595, 1):
print(i, Kullback(kk, i))
Find_best_ic(kk, 43, 37)
kkk = Diana(kk, 'XIYXKAPTEFZEEXSBZLKKBZQBAQEBJTFQEXKLQEBOXKA')
Period verification:
for i in range(35, 45, 1):
print(i, Kullback(kkk, i))
Table of logarithms of quadrigram frequencies for the English language.
def quadidx(q):
"""Returns the index corresponding to a quadrigram
"""
idx = ord(q[0])-ord('A')
idx = idx*26+ord(q[1])-ord('A')
idx = idx*26+ord(q[2])-ord('A')
idx = idx*26+ord(q[3])-ord('A')
return idx
quadf = np.full(26*26*26*26, 100, dtype=np.float32)
file = open('logf4g_en.txt', 'r')
for w in file:
q, f = w.split()
quadf[quadidx(q)] = f
file.close()
clquadf = cl.array.to_device(queue, quadf)
This kernel searches by brute force the trigram of the key at the position pos
which gives the minimum logscore.
%%cl_kernel -o "-cl-fast-relaxed-math"
__kernel void best_trig_score(__global float *clquadf,
__global char *k,
int sizek,
__global char *pw,
int sizepw,
int pos,
__global float *clscore)
{
int gid0 = get_global_id(0);
int gid1 = get_global_id(1);
int gid2 = get_global_id(2);
char mypw[100]; // local copy of pw
for(int i=0; i<sizepw; i++) {
mypw[i] = pw[i];
}
mypw[pos%sizepw] = gid0;
mypw[(pos+1)%sizepw] = gid1;
mypw[(pos+2)%sizepw] = gid2; // pw for this thread
float myscore = 0.0;
char t0 = (25 - k[0] - mypw[0] + 26)%26;
char t1 = (25 - k[1] - mypw[1] + 26)%26;
char t2 = (25 - k[2] - mypw[2] + 26)%26;
int ipw = 3;
for(int i = 3; i<sizek; i++) {
char t3 = (25 - k[i] - mypw[ipw] + 26)%26; // Diana
ipw = (ipw + 1)%sizepw;
int idx = ((t0*26+t1)*26+t2)*26+t3;
if ((idx >= 0) && (idx <= 456975)) { // 26^4 = 456976
myscore += clquadf[idx];
}
else {
myscore = -1; // In case of error (never happens!)
break;
}
t0 = t1;
t1 = t2;
t2 = t3;
}
clscore[(gid0*26+gid1)*26+gid2] = myscore;
}
best_trig_score.set_scalar_arg_dtypes( [None, None, np.int32, None, np.int32, np.int32, None] )
def Solve_Diana(ktxt, p):
start = time.time()
assert(p < 100)
# crypto
k = np.array(list(ktxt), dtype=np.character)
clk = cl.array.to_device(queue, k)
translate(queue, (len(clk),), None, clk.data, -65)
# key:
pw = np.array(['E' for i in range(p)], dtype=np.character)
clpw = cl.array.to_device(queue, pw)
translate(queue, (len(clpw),), None, clpw.data, -65)
# scores array:
score = np.full(26*26*26, 0.0, dtype=np.float32) # flat array of scores
clscore = cl.array.to_device(queue, score)
# processing:
for i in range(0, 2*len(pw), 3): # two rounds
best_trig_score(queue, (26,26,26), None, clquadf.data, clk.data, len(clk),
clpw.data, p, i, clscore.data)
score = clscore.get()
min_score = min(score)
print(min(score))
idmin = np.where(score==min(score))[0][0]
pw = clpw.get()
pw[i%len(pw)], pw[(i+1)%len(pw)], pw[(i+2)%len(pw)] = map(chr, triconv(idmin))
clpw = cl.array.to_device(queue, pw)
translate(queue, (len(clpw),), None, clpw.data, 65)
pw = clpw.get()
pw = b''.join(pw.tolist())
pw = pw.decode("utf-8")
delta = int(time.time()-start)
print('----- Elapsed time ',delta//60, 'min', delta%60, 'sec')
return min_score, pw
Solve_Diana(kkk, 37)
Diana(kkk, 'TEBKFKQEBZLROPBLCERJXKBSBKQPFQYBZLJBP')
We can search for keys in any order:
Find_best_ic(k, 43, 37*41)
kk = Diana(k, 'LAKLYITPEDJEELQHJXYYHJSHISEHZPDSELYXSEHULYI')
Find_best_ic(kk, 41, 37)
kkk = Diana(kk, 'VEGEQQIRKDURUVETEUTXEPUFAQQUXNEPBETUXAPAG')
Solve_Diana(kkk, 37)
Diana(kkk, 'TEBKFKQEBZLROPBLCERJXKBSBKQPFQYBZLJBP')
Le 19/09/2018 - Contact : Rossignol@bribes.org