# # This file is part of John the Ripper password cracker, # Copyright (c) 1996-2006,2008-2011 by Solar Designer # # ...with changes in the jumbo patch, by various authors # # # This file uses rules from the KoreLogic set published # online at: http://contest.korelogic.com/rules.html # [Options] # Wordlist file name, to be used in batch mode Wordlist = $JOHN/password.lst # Default Markov mode settings Statsfile = $JOHN/stats MkvLvl = 200 MkvMaxLen = 12 # Use idle cycles only Idle = Y # Crash recovery file saving delay in seconds Save = 600 # Beep when a password is found (who needs this anyway?) Beep = N # Automagically disable OMP if MPI is used (set to N if # you want to run one MPI process per multi-core host) MPIOMPmutex = Y # Print a notice if disabling OMP (when MPIOMPmutex = Y) # or when running OMP and MPI at the same time MPIOMPverbose = Y # Time formatting string used in status ETA. # %c means 'local' specific canonical form, such as: # 05/06/11 18:10:34 # # Other examples # %d/%m/%y %H:%M (day/mon/year hour:min) # %m/%d/%y %H:%M (mon/day/year hour:min) # %Y-%m-%d %H:%M (ISO 8601 style, 2011-05-06 18:10) TimeFormat = %c # Threshold for showing ETA, in percent. ETA will not be # shown if progress is less than this. If too low, early # reported figures will be less accurate (default 0.05%) ETAthreshold = 0.05% # "Single crack" mode rules [List.Rules:Single] # Simple rules come first... : -s x** -c (?a c Q -c l Q -s-c x** /?u l # These were not included in crackers I've seen, but are pretty efficient, # so I include them near the beginning >6 '6 >7 '7 l -c >6 '6 /?u l >5 '5 # Weird order, eh? Can't do anything about it, the order is based on the # number of successful cracks... <* d r c -c <* (?a d c -c >5 '5 /?u l -c u Q -c )?a r l -[:c] <* !?A \p1[lc] p -c <* c Q d -c >7 '7 /?u >4 '4 l -c <+ (?l c r -c <+ )?l l Tm >3 '3 -c >4 '4 /?u -c >3 '3 /?u l -c u Q r <* d M 'l f Q -c <* l Q d M 'l f Q # About 50% of single-mode-crackable passwords get cracked by now... # >2 x12 ... >8 x18 >[2-8] x1\1 >9 \[ # >3 x22 ... >9 x28 >[3-9] x2\p[2-8] # >4 x32 ... >9 x37 >[4-9] x3\p[2-7] # >2 x12 /?u l ... >8 x18 /?u l -c >[2-8] x1\1 /?u l -c >9 \[ /?u l # >3 x22 /?u l ... >9 x28 /?u l -c >[3-9] x2\p[2-8] /?u l # >4 x32 /?u l ... >9 x37 /?u l -c >[4-9] x3\p[2-7] /?u l # Now to the suffix stuff... <* l $[1-9!0a-rt-z"-/:-@\[-`{-~] -c <* (?a c $[1-9!0a-rt-z"-/:-@\[-`{-~] -[:c] <* !?A (?\p1[za] \p1[lc] $s M 'l p Q X0z0 'l $s -[:c] <* /?A (?\p1[za] \p1[lc] $s <* l r $[1-9!] -c <* /?a u $[1-9!] -[:c] <- (?\p1[za] \p1[lc] Az"'s" -[:c] <- (?\p1[za] \p1[lc] Az"!!" -[:c] (?\p1[za] \p1[lc] $! <- Az"!!" # Removing vowels... -[:c] /?v @?v >2 (?\p1[za] \p1[lc] /?v @?v >2 <* d # crack -> cracked, crack -> cracking <* l [PI] -c <* l [PI] (?a c # mary -> marie -[:c] <* (?\p1[za] \p1[lc] )y omi $e # marie -> mary -[:c] <* (?\p1[za] \p1[lc] )e \] )i val1 oay # The following are some 3l33t rules -[:c] l /[aelos] s\0\p[4310$] (?\p1[za] \p1[:c] -[:c] l /a /[elos] sa4 s\0\p[310$] (?\p1[za] \p1[:c] -[:c] l /e /[los] se3 s\0\p[10$] (?\p1[za] \p1[:c] -[:c] l /l /[os] sl1 s\0\p[0$] (?\p1[za] \p1[:c] -[:c] l /o /s so0 ss$ (?\p1[za] \p1[:c] -[:c] l /a /e /[los] sa4 se3 s\0\p[10$] (?\p1[za] \p1[:c] -[:c] l /a /l /[os] sa4 sl1 s\0\p[0$] (?\p1[za] \p1[:c] -[:c] l /a /o /s sa4 so0 ss$ (?\p1[za] \p1[:c] -[:c] l /e /l /[os] se3 sl1 s\0\p[0$] (?\p1[za] \p1[:c] -[:c] l /[el] /o /s s\0\p[31] so0 ss$ (?\p1[za] \p1[:c] -[:c] l /a /e /l /[os] sa4 se3 sl1 s\0\p[0$] (?\p1[za] \p1[:c] -[:c] l /a /[el] /o /s sa4 s\0\p[31] so0 ss$ (?\p1[za] \p1[:c] -[:c] l /e /l /o /s se3 sl1 so0 ss$ (?\p1[za] \p1[:c] -[:c] l /a /e /l /o /s sa4 se3 sl1 so0 ss$ (?\p1[za] \p1[:c] # Now to the prefix stuff... l ^[1a-z2-90] -c l Q ^[A-Z] ^[A-Z] l ^["-/:-@\[-`{-~] -[:c] <9 (?a \p1[lc] A0"[tT]he" -[:c] <9 (?a \p1[lc] A0"[aA]my" -[:c] <9 (?a \p1[lc] A0"[mdMD]r" -[:c] <9 (?a \p1[lc] A0"[mdMD]r." -[:c] <9 (?a \p1[lc] A0"__" <- !?A l p ^[240-9] # Some word pair rules... # johnsmith -> JohnSmith, johnSmith -p-c (?a 2 (?a c 1 [cl] # JohnSmith -> john smith, john_smith, john-smith -p 1 <- $[ _\-] + l # JohnSmith -> John smith, John_smith, John-smith -p-c 1 <- (?a c $[ _\-] 2 l # JohnSmith -> john Smith, john_Smith, john-Smith -p-c 1 <- l $[ _\-] 2 (?a c # johnsmith -> John Smith, John_Smith, John-Smith -p-c 1 <- (?a c $[ _\-] 2 (?a c # Applying different simple rules to each of the two words -p-[c:] 1 \p1[ur] 2 l -p-c 2 (?a c 1 [ur] -p-[c:] 1 l 2 \p1[ur] -p-c 1 (?a c 2 [ur] # jsmith -> smithj, etc... -[:c] (?a \p1[lc] [{}] -[:c] (?a \p1[lc] [{}] \0 # Toggle case... -c <+ )?u l Tm -c T0 Q M c Q l Q u Q C Q X0z0 'l -c T[1-9A-E] Q M l Tm Q C Q u Q l Q c Q X0z0 'l -c l Q T[1-9A-E] Q M T\0 Q l Tm Q C Q u Q X0z0 'l -c >2 2 /?l /?u t Q M c Q C Q l Tm Q X0z0 'l # Deleting chars... >[2-8] D\p[1-7] >[8-9A-E] D\1 -c /?u >[2-8] D\p[1-7] l -c /?u >[8-9A-E] D\1 l =1?a \[ M c Q -c (?a >[1-9A-E] D\1 c # Inserting a dot... -[:c] >3 (?a \p1[lc] i[12]. # More suffix stuff... <- l Az"[190][0-9]" -c <- (?a c Az"[190][0-9]" <- l Az"[782][0-9]" -c <- (?a c Az"[782][0-9]" <* l $[A-Z] -c <* (?a c $[A-Z] # cracking -> CRACKiNG -c u /I sIi # Crack96 -> cRACK96 %2?a C Q # Crack96 -> cRACK(^ /?A S Q # Crack96 -> CRaCK96 -c /?v V Q # Really weird charset conversions, like "england" -> "rmh;smf" :[RL] Q l Q [RL] -c (?a c Q [RL] :[RL] \0 Q # Both prefixing and suffixing... <- l ^[1!@#$%^&*\-=_+.?|:'"] $\1 <- l ^[({[<] $\p[)}\]>] # The rest of two-digit suffix stuff, less common numbers... <- l Az"[63-5][0-9]" -c <- (?a c Az"[63-5][0-9]" # Some three-digit numbers... -[:c] (?a \p1[lc] Az"007" <+ -[:c] (?a \p1[lc] Az"123" <+ -[:c] (?a \p1[lc] Az"[1-9]\0\0" <+ # Some [birth] years... l Az"19[7-96-0]" <+ >- l Az"20[01]" <+ >- l Az"19[7-9][0-9]" <+ l Az"20[01][0-9]" <+ l Az"19[6-0][9-0]" <+ # Uncomment the following lines if you're really crazy ;# Insert/overstrike some characters... ;!?A >[1-6] l i\0[a-z] ;!?A l o0[a-z] ;!?A >[1-7] l o\0[a-z] ;# Toggle case everywhere (up to length 8), assuming that certain case ;# combinations were already tried. ;-c T1 Q M T0 Q ;-c T2 Q M T[z0] T[z1] Q ;-c T3 Q M T[z0] T[z1] T[z2] Q ;-c T4 Q M T[z0] T[z1] T[z2] T[z3] Q ;-c T5 Q M T[z0] T[z1] T[z2] T[z3] T[z4] Q ;-c T6 Q M T[z0] T[z1] T[z2] T[z3] T[z4] T[z5] Q ;-c T7 Q M T[z0] T[z1] T[z2] T[z3] T[z4] T[z5] T[z6] Q ;# Very slow stuff... ;l Az"[1-90][0-9][0-9]" <+ ;-c (?a c Az"[1-90][0-9][0-9]" <+ ;<[\-9] l A\p[z0]"[a-z][a-z]" ;<- l ^[a-z] $[a-z] # Wordlist mode rules [List.Rules:Wordlist] # Try words as they are : # Lowercase every pure alphanumeric word -c >3 !?X l Q # Capitalize every pure alphanumeric word -c (?a >2 !?X c Q # Lowercase and pluralize pure alphabetic words <* >2 !?A l p # Lowercase pure alphabetic words and append '1' <* >2 !?A l $1 # Capitalize pure alphabetic words and append '1' -c <* >2 !?A c $1 # Duplicate reasonably short pure alphabetic words (fred -> fredfred) <7 >1 !?A l d # Lowercase and reverse pure alphabetic words >3 !?A l M r Q # Prefix pure alphabetic words with '1' >2 !?A l ^1 # Uppercase pure alphanumeric words -c >2 !?X u Q M c Q u # Lowercase pure alphabetic words and append a digit or simple punctuation <* >2 !?A l $[2!37954860.?] # Words containing punctuation, which is then squeezed out, lowercase /?p @?p >3 l # Words with vowels removed, lowercase /?v @?v >3 l # Words containing whitespace, which is then squeezed out, lowercase /?w @?w >3 l # Capitalize and duplicate short pure alphabetic words (fred -> FredFred) -c <7 >1 !?A c d # Capitalize and reverse pure alphabetic words (fred -> derF) -c <+ >2 !?A c r # Reverse and capitalize pure alphabetic words (fred -> Derf) -c >2 !?A l M r Q c # Lowercase and reflect pure alphabetic words (fred -> fredderf) <7 >1 !?A l d M 'l f Q # Uppercase the last letter of pure alphabetic words (fred -> freD) -c <+ >2 !?A l M r Q c r # Prefix pure alphabetic words with '2' or '4' >2 !?A l ^[24] # Capitalize pure alphabetic words and append a digit or simple punctuation -c <* >2 !?A c $[2!3957468.?0] # Prefix pure alphabetic words with digits >2 !?A l ^[379568] # Capitalize and pluralize pure alphabetic words of reasonable length -c <* >2 !?A c p # Lowercase/capitalize pure alphabetic words of reasonable length and convert: # crack -> cracked, crack -> cracking -[:c] <* >2 !?A \p1[lc] M [PI] Q # Try the second half of split passwords -s x** -s-c x** M l Q # Prepend "pass" A0"[pP][aA][sS][sS]" # [List.Rules:KoreLogicRulesPrependYears] A0"20[0-1][0-9]" A0"19[3-9][0-9]" # Notice: Your wordlist should likely be all lowercase - or you are wasting work # [List.Rules:KoreLogicRulesAppendYears] cAz"19[0-9][0-9]" Az"19[0-9][0-9]" cAz"20[01][0-9]" Az"20[01][0-9]" # [List.Rules:KoreLogicRulesPrependAndAppendSpecial] cA0"[!$@#%.^&()_+\-={}|\[\]\\;':,/\<\>?`~*]"Az"[!$@#%.^&()_+\-={}|\[\]\\;':,/\<\>?`~*]" A0"[!$@#%.^&()_+\-={}|\[\]\\;':,/\<\>?`~*]"Az"[!$@#%.^&()_+\-={}|\[\]\\;':,/\<\>?`~*]" # [List.Rules:KoreLogicRulesAdd1234_Everywhere] Az"1234" >0A[0]"1234" >1A[1]"1234" >2A[2]"1234" >3A[3]"1234" >4A[4]"1234" >5A[5]"1234" >6A[6]"1234" >7A[7]"1234" >8A[8]"1234" >9A[9]"1234" # [List.Rules:KoreLogicRulesAdd123_Everywhere] Az"123" >0A[0]"123" >1A[1]"123" >2A[2]"123" >3A[3]"123" >4A[4]"123" >5A[5]"123" >6A[6]"123" >7A[7]"123" >8A[8]"123" >9A[9]"123" Az".com" cAz".com" Az".net" cAz".net" Az".org" cAz".org" # [List.Rules:KoreLogicRulesReplaceNumbers2Special] /1s1! /2s2@ /3s3# /4s4$ /5s5% /6s6^ /7s7& /8s8* /9s9( /0s0) /1s1!%12s2@ /1s1!%13s3# /1s1!%14s4$ /1s1!%15s5% /1s1!%16s6^ /1s1!%17s7& /1s1!%18s8* /1s1!%19s9( /1s1!%10s0) /2s2@%13s3# /2s2@%14s4$ /2s2@%15s5% /2s2@%16s6^ /2s2@%17s7& /2s2@%18s8* /2s2@%19s9( /2s2@%10s0) /3s3#%14s4$ /3s3#%15s5% /3s3#%16s6^ /3s3#%17s7& /3s3#%18s8* /3s3#%19s9( /3s3#%10s0) /4s4$%15s5% /4s4$%16s6^ /4s4$%17s7& /4s4$%18s8* /4s4$%19s9( /4s4$%10s0) /5s5%%16s6^ /5s5%%17s7& /5s5%%18s8* /5s5%%19s9( /5s5%%10s0) /6s6^%17s7& /6s6^%18s8* /6s6^%19s9( /6s6^%10s0) /7s7&%18s8* /7s7&%19s9( /7s7&%10s0) /8s8*%19s9( /8s8*%10s0) /9s9(%10s0) # [List.Rules:KoreLogicRulesReplaceNumbers] /0s01 /0s02 /0s03 /0s04 /0s05 /0s06 /0s07 /0s08 /0s09 /1s10 /1s12 /1s13 /1s14 /1s15 /1s16 /1s17 /1s18 /1s19 /2s20 /2s21 /2s23 /2s24 /2s25 /2s26 /2s27 /2s28 /2s29 /3s30 /3s31 /3s32 /3s34 /3s35 /3s36 /3s37 /3s38 /3s39 /4s40 /4s41 /4s42 /4s43 /4s45 /4s46 /4s47 /4s48 /4s49 /5s50 /5s51 /5s52 /5s53 /5s54 /5s56 /5s57 /5s58 /5s59 /6s60 /6s61 /6s62 /6s63 /6s64 /6s65 /6s67 /6s68 /6s69 /7s70 /7s71 /7s72 /7s73 /7s74 /7s75 /7s76 /7s78 /7s79 /8s80 /8s81 /8s82 /8s83 /8s84 /8s85 /8s86 /8s87 /8s89 /9s90 /9s91 /9s92 /9s93 /9s94 /9s95 /9s96 /9s97 /9s98 # [List.Rules:KoreLogicRulesPrependJustSpecials] cA0"[!$@#%.^&()_+\-={}|\[\]\\;':,/\<\>?`~*]" A0"[!$@#%.^&()_+\-={}|\[\]\\;':,/\<\>?`~*]" cA0"[!$@#%.^&()_+\-={}|\[\]\\;':,/\<\>?`~*][!$@#%.^&()_+\-={}|\[\]\\;':,/\<\>?`~*]" A0"[!$@#%.^&()_+\-={}|\[\]\\;':,/\<\>?`~*][!$@#%.^&()_+\-={}|\[\]\\;':,/\<\>?`~*]" # [List.Rules:KoreLogicRulesAppend1_AddSpecialEverywhere] >4cA[0-5]"[!$@#%.^&()_+\-={}|\[\]\\;':,/\<\>?`~*]"Az"1" >5cA[6]"[!$@#%.^&()_+\-={}|\[\]\\;':,/\<\>?`~*]"Az"1" >6cA[7]"[!$@#%.^&()_+\-={}|\[\]\\;':,/\<\>?`~*]"Az"1" >7cA[8]"[!$@#%.^&()_+\-={}|\[\]\\;':,/\<\>?`~*]"Az"1" >8cA[9]"[!$@#%.^&()_+\-={}|\[\]\\;':,/\<\>?`~*]"Az"1" >4A[0-5]"[!$@#%.^&()_+\-={}|\[\]\\;':,/\<\>?`~*]"Az"1" >5A[6]"[!$@#%.^&()_+\-={}|\[\]\\;':,/\<\>?`~*]"Az"1" >6A[7]"[!$@#%.^&()_+\-={}|\[\]\\;':,/\<\>?`~*]"Az"1" >7A[8]"[!$@#%.^&()_+\-={}|\[\]\\;':,/\<\>?`~*]"Az"1" >8A[9]"[!$@#%.^&()_+\-={}|\[\]\\;':,/\<\>?`~*]"Az"1" A0"[dD]ev" Az"[dD]ev" A0"[uU]at" Az"[uU]at" A0"[pP]rod" Az"[pP]rod" A0"[tT]est" Az"[tT]est" /asa@[:c] /asa4[:c] /AsA4[:c] /AsA@[:c] /bsb8[:c] /BsB8[:c] /ese3[:c] /EsE3[:c] /isi1[:c] /isi![:c] /isi|[:c] /IsI1[:c] /IsI![:c] /IsI|[:c] /lsl1[:c] /lsl7[:c] /lsl|[:c] /lsl![:c] /Lsl1[:c] /Lsl7[:c] /Lsl|[:c] /Lsl![:c] /oso0[:c] /OsO0[:c] /sss$[:c] /sss5[:c] /SsS$[:c] /SsS5[:c] /tst+[:c] /TsT+[:c] /1s1![:c] /1s1i[:c] /1s1I[:c] /1s1|[:c] /0s0o[:c] /0s0O[:c] /3s3e[:c] /3s3E[:c] /4s4a[:c] /4s4A[:c] /5s5s[:c] /5s5S[:c] /7s7l[:c] /7s7L[:c] /8s8b[:c] /8s8B[:c] /asa@/bsb8[:c] /asa@/BsB8[:c] /asa@/ese3[:c] /asa@/EsE3[:c] /asa@/isi1[:c] /asa@/isi![:c] /asa@/isi|[:c] /asa@/IsI1[:c] /asa@/IsI![:c] /asa@/IsI|[:c] /asa@/lsl1[:c] /asa@/lsl7[:c] /asa@/lsl|[:c] /asa@/lsl![:c] /asa@/Lsl1[:c] /asa@/Lsl7[:c] /asa@/Lsl|[:c] /asa@/Lsl![:c] /asa@/oso0[:c] /asa@/OsO0[:c] /asa@/sss$[:c] /asa@/sss5[:c] /asa@/SsS$[:c] /asa@/SsS5[:c] /asa@/tst+[:c] /asa@/TsT+[:c] /asa@/1s1![:c] /asa@/1s1i[:c] /asa@/1s1I[:c] /asa@/1s1|[:c] /asa@/0s0o[:c] /asa@/0s0O[:c] /asa@/3s3e[:c] /asa@/3s3E[:c] /asa@/4s4a[:c] /asa@/4s4A[:c] /asa@/5s5s[:c] /asa@/5s5S[:c] /asa@/7s7l[:c] /asa@/7s7L[:c] /asa@/8s8b[:c] /asa@/8s8B[:c] /asa4/AsA4[:c] /asa4/AsA@[:c] /asa4/bsb8[:c] /asa4/BsB8[:c] /asa4/ese3[:c] /asa4/EsE3[:c] /asa4/isi1[:c] /asa4/isi![:c] /asa4/isi|[:c] /asa4/IsI1[:c] /asa4/IsI![:c] /asa4/IsI|[:c] /asa4/lsl1[:c] /asa4/lsl7[:c] /asa4/lsl|[:c] /asa4/lsl![:c] /asa4/Lsl1[:c] /asa4/Lsl7[:c] /asa4/Lsl|[:c] /asa4/Lsl![:c] /asa4/oso0[:c] /asa4/OsO0[:c] /asa4/sss$[:c] /asa4/sss5[:c] /asa4/SsS$[:c] /asa4/SsS5[:c] /asa4/tst+[:c] /asa4/TsT+[:c] /asa4/1s1![:c] /asa4/1s1i[:c] /asa4/1s1I[:c] /asa4/1s1|[:c] /asa4/0s0o[:c] /asa4/0s0O[:c] /asa4/3s3e[:c] /asa4/3s3E[:c] /asa4/4s4a[:c] /asa4/4s4A[:c] /asa4/5s5s[:c] /asa4/5s5S[:c] /asa4/7s7l[:c] /asa4/7s7L[:c] /asa4/8s8b[:c] /asa4/8s8B[:c] /AsA4/asa@[:c] /AsA4/asa4[:c] /AsA4/BsB8[:c] /AsA4/ese3[:c] /AsA4/EsE3[:c] /AsA4/isi1[:c] /AsA4/isi![:c] /AsA4/isi|[:c] /AsA4/IsI1[:c] /AsA4/IsI![:c] /AsA4/IsI|[:c] /AsA4/lsl1[:c] /AsA4/lsl7[:c] /AsA4/lsl|[:c] /AsA4/lsl![:c] /AsA4/Lsl1[:c] /AsA4/Lsl7[:c] /AsA4/Lsl|[:c] /AsA4/Lsl![:c] /AsA4/oso0[:c] /AsA4/OsO0[:c] /AsA4/sss$[:c] /AsA4/sss5[:c] /AsA4/SsS$[:c] /AsA4/SsS5[:c] /AsA4/tst+[:c] /AsA4/TsT+[:c] /AsA4/1s1![:c] /AsA4/1s1i[:c] /AsA4/1s1I[:c] /AsA4/1s1|[:c] /AsA4/0s0o[:c] /AsA4/0s0O[:c] /AsA4/3s3e[:c] /AsA4/3s3E[:c] /AsA4/4s4a[:c] /AsA4/4s4A[:c] /AsA4/5s5s[:c] /AsA4/5s5S[:c] /AsA4/7s7l[:c] /AsA4/7s7L[:c] /AsA4/8s8b[:c] /AsA4/8s8B[:c] /AsA@/asa@[:c] /AsA@/asa4[:c] /AsA@/bsb8[:c] /AsA@/BsB8[:c] /AsA@/ese3[:c] /AsA@/EsE3[:c] /AsA@/isi1[:c] /AsA@/isi![:c] /AsA@/isi|[:c] /AsA@/IsI1[:c] /AsA@/IsI![:c] /AsA@/IsI|[:c] /AsA@/lsl1[:c] /AsA@/lsl7[:c] /AsA@/lsl|[:c] /AsA@/lsl![:c] /AsA@/Lsl1[:c] /AsA@/Lsl7[:c] /AsA@/Lsl|[:c] /AsA@/Lsl![:c] /AsA@/oso0[:c] /AsA@/OsO0[:c] /AsA@/sss$[:c] /AsA@/sss5[:c] /AsA@/SsS$[:c] /AsA@/SsS5[:c] /AsA@/tst+[:c] /AsA@/TsT+[:c] /AsA@/1s1![:c] /AsA@/1s1i[:c] /AsA@/1s1I[:c] /AsA@/1s1|[:c] /AsA@/0s0o[:c] /AsA@/0s0O[:c] /AsA@/3s3e[:c] /AsA@/3s3E[:c] /AsA@/4s4a[:c] /AsA@/4s4A[:c] /AsA@/5s5s[:c] /AsA@/5s5S[:c] /AsA@/7s7l[:c] /AsA@/7s7L[:c] /AsA@/8s8b[:c] /AsA@/8s8B[:c] /bsb8/asa@[:c] /bsb8/asa4[:c] /bsb8/AsA4[:c] /bsb8/AsA@[:c] /bsb8/BsB8[:c] /bsb8/ese3[:c] /bsb8/EsE3[:c] /bsb8/isi1[:c] /bsb8/isi![:c] /bsb8/isi|[:c] /bsb8/IsI1[:c] /bsb8/IsI![:c] /bsb8/IsI|[:c] /bsb8/lsl1[:c] /bsb8/lsl7[:c] /bsb8/lsl|[:c] /bsb8/lsl![:c] /bsb8/Lsl1[:c] /bsb8/Lsl7[:c] /bsb8/Lsl|[:c] /bsb8/Lsl![:c] /bsb8/oso0[:c] /bsb8/OsO0[:c] /bsb8/sss$[:c] /bsb8/sss5[:c] /bsb8/SsS$[:c] /bsb8/SsS5[:c] /bsb8/tst+[:c] /bsb8/TsT+[:c] /bsb8/1s1![:c] /bsb8/1s1i[:c] /bsb8/1s1I[:c] /bsb8/1s1|[:c] /bsb8/0s0o[:c] /bsb8/0s0O[:c] /bsb8/3s3e[:c] /bsb8/3s3E[:c] /bsb8/4s4a[:c] /bsb8/4s4A[:c] /bsb8/5s5s[:c] /bsb8/5s5S[:c] /bsb8/7s7l[:c] /bsb8/7s7L[:c] /bsb8/8s8b[:c] /bsb8/8s8B[:c] /BsB8/asa@[:c] /BsB8/asa4[:c] /BsB8/AsA4[:c] /BsB8/AsA@[:c] /BsB8/bsb8[:c] /BsB8/ese3[:c] /BsB8/EsE3[:c] /BsB8/isi1[:c] /BsB8/isi![:c] /BsB8/isi|[:c] /BsB8/IsI1[:c] /BsB8/IsI![:c] /BsB8/IsI|[:c] /BsB8/lsl1[:c] /BsB8/lsl7[:c] /BsB8/lsl|[:c] /BsB8/lsl![:c] /BsB8/Lsl1[:c] /BsB8/Lsl7[:c] /BsB8/Lsl|[:c] /BsB8/Lsl![:c] /BsB8/oso0[:c] /BsB8/OsO0[:c] /BsB8/sss$[:c] /BsB8/sss5[:c] /BsB8/SsS$[:c] /BsB8/SsS5[:c] /BsB8/tst+[:c] /BsB8/TsT+[:c] /BsB8/1s1![:c] /BsB8/1s1i[:c] /BsB8/1s1I[:c] /BsB8/1s1|[:c] /BsB8/0s0o[:c] /BsB8/0s0O[:c] /BsB8/3s3e[:c] /BsB8/3s3E[:c] /BsB8/4s4a[:c] /BsB8/4s4A[:c] /BsB8/5s5s[:c] /BsB8/5s5S[:c] /BsB8/7s7l[:c] /BsB8/7s7L[:c] /BsB8/8s8b[:c] /BsB8/8s8B[:c] /ese3/asa@[:c] /ese3/asa4[:c] /ese3/AsA4[:c] /ese3/AsA@[:c] /ese3/bsb8[:c] /ese3/BsB8[:c] /ese3/EsE3[:c] /ese3/isi1[:c] /ese3/isi![:c] /ese3/isi|[:c] /ese3/IsI1[:c] /ese3/IsI![:c] /ese3/IsI|[:c] /ese3/lsl1[:c] /ese3/lsl7[:c] /ese3/lsl|[:c] /ese3/lsl![:c] /ese3/Lsl1[:c] /ese3/Lsl7[:c] /ese3/Lsl|[:c] /ese3/Lsl![:c] /ese3/oso0[:c] /ese3/OsO0[:c] /ese3/sss$[:c] /ese3/sss5[:c] /ese3/SsS$[:c] /ese3/SsS5[:c] /ese3/tst+[:c] /ese3/TsT+[:c] /ese3/1s1![:c] /ese3/1s1i[:c] /ese3/1s1I[:c] /ese3/1s1|[:c] /ese3/0s0o[:c] /ese3/0s0O[:c] /ese3/3s3e[:c] /ese3/3s3E[:c] /ese3/4s4a[:c] /ese3/4s4A[:c] /ese3/5s5s[:c] /ese3/5s5S[:c] /ese3/7s7l[:c] /ese3/7s7L[:c] /ese3/8s8b[:c] /ese3/8s8B[:c] /EsE3/asa@[:c] /EsE3/asa4[:c] /EsE3/AsA4[:c] /EsE3/AsA@[:c] /EsE3/bsb8[:c] /EsE3/BsB8[:c] /EsE3/ese3[:c] /EsE3/isi1[:c] /EsE3/isi![:c] /EsE3/isi|[:c] /EsE3/IsI1[:c] /EsE3/IsI![:c] /EsE3/IsI|[:c] /EsE3/lsl1[:c] /EsE3/lsl7[:c] /EsE3/lsl|[:c] /EsE3/lsl![:c] /EsE3/Lsl1[:c] /EsE3/Lsl7[:c] /EsE3/Lsl|[:c] /EsE3/Lsl![:c] /EsE3/oso0[:c] /EsE3/OsO0[:c] /EsE3/sss$[:c] /EsE3/sss5[:c] /EsE3/SsS$[:c] /EsE3/SsS5[:c] /EsE3/tst+[:c] /EsE3/TsT+[:c] /EsE3/1s1![:c] /EsE3/1s1i[:c] /EsE3/1s1I[:c] /EsE3/1s1|[:c] /EsE3/0s0o[:c] /EsE3/0s0O[:c] /EsE3/3s3e[:c] /EsE3/3s3E[:c] /EsE3/4s4a[:c] /EsE3/4s4A[:c] /EsE3/5s5s[:c] /EsE3/5s5S[:c] /EsE3/7s7l[:c] /EsE3/7s7L[:c] /EsE3/8s8b[:c] /EsE3/8s8B[:c] /isi1/asa@[:c] /isi1/asa4[:c] /isi1/AsA4[:c] /isi1/AsA@[:c] /isi1/bsb8[:c] /isi1/BsB8[:c] /isi1/ese3[:c] /isi1/EsE3[:c] /isi1/IsI1[:c] /isi1/IsI![:c] /isi1/IsI|[:c] /isi1/lsl1[:c] /isi1/lsl7[:c] /isi1/lsl|[:c] /isi1/lsl![:c] /isi1/Lsl1[:c] /isi1/Lsl7[:c] /isi1/Lsl|[:c] /isi1/Lsl![:c] /isi1/oso0[:c] /isi1/OsO0[:c] /isi1/sss$[:c] /isi1/sss5[:c] /isi1/SsS$[:c] /isi1/SsS5[:c] /isi1/tst+[:c] /isi1/TsT+[:c] /isi1/1s1![:c] /isi1/1s1i[:c] /isi1/1s1I[:c] /isi1/1s1|[:c] /isi1/0s0o[:c] /isi1/0s0O[:c] /isi1/3s3e[:c] /isi1/3s3E[:c] /isi1/4s4a[:c] /isi1/4s4A[:c] /isi1/5s5s[:c] /isi1/5s5S[:c] /isi1/7s7l[:c] /isi1/7s7L[:c] /isi1/8s8b[:c] /isi1/8s8B[:c] /isi!/asa@[:c] /isi!/asa4[:c] /isi!/AsA4[:c] /isi!/AsA@[:c] /isi!/bsb8[:c] /isi!/BsB8[:c] /isi!/ese3[:c] /isi!/EsE3[:c] /isi!/isi1[:c] /isi!/isi|[:c] /isi!/IsI1[:c] /isi!/IsI![:c] /isi!/IsI|[:c] /isi!/lsl1[:c] /isi!/lsl7[:c] /isi!/lsl|[:c] /isi!/lsl![:c] /isi!/Lsl1[:c] /isi!/Lsl7[:c] /isi!/Lsl|[:c] /isi!/Lsl![:c] /isi!/oso0[:c] /isi!/OsO0[:c] /isi!/sss$[:c] /isi!/sss5[:c] /isi!/SsS$[:c] /isi!/SsS5[:c] /isi!/tst+[:c] /isi!/TsT+[:c] /isi!/1s1![:c] /isi!/1s1i[:c] /isi!/1s1I[:c] /isi!/1s1|[:c] /isi!/0s0o[:c] /isi!/0s0O[:c] /isi!/3s3e[:c] /isi!/3s3E[:c] /isi!/4s4a[:c] /isi!/4s4A[:c] /isi!/5s5s[:c] /isi!/5s5S[:c] /isi!/7s7l[:c] /isi!/7s7L[:c] /isi!/8s8b[:c] /isi!/8s8B[:c] /isi|/asa@[:c] /isi|/asa4[:c] /isi|/AsA4[:c] /isi|/AsA@[:c] /isi|/bsb8[:c] /isi|/BsB8[:c] /isi|/ese3[:c] /isi|/EsE3[:c] /isi|/isi1[:c] /isi|/isi![:c] /isi|/IsI1[:c] /isi|/IsI![:c] /isi|/IsI|[:c] /isi|/lsl1[:c] /isi|/lsl7[:c] /isi|/lsl|[:c] /isi|/lsl![:c] /isi|/Lsl1[:c] /isi|/Lsl7[:c] /isi|/Lsl|[:c] /isi|/Lsl![:c] /isi|/oso0[:c] /isi|/OsO0[:c] /isi|/sss$[:c] /isi|/sss5[:c] /isi|/SsS$[:c] /isi|/SsS5[:c] /isi|/tst+[:c] /isi|/TsT+[:c] /isi|/1s1![:c] /isi|/1s1i[:c] /isi|/1s1I[:c] /isi|/1s1|[:c] /isi|/0s0o[:c] /isi|/0s0O[:c] /isi|/3s3e[:c] /isi|/3s3E[:c] /isi|/4s4a[:c] /isi|/4s4A[:c] /isi|/5s5s[:c] /isi|/5s5S[:c] /isi|/7s7l[:c] /isi|/7s7L[:c] /isi|/8s8b[:c] /isi|/8s8B[:c] /IsI1/asa@[:c] /IsI1/asa4[:c] /IsI1/AsA4[:c] /IsI1/AsA@[:c] /IsI1/bsb8[:c] /IsI1/BsB8[:c] /IsI1/ese3[:c] /IsI1/EsE3[:c] /IsI1/isi1[:c] /IsI1/isi![:c] /IsI1/isi|[:c] /IsI1/lsl1[:c] /IsI1/lsl7[:c] /IsI1/lsl|[:c] /IsI1/lsl![:c] /IsI1/Lsl1[:c] /IsI1/Lsl7[:c] /IsI1/Lsl|[:c] /IsI1/Lsl![:c] /IsI1/oso0[:c] /IsI1/OsO0[:c] /IsI1/sss$[:c] /IsI1/sss5[:c] /IsI1/SsS$[:c] /IsI1/SsS5[:c] /IsI1/tst+[:c] /IsI1/TsT+[:c] /IsI1/1s1![:c] /IsI1/1s1i[:c] /IsI1/1s1I[:c] /IsI1/1s1|[:c] /IsI1/0s0o[:c] /IsI1/0s0O[:c] /IsI1/3s3e[:c] /IsI1/3s3E[:c] /IsI1/4s4a[:c] /IsI1/4s4A[:c] /IsI1/5s5s[:c] /IsI1/5s5S[:c] /IsI1/7s7l[:c] /IsI1/7s7L[:c] /IsI1/8s8b[:c] /IsI1/8s8B[:c] /IsI!/asa@[:c] /IsI!/asa4[:c] /IsI!/AsA4[:c] /IsI!/AsA@[:c] /IsI!/bsb8[:c] /IsI!/BsB8[:c] /IsI!/ese3[:c] /IsI!/EsE3[:c] /IsI!/isi1[:c] /IsI!/isi![:c] /IsI!/isi|[:c] /IsI!/IsI1[:c] /IsI!/IsI|[:c] /IsI!/lsl1[:c] /IsI!/lsl7[:c] /IsI!/lsl|[:c] /IsI!/lsl![:c] /IsI!/Lsl1[:c] /IsI!/Lsl7[:c] /IsI!/Lsl|[:c] /IsI!/Lsl![:c] /IsI!/oso0[:c] /IsI!/OsO0[:c] /IsI!/sss$[:c] /IsI!/sss5[:c] /IsI!/SsS$[:c] /IsI!/SsS5[:c] /IsI!/tst+[:c] /IsI!/TsT+[:c] /IsI!/1s1![:c] /IsI!/1s1i[:c] /IsI!/1s1I[:c] /IsI!/1s1|[:c] /IsI!/0s0o[:c] /IsI!/0s0O[:c] /IsI!/3s3e[:c] /IsI!/3s3E[:c] /IsI!/4s4a[:c] /IsI!/4s4A[:c] /IsI!/5s5s[:c] /IsI!/5s5S[:c] /IsI!/7s7l[:c] /IsI!/7s7L[:c] /IsI!/8s8b[:c] /IsI!/8s8B[:c] /IsI|/asa@[:c] /IsI|/asa4[:c] /IsI|/AsA4[:c] /IsI|/AsA@[:c] /IsI|/bsb8[:c] /IsI|/BsB8[:c] /IsI|/ese3[:c] /IsI|/EsE3[:c] /IsI|/isi1[:c] /IsI|/isi![:c] /IsI|/isi|[:c] /IsI|/IsI1[:c] /IsI|/IsI![:c] /IsI|/lsl1[:c] /IsI|/lsl7[:c] /IsI|/lsl|[:c] /IsI|/lsl![:c] /IsI|/Lsl1[:c] /IsI|/Lsl7[:c] /IsI|/Lsl|[:c] /IsI|/Lsl![:c] /IsI|/oso0[:c] /IsI|/OsO0[:c] /IsI|/sss$[:c] /IsI|/sss5[:c] /IsI|/SsS$[:c] /IsI|/SsS5[:c] /IsI|/tst+[:c] /IsI|/TsT+[:c] /IsI|/1s1![:c] /IsI|/1s1i[:c] /IsI|/1s1I[:c] /IsI|/1s1|[:c] /IsI|/0s0o[:c] /IsI|/0s0O[:c] /IsI|/3s3e[:c] /IsI|/3s3E[:c] /IsI|/4s4a[:c] /IsI|/4s4A[:c] /IsI|/5s5s[:c] /IsI|/5s5S[:c] /IsI|/7s7l[:c] /IsI|/7s7L[:c] /IsI|/8s8b[:c] /IsI|/8s8B[:c] /lsl1/asa@[:c] /lsl1/asa4[:c] /lsl1/AsA4[:c] /lsl1/AsA@[:c] /lsl1/bsb8[:c] /lsl1/BsB8[:c] /lsl1/ese3[:c] /lsl1/EsE3[:c] /lsl1/isi1[:c] /lsl1/isi![:c] /lsl1/isi|[:c] /lsl1/IsI1[:c] /lsl1/IsI![:c] /lsl1/IsI|[:c] /lsl1/Lsl1[:c] /lsl1/Lsl7[:c] /lsl1/Lsl|[:c] /lsl1/Lsl![:c] /lsl1/oso0[:c] /lsl1/OsO0[:c] /lsl1/sss$[:c] /lsl1/sss5[:c] /lsl1/SsS$[:c] /lsl1/SsS5[:c] /lsl1/tst+[:c] /lsl1/TsT+[:c] /lsl1/1s1![:c] /lsl1/1s1i[:c] /lsl1/1s1I[:c] /lsl1/1s1|[:c] /lsl1/0s0o[:c] /lsl1/0s0O[:c] /lsl1/3s3e[:c] /lsl1/3s3E[:c] /lsl1/4s4a[:c] /lsl1/4s4A[:c] /lsl1/5s5s[:c] /lsl1/5s5S[:c] /lsl1/7s7l[:c] /lsl1/7s7L[:c] /lsl1/8s8b[:c] /lsl1/8s8B[:c] /lsl7/asa@[:c] /lsl7/asa4[:c] /lsl7/AsA4[:c] /lsl7/AsA@[:c] /lsl7/bsb8[:c] /lsl7/BsB8[:c] /lsl7/ese3[:c] /lsl7/EsE3[:c] /lsl7/isi1[:c] /lsl7/isi![:c] /lsl7/isi|[:c] /lsl7/IsI1[:c] /lsl7/IsI![:c] /lsl7/IsI|[:c] /lsl7/lsl1[:c] /lsl7/lsl|[:c] /lsl7/lsl![:c] /lsl7/Lsl1[:c] /lsl7/Lsl7[:c] /lsl7/Lsl|[:c] /lsl7/Lsl![:c] /lsl7/oso0[:c] /lsl7/OsO0[:c] /lsl7/sss$[:c] /lsl7/sss5[:c] /lsl7/SsS$[:c] /lsl7/SsS5[:c] /lsl7/tst+[:c] /lsl7/TsT+[:c] /lsl7/1s1![:c] /lsl7/1s1i[:c] /lsl7/1s1I[:c] /lsl7/1s1|[:c] /lsl7/0s0o[:c] /lsl7/0s0O[:c] /lsl7/3s3e[:c] /lsl7/3s3E[:c] /lsl7/4s4a[:c] /lsl7/4s4A[:c] /lsl7/5s5s[:c] /lsl7/5s5S[:c] /lsl7/7s7l[:c] /lsl7/7s7L[:c] /lsl7/8s8b[:c] /lsl7/8s8B[:c] /lsl|/asa@[:c] /lsl|/asa4[:c] /lsl|/AsA4[:c] /lsl|/AsA@[:c] /lsl|/bsb8[:c] /lsl|/BsB8[:c] /lsl|/ese3[:c] /lsl|/EsE3[:c] /lsl|/isi1[:c] /lsl|/isi![:c] /lsl|/isi|[:c] /lsl|/IsI1[:c] /lsl|/IsI![:c] /lsl|/IsI|[:c] /lsl|/lsl1[:c] /lsl|/lsl7[:c] /lsl|/lsl![:c] /lsl|/Lsl1[:c] /lsl|/Lsl7[:c] /lsl|/Lsl|[:c] /lsl|/Lsl![:c] /lsl|/oso0[:c] /lsl|/OsO0[:c] /lsl|/sss$[:c] /lsl|/sss5[:c] /lsl|/SsS$[:c] /lsl|/SsS5[:c] /lsl|/tst+[:c] /lsl|/TsT+[:c] /lsl|/1s1![:c] /lsl|/1s1i[:c] /lsl|/1s1I[:c] /lsl|/1s1|[:c] /lsl|/0s0o[:c] /lsl|/0s0O[:c] /lsl|/3s3e[:c] /lsl|/3s3E[:c] /lsl|/4s4a[:c] /lsl|/4s4A[:c] /lsl|/5s5s[:c] /lsl|/5s5S[:c] /lsl|/7s7l[:c] /lsl|/7s7L[:c] /lsl|/8s8b[:c] /lsl|/8s8B[:c] /lsl!/asa@[:c] /lsl!/asa4[:c] /lsl!/AsA4[:c] /lsl!/AsA@[:c] /lsl!/bsb8[:c] /lsl!/BsB8[:c] /lsl!/ese3[:c] /lsl!/EsE3[:c] /lsl!/isi1[:c] /lsl!/isi![:c] /lsl!/isi|[:c] /lsl!/IsI1[:c] /lsl!/IsI![:c] /lsl!/IsI|[:c] /lsl!/lsl1[:c] /lsl!/lsl7[:c] /lsl!/lsl|[:c] /lsl!/Lsl1[:c] /lsl!/Lsl7[:c] /lsl!/Lsl|[:c] /lsl!/Lsl![:c] /lsl!/oso0[:c] /lsl!/OsO0[:c] /lsl!/sss$[:c] /lsl!/sss5[:c] /lsl!/SsS$[:c] /lsl!/SsS5[:c] /lsl!/tst+[:c] /lsl!/TsT+[:c] /lsl!/1s1![:c] /lsl!/1s1i[:c] /lsl!/1s1I[:c] /lsl!/1s1|[:c] /lsl!/0s0o[:c] /lsl!/0s0O[:c] /lsl!/3s3e[:c] /lsl!/3s3E[:c] /lsl!/4s4a[:c] /lsl!/4s4A[:c] /lsl!/5s5s[:c] /lsl!/5s5S[:c] /lsl!/7s7l[:c] /lsl!/7s7L[:c] /lsl!/8s8b[:c] /lsl!/8s8B[:c] /Lsl1/asa@[:c] /Lsl1/asa4[:c] /Lsl1/AsA4[:c] /Lsl1/AsA@[:c] /Lsl1/bsb8[:c] /Lsl1/BsB8[:c] /Lsl1/ese3[:c] /Lsl1/EsE3[:c] /Lsl1/isi1[:c] /Lsl1/isi![:c] /Lsl1/isi|[:c] /Lsl1/IsI1[:c] /Lsl1/IsI![:c] /Lsl1/IsI|[:c] /Lsl1/lsl1[:c] /Lsl1/lsl7[:c] /Lsl1/lsl|[:c] /Lsl1/lsl![:c] /Lsl1/oso0[:c] /Lsl1/OsO0[:c] /Lsl1/sss$[:c] /Lsl1/sss5[:c] /Lsl1/SsS$[:c] /Lsl1/SsS5[:c] /Lsl1/tst+[:c] /Lsl1/TsT+[:c] /Lsl1/1s1![:c] /Lsl1/1s1i[:c] /Lsl1/1s1I[:c] /Lsl1/1s1|[:c] /Lsl1/0s0o[:c] /Lsl1/0s0O[:c] /Lsl1/3s3e[:c] /Lsl1/3s3E[:c] /Lsl1/4s4a[:c] /Lsl1/4s4A[:c] /Lsl1/5s5s[:c] /Lsl1/5s5S[:c] /Lsl1/7s7l[:c] /Lsl1/7s7L[:c] /Lsl1/8s8b[:c] /Lsl1/8s8B[:c] /Lsl7/asa@[:c] /Lsl7/asa4[:c] /Lsl7/AsA4[:c] /Lsl7/AsA@[:c] /Lsl7/bsb8[:c] /Lsl7/BsB8[:c] /Lsl7/ese3[:c] /Lsl7/EsE3[:c] /Lsl7/isi1[:c] /Lsl7/isi![:c] /Lsl7/isi|[:c] /Lsl7/IsI1[:c] /Lsl7/IsI![:c] /Lsl7/IsI|[:c] /Lsl7/lsl1[:c] /Lsl7/lsl7[:c] /Lsl7/lsl|[:c] /Lsl7/lsl![:c] /Lsl7/Lsl1[:c] /Lsl7/Lsl|[:c] /Lsl7/Lsl![:c] /Lsl7/oso0[:c] /Lsl7/OsO0[:c] /Lsl7/sss$[:c] /Lsl7/sss5[:c] /Lsl7/SsS$[:c] /Lsl7/SsS5[:c] /Lsl7/tst+[:c] /Lsl7/TsT+[:c] /Lsl7/1s1![:c] /Lsl7/1s1i[:c] /Lsl7/1s1I[:c] /Lsl7/1s1|[:c] /Lsl7/0s0o[:c] /Lsl7/0s0O[:c] /Lsl7/3s3e[:c] /Lsl7/3s3E[:c] /Lsl7/4s4a[:c] /Lsl7/4s4A[:c] /Lsl7/5s5s[:c] /Lsl7/5s5S[:c] /Lsl7/7s7l[:c] /Lsl7/7s7L[:c] /Lsl7/8s8b[:c] /Lsl7/8s8B[:c] /Lsl|/asa@[:c] /Lsl|/asa4[:c] /Lsl|/AsA4[:c] /Lsl|/AsA@[:c] /Lsl|/bsb8[:c] /Lsl|/BsB8[:c] /Lsl|/ese3[:c] /Lsl|/EsE3[:c] /Lsl|/isi1[:c] /Lsl|/isi![:c] /Lsl|/isi|[:c] /Lsl|/IsI1[:c] /Lsl|/IsI![:c] /Lsl|/IsI|[:c] /Lsl|/lsl1[:c] /Lsl|/lsl7[:c] /Lsl|/lsl|[:c] /Lsl|/lsl![:c] /Lsl|/oso0[:c] /Lsl|/OsO0[:c] /Lsl|/sss$[:c] /Lsl|/sss5[:c] /Lsl|/SsS$[:c] /Lsl|/SsS5[:c] /Lsl|/tst+[:c] /Lsl|/TsT+[:c] /Lsl|/1s1![:c] /Lsl|/1s1i[:c] /Lsl|/1s1I[:c] /Lsl|/1s1|[:c] /Lsl|/0s0o[:c] /Lsl|/0s0O[:c] /Lsl|/3s3e[:c] /Lsl|/3s3E[:c] /Lsl|/4s4a[:c] /Lsl|/4s4A[:c] /Lsl|/5s5s[:c] /Lsl|/5s5S[:c] /Lsl|/7s7l[:c] /Lsl|/7s7L[:c] /Lsl|/8s8b[:c] /Lsl|/8s8B[:c] /Lsl!/asa@[:c] /Lsl!/asa4[:c] /Lsl!/AsA4[:c] /Lsl!/AsA@[:c] /Lsl!/bsb8[:c] /Lsl!/BsB8[:c] /Lsl!/ese3[:c] /Lsl!/EsE3[:c] /Lsl!/isi1[:c] /Lsl!/isi![:c] /Lsl!/isi|[:c] /Lsl!/IsI1[:c] /Lsl!/IsI![:c] /Lsl!/IsI|[:c] /Lsl!/lsl1[:c] /Lsl!/lsl7[:c] /Lsl!/lsl|[:c] /Lsl!/lsl![:c] /Lsl!/oso0[:c] /Lsl!/OsO0[:c] /Lsl!/sss$[:c] /Lsl!/sss5[:c] /Lsl!/SsS$[:c] /Lsl!/SsS5[:c] /Lsl!/tst+[:c] /Lsl!/TsT+[:c] /Lsl!/1s1![:c] /Lsl!/1s1i[:c] /Lsl!/1s1I[:c] /Lsl!/1s1|[:c] /Lsl!/0s0o[:c] /Lsl!/0s0O[:c] /Lsl!/3s3e[:c] /Lsl!/3s3E[:c] /Lsl!/4s4a[:c] /Lsl!/4s4A[:c] /Lsl!/5s5s[:c] /Lsl!/5s5S[:c] /Lsl!/7s7l[:c] /Lsl!/7s7L[:c] /Lsl!/8s8b[:c] /Lsl!/8s8B[:c] /oso0/asa@[:c] /oso0/asa4[:c] /oso0/AsA4[:c] /oso0/AsA@[:c] /oso0/bsb8[:c] /oso0/BsB8[:c] /oso0/ese3[:c] /oso0/EsE3[:c] /oso0/isi1[:c] /oso0/isi![:c] /oso0/isi|[:c] /oso0/IsI1[:c] /oso0/IsI![:c] /oso0/IsI|[:c] /oso0/lsl1[:c] /oso0/lsl7[:c] /oso0/lsl|[:c] /oso0/lsl![:c] /oso0/Lsl1[:c] /oso0/Lsl7[:c] /oso0/Lsl|[:c] /oso0/Lsl![:c] /oso0/OsO0[:c] /oso0/sss$[:c] /oso0/sss5[:c] /oso0/SsS$[:c] /oso0/SsS5[:c] /oso0/tst+[:c] /oso0/TsT+[:c] /oso0/1s1![:c] /oso0/1s1i[:c] /oso0/1s1I[:c] /oso0/1s1|[:c] /oso0/0s0o[:c] /oso0/0s0O[:c] /oso0/3s3e[:c] /oso0/3s3E[:c] /oso0/4s4a[:c] /oso0/4s4A[:c] /oso0/5s5s[:c] /oso0/5s5S[:c] /oso0/7s7l[:c] /oso0/7s7L[:c] /oso0/8s8b[:c] /oso0/8s8B[:c] /OsO0/asa@[:c] /OsO0/asa4[:c] /OsO0/AsA4[:c] /OsO0/AsA@[:c] /OsO0/bsb8[:c] /OsO0/BsB8[:c] /OsO0/ese3[:c] /OsO0/EsE3[:c] /OsO0/isi1[:c] /OsO0/isi![:c] /OsO0/isi|[:c] /OsO0/IsI1[:c] /OsO0/IsI![:c] /OsO0/IsI|[:c] /OsO0/lsl1[:c] /OsO0/lsl7[:c] /OsO0/lsl|[:c] /OsO0/lsl![:c] /OsO0/Lsl1[:c] /OsO0/Lsl7[:c] /OsO0/Lsl|[:c] /OsO0/Lsl![:c] /OsO0/oso0[:c] /OsO0/sss$[:c] /OsO0/sss5[:c] /OsO0/SsS$[:c] /OsO0/SsS5[:c] /OsO0/tst+[:c] /OsO0/TsT+[:c] /OsO0/1s1![:c] /OsO0/1s1i[:c] /OsO0/1s1I[:c] /OsO0/1s1|[:c] /OsO0/0s0o[:c] /OsO0/0s0O[:c] /OsO0/3s3e[:c] /OsO0/3s3E[:c] /OsO0/4s4a[:c] /OsO0/4s4A[:c] /OsO0/5s5s[:c] /OsO0/5s5S[:c] /OsO0/7s7l[:c] /OsO0/7s7L[:c] /OsO0/8s8b[:c] /OsO0/8s8B[:c] /sss$/asa@[:c] /sss$/asa4[:c] /sss$/AsA4[:c] /sss$/AsA@[:c] /sss$/bsb8[:c] /sss$/BsB8[:c] /sss$/ese3[:c] /sss$/EsE3[:c] /sss$/isi1[:c] /sss$/isi![:c] /sss$/isi|[:c] /sss$/IsI1[:c] /sss$/IsI![:c] /sss$/IsI|[:c] /sss$/lsl1[:c] /sss$/lsl7[:c] /sss$/lsl|[:c] /sss$/lsl![:c] /sss$/Lsl1[:c] /sss$/Lsl7[:c] /sss$/Lsl|[:c] /sss$/Lsl![:c] /sss$/oso0[:c] /sss$/OsO0[:c] /sss$/SsS$[:c] /sss$/SsS5[:c] /sss$/tst+[:c] /sss$/TsT+[:c] /sss$/1s1![:c] /sss$/1s1i[:c] /sss$/1s1I[:c] /sss$/1s1|[:c] /sss$/0s0o[:c] /sss$/0s0O[:c] /sss$/3s3e[:c] /sss$/3s3E[:c] /sss$/4s4a[:c] /sss$/4s4A[:c] /sss$/5s5s[:c] /sss$/5s5S[:c] /sss$/7s7l[:c] /sss$/7s7L[:c] /sss$/8s8b[:c] /sss$/8s8B[:c] /sss5/asa@[:c] /sss5/asa4[:c] /sss5/AsA4[:c] /sss5/AsA@[:c] /sss5/bsb8[:c] /sss5/BsB8[:c] /sss5/ese3[:c] /sss5/EsE3[:c] /sss5/isi1[:c] /sss5/isi![:c] /sss5/isi|[:c] /sss5/IsI1[:c] /sss5/IsI![:c] /sss5/IsI|[:c] /sss5/lsl1[:c] /sss5/lsl7[:c] /sss5/lsl|[:c] /sss5/lsl![:c] /sss5/Lsl1[:c] /sss5/Lsl7[:c] /sss5/Lsl|[:c] /sss5/Lsl![:c] /sss5/oso0[:c] /sss5/OsO0[:c] /sss5/SsS$[:c] /sss5/SsS5[:c] /sss5/tst+[:c] /sss5/TsT+[:c] /sss5/1s1![:c] /sss5/1s1i[:c] /sss5/1s1I[:c] /sss5/1s1|[:c] /sss5/0s0o[:c] /sss5/0s0O[:c] /sss5/3s3e[:c] /sss5/3s3E[:c] /sss5/4s4a[:c] /sss5/4s4A[:c] /sss5/5s5s[:c] /sss5/5s5S[:c] /sss5/7s7l[:c] /sss5/7s7L[:c] /sss5/8s8b[:c] /sss5/8s8B[:c] /SsS$/asa@[:c] /SsS$/asa4[:c] /SsS$/AsA4[:c] /SsS$/AsA@[:c] /SsS$/bsb8[:c] /SsS$/BsB8[:c] /SsS$/ese3[:c] /SsS$/EsE3[:c] /SsS$/isi1[:c] /SsS$/isi![:c] /SsS$/isi|[:c] /SsS$/IsI1[:c] /SsS$/IsI![:c] /SsS$/IsI|[:c] /SsS$/lsl1[:c] /SsS$/lsl7[:c] /SsS$/lsl|[:c] /SsS$/lsl![:c] /SsS$/Lsl1[:c] /SsS$/Lsl7[:c] /SsS$/Lsl|[:c] /SsS$/Lsl![:c] /SsS$/oso0[:c] /SsS$/OsO0[:c] /SsS$/sss$[:c] /SsS$/sss5[:c] /SsS$/tst+[:c] /SsS$/TsT+[:c] /SsS$/1s1![:c] /SsS$/1s1i[:c] /SsS$/1s1I[:c] /SsS$/1s1|[:c] /SsS$/0s0o[:c] /SsS$/0s0O[:c] /SsS$/3s3e[:c] /SsS$/3s3E[:c] /SsS$/4s4a[:c] /SsS$/4s4A[:c] /SsS$/5s5s[:c] /SsS$/5s5S[:c] /SsS$/7s7l[:c] /SsS$/7s7L[:c] /SsS$/8s8b[:c] /SsS$/8s8B[:c] /SsS5/asa@[:c] /SsS5/asa4[:c] /SsS5/AsA4[:c] /SsS5/AsA@[:c] /SsS5/bsb8[:c] /SsS5/BsB8[:c] /SsS5/ese3[:c] /SsS5/EsE3[:c] /SsS5/isi1[:c] /SsS5/isi![:c] /SsS5/isi|[:c] /SsS5/IsI1[:c] /SsS5/IsI![:c] /SsS5/IsI|[:c] /SsS5/lsl1[:c] /SsS5/lsl7[:c] /SsS5/lsl|[:c] /SsS5/lsl![:c] /SsS5/Lsl1[:c] /SsS5/Lsl7[:c] /SsS5/Lsl|[:c] /SsS5/Lsl![:c] /SsS5/oso0[:c] /SsS5/OsO0[:c] /SsS5/sss$[:c] /SsS5/sss5[:c] /SsS5/tst+[:c] /SsS5/TsT+[:c] /SsS5/1s1![:c] /SsS5/1s1i[:c] /SsS5/1s1I[:c] /SsS5/1s1|[:c] /SsS5/0s0o[:c] /SsS5/0s0O[:c] /SsS5/3s3e[:c] /SsS5/3s3E[:c] /SsS5/4s4a[:c] /SsS5/4s4A[:c] /SsS5/5s5s[:c] /SsS5/5s5S[:c] /SsS5/7s7l[:c] /SsS5/7s7L[:c] /SsS5/8s8b[:c] /SsS5/8s8B[:c] /tst+/asa@[:c] /tst+/asa4[:c] /tst+/AsA4[:c] /tst+/AsA@[:c] /tst+/bsb8[:c] /tst+/BsB8[:c] /tst+/ese3[:c] /tst+/EsE3[:c] /tst+/isi1[:c] /tst+/isi![:c] /tst+/isi|[:c] /tst+/IsI1[:c] /tst+/IsI![:c] /tst+/IsI|[:c] /tst+/lsl1[:c] /tst+/lsl7[:c] /tst+/lsl|[:c] /tst+/lsl![:c] /tst+/Lsl1[:c] /tst+/Lsl7[:c] /tst+/Lsl|[:c] /tst+/Lsl![:c] /tst+/oso0[:c] /tst+/OsO0[:c] /tst+/sss$[:c] /tst+/sss5[:c] /tst+/SsS$[:c] /tst+/SsS5[:c] /tst+/TsT+[:c] /tst+/1s1![:c] /tst+/1s1i[:c] /tst+/1s1I[:c] /tst+/1s1|[:c] /tst+/0s0o[:c] /tst+/0s0O[:c] /tst+/3s3e[:c] /tst+/3s3E[:c] /tst+/4s4a[:c] /tst+/4s4A[:c] /tst+/5s5s[:c] /tst+/5s5S[:c] /tst+/7s7l[:c] /tst+/7s7L[:c] /tst+/8s8b[:c] /tst+/8s8B[:c] /TsT+/asa@[:c] /TsT+/asa4[:c] /TsT+/AsA4[:c] /TsT+/AsA@[:c] /TsT+/bsb8[:c] /TsT+/BsB8[:c] /TsT+/ese3[:c] /TsT+/EsE3[:c] /TsT+/isi1[:c] /TsT+/isi![:c] /TsT+/isi|[:c] /TsT+/IsI1[:c] /TsT+/IsI![:c] /TsT+/IsI|[:c] /TsT+/lsl1[:c] /TsT+/lsl7[:c] /TsT+/lsl|[:c] /TsT+/lsl![:c] /TsT+/Lsl1[:c] /TsT+/Lsl7[:c] /TsT+/Lsl|[:c] /TsT+/Lsl![:c] /TsT+/oso0[:c] /TsT+/OsO0[:c] /TsT+/sss$[:c] /TsT+/sss5[:c] /TsT+/SsS$[:c] /TsT+/SsS5[:c] /TsT+/tst+[:c] /TsT+/1s1![:c] /TsT+/1s1i[:c] /TsT+/1s1I[:c] /TsT+/1s1|[:c] /TsT+/0s0o[:c] /TsT+/0s0O[:c] /TsT+/3s3e[:c] /TsT+/3s3E[:c] /TsT+/4s4a[:c] /TsT+/4s4A[:c] /TsT+/5s5s[:c] /TsT+/5s5S[:c] /TsT+/7s7l[:c] /TsT+/7s7L[:c] /TsT+/8s8b[:c] /TsT+/8s8B[:c] /1s1!/asa@[:c] /1s1!/asa4[:c] /1s1!/AsA4[:c] /1s1!/AsA@[:c] /1s1!/bsb8[:c] /1s1!/BsB8[:c] /1s1!/ese3[:c] /1s1!/EsE3[:c] /1s1!/isi1[:c] /1s1!/isi![:c] /1s1!/isi|[:c] /1s1!/IsI1[:c] /1s1!/IsI![:c] /1s1!/IsI|[:c] /1s1!/lsl1[:c] /1s1!/lsl7[:c] /1s1!/lsl|[:c] /1s1!/lsl![:c] /1s1!/Lsl1[:c] /1s1!/Lsl7[:c] /1s1!/Lsl|[:c] /1s1!/Lsl![:c] /1s1!/oso0[:c] /1s1!/OsO0[:c] /1s1!/sss$[:c] /1s1!/sss5[:c] /1s1!/SsS$[:c] /1s1!/SsS5[:c] /1s1!/tst+[:c] /1s1!/TsT+[:c] /1s1!/0s0o[:c] /1s1!/0s0O[:c] /1s1!/3s3e[:c] /1s1!/3s3E[:c] /1s1!/4s4a[:c] /1s1!/4s4A[:c] /1s1!/5s5s[:c] /1s1!/5s5S[:c] /1s1!/7s7l[:c] /1s1!/7s7L[:c] /1s1!/8s8b[:c] /1s1!/8s8B[:c] /1s1i/asa@[:c] /1s1i/asa4[:c] /1s1i/AsA4[:c] /1s1i/AsA@[:c] /1s1i/bsb8[:c] /1s1i/BsB8[:c] /1s1i/ese3[:c] /1s1i/EsE3[:c] /1s1i/isi1[:c] /1s1i/isi![:c] /1s1i/isi|[:c] /1s1i/IsI1[:c] /1s1i/IsI![:c] /1s1i/IsI|[:c] /1s1i/lsl1[:c] /1s1i/lsl7[:c] /1s1i/lsl|[:c] /1s1i/lsl![:c] /1s1i/Lsl1[:c] /1s1i/Lsl7[:c] /1s1i/Lsl|[:c] /1s1i/Lsl![:c] /1s1i/oso0[:c] /1s1i/OsO0[:c] /1s1i/sss$[:c] /1s1i/sss5[:c] /1s1i/SsS$[:c] /1s1i/SsS5[:c] /1s1i/tst+[:c] /1s1i/TsT+[:c] /1s1i/0s0o[:c] /1s1i/0s0O[:c] /1s1i/3s3e[:c] /1s1i/3s3E[:c] /1s1i/4s4a[:c] /1s1i/4s4A[:c] /1s1i/5s5s[:c] /1s1i/5s5S[:c] /1s1i/7s7l[:c] /1s1i/7s7L[:c] /1s1i/8s8b[:c] /1s1i/8s8B[:c] /1s1I/asa@[:c] /1s1I/asa4[:c] /1s1I/AsA4[:c] /1s1I/AsA@[:c] /1s1I/bsb8[:c] /1s1I/BsB8[:c] /1s1I/ese3[:c] /1s1I/EsE3[:c] /1s1I/isi1[:c] /1s1I/isi![:c] /1s1I/isi|[:c] /1s1I/IsI1[:c] /1s1I/IsI![:c] /1s1I/IsI|[:c] /1s1I/lsl1[:c] /1s1I/lsl7[:c] /1s1I/lsl|[:c] /1s1I/lsl![:c] /1s1I/Lsl1[:c] /1s1I/Lsl7[:c] /1s1I/Lsl|[:c] /1s1I/Lsl![:c] /1s1I/oso0[:c] /1s1I/OsO0[:c] /1s1I/sss$[:c] /1s1I/sss5[:c] /1s1I/SsS$[:c] /1s1I/SsS5[:c] /1s1I/tst+[:c] /1s1I/TsT+[:c] /1s1I/1s1![:c] /1s1I/1s1i[:c] /1s1I/1s1|[:c] /1s1I/0s0o[:c] /1s1I/0s0O[:c] /1s1I/3s3e[:c] /1s1I/3s3E[:c] /1s1I/4s4a[:c] /1s1I/4s4A[:c] /1s1I/5s5s[:c] /1s1I/5s5S[:c] /1s1I/7s7l[:c] /1s1I/7s7L[:c] /1s1I/8s8b[:c] /1s1I/8s8B[:c] /1s1|/asa@[:c] /1s1|/asa4[:c] /1s1|/AsA4[:c] /1s1|/AsA@[:c] /1s1|/bsb8[:c] /1s1|/BsB8[:c] /1s1|/ese3[:c] /1s1|/EsE3[:c] /1s1|/isi1[:c] /1s1|/isi![:c] /1s1|/isi|[:c] /1s1|/IsI1[:c] /1s1|/IsI![:c] /1s1|/IsI|[:c] /1s1|/lsl1[:c] /1s1|/lsl7[:c] /1s1|/lsl|[:c] /1s1|/lsl![:c] /1s1|/Lsl1[:c] /1s1|/Lsl7[:c] /1s1|/Lsl|[:c] /1s1|/Lsl![:c] /1s1|/oso0[:c] /1s1|/OsO0[:c] /1s1|/sss$[:c] /1s1|/sss5[:c] /1s1|/SsS$[:c] /1s1|/SsS5[:c] /1s1|/tst+[:c] /1s1|/TsT+[:c] /1s1|/1s1![:c] /1s1|/1s1i[:c] /1s1|/1s1I[:c] /1s1|/0s0o[:c] /1s1|/0s0O[:c] /1s1|/3s3e[:c] /1s1|/3s3E[:c] /1s1|/4s4a[:c] /1s1|/4s4A[:c] /1s1|/5s5s[:c] /1s1|/5s5S[:c] /1s1|/7s7l[:c] /1s1|/7s7L[:c] /1s1|/8s8b[:c] /1s1|/8s8B[:c] /0s0o/asa@[:c] /0s0o/asa4[:c] /0s0o/AsA4[:c] /0s0o/AsA@[:c] /0s0o/bsb8[:c] /0s0o/BsB8[:c] /0s0o/ese3[:c] /0s0o/EsE3[:c] /0s0o/isi1[:c] /0s0o/isi![:c] /0s0o/isi|[:c] /0s0o/IsI1[:c] /0s0o/IsI![:c] /0s0o/IsI|[:c] /0s0o/lsl1[:c] /0s0o/lsl7[:c] /0s0o/lsl|[:c] /0s0o/lsl![:c] /0s0o/Lsl1[:c] /0s0o/Lsl7[:c] /0s0o/Lsl|[:c] /0s0o/Lsl![:c] /0s0o/oso0[:c] /0s0o/OsO0[:c] /0s0o/sss$[:c] /0s0o/sss5[:c] /0s0o/SsS$[:c] /0s0o/SsS5[:c] /0s0o/tst+[:c] /0s0o/TsT+[:c] /0s0o/1s1![:c] /0s0o/1s1i[:c] /0s0o/1s1I[:c] /0s0o/1s1|[:c] /0s0o/3s3e[:c] /0s0o/3s3E[:c] /0s0o/4s4a[:c] /0s0o/4s4A[:c] /0s0o/5s5s[:c] /0s0o/5s5S[:c] /0s0o/7s7l[:c] /0s0o/7s7L[:c] /0s0o/8s8b[:c] /0s0o/8s8B[:c] /0s0O/asa@[:c] /0s0O/asa4[:c] /0s0O/AsA4[:c] /0s0O/AsA@[:c] /0s0O/bsb8[:c] /0s0O/BsB8[:c] /0s0O/ese3[:c] /0s0O/EsE3[:c] /0s0O/isi1[:c] /0s0O/isi![:c] /0s0O/isi|[:c] /0s0O/IsI1[:c] /0s0O/IsI![:c] /0s0O/IsI|[:c] /0s0O/lsl1[:c] /0s0O/lsl7[:c] /0s0O/lsl|[:c] /0s0O/lsl![:c] /0s0O/Lsl1[:c] /0s0O/Lsl7[:c] /0s0O/Lsl|[:c] /0s0O/Lsl![:c] /0s0O/oso0[:c] /0s0O/OsO0[:c] /0s0O/sss$[:c] /0s0O/sss5[:c] /0s0O/SsS$[:c] /0s0O/SsS5[:c] /0s0O/tst+[:c] /0s0O/TsT+[:c] /0s0O/1s1![:c] /0s0O/1s1i[:c] /0s0O/1s1I[:c] /0s0O/1s1|[:c] /0s0O/3s3e[:c] /0s0O/3s3E[:c] /0s0O/4s4a[:c] /0s0O/4s4A[:c] /0s0O/5s5s[:c] /0s0O/5s5S[:c] /0s0O/7s7l[:c] /0s0O/7s7L[:c] /0s0O/8s8b[:c] /0s0O/8s8B[:c] /3s3e/asa@[:c] /3s3e/asa4[:c] /3s3e/AsA4[:c] /3s3e/AsA@[:c] /3s3e/bsb8[:c] /3s3e/BsB8[:c] /3s3e/ese3[:c] /3s3e/EsE3[:c] /3s3e/isi1[:c] /3s3e/isi![:c] /3s3e/isi|[:c] /3s3e/IsI1[:c] /3s3e/IsI![:c] /3s3e/IsI|[:c] /3s3e/lsl1[:c] /3s3e/lsl7[:c] /3s3e/lsl|[:c] /3s3e/lsl![:c] /3s3e/Lsl1[:c] /3s3e/Lsl7[:c] /3s3e/Lsl|[:c] /3s3e/Lsl![:c] /3s3e/oso0[:c] /3s3e/OsO0[:c] /3s3e/sss$[:c] /3s3e/sss5[:c] /3s3e/SsS$[:c] /3s3e/SsS5[:c] /3s3e/tst+[:c] /3s3e/TsT+[:c] /3s3e/1s1![:c] /3s3e/1s1i[:c] /3s3e/1s1I[:c] /3s3e/1s1|[:c] /3s3e/0s0o[:c] /3s3e/0s0O[:c] /3s3e/4s4a[:c] /3s3e/4s4A[:c] /3s3e/5s5s[:c] /3s3e/5s5S[:c] /3s3e/7s7l[:c] /3s3e/7s7L[:c] /3s3e/8s8b[:c] /3s3e/8s8B[:c] /3s3E/asa@[:c] /3s3E/asa4[:c] /3s3E/AsA4[:c] /3s3E/AsA@[:c] /3s3E/bsb8[:c] /3s3E/BsB8[:c] /3s3E/ese3[:c] /3s3E/EsE3[:c] /3s3E/isi1[:c] /3s3E/isi![:c] /3s3E/isi|[:c] /3s3E/IsI1[:c] /3s3E/IsI![:c] /3s3E/IsI|[:c] /3s3E/lsl1[:c] /3s3E/lsl7[:c] /3s3E/lsl|[:c] /3s3E/lsl![:c] /3s3E/Lsl1[:c] /3s3E/Lsl7[:c] /3s3E/Lsl|[:c] /3s3E/Lsl![:c] /3s3E/oso0[:c] /3s3E/OsO0[:c] /3s3E/sss$[:c] /3s3E/sss5[:c] /3s3E/SsS$[:c] /3s3E/SsS5[:c] /3s3E/tst+[:c] /3s3E/TsT+[:c] /3s3E/1s1![:c] /3s3E/1s1i[:c] /3s3E/1s1I[:c] /3s3E/1s1|[:c] /3s3E/0s0o[:c] /3s3E/0s0O[:c] /3s3E/4s4a[:c] /3s3E/4s4A[:c] /3s3E/5s5s[:c] /3s3E/5s5S[:c] /3s3E/7s7l[:c] /3s3E/7s7L[:c] /3s3E/8s8b[:c] /3s3E/8s8B[:c] /4s4a/asa@[:c] /4s4a/asa4[:c] /4s4a/AsA4[:c] /4s4a/AsA@[:c] /4s4a/bsb8[:c] /4s4a/BsB8[:c] /4s4a/ese3[:c] /4s4a/EsE3[:c] /4s4a/isi1[:c] /4s4a/isi![:c] /4s4a/isi|[:c] /4s4a/IsI1[:c] /4s4a/IsI![:c] /4s4a/IsI|[:c] /4s4a/lsl1[:c] /4s4a/lsl7[:c] /4s4a/lsl|[:c] /4s4a/lsl![:c] /4s4a/Lsl1[:c] /4s4a/Lsl7[:c] /4s4a/Lsl|[:c] /4s4a/Lsl![:c] /4s4a/oso0[:c] /4s4a/OsO0[:c] /4s4a/sss$[:c] /4s4a/sss5[:c] /4s4a/SsS$[:c] /4s4a/SsS5[:c] /4s4a/tst+[:c] /4s4a/TsT+[:c] /4s4a/1s1![:c] /4s4a/1s1i[:c] /4s4a/1s1I[:c] /4s4a/1s1|[:c] /4s4a/0s0o[:c] /4s4a/0s0O[:c] /4s4a/3s3e[:c] /4s4a/3s3E[:c] /4s4a/5s5s[:c] /4s4a/5s5S[:c] /4s4a/7s7l[:c] /4s4a/7s7L[:c] /4s4a/8s8b[:c] /4s4a/8s8B[:c] /4s4A/asa@[:c] /4s4A/asa4[:c] /4s4A/AsA4[:c] /4s4A/AsA@[:c] /4s4A/bsb8[:c] /4s4A/BsB8[:c] /4s4A/ese3[:c] /4s4A/EsE3[:c] /4s4A/isi1[:c] /4s4A/isi![:c] /4s4A/isi|[:c] /4s4A/IsI1[:c] /4s4A/IsI![:c] /4s4A/IsI|[:c] /4s4A/lsl1[:c] /4s4A/lsl7[:c] /4s4A/lsl|[:c] /4s4A/lsl![:c] /4s4A/Lsl1[:c] /4s4A/Lsl7[:c] /4s4A/Lsl|[:c] /4s4A/Lsl![:c] /4s4A/oso0[:c] /4s4A/OsO0[:c] /4s4A/sss$[:c] /4s4A/sss5[:c] /4s4A/SsS$[:c] /4s4A/SsS5[:c] /4s4A/tst+[:c] /4s4A/TsT+[:c] /4s4A/1s1![:c] /4s4A/1s1i[:c] /4s4A/1s1I[:c] /4s4A/1s1|[:c] /4s4A/0s0o[:c] /4s4A/0s0O[:c] /4s4A/3s3e[:c] /4s4A/3s3E[:c] /4s4A/5s5s[:c] /4s4A/5s5S[:c] /4s4A/7s7l[:c] /4s4A/7s7L[:c] /4s4A/8s8b[:c] /4s4A/8s8B[:c] /5s5s/asa@[:c] /5s5s/asa4[:c] /5s5s/AsA4[:c] /5s5s/AsA@[:c] /5s5s/bsb8[:c] /5s5s/BsB8[:c] /5s5s/ese3[:c] /5s5s/EsE3[:c] /5s5s/isi1[:c] /5s5s/isi![:c] /5s5s/isi|[:c] /5s5s/IsI1[:c] /5s5s/IsI![:c] /5s5s/IsI|[:c] /5s5s/lsl1[:c] /5s5s/lsl7[:c] /5s5s/lsl|[:c] /5s5s/lsl![:c] /5s5s/Lsl1[:c] /5s5s/Lsl7[:c] /5s5s/Lsl|[:c] /5s5s/Lsl![:c] /5s5s/oso0[:c] /5s5s/OsO0[:c] /5s5s/sss$[:c] /5s5s/sss5[:c] /5s5s/SsS$[:c] /5s5s/SsS5[:c] /5s5s/tst+[:c] /5s5s/TsT+[:c] /5s5s/1s1![:c] /5s5s/1s1i[:c] /5s5s/1s1I[:c] /5s5s/1s1|[:c] /5s5s/0s0o[:c] /5s5s/0s0O[:c] /5s5s/3s3e[:c] /5s5s/3s3E[:c] /5s5s/4s4a[:c] /5s5s/4s4A[:c] /5s5s/7s7l[:c] /5s5s/7s7L[:c] /5s5s/8s8b[:c] /5s5s/8s8B[:c] /5s5S/asa@[:c] /5s5S/asa4[:c] /5s5S/AsA4[:c] /5s5S/AsA@[:c] /5s5S/bsb8[:c] /5s5S/BsB8[:c] /5s5S/ese3[:c] /5s5S/EsE3[:c] /5s5S/isi1[:c] /5s5S/isi![:c] /5s5S/isi|[:c] /5s5S/IsI1[:c] /5s5S/IsI![:c] /5s5S/IsI|[:c] /5s5S/lsl1[:c] /5s5S/lsl7[:c] /5s5S/lsl|[:c] /5s5S/lsl![:c] /5s5S/Lsl1[:c] /5s5S/Lsl7[:c] /5s5S/Lsl|[:c] /5s5S/Lsl![:c] /5s5S/oso0[:c] /5s5S/OsO0[:c] /5s5S/sss$[:c] /5s5S/sss5[:c] /5s5S/SsS$[:c] /5s5S/SsS5[:c] /5s5S/tst+[:c] /5s5S/TsT+[:c] /5s5S/1s1![:c] /5s5S/1s1i[:c] /5s5S/1s1I[:c] /5s5S/1s1|[:c] /5s5S/0s0o[:c] /5s5S/0s0O[:c] /5s5S/3s3e[:c] /5s5S/3s3E[:c] /5s5S/4s4a[:c] /5s5S/4s4A[:c] /5s5S/7s7l[:c] /5s5S/7s7L[:c] /5s5S/8s8b[:c] /5s5S/8s8B[:c] /7s7l/asa@[:c] /7s7l/asa4[:c] /7s7l/AsA4[:c] /7s7l/AsA@[:c] /7s7l/bsb8[:c] /7s7l/BsB8[:c] /7s7l/ese3[:c] /7s7l/EsE3[:c] /7s7l/isi1[:c] /7s7l/isi![:c] /7s7l/isi|[:c] /7s7l/IsI1[:c] /7s7l/IsI![:c] /7s7l/IsI|[:c] /7s7l/lsl1[:c] /7s7l/lsl7[:c] /7s7l/lsl|[:c] /7s7l/lsl![:c] /7s7l/Lsl1[:c] /7s7l/Lsl7[:c] /7s7l/Lsl|[:c] /7s7l/Lsl![:c] /7s7l/oso0[:c] /7s7l/OsO0[:c] /7s7l/sss$[:c] /7s7l/sss5[:c] /7s7l/SsS$[:c] /7s7l/SsS5[:c] /7s7l/tst+[:c] /7s7l/TsT+[:c] /7s7l/1s1![:c] /7s7l/1s1i[:c] /7s7l/1s1I[:c] /7s7l/1s1|[:c] /7s7l/0s0o[:c] /7s7l/0s0O[:c] /7s7l/3s3e[:c] /7s7l/3s3E[:c] /7s7l/4s4a[:c] /7s7l/4s4A[:c] /7s7l/5s5s[:c] /7s7l/5s5S[:c] /7s7l/8s8b[:c] /7s7l/8s8B[:c] /7s7L/asa@[:c] /7s7L/asa4[:c] /7s7L/AsA4[:c] /7s7L/AsA@[:c] /7s7L/bsb8[:c] /7s7L/BsB8[:c] /7s7L/ese3[:c] /7s7L/EsE3[:c] /7s7L/isi1[:c] /7s7L/isi![:c] /7s7L/isi|[:c] /7s7L/IsI1[:c] /7s7L/IsI![:c] /7s7L/IsI|[:c] /7s7L/lsl1[:c] /7s7L/lsl7[:c] /7s7L/lsl|[:c] /7s7L/lsl![:c] /7s7L/Lsl1[:c] /7s7L/Lsl7[:c] /7s7L/Lsl|[:c] /7s7L/Lsl![:c] /7s7L/oso0[:c] /7s7L/OsO0[:c] /7s7L/sss$[:c] /7s7L/sss5[:c] /7s7L/SsS$[:c] /7s7L/SsS5[:c] /7s7L/tst+[:c] /7s7L/TsT+[:c] /7s7L/1s1![:c] /7s7L/1s1i[:c] /7s7L/1s1I[:c] /7s7L/1s1|[:c] /7s7L/0s0o[:c] /7s7L/0s0O[:c] /7s7L/3s3e[:c] /7s7L/3s3E[:c] /7s7L/4s4a[:c] /7s7L/4s4A[:c] /7s7L/5s5s[:c] /7s7L/5s5S[:c] /7s7L/8s8b[:c] /7s7L/8s8B[:c] /8s8b/asa@[:c] /8s8b/asa4[:c] /8s8b/AsA4[:c] /8s8b/AsA@[:c] /8s8b/bsb8[:c] /8s8b/BsB8[:c] /8s8b/ese3[:c] /8s8b/EsE3[:c] /8s8b/isi1[:c] /8s8b/isi![:c] /8s8b/isi|[:c] /8s8b/IsI1[:c] /8s8b/IsI![:c] /8s8b/IsI|[:c] /8s8b/lsl1[:c] /8s8b/lsl7[:c] /8s8b/lsl|[:c] /8s8b/lsl![:c] /8s8b/Lsl1[:c] /8s8b/Lsl7[:c] /8s8b/Lsl|[:c] /8s8b/Lsl![:c] /8s8b/oso0[:c] /8s8b/OsO0[:c] /8s8b/sss$[:c] /8s8b/sss5[:c] /8s8b/SsS$[:c] /8s8b/SsS5[:c] /8s8b/tst+[:c] /8s8b/TsT+[:c] /8s8b/1s1![:c] /8s8b/1s1i[:c] /8s8b/1s1I[:c] /8s8b/1s1|[:c] /8s8b/0s0o[:c] /8s8b/0s0O[:c] /8s8b/3s3e[:c] /8s8b/3s3E[:c] /8s8b/4s4a[:c] /8s8b/4s4A[:c] /8s8b/5s5s[:c] /8s8b/5s5S[:c] /8s8b/7s7l[:c] /8s8b/7s7L[:c] /8s8B/asa@[:c] /8s8B/asa4[:c] /8s8B/AsA4[:c] /8s8B/AsA@[:c] /8s8B/bsb8[:c] /8s8B/BsB8[:c] /8s8B/ese3[:c] /8s8B/EsE3[:c] /8s8B/isi1[:c] /8s8B/isi![:c] /8s8B/isi|[:c] /8s8B/IsI1[:c] /8s8B/IsI![:c] /8s8B/IsI|[:c] /8s8B/lsl1[:c] /8s8B/lsl7[:c] /8s8B/lsl|[:c] /8s8B/lsl![:c] /8s8B/Lsl1[:c] /8s8B/Lsl7[:c] /8s8B/Lsl|[:c] /8s8B/Lsl![:c] /8s8B/oso0[:c] /8s8B/OsO0[:c] /8s8B/sss$[:c] /8s8B/sss5[:c] /8s8B/SsS$[:c] /8s8B/SsS5[:c] /8s8B/tst+[:c] /8s8B/TsT+[:c] /8s8B/1s1![:c] /8s8B/1s1i[:c] /8s8B/1s1I[:c] /8s8B/1s1|[:c] /8s8B/0s0o[:c] /8s8B/0s0O[:c] /8s8B/3s3e[:c] /8s8B/3s3E[:c] /8s8B/4s4a[:c] /8s8B/4s4A[:c] /8s8B/5s5s[:c] /8s8B/5s5S[:c] /8s8B/7s7l[:c] /8s8B/7s7L[:c] # These are some popular triple/quad l33t rules /asa4/ese3/lsl1[:c] /asa4/ese3/oso0[:c] /asa4/ese3/sss$[:c] /asa4/lsl1/oso0[:c] /asa4/lsl1/sss$[:c] /asa4/oso0/sss$[:c] /ese3/lsl1/oso0[:c] /ese3/lsl1/sss$[:c] /ese3/oso0/sss$[:c] /lsl1/oso0/sss$[:c] /asa4/ese3/lsl1/oso0[:c] /asa4/ese3/lsl1/sss$[:c] /asa4/ese3/oso0/sss$[:c] /asa4/lsl1/oso0/sss$[:c] /ese3/lsl1/oso0/sss$[:c] /asa4/ese3/lsl1/oso0/sss$[:c] # Case toggler for cracking MD4-based NTLM hashes (with the contributed patch) # given already cracked DES-based LM hashes. # Rename this section to [List.Rules:Wordlist] to activate it. [List.Rules:NT] : -c T0Q -c T1QT[z0] -c T2QT[z0]T[z1] -c T3QT[z0]T[z1]T[z2] -c T4QT[z0]T[z1]T[z2]T[z3] -c T5QT[z0]T[z1]T[z2]T[z3]T[z4] -c T6QT[z0]T[z1]T[z2]T[z3]T[z4]T[z5] -c T7QT[z0]T[z1]T[z2]T[z3]T[z4]T[z5]T[z6] -c T8QT[z0]T[z1]T[z2]T[z3]T[z4]T[z5]T[z6]T[z7] -c T9QT[z0]T[z1]T[z2]T[z3]T[z4]T[z5]T[z6]T[z7]T[z8] -c TAQT[z0]T[z1]T[z2]T[z3]T[z4]T[z5]T[z6]T[z7]T[z8]T[z9] -c TBQT[z0]T[z1]T[z2]T[z3]T[z4]T[z5]T[z6]T[z7]T[z8]T[z9]T[zA] -c TCQT[z0]T[z1]T[z2]T[z3]T[z4]T[z5]T[z6]T[z7]T[z8]T[z9]T[zA]T[zB] -c TDQT[z0]T[z1]T[z2]T[z3]T[z4]T[z5]T[z6]T[z7]T[z8]T[z9]T[zA]T[zB]T[zC] # Incremental modes [Incremental:All] File = $JOHN/all.chr MinLen = 0 MaxLen = 8 CharCount = 95 [Incremental:All4] File = $JOHN/all.chr MinLen = 0 MaxLen = 4 CharCount = 95 [Incremental:Alpha] File = $JOHN/alpha.chr MinLen = 1 MaxLen = 8 CharCount = 26 [Incremental:Digits] File = $JOHN/digits.chr MinLen = 1 MaxLen = 8 CharCount = 10 [Incremental:Digits5] File = $JOHN/digits.chr MinLen = 1 MaxLen = 5 CharCount = 10 [Incremental:Alnum] File = $JOHN/alnum.chr MinLen = 1 MaxLen = 8 CharCount = 36 [Incremental:LanMan] File = $JOHN/lanman.chr MinLen = 0 MaxLen = 7 CharCount = 69 # Some pre-defined word filters [List.External:Filter_Alpha] void filter() { int i, c; i = 0; while (c = word[i++]) if (c < 'a' || c > 'z') { word = 0; return; } } [List.External:Filter_Digits] void filter() { int i, c; i = 0; while (c = word[i++]) if (c < '0' || c > '9') { word = 0; return; } } [List.External:Filter_Alnum] void filter() { int i, c; i = 0; while (c = word[i++]) if ((c < 'a' || c > 'z') && (c < '0' || c > '9')) { word = 0; return; } } [List.External:Filter_No_Cap_or_Symbols] void filter() { int i, c; i = 0; while (c = word[i++]) if ((c < 'a' || c > 'z') && (c < '0' || c > '9')) { return; } word = 0; return; } [List.External:Filter_LanMan] void filter() { int i, c; word[7] = 0; // Truncate at 7 characters i = 0; // Convert to uppercase while (c = word[i]) { if (c >= 'a' && c <= 'z') word[i] &= 0xDF; i++; } } # A simple cracker for LM hashes [List.External:LanMan] int length; // Current length void init() { word[0] = 'A' - 1; // Start with "A" word[length = 1] = 0; } void generate() { int i; i = length - 1; // Start from the last character while (++word[i] > 'Z') // Try to increase it if (i) // Overflow here, any more positions? word[i--] = 'A'; // Yes, move to the left, and repeat else // No if (length < 7) { word[i = ++length] = 0; // Switch to the next length while (i--) word[i] = 'A'; return; } else { word = 0; return; // We're done } } void restore() { length = 0; // Calculate the length while (word[length]) length++; } # Simple and well-commented, yet useful external mode example [List.External:Double] /* * This cracking mode tries all the possible duplicated lowercase alphabetic * "words" of up to 8 characters long. Since word halves are the same, it * only has to try about 500,000 words. */ /* Global variables: current length and word */ int length, current[9]; /* Called at startup to initialize the global variables */ void init() { int i; i = length = 2; // Start with 4 character long words while (i--) current[i] = 'a'; // Set our half-word to "aa" } /* Generates a new word */ void generate() { int i; /* Export last generated word, duplicating it at the same time; here "word" * is a pre-defined external variable. */ word[(i = length) << 1] = 0; while (i--) word[length + i] = word[i] = current[i]; /* Generate a new word */ i = length - 1; // Start from the last character while (++current[i] > 'z') // Try to increase it if (i) // Overflow here, any more positions? current[i--] = 'a'; // Yes, move to the left, and repeat else { // No current = 0; // Request a length switch break; // Break out of the loop } /* Switch to the next length, unless we were generating 8 character long * words already. */ if (!current && length < 4) { i = ++length; while (i--) current[i] = 'a'; } } /* Called when restoring an interrupted session */ void restore() { int i; /* Import the word back */ i = 0; while (current[i] = word[i]) i++; /* ...and calculate the half-word length */ length = i >> 1; } # Trivial parallel processing example [List.External:Parallel] /* * This word filter makes John process some of the words only, for running * multiple instances on different CPUs. It can be used with any cracking * mode except for "single crack". Note: this is not a good solution, but * is just an example of what can be done with word filters. */ int node, total; // This node's number, and node count int number; // Current word number void init() { node = 1; total = 2; // Node 1 of 2, change as appropriate number = node - 1; // Speedup the filter a bit } void filter() { if (number++ % total) // Word for a different node? word = 0; // Yes, skip it } # Strip 0.5 ("Secure Tool for Recalling Important Passwords") cracker, # based on analysis done by Thomas Roessler and Ian Goldberg. This will # crack passwords you may have generated with Strip; other uses of Strip # are unaffected. [List.External:Strip] int minlength, maxlength, mintype, maxtype; int crack_seed, length, type; int count, charset[128]; void init() { int c; /* Password lengths to try; Strip can generate passwords of 4 to 16 * characters, but traditional crypt(3) hashes are limited to 8. */ minlength = 4; // 4 maxlength = 8; // 16 /* Password types to try (Numeric, Alpha-Num, Alpha-Num w/ Meta). */ mintype = 0; // 0 maxtype = 2; // 2 crack_seed = 0x10000; length = minlength - 1; type = mintype; count = 0; c = '0'; while (c <= '9') charset[count++] = c++; } void generate() { int seed, random; int i, c; if (crack_seed > 0xffff) { crack_seed = 0; if (++length > maxlength) { length = minlength; if (++type > maxtype) { word[0] = 0; return; } } count = 10; if (type >= 1) { c = 'a'; while (c <= 'f') charset[count++] = c++; c = 'h'; while (c <= 'z') charset[count++] = c++; c = 'A'; while (c <= 'Z') charset[count++] = c++; } if (type == 2) { charset[count++] = '!'; c = '#'; while (c <= '&') charset[count++] = c++; c = '('; while (c <= '/') charset[count++] = c++; c = '<'; while (c <= '>') charset[count++] = c++; charset[count++] = '?'; charset[count++] = '@'; charset[count++] = '['; charset[count++] = ']'; charset[count++] = '^'; charset[count++] = '_'; c = '{'; while (c <= '~') charset[count++] = c++; } } seed = (crack_seed++ << 16 >> 16) * 22695477 + 1; i = 0; while (i < length) { random = ((seed = seed * 22695477 + 1) >> 16) & 0x7fff; word[i++] = charset[random % count]; } word[i] = 0; } # Try sequences of adjacent keys on a keyboard as candidate passwords [List.External:Keyboard] int maxlength, length; // Maximum password length to try, current length int fuzz; // The desired "fuzz factor", either 0 or 1 int id[15]; // Current character indices for each position int m[0x400], mc[0x80]; // The keys matrix, counts of adjacent keys int f[0x40], fc; // Characters for the first position, their count void init() { int minlength; int i, j, c, p; int k[0x40]; minlength = 1; // Initial password length to try maxlength = 15; // Maximum password length to try, up to 15 fuzz = 1; // "Fuzz factor", set to 0 for much quicker runs /* * This defines the keyboard layout, by default for a QWERTY keyboard. * Please note that the sizes of m[] and mc[] arrays assume 7-bit * characters and will need to be doubled for 8-bit characters such as * umlauts. */ i = 0; while (i < 0x40) k[i++] = 0; k[0] = '`'; i = 0; while (++i <= 9) k[i] = '0' + i; k[10] = '0'; k[11] = '-'; k[12] = '='; k[0x11] = 'q'; k[0x12] = 'w'; k[0x13] = 'e'; k[0x14] = 'r'; k[0x15] = 't'; k[0x16] = 'y'; k[0x17] = 'u'; k[0x18] = 'i'; k[0x19] = 'o'; k[0x1a] = 'p'; k[0x1b] = '['; k[0x1c] = ']'; k[0x1d] = '\\'; k[0x21] = 'a'; k[0x22] = 's'; k[0x23] = 'd'; k[0x24] = 'f'; k[0x25] = 'g'; k[0x26] = 'h'; k[0x27] = 'j'; k[0x28] = 'k'; k[0x29] = 'l'; k[0x2a] = ';'; k[0x2b] = '\''; k[0x31] = 'z'; k[0x32] = 'x'; k[0x33] = 'c'; k[0x34] = 'v'; k[0x35] = 'b'; k[0x36] = 'n'; k[0x37] = 'm'; k[0x38] = ','; k[0x39] = '.'; k[0x3a] = '/'; i = 0; while (i < 0x80) mc[i++] = 0; fc = 0; /* rows */ c = 0; i = 0; while (i < 0x40) { p = c; c = k[i++]; if (!c) continue; f[fc++] = c; if (!p) continue; m[(c << 3) + mc[c]++] = p; m[(p << 3) + mc[p]++] = c; } f[fc] = 0; /* columns */ i = 0; while (i < 0x30) { p = k[i++]; if (!p) continue; j = 1 - fuzz; while (j <= 1 + fuzz) { c = k[i + 0x10 - j++]; if (!c) continue; m[(c << 3) + mc[c]++] = p; m[(p << 3) + mc[p]++] = c; } } id[0] = 0; length = minlength; } void generate() { int i, p, maxcount; word[i = 0] = p = f[id[0]]; while (++i < length) word[i] = p = m[(p << 3) + id[i]]; word[i--] = 0; if (i) maxcount = mc[word[i - 1]]; else maxcount = fc; while (++id[i] >= maxcount) { if (!i) { if (length < maxlength) { id[0] = 0; id[length++] = 0; } return; } id[i--] = 0; if (i) maxcount = mc[word[i - 1]]; else maxcount = fc; } } void restore() { int i; /* Calculate the length */ length = 0; while (word[length]) length++; /* Infer the first character index */ i = -1; while (++i < fc) { if (f[i] == word[0]) { id[0] = i; break; } } /* This sample can be enhanced to infer the rest of the indices here */ } # Generic implementation of "dumb" exhaustive search, given a range of lengths # and an arbitrary charset. This is pre-configured to try 8-bit characters # against LM hashes, which is only reasonable to do for very short password # half lengths. [List.External:DumbForce] int maxlength; // Maximum password length to try int last; // Last character position, zero-based int lastid; // Character index in the last position int id[0x7f]; // Current character indices for other positions int charset[0x100], c0; // Character set void init() { int minlength; int i, c; minlength = 1; // Initial password length to try, must be at least 1 maxlength = 7; // Must be at least same as minlength /* * This defines the character set. * * Let's say, we want to try TAB, all non-control ASCII characters, and all * 8-bit characters, including the 8-bit terminal controls range (as these are * used as regular national characters with some 8-bit encodings), but except * for known terminal controls (risky for the terminal we may be running on). * * Also, let's say our hashes are case-insensitive, so skip lowercase letters * (this is right for LM hashes). */ i = 0; charset[i++] = 9; // Add horizontal TAB (ASCII 9), then c = ' '; // start with space (ASCII 32) and while (c < 'a') // proceed till lowercase 'a' charset[i++] = c++; c = 'z' + 1; // Skip lowercase letters and while (c <= 0x7e) // proceed for all printable ASCII charset[i++] = c++; c++; // Skip DEL (ASCII 127) and while (c < 0x84) // proceed over 8-bit codes till IND charset[i++] = c++; charset[i++] = 0x86; // Skip IND (84 hex) and NEL (85 hex) charset[i++] = 0x87; c = 0x89; // Skip HTS (88 hex) while (c < 0x8d) // Proceed till RI (8D hex) charset[i++] = c++; c = 0x91; // Skip RI, SS2, SS3, DCS while (c < 0x96) // Proceed till SPA (96 hex) charset[i++] = c++; charset[i++] = 0x99; // Skip SPA, EPA, SOS c = 0xa0; // Skip DECID, CSI, ST, OSC, PM, APC while (c <= 0xff) // Proceed with the rest of 8-bit codes charset[i++] = c++; /* Zero-terminate it, and cache the first character */ charset[i] = 0; c0 = charset[0]; last = minlength - 1; i = 0; while (i <= last) { id[i] = 0; word[i++] = c0; } lastid = -1; word[i] = 0; } void generate() { int i; /* Handle the typical case specially */ if (word[last] = charset[++lastid]) return; lastid = 0; word[i = last] = c0; while (i--) { // Have a preceding position? if (word[i] = charset[++id[i]]) return; id[i] = 0; word[i] = c0; } if (++last < maxlength) { // Next length? id[last] = lastid = 0; word[last] = c0; word[last + 1] = 0; } else // We're done word = 0; } void restore() { int i, c; /* Calculate the current length and infer the character indices */ last = 0; while (c = word[last]) { i = 0; while (charset[i] != c && charset[i]) i++; if (!charset[i]) i = 0; // Not found id[last++] = i; } lastid = id[--last]; } # Generic implementation of exhaustive search for a partially-known password. # This is pre-configured for length 8, lowercase and uppercase letters in the # first 4 positions (52 different characters), and digits in the remaining 4 # positions - however, the corresponding part of init() may be modified to use # arbitrary character sets or even fixed characters for each position. [List.External:KnownForce] int last; // Last character position, zero-based int lastofs; // Last character position offset into charset[] int lastid; // Current character index in the last position int id[0x7f]; // Current character indices for other positions int charset[0x7f00]; // Character sets, 0x100 elements for each position void init() { int length; int pos, ofs, i, c; length = 8; // Password length to try /* This defines the character sets for different character positions */ pos = 0; while (pos < 4) { ofs = pos++ << 8; i = 0; c = 'a'; while (c <= 'z') charset[ofs + i++] = c++; c = 'A'; while (c <= 'Z') charset[ofs + i++] = c++; charset[ofs + i] = 0; } while (pos < length) { ofs = pos++ << 8; i = 0; c = '0'; while (c <= '9') charset[ofs + i++] = c++; charset[ofs + i] = 0; } last = length - 1; pos = -1; while (++pos <= last) word[pos] = charset[id[pos] = pos << 8]; lastid = (lastofs = last << 8) - 1; word[pos] = 0; } void generate() { int pos; /* Handle the typical case specially */ if (word[last] = charset[++lastid]) return; word[pos = last] = charset[lastid = lastofs]; while (pos--) { // Have a preceding position? if (word[pos] = charset[++id[pos]]) return; word[pos] = charset[id[pos] = pos << 8]; } word = 0; // We're done } void restore() { int i, c; /* Calculate the current length and infer the character indices */ last = 0; while (c = word[last]) { i = lastofs = last << 8; while (charset[i] != c && charset[i]) i++; if (!charset[i]) i = lastofs; // Not found id[last++] = i; } lastid = id[--last]; } # A variation of KnownForce configured to try likely date and time strings. [List.External:DateTime] int last; // Last character position, zero-based int lastofs; // Last character position offset into charset[] int lastid; // Current character index in the last position int id[0x7f]; // Current character indices for other positions int charset[0x7f00]; // Character sets, 0x100 elements for each position void init() { int length; int pos, ofs, i, c; length = 8; // Must be one of: 4, 5, 7, 8 /* This defines the character sets for different character positions */ pos = 0; while (pos < length - 6) { ofs = pos++ << 8; i = 0; c = '0'; while (c <= '9') charset[ofs + i++] = c++; charset[ofs + i] = 0; } if (pos) { ofs = pos++ << 8; charset[ofs] = '/'; charset[ofs + 1] = '.'; charset[ofs + 2] = ':'; charset[ofs + 3] = 0; } while (pos < length - 3) { ofs = pos++ << 8; i = 0; c = '0'; while (c <= '9') charset[ofs + i++] = c++; charset[ofs + i] = 0; } ofs = pos++ << 8; charset[ofs] = '/'; charset[ofs + 1] = '.'; charset[ofs + 2] = ':'; charset[ofs + 3] = 0; while (pos < length) { ofs = pos++ << 8; i = 0; c = '0'; while (c <= '9') charset[ofs + i++] = c++; charset[ofs + i] = 0; } last = length - 1; pos = -1; while (++pos <= last) word[pos] = charset[id[pos] = pos << 8]; lastid = (lastofs = last << 8) - 1; word[pos] = 0; } void generate() { int pos; /* Handle the typical case specially */ if (word[last] = charset[++lastid]) return; word[pos = last] = charset[lastid = lastofs]; while (pos--) { // Have a preceding position? if (word[pos] = charset[++id[pos]]) return; word[pos] = charset[id[pos] = pos << 8]; } word = 0; // We're done } void restore() { int i, c; /* Calculate the current length and infer the character indices */ last = 0; while (c = word[last]) { i = lastofs = last << 8; while (charset[i] != c && charset[i]) i++; if (!charset[i]) i = lastofs; // Not found id[last++] = i; } lastid = id[--last]; } # Try strings of repeated characters. [List.External:Repeats] int minlength, maxlength, minc, maxc, length, c; void init() { minlength = 1; maxlength = 72; minc = 0x20; maxc = 0xff; length = minlength; c = minc; } void generate() { int i; i = 0; while (i < length) word[i++] = c; word[i] = 0; if (c++ < maxc) return; c = minc; if (++length > maxlength) c = 0; // Will NUL out the next "word" and thus terminate } # Generate candidate passwords from many small subsets of characters from a # much larger full character set. This will test for passwords containing too # few different characters. As currently implemented, this code will produce # some duplicates, although their number is relatively small when the maximum # number of different characters (the maxdiff setting) is significantly lower # than the maximum length (the maxlength setting). Nevertheless, you may want # to pass the resulting candidate passwords through "unique" if you intend to # test them against hashes that are salted and/or of a slow to compute type. [List.External:Subsets] int minlength; // Minimum password length to try int maxlength; // Maximum password length to try int startdiff; // Initial number of characters in a subset to try int maxdiff; // Maximum number of characters in a subset to try int last; // Last character position, zero-based int lastid; // Character index in the last position int id[0x7f]; // Current character indices for other positions int subset[0x100], c0; // Current subset int subcount; // Number of characters in the current subset int subid[0x100]; // Indices into charset[] of characters in subset[] int charset[0x100]; // Full character set int charcount; // Number of characters in the full charset void init() { int i, c; minlength = 1; // Minimum password length to try, must be at least 1 maxlength = 8; // Must be at least same as minlength startdiff = 1; // Initial number of different characters to try maxdiff = 3; // Maximum number of different characters to try /* This defines the character set */ i = 0; c = 0x20; while (c <= 0x7e) charset[i++] = c++; if (maxdiff > (charcount = i)) maxdiff = i; if (maxdiff > maxlength) maxdiff = maxlength; /* * Initialize the variables such that generate() gets to its "next subset" * code, which will initialize everything for real. */ subcount = (i = startdiff) - 1; while (i--) subid[i] = charcount; subset[0] = c0 = 0; last = maxlength - 1; lastid = -1; } void generate() { int i; /* Handle the typical case specially */ if (word[last] = subset[++lastid]) return; lastid = 0; word[i = last] = c0; while (i--) { // Have a preceding position? if (word[i] = subset[++id[i]]) return; id[i] = 0; word[i] = c0; } if (++last < maxlength) { // Next length? id[last] = lastid = 0; word[last] = c0; word[last + 1] = 0; return; } /* Next subset */ if (subcount) { int j; i = subcount - 1; j = charcount; while (++subid[i] >= j) { if (i--) { j--; continue; } subid[i = 0] = 0; subset[++subcount] = 0; break; } } else { subid[i = 0] = 0; subset[++subcount] = 0; } subset[i] = charset[subid[i]]; while (++i < subcount) subset[i] = charset[subid[i] = subid[i - 1] + 1]; if (subcount > maxdiff) { word = 0; // Done return; } /* * We won't be able to fully use the subset if the length is smaller than the * character count. We assume that we've tried all smaller subsets before, so * we don't bother with such short lengths. */ if (minlength < subcount) last = subcount - 1; else last = minlength - 1; c0 = subset[0]; i = 0; while (i <= last) { id[i] = 0; word[i++] = c0; } lastid = 0; word[i] = 0; } # Simple password policy matching: require at least one digit. [List.External:AtLeast1-Simple] void filter() { int i, c; i = 0; while (c = word[i++]) if (c >= '0' && c <= '9') return; // Found at least one suitable character, good word = 0; // No suitable characters found, skip this "word" } # The same password policy implemented in a more efficient and more generic # fashion (easy to expand to include other "sufficient" characters as well). [List.External:AtLeast1-Generic] int mask[0x100]; void init() { int c; mask[0] = 0; // Terminate the loop in filter() on NUL c = 1; while (c < 0x100) mask[c++] = 1; // Continue looping in filter() on most chars c = '0'; while (c <= '9') mask[c++] = 0; // Terminate the loop in filter() on digits } void filter() { int i; i = -1; while (mask[word[++i]]) continue; if (word[i]) return; // Found at least one suitable character, good word = 0; // No suitable characters found, skip this "word" } # An efficient and fairly generic password policy matcher. The policy to match # is specified in the check at the end of filter() and in mask[]. For example, # lowercase and uppercase letters may be treated the same by initializing the # corresponding mask[] elements to the same value, then adjusting the value to # check "seen" for accordingly. [List.External:Policy] int mask[0x100]; void init() { int c; mask[0] = 0x100; c = 1; while (c < 0x100) mask[c++] = 0x200; c = 'a'; while (c <= 'z') mask[c++] = 1; c = 'A'; while (c <= 'Z') mask[c++] = 2; c = '0'; while (c <= '9') mask[c++] = 4; } void filter() { int i, seen; /* * This loop ends when we see NUL (sets 0x100) or a disallowed character * (sets 0x200). */ i = -1; seen = 0; while ((seen |= mask[word[++i]]) < 0x100) continue; /* * We should have seen at least one character of each type (which "add up" * to 7) and then a NUL (adds 0x100), but not any other characters (would * add 0x200). The length must be 8. */ if (seen != 0x107 || i != 8) word = 0; // Does not conform to policy } # Append the Luhn algorithm digit to arbitrary all-digit strings. Optimized # for speed, not for size nor simplicity. The primary optimization trick is to # compute the length and four sums in parallel (in two SIMD'ish variables). # Then whether the length is even or odd determines which two of the four sums # are actually used. Checks for non-digits and for NUL are packed into the # SIMD'ish bitmasks as well. [List.External:AppendLuhn] int map1[0x100], map2[0x1fff]; void init() { int i; map1[0] = ~0x7fffffff; i = 1; while (i < 0x100) map1[i++] = ~0x7effffff; i = -1; while (++i < 10) map1['0' + i] = i + ((i * 2 % 10 + i / 5) << 12); i = -1; while (++i < 0x1fff) { if (i % 10) map2[i] = '9' + 1 - i % 10; else map2[i] = '0'; } } void filter() { int i, o, e; i = o = e = 0; while ((o += map1[word[i++]]) >= 0) { if ((e += map1[word[i++]]) >= 0) continue; if (e & 0x01000000) return; // Not all-digit, leave unmodified word[i--] = 0; word[i] = map2[(e & 0xfff) + (o >> 12)]; return; } if (o & 0x01000000) return; // Not all-digit, leave unmodified word[i--] = 0; word[i] = map2[(o & 0xfff) + (e >> 12)]; } # Here are some examples of GENERIC-MD5. # Please refer to doc/MD5_GENERIC for documentation on how to set these up. #################################################################### # Simple GENERIC-MD5 type for md5($p)^^4 (i.e. 4 steps of md5 recursively) #################################################################### [List.Generic:md5_gen(1001)] # expression shown will be the string: md5_gen(1001) md5(md5(md5(md5($p)))) Expression=md5(md5(md5(md5($p)))) Flag=MGF_KEYS_INPUT # here is the optimized 'script' to perform the md5 4 times on itself. Func=MD5GenBaseFunc__crypt Func=MD5GenBaseFunc__clean_input2 Func=MD5GenBaseFunc__append_from_last_output_to_input2_as_base16 Func=MD5GenBaseFunc__crypt2 Func=MD5GenBaseFunc__clean_input2_kwik Func=MD5GenBaseFunc__append_from_last_output2_as_base16 Func=MD5GenBaseFunc__crypt2 Func=MD5GenBaseFunc__clean_input2_kwik Func=MD5GenBaseFunc__append_from_last_output2_as_base16 Func=MD5GenBaseFunc__crypt_in2_to_out1 Test=md5_gen(1001)57200e13b490d4ae47d5e19be026b057:test1 Test=md5_gen(1001)c6cc44f9e7fb7efcde62ba2e627a49c6:thatsworking Test=md5_gen(1001)0ae9549604e539a249c1fa9f5e5fb73b:test3 #################################################################### # Simple GENERIC-MD5 type for md5($p)^^5 (i.e. 5 steps of md5 recursively) #################################################################### [List.Generic:md5_gen(1002)] # expression shown will be the string: md5_gen(1002) md5(md5(md5(md5(md5($p))))) Expression=md5(md5(md5(md5(md5($p))))) Flag=MGF_KEYS_INPUT # here is the optimized 'script' to perform the md5 5 times on itself. Func=MD5GenBaseFunc__crypt Func=MD5GenBaseFunc__clean_input2 Func=MD5GenBaseFunc__append_from_last_output_to_input2_as_base16 Func=MD5GenBaseFunc__crypt2 Func=MD5GenBaseFunc__clean_input2_kwik Func=MD5GenBaseFunc__append_from_last_output2_as_base16 Func=MD5GenBaseFunc__crypt2 Func=MD5GenBaseFunc__clean_input2_kwik Func=MD5GenBaseFunc__append_from_last_output2_as_base16 Func=MD5GenBaseFunc__crypt2 Func=MD5GenBaseFunc__clean_input2_kwik Func=MD5GenBaseFunc__append_from_last_output2_as_base16 Func=MD5GenBaseFunc__crypt_in2_to_out1 # These are test strings for this format. Test=md5_gen(1002)25de8cd0b0cf69c5b5bc19c8ee64adab:test1 Test=md5_gen(1002)a0b535420ea47849f7c2cc09a3ad0ac3:thatsworking Test=md5_gen(1002)4cb029bd5b4ef79f785ca685caf17bf8:test3 #################################################################### # Simple GENERIC-MD5 type for md5(md5($p).md5($p)) #################################################################### [List.Generic:md5_gen(1003)] # expression shown will be the string: md5_gen(1003) md5(md5($p).md5($p)) Expression=md5(md5($p).md5($p)) # NOTE, this format does NOT work on SSE2. It requires a md5() of a 64 byte string. # SSE (or MMX) is limtited to 54 byte max password, due to 'enhancements' # Thus, we need a non-sse2 safe flag. Flag=MGF_NOTSSE2Safe Flag=MGF_KEYS_INPUT # here is the optimized 'script' to perform hash 'like' IPB but salt replaced with password. Func=MD5GenBaseFunc__crypt Func=MD5GenBaseFunc__clean_input2_kwik Func=MD5GenBaseFunc__append_from_last_output_to_input2_as_base16 Func=MD5GenBaseFunc__append_from_last_output_to_input2_as_base16 Func=MD5GenBaseFunc__crypt_in2_to_out1 # These are test strings for this format. Test=md5_gen(1003)478b10974f15e7295883224fd286ccba:test1 Test=md5_gen(1003)18a59101e6c6fb38260d542a394ecb22:thatsworking Test=md5_gen(1003)630b01b68b6db6fd43a751f8147d1faf:test3 #################################################################### # Simple GENERIC-MD5 type for md5($p)^^6 (i.e. 6 steps of md5 recursively) #################################################################### [List.Generic:md5_gen(1004)] # expression shown will be the string: md5_gen(1004) md5(md5(md5(md5(md5(md5($p)))))) Expression=md5(md5(md5(md5(md5(md5($p)))))) Flag=MGF_KEYS_INPUT # here is the optimized 'script' to perform the md5 6 times on itself. Func=MD5GenBaseFunc__crypt Func=MD5GenBaseFunc__clean_input2 Func=MD5GenBaseFunc__append_from_last_output_to_input2_as_base16 Func=MD5GenBaseFunc__crypt2 Func=MD5GenBaseFunc__clean_input2_kwik Func=MD5GenBaseFunc__append_from_last_output2_as_base16 Func=MD5GenBaseFunc__crypt2 Func=MD5GenBaseFunc__clean_input2_kwik Func=MD5GenBaseFunc__append_from_last_output2_as_base16 Func=MD5GenBaseFunc__crypt2 Func=MD5GenBaseFunc__clean_input2_kwik Func=MD5GenBaseFunc__append_from_last_output2_as_base16 Func=MD5GenBaseFunc__crypt2 Func=MD5GenBaseFunc__clean_input2_kwik Func=MD5GenBaseFunc__append_from_last_output2_as_base16 Func=MD5GenBaseFunc__crypt_in2_to_out1 # These are test strings for this format. Test=md5_gen(1004)de1b991dd27fb9813e88b957a455dccd:test1 Test=md5_gen(1004)6a62cd3c4d81139f61fb2553cdef0dc7:thatsworking Test=md5_gen(1004)a977990e521c5d1d17c6d65fdf2681b4:test3 #################################################################### # Simple GENERIC-MD5 type for md5($p)^^7 (i.e. 7 steps of md5 recursively) #################################################################### [List.Generic:md5_gen(1005)] # expression shown will be the string: md5_gen(1005) md5(md5(md5(md5(md5(md5(md5($p))))))) Expression=md5(md5(md5(md5(md5(md5(md5($p))))))) Flag=MGF_KEYS_INPUT # here is the optimized 'script' to perform the md5 7 times on itself. Func=MD5GenBaseFunc__crypt Func=MD5GenBaseFunc__clean_input2 Func=MD5GenBaseFunc__append_from_last_output_to_input2_as_base16 Func=MD5GenBaseFunc__crypt2 Func=MD5GenBaseFunc__clean_input2_kwik Func=MD5GenBaseFunc__append_from_last_output2_as_base16 Func=MD5GenBaseFunc__crypt2 Func=MD5GenBaseFunc__clean_input2_kwik Func=MD5GenBaseFunc__append_from_last_output2_as_base16 Func=MD5GenBaseFunc__crypt2 Func=MD5GenBaseFunc__clean_input2_kwik Func=MD5GenBaseFunc__append_from_last_output2_as_base16 Func=MD5GenBaseFunc__crypt2 Func=MD5GenBaseFunc__clean_input2_kwik Func=MD5GenBaseFunc__append_from_last_output2_as_base16 Func=MD5GenBaseFunc__crypt2 Func=MD5GenBaseFunc__clean_input2_kwik Func=MD5GenBaseFunc__append_from_last_output2_as_base16 Func=MD5GenBaseFunc__crypt_in2_to_out1 # These are test strings for this format. Test=md5_gen(1005)784c527d0d92873ff9c0773e1c35621d:test1 Test=md5_gen(1005)efcbbe6331caecf0e7f40160e65aadcc:thatsworking Test=md5_gen(1005)abb8bdd2c6ac2dfea2b2af6f5aed5446:test3 #################################################################### # Simple GENERIC-MD5 type for md5($p)^^8 (i.e. 8 steps of md5 recursively) #################################################################### [List.Generic:md5_gen(1006)] # expression shown will be the string: md5_gen(1006) md5(md5(md5(md5(md5(md5(md5(md5($p)))))))) Expression=md5(md5(md5(md5(md5(md5(md5(md5($p)))))))) Flag=MGF_KEYS_INPUT # here is the optimized 'script' to perform the md5 8 times on itself. Func=MD5GenBaseFunc__crypt Func=MD5GenBaseFunc__clean_input2 Func=MD5GenBaseFunc__append_from_last_output_to_input2_as_base16 Func=MD5GenBaseFunc__crypt2 Func=MD5GenBaseFunc__clean_input2_kwik Func=MD5GenBaseFunc__append_from_last_output2_as_base16 Func=MD5GenBaseFunc__crypt2 Func=MD5GenBaseFunc__clean_input2_kwik Func=MD5GenBaseFunc__append_from_last_output2_as_base16 Func=MD5GenBaseFunc__crypt2 Func=MD5GenBaseFunc__clean_input2_kwik Func=MD5GenBaseFunc__append_from_last_output2_as_base16 Func=MD5GenBaseFunc__crypt2 Func=MD5GenBaseFunc__clean_input2_kwik Func=MD5GenBaseFunc__append_from_last_output2_as_base16 Func=MD5GenBaseFunc__crypt2 Func=MD5GenBaseFunc__clean_input2_kwik Func=MD5GenBaseFunc__append_from_last_output2_as_base16 Func=MD5GenBaseFunc__crypt2 Func=MD5GenBaseFunc__clean_input2_kwik Func=MD5GenBaseFunc__append_from_last_output2_as_base16 Func=MD5GenBaseFunc__crypt_in2_to_out1 # These are test strings for this format. Test=md5_gen(1006)1ec1f32398f64cab51183f63630eceea:test1 Test=md5_gen(1006)f66b339ac21d6fd6af216f2b70aab2c9:thatsworking Test=md5_gen(1006)e9d38522b5eeec753332e576e2e0fe5d:test3 #################################################################### # Simple GENERIC-MD5 type for vBulletin md5(md5($p).$s) Included here to 'exercise' the script parser #################################################################### [List.Generic:md5_gen(1007)] # expression shown will be the string: md5_gen(1007) md5(md5($p).$s) [vBulletin] Expression=md5(md5($p).$s) [vBulletin] # Flag needed here, is Salt. There is no 'fixed' saltlen. Flag=MGF_SALTED Flag=MGF_ColonNOTValid Flag=MGF_KEYS_BASE16_IN1 # vBulletin has a 'fixed' 3 byte salt, so list the fixed size SaltLen=3 ColonChar=; # here is the optimized 'script' to perform vBulletin hash Func=MD5GenBaseFunc__set_input_len_32 Func=MD5GenBaseFunc__append_salt Func=MD5GenBaseFunc__crypt # NOTE, vBulletin is setup to 'override' the ':'. USUALLY, it is good to use something # outside of the ASCII values from 0x20 to 0x7F. 0x1F is a 'good' choice, but it will # cause john.conf to have a 'non-normal' ASCII char. Thus for this 'simple' example, I # have used the ';' character. NOTE this would have the same 'problems' as the ':' character # if used for real, since ; is also a valid character within the salt of vBulletin. # NOTE to run, you MUST use the command line switch: -field-separator-char=; Test=md5_gen(1007)daa61d77e218e42060c2fa198ac1feaf$SXB;test1 Test=md5_gen(1007)de56b00bb15d6db79204bd44383469bc$T &;thatsworking Test=md5_gen(1007)fb685c6f469f6e549c85e4c1fb5a65a6$\\H:;test3 #################################################################### # Simple GENERIC-MD5 type for joomla md5($p.$s) Included here to 'exercise' the script parser #################################################################### [List.Generic:md5_gen(1008)] # expression shown will be the string: md5_gen(1008) md5($p.$s) [joomla] Expression=md5($p.$s) [joomla] # Flag needed here, is Salt. There is no 'fixed' saltlen. Flag=MGF_SALTED # here is the optimized 'script' to perform the md5 8 times on itself. Func=MD5GenBaseFunc__clean_input Func=MD5GenBaseFunc__append_keys Func=MD5GenBaseFunc__append_salt Func=MD5GenBaseFunc__crypt Test=md5_gen(1008)ed52af63d8ecf0c682442dfef5f36391$1aDNNojYGSc7pSzcdxKxhbqvLtEe4deG:test1 Test=md5_gen(1008)4fa1e9d54d89bfbe48b4c0f0ca0a3756$laxcaXPjgcdKdKEbkX1SIjHKm0gfYt1c:thatsworking Test=md5_gen(1008)82568eeaa1fcf299662ccd59d8a12f54$BdWwFsbGtXPGc0H1TBxCrn0GasyAlJBJ:test3