packages feed

crypto-api 0.10.2 → 0.11

raw patch · 8 files changed

+532/−1592 lines, 8 filesdep +transformersdep −arraydep −largewordPVP ok

version bump matches the API change (PVP)

Dependencies added: transformers

Dependencies removed: array, largeword

API changes (from Hackage documentation)

- Crypto.Modes: cMac :: BlockCipher k => k -> ByteString -> ByteString
- Crypto.Modes: cMac' :: BlockCipher k => k -> ByteString -> ByteString
- Crypto.Modes: cbc' :: BlockCipher k => k -> IV k -> ByteString -> (ByteString, IV k)
- Crypto.Modes: cbcMac :: BlockCipher k => k -> ByteString -> ByteString
- Crypto.Modes: cbcMac' :: BlockCipher k => k -> ByteString -> ByteString
- Crypto.Modes: cfb' :: BlockCipher k => k -> IV k -> ByteString -> (ByteString, IV k)
- Crypto.Modes: data IV k
- Crypto.Modes: dblIV :: BlockCipher k => IV k -> IV k
- Crypto.Modes: ecb' :: BlockCipher k => k -> ByteString -> ByteString
- Crypto.Modes: instance Eq (IV k)
- Crypto.Modes: instance Ord (IV k)
- Crypto.Modes: instance Show (IV k)
- Crypto.Modes: ofb' :: BlockCipher k => k -> IV k -> ByteString -> (ByteString, IV k)
- Crypto.Modes: siv :: BlockCipher k => k -> k -> [ByteString] -> ByteString -> Maybe ByteString
- Crypto.Modes: siv' :: BlockCipher k => k -> k -> [ByteString] -> ByteString -> Maybe ByteString
- Crypto.Modes: unCbc' :: BlockCipher k => k -> IV k -> ByteString -> (ByteString, IV k)
- Crypto.Modes: unCfb' :: BlockCipher k => k -> IV k -> ByteString -> (ByteString, IV k)
- Crypto.Modes: unEcb' :: BlockCipher k => k -> ByteString -> ByteString
- Crypto.Modes: unOfb' :: BlockCipher k => k -> IV k -> ByteString -> (ByteString, IV k)
- Crypto.Modes: unSiv :: BlockCipher k => k -> k -> [ByteString] -> ByteString -> Maybe ByteString
- Crypto.Modes: unSiv' :: BlockCipher k => k -> k -> [ByteString] -> ByteString -> Maybe ByteString
+ Crypto.Classes: cbc :: BlockCipher k => k -> IV k -> ByteString -> (ByteString, IV k)
+ Crypto.Classes: cfb :: BlockCipher k => k -> IV k -> ByteString -> (ByteString, IV k)
+ Crypto.Classes: ctr :: BlockCipher k => k -> IV k -> ByteString -> (ByteString, IV k)
+ Crypto.Classes: ecb :: BlockCipher k => k -> ByteString -> ByteString
+ Crypto.Classes: ofb :: BlockCipher k => k -> IV k -> ByteString -> (ByteString, IV k)
+ Crypto.Classes: unCbc :: BlockCipher k => k -> IV k -> ByteString -> (ByteString, IV k)
+ Crypto.Classes: unCfb :: BlockCipher k => k -> IV k -> ByteString -> (ByteString, IV k)
+ Crypto.Classes: unCtr :: BlockCipher k => k -> IV k -> ByteString -> (ByteString, IV k)
+ Crypto.Classes: unEcb :: BlockCipher k => k -> ByteString -> ByteString
+ Crypto.Classes: unOfb :: BlockCipher k => k -> IV k -> ByteString -> (ByteString, IV k)
+ Crypto.Types: IV :: {-# UNPACK #-} !ByteString -> IV k
+ Crypto.Types: data IV k
+ Crypto.Types: initializationVector :: IV k -> {-# UNPACK #-} !ByteString
+ Crypto.Types: instance Eq (IV k)
+ Crypto.Types: instance Ord (IV k)
+ Crypto.Types: instance Show (IV k)
- Crypto.Classes: class Serialize k => BlockCipher k
+ Crypto.Classes: class Serialize k => BlockCipher k where ecb = modeEcb' unEcb = modeUnEcb' cbc = modeCbc' unCbc = modeUnCbc' ctr = modeCtr' incIV unCtr = modeUnCtr' incIV cfb = modeCfb' unCfb = modeUnCfb' ofb = modeOfb' unOfb = modeUnOfb'
- Crypto.Classes: class (Serialize d, Eq d, Ord d) => Hash ctx d | d -> ctx, ctx -> d
+ Crypto.Classes: class (Serialize d, Eq d, Ord d) => Hash ctx d | d -> ctx, ctx -> d where hash msg = res where res = finalize ctx end ctx = foldl' updateCtx initialCtx blks (blks, end) = makeBlocks msg blockLen blockLen = (blockLength .::. res) `div` 8 hash' msg = res where res = finalize (updateCtx initialCtx top) end (top, end) = splitAt remlen msg remlen = length msg - (length msg `rem` bLen) bLen = blockLength `for` res `div` 8
- Crypto.Classes: hash :: Hash ctx d => ByteString -> d
+ Crypto.Classes: hash :: (Hash ctx d, Hash ctx d) => ByteString -> d
- Crypto.Classes: hash' :: Hash ctx d => ByteString -> d
+ Crypto.Classes: hash' :: (Hash ctx d, Hash ctx d) => ByteString -> d

Files

− Crypto/CPoly.hs
@@ -1,1123 +0,0 @@-module Crypto.CPoly-	(-	cpoly,-	cpoly2list,-	cpoly2revlist,-	) where-import Data.Bits-import Data.Array---- Based on the data from "Table of Low-Weight Binary Irreducible Polynomials" of Gadiel Seroussi--- Get the CMAC polynomial applicable to each block length from 2 to 10000--- The values for 64 and 128 match the standard--- Please note this takes 1 minute and some memory to compile on my I5 so may--- take longer on other platforms--- Generated by: cat polys.txt | sed -e 's/^.*$/(\0)/g' -e 's/^(\([0-9]*\),\([0-9]*\))$/cpolys \1 = T \2/g' -e 's/^(\([0-9]*\),\([0-9]*\),\([0-9]*\),\([0-9]*\))$/cpolys \1 = Q \2 \3 \4/g' > cpoly2.hs--- Polys.txt generated by: cat /tmp/lalala.txt | egrep "[1-9][0-9]*,[1-9][0-9]*(,[1-9][0-9]*,[1-9][0-9]*)?" | tr ' ' '\n'  | sed '/^$/d' > polys.txt--data Poly = T Int-	  | Q Int Int Int--cpoly :: (Integral a, Bits b) => a -> b -> b-cpoly x = cpoly2 $ cpolys $ fromIntegral (x)-  where-	cpoly2 (T a) = (\x -> (x `complementBit` a `complementBit` 0))-	cpoly2 (Q a b c) = (\x -> (x `complementBit` a `complementBit` b `complementBit` c `complementBit` 0))--cpoly2list :: (Integral a, Integral b) => a -> [b]-cpoly2list x = cpoly2 $ cpolys $ fromIntegral (x)-  where-	cpoly2 (T a) = map fromIntegral [a,0]-	cpoly2 (Q a b c) = map fromIntegral [a,b,c,0]--cpoly2revlist :: (Integral a, Integral b) => a -> [b]-cpoly2revlist x = cpoly2 $ cpolys $ fromIntegral (x)-  where-	cpoly2 (T a) = map fromIntegral [0,a]-	cpoly2 (Q a b c) = map fromIntegral [0,c,b,a]--cpolys :: Int -> Poly-cpolys i- | i < 2 || i > 10000 = error $ "The CMAC polynomial for the value" ++ show i ++ "hasn't been precomputed"- | otherwise = cpolysArr ! i--cpolysArr :: Array Int Poly-cpolysArr = listArray (2,10000) [-  T 1,T 1,T 1,T 2,T 1,T 1,Q 4 3 1,T 1,T 3,T 2,T 3,Q 4 3 1,T 5,T 1,Q 5 3 1,-  T 3,T 3,Q 5 2 1,T 3,T 2,T 1,T 5,Q 4 3 1,T 3,Q 4 3 1,Q 5 2 1,T 1,T 2,T 1,-  T 3,Q 7 3 2,T 10,T 7,T 2,T 9,Q 6 4 1,Q 6 5 1,T 4,Q 5 4 3,T 3,T 7,Q 6 4 3,-  T 5,Q 4 3 1,T 1,T 5,Q 5 3 2,T 9,Q 4 3 2,Q 6 3 1,T 3,Q 6 2 1,T 9,T 7,Q 7 4 2,-  T 4,T 19,Q 7 4 2,T 1,Q 5 2 1,T 29,T 1,Q 4 3 1,T 18,T 3,Q 5 2 1,T 9,Q 6 5 2,-  Q 5 3 1,T 6,Q 10 9 3,T 25,T 35,Q 6 3 1,T 21,Q 6 5 2,Q 6 5 3,T 9,Q 9 4 2,-  T 4,Q 8 3 1,Q 7 4 2,T 5,Q 8 2 1,T 21,T 13,Q 7 6 2,T 38,T 27,Q 8 5 1,T 21,-  T 2,T 21,T 11,Q 10 9 6,T 6,T 11,Q 6 3 1,T 15,Q 7 6 1,T 29,T 9,Q 4 3 1,-  T 4,T 15,Q 9 7 4,T 17,Q 5 4 2,T 33,T 10,Q 5 4 3,T 9,Q 5 3 2,Q 8 7 5,Q 4 2 1,-  Q 5 2 1,T 33,T 8,Q 4 3 1,T 18,Q 6 2 1,T 2,T 19,Q 7 6 5,T 21,T 1,Q 7 2 1,-  T 5,T 3,Q 8 3 2,T 17,Q 9 8 2,T 57,T 11,Q 5 3 2,T 21,Q 8 7 1,Q 8 5 3,T 15,-  Q 10 4 1,T 21,Q 5 3 2,Q 7 4 2,T 52,T 71,T 14,T 27,Q 10 9 7,T 53,T 3,Q 6 3 2,-  T 1,T 15,T 62,T 9,Q 6 5 2,Q 8 6 5,T 31,Q 5 3 2,T 18,T 27,Q 7 6 3,Q 10 8 7,-  Q 9 8 3,T 37,T 6,Q 15 3 2,T 34,T 11,Q 6 5 2,T 1,Q 8 5 2,T 13,T 6,Q 11 3 2,-  T 8,T 31,Q 4 2 1,T 3,Q 7 6 1,T 81,T 56,Q 9 8 7,T 24,T 11,Q 7 6 5,Q 6 5 2,-  Q 6 5 2,Q 8 7 6,T 9,Q 7 2 1,T 15,T 87,Q 8 3 2,T 3,Q 9 4 2,T 9,T 34,Q 5 3 2,-  T 14,T 55,Q 8 7 1,T 27,Q 9 5 2,Q 10 9 5,T 43,Q 9 3 1,T 6,T 7,Q 11 10 8,-  T 105,Q 6 5 2,T 73,T 23,Q 7 3 1,T 45,T 11,Q 8 4 1,T 7,Q 8 6 2,Q 5 4 2,-  T 33,Q 9 8 3,T 32,Q 10 7 3,Q 10 9 4,T 113,Q 10 4 1,Q 8 7 6,T 26,Q 9 4 2,-  T 74,T 31,Q 9 6 1,T 5,Q 7 4 1,T 73,T 36,Q 8 5 3,T 70,T 95,Q 8 5 1,T 111,-  Q 6 4 1,Q 11 2 1,T 82,Q 15 14 10,T 35,T 103,Q 7 4 2,T 15,T 46,Q 7 2 1,-  T 52,Q 10 5 2,T 12,T 71,Q 10 6 2,T 15,Q 7 6 4,Q 9 8 4,T 93,Q 9 6 2,T 42,-  T 47,Q 8 6 3,T 25,Q 7 6 1,T 53,T 58,Q 9 3 2,T 23,T 67,Q 11 10 9,T 63,-  Q 12 6 3,T 5,T 5,Q 9 5 2,T 93,T 35,Q 12 7 5,T 53,Q 10 7 5,T 69,T 71,Q 11 10 1,-  T 21,Q 5 3 2,Q 12 11 5,T 37,Q 11 6 1,T 33,T 48,Q 7 3 2,T 5,Q 11 8 4,Q 11 6 4,-  T 5,Q 9 5 2,T 41,T 1,Q 11 2 1,T 102,Q 7 3 1,Q 8 4 2,T 15,Q 10 6 4,T 93,-  Q 7 5 3,Q 9 7 4,T 79,T 15,Q 10 9 1,T 63,Q 7 4 2,T 45,T 36,Q 4 3 1,T 31,-  T 67,Q 10 3 1,T 51,Q 10 5 2,Q 10 3 1,T 34,Q 8 3 1,T 50,T 99,Q 10 6 2,-  T 89,T 2,Q 5 2 1,Q 10 7 2,Q 7 4 1,T 55,Q 4 3 1,Q 16 10 7,T 45,Q 10 8 6,-  T 125,T 75,Q 7 2 1,T 22,T 63,Q 11 10 3,T 103,Q 6 5 2,T 53,T 34,Q 13 11 6,-  T 69,T 99,Q 6 5 1,Q 10 9 7,Q 11 10 2,T 57,T 68,Q 5 3 2,Q 7 4 1,T 63,Q 8 5 3,-  T 9,Q 9 6 5,T 29,T 21,Q 7 3 2,T 91,T 139,Q 8 3 2,T 111,Q 8 7 2,Q 8 6 5,-  T 16,Q 8 7 5,T 41,T 43,Q 10 8 5,T 47,Q 5 2 1,T 81,T 90,Q 12 3 2,T 6,T 83,-  Q 8 7 1,T 159,Q 10 9 5,T 9,T 28,Q 13 10 6,T 7,T 135,Q 11 6 5,T 25,Q 12 7 6,-  Q 7 6 2,T 26,Q 5 3 2,T 152,T 171,Q 9 8 5,T 65,Q 13 8 2,T 141,T 71,Q 5 3 2,-  T 87,Q 10 4 3,Q 12 10 3,T 147,Q 10 7 6,T 13,T 102,Q 9 5 2,T 107,T 199,-  Q 15 5 4,T 7,Q 5 4 2,T 149,T 25,Q 9 7 2,T 12,T 63,Q 11 6 5,T 105,Q 10 8 7,-  Q 14 6 1,T 120,Q 13 4 3,T 33,Q 12 11 5,Q 12 9 5,T 165,Q 6 2 1,T 65,T 49,-  Q 4 3 1,T 7,Q 7 5 2,Q 10 6 1,T 81,Q 7 6 4,T 105,T 73,Q 11 6 4,T 134,T 47,-  Q 16 10 1,Q 6 5 4,Q 15 6 4,Q 8 6 1,T 38,Q 18 9 6,T 16,T 203,Q 12 5 2,-  T 19,Q 7 6 1,T 73,T 93,Q 19 18 13,T 31,Q 14 11 6,Q 11 6 1,T 27,Q 9 5 2,-  T 9,T 1,Q 11 3 2,T 200,T 191,Q 9 8 4,T 9,Q 16 15 7,T 121,T 104,Q 15 9 6,-  T 138,Q 9 6 5,Q 9 6 4,T 105,Q 17 16 6,T 81,T 94,Q 4 3 1,T 83,T 219,Q 11 6 3,-  T 7,Q 10 5 3,T 17,T 76,Q 16 5 2,T 78,T 155,Q 11 6 5,T 27,Q 5 4 2,Q 8 5 4,-  T 3,Q 15 14 6,T 156,T 23,Q 13 6 3,T 9,Q 8 7 3,T 69,T 10,Q 8 5 2,T 26,-  T 67,Q 14 7 4,T 21,Q 12 10 2,T 33,T 79,Q 15 11 2,T 32,T 39,Q 13 6 2,T 167,-  Q 6 4 1,T 97,T 47,Q 11 6 2,T 42,Q 10 7 3,Q 10 5 4,T 1,Q 4 3 2,T 161,Q 8 6 2,-  Q 7 5 3,T 94,T 195,Q 10 5 4,T 9,Q 13 10 4,Q 8 6 1,T 16,Q 8 3 1,T 122,-  Q 8 2 1,Q 13 7 4,Q 10 5 3,Q 16 4 3,T 193,T 135,Q 19 16 9,T 39,Q 10 8 7,-  Q 10 9 4,T 153,Q 7 6 5,T 73,T 34,Q 11 9 6,T 71,Q 11 4 2,Q 14 7 3,T 163,-  Q 11 6 1,T 153,T 28,Q 15 7 6,T 77,T 67,Q 10 5 2,Q 12 8 1,Q 10 6 4,T 13,-  T 146,Q 13 4 3,T 25,Q 23 22 16,Q 12 9 7,T 237,Q 13 7 6,T 85,T 130,Q 14 13 3,-  T 88,Q 7 5 2,Q 11 6 1,T 35,Q 10 4 3,T 93,Q 9 6 4,Q 13 6 3,T 86,T 19,Q 9 2 1,-  T 273,Q 14 12 9,Q 7 6 1,T 30,Q 9 5 2,T 201,T 215,Q 6 4 3,T 105,Q 10 7 5,-  T 165,T 105,Q 19 13 6,T 31,T 127,Q 10 4 2,T 81,Q 19 10 4,T 45,T 211,Q 19 10 3,-  T 200,T 295,Q 9 8 5,T 9,Q 12 6 5,T 297,T 68,Q 11 6 5,T 133,T 251,Q 13 8 4,-  T 223,Q 6 5 2,Q 7 4 2,T 307,Q 9 2 1,T 101,T 39,Q 14 10 4,T 217,Q 14 9 1,-  Q 6 5 1,T 16,Q 14 3 2,T 11,T 119,Q 11 3 2,Q 11 6 5,Q 11 8 4,T 249,T 5,-  Q 13 3 1,T 37,T 3,T 14,T 93,Q 10 8 7,T 33,T 88,Q 7 5 4,T 38,T 55,Q 15 4 2,-  T 11,Q 12 11 4,T 21,T 107,Q 11 9 8,T 33,Q 10 7 2,Q 18 7 3,T 147,Q 5 4 2,-  T 153,T 15,Q 11 6 5,T 28,Q 11 7 4,Q 6 3 1,T 31,Q 8 4 3,Q 15 5 3,T 66,-  Q 23 16 9,Q 11 9 3,T 171,Q 11 6 1,T 209,Q 4 3 1,T 197,T 13,Q 19 14 6,-  T 14,T 79,Q 13 6 2,T 299,Q 15 8 2,T 169,T 177,Q 23 10 2,T 267,T 215,Q 15 10 1,-  T 75,Q 16 4 2,T 37,Q 12 7 1,Q 8 3 2,T 17,Q 12 11 8,Q 15 8 5,T 15,Q 4 3 1,-  Q 13 12 4,T 92,Q 5 4 3,T 41,T 23,Q 7 4 1,T 183,Q 16 7 1,T 165,T 150,Q 9 6 4,-  T 9,T 231,Q 16 10 4,T 207,Q 9 6 5,T 5,T 180,Q 4 3 2,T 58,T 147,Q 8 6 2,-  T 343,Q 8 7 2,Q 11 6 1,T 44,Q 13 8 6,T 5,T 347,Q 18 16 8,T 135,Q 9 8 3,-  T 85,T 90,Q 13 11 1,T 258,T 351,Q 10 6 4,T 19,Q 7 6 1,T 309,T 18,Q 13 10 3,-  T 158,T 19,Q 12 10 1,T 45,Q 7 6 1,T 233,T 98,Q 11 6 5,T 3,T 83,Q 16 14 9,-  Q 6 5 3,Q 9 7 4,Q 22 19 9,T 168,Q 19 17 4,T 120,Q 14 5 2,Q 17 15 6,T 7,-  Q 10 8 6,T 185,T 93,Q 15 14 7,T 29,T 375,Q 10 8 3,T 13,Q 17 16 2,T 329,-  T 68,Q 13 9 6,T 92,Q 12 10 3,Q 7 6 3,Q 17 10 3,Q 5 2 1,Q 9 6 1,T 30,Q 9 7 3,-  T 253,T 143,Q 7 4 1,Q 9 4 1,Q 12 10 4,T 53,T 25,Q 9 7 1,T 217,Q 15 13 9,-  Q 14 9 2,T 75,Q 8 7 2,T 21,T 7,Q 14 3 2,T 15,T 159,Q 12 10 8,T 29,Q 10 3 1,-  T 21,T 333,Q 11 8 2,T 52,T 119,Q 16 9 7,T 123,Q 15 11 2,T 17,T 9,Q 11 6 4,-  T 38,T 255,Q 12 10 7,T 189,Q 4 3 1,Q 17 10 7,T 49,Q 13 5 2,T 149,T 15,-  Q 14 7 5,Q 10 9 2,Q 8 6 5,T 61,T 54,Q 11 5 1,T 144,T 47,Q 11 10 7,T 105,-  T 2,T 105,T 136,Q 11 4 1,T 253,T 111,Q 13 10 5,T 159,Q 10 7 1,Q 7 5 3,-  T 29,Q 19 10 3,T 119,T 207,Q 17 15 4,T 35,T 14,T 349,Q 6 3 2,Q 21 10 6,-  T 1,T 75,Q 9 5 2,T 145,Q 11 7 6,T 301,T 378,Q 13 3 1,T 352,Q 12 7 4,Q 12 8 1,-  T 149,Q 6 5 4,Q 12 9 8,T 11,Q 15 7 5,T 78,T 99,Q 17 16 12,T 173,Q 8 7 1,-  Q 13 9 8,T 147,Q 19 18 10,T 127,T 183,Q 12 4 1,T 31,Q 11 8 6,T 173,T 12,-  Q 7 5 3,T 113,T 207,Q 18 15 5,T 1,Q 13 7 6,T 21,T 35,Q 12 7 2,T 117,T 123,-  Q 12 10 2,T 143,Q 14 4 1,Q 15 9 7,T 204,Q 7 5 1,T 91,Q 4 2 1,Q 8 6 3,-  T 183,Q 12 10 7,T 77,T 36,Q 14 9 6,T 221,Q 7 6 5,Q 16 14 13,T 31,Q 16 15 7,-  T 365,T 403,Q 10 3 2,Q 11 4 3,T 31,Q 10 9 4,T 177,Q 16 6 1,Q 22 6 5,T 417,-  Q 15 13 12,T 217,T 207,Q 7 5 4,Q 10 7 1,Q 11 6 1,T 45,T 24,Q 12 11 9,-  T 77,Q 21 20 13,Q 9 6 5,T 189,Q 8 3 2,Q 13 12 10,T 260,Q 16 9 7,T 168,-  T 131,Q 7 6 3,T 305,Q 10 9 6,Q 13 9 4,T 143,Q 12 9 3,T 18,Q 15 8 5,Q 20 9 6,-  T 103,Q 15 4 2,T 201,T 36,Q 9 5 2,T 31,Q 11 7 2,Q 6 2 1,T 7,Q 13 6 4,-  Q 9 8 7,T 19,Q 17 10 6,T 15,Q 9 3 1,T 178,Q 8 7 6,Q 12 6 5,T 177,T 230,-  Q 24 9 3,T 222,T 3,Q 16 13 12,T 121,Q 10 4 2,T 161,T 39,Q 17 15 13,T 62,-  T 223,Q 15 12 2,T 65,Q 12 6 3,T 101,T 59,Q 5 4 3,T 17,Q 5 3 2,Q 13 8 3,-  Q 10 9 7,Q 12 8 2,Q 5 4 3,T 75,Q 19 17 8,T 55,T 99,Q 10 7 4,T 115,Q 9 8 6,-  T 385,T 186,Q 15 6 3,Q 9 4 1,Q 12 10 5,Q 10 8 1,T 135,Q 5 2 1,T 317,T 7,-  Q 19 6 1,T 294,T 35,Q 13 12 6,T 119,T 98,T 93,T 68,Q 21 15 3,T 108,T 75,-  Q 12 6 5,T 411,Q 12 7 2,Q 13 7 2,T 21,Q 15 10 8,T 412,T 439,Q 10 7 6,-  T 41,Q 13 9 6,Q 8 5 2,T 10,Q 15 7 2,T 141,T 159,Q 13 12 10,T 291,Q 10 9 1,-  T 105,T 24,Q 11 2 1,T 198,T 27,Q 6 3 1,T 439,Q 10 3 1,T 49,T 168,Q 13 11 9,-  T 463,Q 10 9 3,Q 13 9 8,Q 15 8 3,Q 18 16 8,Q 15 14 11,T 7,Q 19 9 8,Q 12 6 3,-  Q 7 4 3,Q 15 14 5,Q 8 6 3,Q 10 9 7,T 361,T 230,Q 15 9 6,T 24,T 407,Q 16 7 2,-  T 189,T 62,T 189,T 112,Q 22 21 10,T 91,T 79,Q 12 10 5,T 23,Q 7 6 1,T 57,-  T 139,Q 24 15 6,T 14,T 83,Q 16 9 1,T 35,Q 9 7 4,T 117,T 65,Q 21 9 6,T 21,-  T 195,Q 23 11 10,T 327,Q 17 14 3,T 417,T 13,Q 15 8 6,T 107,Q 19 10 6,-  Q 18 15 3,T 59,Q 12 10 4,Q 9 7 5,T 283,Q 13 9 6,T 62,T 427,Q 14 7 3,Q 8 7 4,-  Q 15 8 3,T 105,T 27,Q 7 3 1,T 103,T 551,Q 10 6 1,Q 6 4 1,Q 11 6 4,T 129,-  T 9,Q 9 4 2,T 277,T 31,Q 13 12 5,T 141,Q 12 7 3,T 357,Q 7 2 1,Q 11 9 7,-  T 227,T 131,Q 7 6 3,T 23,Q 20 17 3,Q 13 4 1,T 90,Q 15 3 2,T 241,T 75,-  Q 13 6 1,T 307,Q 8 7 3,T 245,T 66,Q 15 11 2,T 365,Q 18 16 11,Q 11 10 1,-  T 19,Q 8 6 1,T 189,T 133,Q 12 7 2,T 114,T 27,Q 6 5 1,Q 15 5 2,Q 17 14 5,-  T 133,T 476,Q 11 9 3,T 16,T 375,Q 15 8 6,T 25,Q 17 11 6,T 77,T 87,Q 5 3 2,-  T 134,T 171,Q 13 8 4,T 75,Q 8 3 1,T 233,T 196,Q 9 8 7,T 173,Q 15 14 12,-  Q 13 6 5,T 281,Q 9 8 2,T 405,T 114,Q 15 9 6,T 171,T 287,Q 8 4 2,T 43,-  Q 4 2 1,T 513,T 273,Q 11 10 6,T 118,T 243,Q 14 7 1,T 203,Q 9 5 2,T 257,-  T 302,Q 27 25 9,T 393,T 91,Q 12 10 6,T 413,Q 15 14 9,Q 18 16 1,T 255,-  Q 12 9 7,T 234,T 167,Q 16 13 10,T 27,Q 15 6 2,T 433,T 105,Q 25 10 2,T 151,-  T 427,Q 13 9 8,T 49,Q 10 6 4,T 153,T 4,Q 17 7 5,T 54,T 203,Q 16 15 1,-  Q 16 14 7,Q 13 6 1,T 25,T 14,Q 15 5 3,T 187,Q 15 13 10,Q 13 10 5,T 97,-  Q 11 10 9,Q 19 10 4,T 589,Q 31 30 2,T 289,Q 9 6 4,Q 11 8 6,T 21,Q 7 4 1,-  Q 7 4 2,T 77,Q 5 3 2,T 119,T 7,Q 9 5 2,T 345,Q 17 10 8,T 333,T 17,Q 16 9 7,-  T 168,Q 15 13 4,Q 11 10 1,T 217,Q 18 11 10,T 189,T 216,Q 12 7 5,T 229,-  T 231,Q 12 9 3,T 223,Q 10 9 1,T 153,T 470,Q 23 16 6,T 99,Q 10 4 3,Q 9 8 4,-  Q 12 10 1,Q 14 9 6,T 201,T 38,Q 15 14 2,T 198,T 399,Q 14 11 5,T 75,Q 11 10 1,-  T 77,Q 16 12 8,Q 20 17 15,T 326,T 39,Q 14 12 9,T 495,Q 8 3 2,T 333,T 476,-  Q 15 14 2,T 164,T 19,Q 12 4 2,Q 8 6 3,Q 13 12 3,Q 12 11 5,T 129,Q 12 9 3,-  T 52,Q 10 8 3,Q 17 16 2,T 337,Q 12 9 3,T 397,T 277,Q 21 11 3,T 73,Q 11 6 1,-  Q 7 5 4,T 95,Q 11 3 2,T 617,T 392,Q 8 3 2,T 75,T 315,Q 15 6 4,T 125,Q 6 5 2,-  Q 15 9 7,T 348,Q 15 6 1,T 553,Q 6 3 2,Q 10 9 7,T 553,Q 14 10 4,T 237,-  T 39,Q 17 14 6,T 371,T 255,Q 8 4 1,T 131,Q 14 6 1,T 117,T 98,Q 5 3 2,-  T 56,T 655,Q 9 5 2,T 239,Q 11 8 4,T 1,T 134,Q 15 9 5,T 88,Q 10 5 3,Q 10 9 4,-  T 181,Q 15 11 2,T 609,T 52,Q 19 18 10,T 100,Q 7 6 3,Q 15 8 2,T 183,Q 18 7 6,-  Q 10 9 2,T 130,Q 11 5 1,T 12,T 219,Q 13 10 7,T 11,Q 19 9 4,T 129,T 3,-  Q 17 15 5,T 300,Q 17 13 9,Q 14 6 5,T 97,Q 13 8 3,T 601,T 55,Q 8 3 1,T 92,-  T 127,Q 12 11 2,T 81,Q 15 10 8,Q 13 2 1,T 47,Q 14 13 6,T 194,T 383,Q 25 14 11,-  T 125,Q 20 19 16,T 429,T 282,Q 10 9 6,T 342,Q 5 3 2,Q 15 9 4,T 33,Q 9 4 2,-  T 49,T 15,Q 11 6 2,T 28,T 103,Q 18 17 8,T 27,Q 11 6 5,T 33,T 17,Q 11 10 6,-  T 387,T 363,Q 15 10 9,T 83,Q 7 6 4,T 357,Q 13 12 4,Q 14 13 7,T 322,T 395,-  Q 16 5 1,T 595,Q 13 10 3,T 421,T 195,Q 11 3 2,T 13,Q 16 12 3,Q 14 3 1,-  T 315,Q 26 10 5,T 297,T 52,Q 9 4 2,T 314,T 243,Q 16 14 9,T 185,Q 12 5 3,-  Q 13 5 2,T 575,Q 12 9 3,T 39,T 311,Q 13 5 2,T 181,Q 20 18 14,T 49,T 25,-  Q 11 4 1,T 77,Q 17 11 10,Q 15 14 8,T 21,Q 17 10 5,T 69,T 49,Q 11 10 2,-  T 32,T 411,Q 21 16 3,Q 11 7 4,Q 22 10 3,T 85,T 140,Q 9 8 6,T 252,T 279,-  Q 9 5 2,T 307,Q 17 10 4,Q 13 12 9,T 94,Q 13 11 4,T 49,Q 17 11 10,Q 16 12 5,-  T 25,Q 6 5 2,Q 12 5 1,T 80,Q 8 3 2,T 246,Q 11 5 2,Q 11 10 2,T 599,Q 18 12 10,-  T 189,T 278,Q 10 9 3,T 399,T 299,Q 13 10 6,T 277,Q 13 10 6,T 69,T 220,-  Q 13 10 3,T 229,Q 18 11 10,Q 16 15 1,T 27,Q 18 9 3,T 473,T 373,Q 18 17 7,-  T 60,T 207,Q 13 9 8,Q 22 20 13,Q 25 18 7,T 225,T 404,Q 21 6 2,T 46,Q 6 2 1,-  Q 17 12 6,T 75,Q 4 2 1,T 365,T 445,Q 11 7 1,T 44,Q 10 8 5,Q 12 5 2,T 63,-  Q 17 4 2,T 189,T 557,Q 19 12 2,T 252,T 99,Q 10 8 5,T 65,Q 14 9 3,T 9,-  T 119,Q 8 5 2,T 339,T 95,Q 12 9 7,T 7,Q 13 10 2,T 77,T 127,Q 21 10 7,-  T 319,T 667,Q 17 10 3,T 501,Q 18 12 9,Q 9 8 5,T 17,Q 20 9 2,T 341,T 731,-  Q 7 6 5,T 647,Q 10 4 2,T 121,T 20,Q 21 19 13,T 574,T 399,Q 15 10 7,T 85,-  Q 16 8 3,T 169,T 15,Q 12 7 5,T 568,Q 10 7 1,Q 18 2 1,T 3,Q 14 3 2,Q 13 7 3,-  T 643,Q 14 11 1,T 548,T 783,Q 14 11 1,T 317,Q 7 6 4,T 153,T 87,Q 15 13 1,-  T 231,Q 11 5 3,Q 18 13 7,T 771,Q 30 20 11,Q 15 6 3,T 103,Q 13 4 3,T 182,-  T 211,Q 17 6 1,T 27,Q 13 12 10,Q 15 14 10,T 17,Q 13 11 5,T 69,Q 11 5 1,-  Q 18 6 1,T 603,Q 10 4 2,T 741,T 668,Q 17 15 3,T 147,T 227,Q 15 10 9,T 37,-  Q 16 6 1,T 173,T 427,Q 7 5 1,T 287,T 231,Q 20 15 10,Q 18 9 1,Q 14 12 5,-  Q 16 5 1,T 310,Q 18 13 1,T 434,T 579,Q 18 13 8,T 45,Q 12 8 3,Q 16 9 5,-  T 53,Q 19 15 10,T 16,Q 17 6 5,Q 17 10 1,T 37,Q 17 10 9,Q 21 13 7,T 99,-  Q 17 9 6,T 176,T 271,Q 18 17 13,T 459,Q 21 17 10,Q 6 5 2,T 202,Q 5 4 3,-  T 90,T 755,Q 15 7 2,T 363,Q 8 4 2,T 129,T 20,Q 11 6 2,T 135,Q 15 8 7,-  Q 14 13 2,Q 10 4 3,Q 24 13 10,Q 19 14 11,T 31,Q 15 8 6,T 758,Q 16 11 5,-  Q 16 5 1,T 359,Q 23 18 17,T 501,T 29,Q 15 6 3,T 201,T 459,Q 12 10 7,T 225,-  Q 22 17 13,Q 24 22 5,T 161,Q 14 11 3,T 52,Q 19 17 6,Q 21 14 12,T 93,Q 13 10 3,-  T 201,T 178,Q 15 12 5,T 250,Q 7 6 4,Q 17 13 6,T 221,Q 13 11 8,Q 17 14 9,-  T 113,Q 17 14 10,T 300,T 39,Q 18 13 3,T 261,Q 15 14 8,T 753,Q 8 4 3,Q 11 10 5,-  T 94,Q 15 13 1,Q 10 4 2,Q 14 11 10,Q 8 6 2,T 461,T 418,Q 19 14 6,T 403,-  T 267,Q 10 9 2,T 259,Q 20 4 3,T 869,T 173,Q 19 18 2,T 369,T 255,Q 22 12 9,-  T 567,Q 20 11 7,T 457,T 482,Q 6 3 2,T 775,Q 19 17 6,Q 6 4 3,T 99,Q 15 14 8,-  Q 6 5 2,T 165,Q 8 3 2,Q 13 12 10,Q 25 21 17,Q 17 14 9,T 105,Q 17 15 14,-  Q 10 3 2,T 250,Q 25 6 5,T 327,T 279,Q 13 6 5,T 371,Q 15 9 4,T 117,T 486,-  Q 10 9 3,T 217,T 635,Q 30 27 17,T 457,Q 16 6 2,T 57,T 439,Q 23 21 6,T 214,-  Q 20 13 6,Q 20 16 1,T 819,Q 15 11 8,T 593,T 190,Q 17 14 3,T 114,Q 21 18 3,-  Q 10 5 2,Q 12 9 5,Q 8 6 3,T 69,T 312,Q 22 5 2,T 502,T 843,Q 15 10 3,T 747,-  Q 6 5 2,T 101,T 123,Q 19 16 9,T 521,T 171,Q 16 7 2,Q 12 6 5,Q 22 21 20,-  T 545,T 163,Q 23 18 1,T 479,T 495,Q 13 6 5,T 11,Q 17 5 2,Q 18 8 1,T 684,-  Q 7 5 1,T 9,Q 18 11 3,Q 22 20 13,T 273,Q 4 3 2,T 381,T 51,Q 18 13 7,T 518,-  Q 9 5 1,Q 14 12 3,T 243,Q 21 17 2,T 53,T 836,Q 21 10 2,T 66,Q 12 10 7,-  Q 13 9 8,T 339,Q 16 11 5,T 901,T 180,Q 16 13 3,T 49,Q 6 3 2,Q 15 4 1,-  Q 16 13 6,Q 18 15 12,T 885,T 39,Q 11 9 4,T 688,Q 16 15 7,Q 13 10 6,T 13,-  Q 25 23 12,T 149,T 260,Q 11 9 1,T 53,T 11,Q 12 4 2,Q 9 7 5,Q 11 8 1,T 121,-  T 261,Q 10 5 2,T 199,Q 20 4 3,Q 17 9 2,Q 13 9 4,Q 12 8 7,T 253,T 174,-  Q 15 4 2,T 370,Q 9 6 1,Q 16 10 9,T 669,Q 20 10 9,T 833,T 353,Q 17 13 2,-  T 29,T 371,Q 9 8 5,Q 8 7 1,Q 19 8 7,Q 12 11 10,T 873,Q 26 11 2,Q 12 9 1,-  Q 10 7 2,Q 13 6 1,T 235,Q 26 24 19,T 733,T 778,Q 12 11 1,T 344,T 931,-  Q 16 6 4,T 945,Q 21 19 14,Q 18 13 11,T 67,Q 20 15 10,T 462,Q 14 5 1,Q 10 9 6,-  Q 18 11 10,Q 16 9 7,T 477,T 105,Q 11 3 2,T 468,Q 23 16 15,Q 16 15 6,T 327,-  Q 23 10 4,T 357,T 25,Q 17 16 7,T 31,Q 7 5 2,Q 16 7 6,T 277,Q 14 13 6,-  T 413,T 103,Q 15 10 1,T 231,T 747,Q 5 2 1,T 113,Q 20 10 7,Q 15 9 6,T 11,-  Q 27 22 18,T 91,T 51,Q 18 13 12,T 603,Q 10 7 3,T 9,T 121,Q 15 14 6,T 17,-  Q 16 11 2,Q 23 15 6,T 279,Q 16 12 6,T 89,T 371,Q 17 15 2,T 771,T 99,Q 7 6 3,-  T 21,Q 10 7 5,T 801,T 26,Q 25 19 14,T 175,Q 10 7 2,Q 20 5 4,Q 12 11 1,-  Q 22 5 1,T 165,T 841,Q 25 19 17,T 238,Q 11 8 6,Q 22 21 4,T 33,Q 8 7 6,-  Q 14 9 2,T 113,Q 13 11 5,T 311,T 891,Q 20 16 14,T 555,Q 23 14 8,T 133,-  T 546,Q 6 3 2,T 103,T 15,Q 10 7 3,T 307,Q 14 10 1,Q 15 12 2,T 367,Q 13 10 6,-  T 169,Q 22 21 11,Q 12 10 8,T 441,Q 17 12 7,T 917,T 205,Q 26 23 13,T 54,-  T 459,Q 17 15 4,Q 19 15 4,Q 5 4 2,Q 9 7 6,T 42,Q 21 15 7,T 330,Q 20 7 3,-  Q 20 7 2,T 81,Q 19 14 1,T 349,T 165,Q 40 35 9,T 274,T 475,Q 11 10 3,T 93,-  Q 12 7 4,Q 13 12 2,T 386,Q 7 6 2,T 881,T 143,Q 9 8 4,T 71,Q 19 18 3,Q 16 11 6,-  T 155,Q 7 2 1,T 735,Q 16 8 7,Q 9 7 4,T 45,Q 7 6 4,Q 12 11 3,T 3,Q 19 14 13,-  T 124,Q 15 13 8,Q 13 6 5,T 323,Q 21 13 6,T 201,T 11,Q 13 12 3,T 245,T 343,-  Q 14 12 10,T 387,Q 19 4 1,Q 16 3 2,T 48,Q 17 9 2,T 97,T 71,Q 17 13 8,-  Q 18 10 7,Q 18 9 8,T 237,Q 11 5 3,Q 13 10 3,T 253,T 231,Q 9 7 4,T 851,-  Q 15 14 4,Q 16 6 5,T 35,Q 4 3 1,T 467,T 523,Q 21 11 10,Q 4 2 1,Q 9 8 3,-  T 261,T 141,Q 18 11 5,T 150,Q 9 4 1,Q 12 9 5,Q 17 15 7,Q 16 15 7,T 645,-  T 256,Q 19 4 2,T 119,T 19,Q 15 12 9,T 35,Q 25 22 9,T 33,T 98,Q 19 15 9,-  T 153,T 111,Q 17 10 2,Q 21 5 3,Q 10 5 1,Q 12 9 6,T 249,Q 16 13 7,T 385,-  T 155,Q 11 10 1,T 25,Q 24 16 11,T 385,T 84,Q 17 14 6,T 304,T 91,Q 14 11 3,-  T 45,Q 24 17 14,T 881,T 539,Q 23 9 1,T 21,T 239,Q 13 6 5,T 213,Q 24 22 4,-  Q 23 13 2,T 47,Q 15 12 9,T 331,Q 13 9 2,Q 14 4 1,T 283,Q 16 3 1,T 69,-  T 345,Q 13 7 3,T 19,T 595,Q 8 3 2,T 549,Q 17 9 2,T 569,T 224,Q 24 13 7,-  T 582,Q 10 7 5,Q 10 9 8,T 405,Q 14 4 1,T 93,T 6,Q 31 25 14,T 766,T 47,-  Q 12 9 7,T 561,Q 10 4 2,T 693,T 840,Q 11 9 3,T 55,T 411,Q 7 6 4,Q 6 4 1,-  Q 15 8 4,T 225,T 128,Q 15 8 1,T 554,T 15,Q 8 7 2,T 111,Q 18 12 7,T 93,-  T 162,Q 11 10 5,T 51,T 51,Q 22 11 1,T 99,Q 19 8 7,T 441,T 111,Q 8 5 3,-  T 71,Q 15 13 9,Q 23 22 16,T 539,Q 6 5 2,T 893,T 49,Q 20 15 5,T 143,Q 15 3 2,-  Q 14 6 5,Q 11 7 1,Q 14 7 4,T 793,T 438,Q 21 16 6,T 142,T 539,Q 20 14 3,-  T 423,Q 20 19 4,T 1041,T 39,Q 24 7 2,T 455,T 603,Q 22 12 11,T 7,Q 17 16 6,-  T 333,Q 17 6 2,Q 21 19 5,T 47,Q 19 16 7,Q 14 9 8,T 425,Q 17 8 7,T 637,-  T 654,Q 19 17 4,T 249,Q 7 6 1,Q 20 17 11,T 63,Q 7 4 2,T 1053,T 120,Q 23 7 1,-  T 20,T 7,Q 27 15 2,T 399,Q 22 12 11,Q 23 15 6,T 217,Q 9 4 3,T 126,T 927,-  Q 19 16 13,T 75,Q 19 14 2,Q 10 9 2,T 729,Q 14 9 6,T 829,T 983,Q 16 10 6,-  Q 12 4 1,Q 14 12 7,T 57,T 273,Q 15 7 2,T 151,T 343,Q 18 17 8,T 115,Q 15 10 7,-  T 369,T 560,Q 21 10 9,T 630,T 239,Q 15 12 1,T 21,Q 10 4 2,Q 17 14 7,T 276,-  Q 13 4 2,T 715,T 975,Q 20 13 4,T 889,Q 8 6 2,T 249,T 651,Q 17 16 7,T 136,-  Q 23 6 5,Q 13 10 2,T 89,Q 10 8 3,Q 21 17 10,T 259,Q 15 10 1,T 405,Q 15 13 3,-  Q 16 6 1,T 95,Q 15 9 8,Q 15 8 1,T 80,Q 8 7 5,T 424,T 551,Q 11 7 2,T 31,-  Q 12 10 8,T 233,T 148,Q 19 6 4,T 221,T 879,Q 17 15 4,T 21,Q 17 4 2,T 245,-  T 161,Q 13 11 5,T 543,T 83,Q 16 3 2,T 717,Q 14 8 5,Q 13 10 7,T 32,Q 15 9 2,-  T 105,Q 15 5 1,T 14,T 349,Q 18 15 8,T 1125,T 553,Q 15 10 8,T 523,T 211,-  Q 10 3 2,T 39,Q 24 18 16,T 65,T 415,Q 27 26 14,T 29,T 987,Q 11 10 2,T 731,-  Q 31 16 9,Q 21 19 4,T 950,Q 23 20 2,T 328,Q 14 11 6,Q 12 11 6,T 183,Q 10 9 8,-  T 161,T 172,Q 19 10 8,T 646,Q 13 10 6,Q 9 7 4,T 643,Q 21 14 5,Q 16 13 6,-  T 610,Q 13 11 8,T 77,Q 12 11 6,Q 20 18 17,T 1139,Q 17 14 5,Q 24 16 13,-  T 198,Q 7 5 4,T 381,T 243,Q 22 9 3,T 1,Q 18 12 2,T 429,T 49,Q 21 19 1,-  T 607,Q 11 9 1,Q 8 7 6,T 11,Q 31 12 10,T 629,T 956,Q 31 13 3,T 59,T 423,-  Q 17 8 7,T 173,Q 22 17 4,Q 15 13 11,T 107,Q 20 19 17,T 61,T 251,Q 11 8 2,-  T 67,Q 17 14 5,Q 14 12 5,T 91,Q 23 6 4,T 1198,T 807,Q 12 2 1,T 25,Q 11 6 1,-  T 29,T 154,Q 23 6 5,T 225,T 311,Q 22 16 6,T 77,Q 11 8 4,T 1117,T 102,-  Q 21 16 6,T 678,Q 20 4 3,Q 8 6 5,T 301,Q 22 14 7,T 477,T 303,Q 29 22 19,-  T 305,T 507,Q 18 6 2,T 145,Q 9 4 3,T 929,T 404,Q 12 7 5,T 339,T 127,Q 15 13 4,-  T 1115,Q 23 20 10,Q 18 13 6,T 786,Q 21 10 4,T 621,T 191,Q 10 4 3,T 331,-  Q 21 14 11,T 357,T 313,Q 12 5 3,T 238,Q 23 20 18,Q 17 7 4,T 35,Q 19 18 10,-  Q 22 13 8,T 1172,Q 5 4 3,T 531,T 599,Q 18 14 2,T 99,Q 26 16 11,T 217,-  Q 15 6 3,Q 12 3 1,T 225,T 899,Q 12 11 9,Q 17 3 2,Q 19 17 6,T 765,T 72,-  Q 20 5 2,T 710,Q 11 7 6,Q 12 11 2,T 523,T 142,Q 19 14 9,T 155,Q 23 13 9,-  T 315,Q 8 7 5,Q 25 16 12,T 141,Q 18 15 7,Q 13 8 2,T 497,Q 12 3 1,T 1171,-  Q 8 7 4,Q 13 12 9,T 135,Q 22 21 5,T 45,T 316,Q 19 8 6,T 131,Q 17 11 3,-  Q 13 8 1,T 25,Q 14 13 3,T 1113,T 110,Q 29 21 7,T 99,T 183,Q 8 7 5,T 563,-  Q 14 4 1,Q 18 13 2,T 579,Q 31 15 13,T 426,Q 16 10 5,Q 23 17 14,Q 15 6 4,-  Q 7 6 5,T 141,T 640,Q 19 9 4,T 49,Q 14 5 3,Q 6 2 1,Q 26 22 13,Q 10 3 1,-  T 185,Q 24 19 16,Q 21 10 9,T 77,T 315,Q 10 9 3,T 209,Q 11 8 7,T 97,T 240,-  Q 21 20 6,T 982,T 891,Q 22 10 3,T 373,Q 10 9 5,T 333,T 103,Q 28 3 2,T 28,-  T 1123,Q 9 6 2,T 349,Q 18 17 7,Q 18 8 1,T 23,Q 9 3 1,T 201,T 203,Q 12 11 10,-  T 561,Q 25 16 14,T 37,T 122,Q 8 5 2,T 69,Q 18 15 14,Q 18 16 9,T 535,Q 12 11 3,-  T 5,T 867,Q 7 2 1,T 674,Q 15 7 3,Q 23 6 1,T 105,Q 26 14 12,Q 22 19 15,-  T 31,Q 25 19 12,T 263,T 1047,Q 23 12 10,Q 13 8 1,Q 29 11 10,T 1017,T 219,-  Q 15 12 5,T 297,T 863,Q 24 17 2,T 145,Q 16 8 7,T 225,T 289,Q 14 13 7,-  T 406,Q 11 6 1,Q 18 8 7,T 435,Q 19 14 5,T 1181,T 34,Q 15 11 2,T 425,T 427,-  Q 27 17 10,Q 21 14 6,Q 14 12 9,T 553,T 518,Q 17 8 7,T 462,T 71,Q 17 10 1,-  T 835,Q 8 7 1,Q 11 5 3,T 409,Q 15 10 4,T 112,T 43,Q 20 17 11,T 47,Q 13 9 6,-  T 177,T 139,Q 19 5 3,T 1241,Q 20 11 5,Q 25 21 14,Q 18 11 10,Q 9 6 4,Q 10 3 1,-  T 144,Q 23 11 9,T 736,T 551,Q 16 13 10,T 597,Q 18 11 10,T 297,T 513,Q 15 8 1,-  T 689,Q 17 13 5,Q 7 5 4,T 519,Q 17 4 2,Q 20 16 13,T 53,Q 19 11 5,T 242,-  Q 6 3 2,Q 20 18 16,T 5,Q 17 14 2,Q 14 12 7,T 458,Q 27 21 19,T 772,T 663,-  T 254,T 819,Q 18 4 2,T 229,T 46,Q 18 7 1,T 530,T 967,Q 13 10 9,T 93,Q 17 8 6,-  Q 15 6 5,T 286,Q 15 9 4,T 635,T 463,Q 11 6 1,Q 14 12 3,Q 8 2 1,T 789,-  T 225,Q 21 10 6,T 36,Q 12 9 3,Q 14 10 8,T 577,Q 10 5 3,T 621,T 123,Q 17 15 12,-  T 170,T 963,Q 32 30 29,T 3,Q 12 10 5,T 257,T 67,Q 12 9 7,Q 12 10 5,T 515,-  Q 9 6 4,T 423,Q 10 9 3,Q 7 3 1,T 690,Q 21 12 7,T 840,Q 12 8 7,Q 30 26 15,-  T 255,Q 14 8 3,T 369,T 102,Q 25 18 1,T 826,T 127,Q 9 6 5,T 121,Q 21 17 2,-  Q 10 6 1,T 430,Q 21 7 5,T 96,T 343,Q 15 11 2,T 845,Q 19 8 7,Q 9 5 4,T 933,-  Q 16 3 1,T 226,T 923,Q 12 9 5,T 109,Q 6 5 4,T 149,T 447,Q 19 18 10,T 484,-  Q 9 7 2,Q 15 11 6,T 25,Q 22 18 17,T 629,T 49,Q 15 4 2,T 716,T 231,Q 13 7 6,-  T 159,Q 24 23 12,Q 17 5 4,T 842,Q 29 26 7,T 108,T 1319,Q 12 10 6,T 687,-  Q 16 10 3,T 1285,T 102,Q 25 19 15,T 269,T 567,Q 13 12 5,T 135,Q 30 25 20,-  Q 28 3 2,T 802,Q 7 3 2,Q 22 21 17,T 1095,Q 20 17 9,T 51,Q 28 27 10,Q 22 10 9,-  T 168,Q 29 21 15,T 349,T 339,Q 19 18 3,Q 21 16 2,Q 14 12 8,T 837,T 490,-  Q 12 7 2,T 343,Q 11 9 4,Q 10 8 4,T 769,Q 19 6 1,Q 20 14 5,T 880,Q 17 14 6,-  T 279,Q 18 14 3,Q 18 16 13,T 609,Q 24 8 2,T 729,T 270,Q 15 13 1,T 1342,-  Q 23 10 9,Q 10 9 7,T 453,Q 13 7 6,T 621,T 84,Q 21 19 8,T 109,Q 15 9 1,-  Q 10 6 5,T 815,Q 16 6 4,Q 18 17 3,T 592,Q 15 14 10,T 288,T 135,Q 19 10 6,-  T 1103,Q 9 6 4,Q 17 15 13,T 186,Q 27 18 1,T 409,Q 15 13 7,Q 20 13 5,T 1113,-  Q 17 8 3,Q 20 4 1,T 1033,Q 20 15 9,T 370,T 1231,Q 7 3 2,T 25,Q 10 9 1,-  Q 23 15 4,T 329,Q 15 8 1,T 114,T 1411,Q 10 7 1,T 1145,Q 14 8 1,T 313,-  T 41,Q 15 13 3,T 756,Q 17 9 7,Q 29 20 11,T 603,Q 20 16 10,T 405,T 139,-  Q 21 17 15,T 212,Q 9 7 2,Q 15 13 10,T 915,Q 8 6 1,Q 12 11 1,T 272,Q 21 5 2,-  T 75,Q 13 6 3,Q 20 16 2,T 605,Q 10 7 4,T 781,T 149,Q 13 10 6,T 1201,T 1431,-  Q 16 13 12,T 529,Q 13 11 6,Q 20 14 9,T 469,Q 11 4 1,T 76,T 31,Q 16 15 10,-  T 309,Q 27 7 2,Q 16 14 9,T 358,Q 29 6 1,T 15,T 91,Q 19 10 1,T 303,Q 11 3 2,-  Q 14 10 9,T 279,Q 27 15 6,T 321,T 1155,Q 17 14 1,Q 19 13 10,Q 23 22 4,-  T 1301,T 685,Q 16 9 2,T 238,T 351,Q 18 7 5,T 21,Q 16 15 4,T 237,T 149,-  Q 19 9 5,T 480,T 559,Q 11 6 5,Q 12 4 1,Q 12 4 3,Q 20 14 1,T 974,Q 24 21 11,-  T 651,Q 9 4 1,Q 13 8 1,Q 14 7 6,Q 15 14 13,T 713,Q 13 12 7,Q 5 3 2,T 172,-  T 499,Q 30 17 5,T 49,Q 23 18 17,T 1425,T 320,Q 5 3 2,T 146,T 551,Q 22 20 11,-  Q 17 3 2,Q 17 7 4,T 397,T 872,Q 17 13 2,T 33,Q 9 6 5,Q 12 10 6,T 823,-  Q 19 14 3,Q 23 13 5,T 69,Q 12 3 2,T 86,T 319,Q 21 14 5,T 83,Q 25 22 15,-  T 861,T 1028,Q 29 27 4,T 561,T 583,Q 18 13 2,T 693,Q 18 10 4,Q 11 3 1,-  T 192,Q 21 10 3,T 126,T 375,Q 12 11 6,T 381,Q 13 2 1,T 669,T 330,Q 17 9 6,-  T 166,T 343,Q 8 3 2,T 313,Q 18 9 7,Q 26 22 9,T 292,Q 23 3 1,T 569,T 303,-  Q 9 6 4,T 345,Q 12 6 5,T 669,T 1011,Q 15 12 9,T 975,Q 22 21 10,Q 12 11 5,-  T 351,Q 14 12 5,Q 15 9 6,T 963,Q 15 13 1,T 1349,Q 25 12 10,Q 22 8 6,T 1327,-  Q 23 6 2,Q 17 15 5,T 308,Q 38 25 9,T 108,T 203,Q 16 6 1,T 413,Q 22 10 1,-  Q 14 12 1,T 734,Q 32 3 2,T 757,Q 19 18 13,Q 17 16 4,T 135,Q 11 6 4,Q 12 9 4,-  T 55,Q 17 15 4,T 238,T 399,Q 21 20 2,T 391,Q 7 6 3,T 633,T 436,Q 27 21 3,-  T 776,T 415,Q 18 16 15,T 69,Q 17 14 11,T 1021,Q 19 15 4,Q 18 3 2,T 765,-  T 651,Q 19 17 16,T 363,Q 22 20 15,Q 21 4 3,Q 13 7 1,Q 5 4 3,T 110,T 811,-  Q 15 10 1,T 405,Q 22 15 1,T 1053,T 32,Q 25 11 9,T 432,T 455,Q 18 16 13,-  T 215,Q 34 26 19,Q 20 13 8,T 65,Q 11 10 5,T 184,Q 17 9 3,Q 16 14 10,T 475,-  Q 12 10 8,T 105,T 174,Q 21 19 16,T 64,Q 9 6 1,Q 23 20 18,T 109,Q 25 14 12,-  T 1281,T 49,Q 20 13 11,T 261,T 279,Q 12 7 5,T 45,Q 14 11 8,T 769,T 419,-  Q 33 29 14,T 1162,Q 18 17 11,Q 14 13 11,T 45,Q 10 7 3,T 225,T 124,Q 23 9 5,-  T 833,Q 6 2 1,Q 14 12 11,T 61,Q 26 20 19,T 1421,T 199,Q 17 15 1,T 191,-  Q 19 15 4,Q 25 18 16,T 461,Q 19 8 4,T 525,T 315,Q 18 17 11,T 493,Q 22 7 6,-  Q 15 10 4,T 861,Q 24 21 18,T 449,T 139,Q 30 19 11,T 23,T 867,Q 22 8 7,-  T 123,Q 6 4 3,T 89,T 356,Q 15 12 10,T 587,Q 29 19 13,Q 14 11 10,T 1115,-  Q 23 18 12,T 981,T 8,Q 23 21 8,T 112,Q 18 11 6,Q 17 10 7,T 1171,Q 22 3 2,-  T 253,T 1254,Q 21 17 6,T 98,Q 19 17 6,Q 15 12 2,T 565,Q 24 14 10,Q 19 9 5,-  T 103,Q 7 6 2,T 858,T 315,Q 18 13 10,T 113,Q 17 13 10,Q 18 10 1,T 672,-  Q 33 31 18,T 1123,T 783,Q 19 14 13,T 301,Q 20 17 14,T 81,T 646,Q 13 10 5,-  T 484,T 915,Q 22 12 2,T 1085,Q 12 10 3,T 1205,T 1225,Q 11 10 2,T 204,-  T 891,Q 9 8 2,T 129,Q 19 18 12,Q 12 4 1,T 495,Q 25 8 7,T 211,T 1059,Q 19 14 1,-  T 175,Q 22 16 14,T 841,T 54,Q 11 6 4,T 674,Q 24 12 3,Q 14 7 3,T 31,Q 17 9 2,-  Q 15 8 6,T 704,Q 16 13 3,T 81,T 1303,Q 12 10 5,T 1559,Q 30 16 1,T 1197,-  T 614,Q 21 11 3,T 67,Q 10 9 8,Q 24 10 3,T 19,Q 11 6 5,T 145,T 784,Q 23 19 1,-  T 101,Q 9 7 5,Q 8 7 6,T 1225,Q 12 9 7,T 501,Q 15 9 8,Q 12 9 7,T 575,T 511,-  Q 21 11 8,T 887,Q 19 8 4,T 409,T 98,Q 12 3 2,T 127,Q 27 13 7,Q 22 13 5,-  T 1249,Q 11 10 4,T 1221,T 426,Q 15 8 1,T 149,Q 15 11 8,Q 9 6 5,T 567,-  Q 10 5 3,T 1485,T 124,Q 31 26 2,T 806,T 203,Q 22 4 1,T 237,Q 18 12 10,-  Q 15 13 7,T 939,Q 17 5 2,Q 18 16 7,Q 19 2 1,Q 20 19 10,T 73,Q 22 3 2,-  T 237,T 333,Q 23 10 1,T 1408,T 775,Q 24 13 10,T 69,Q 25 22 1,Q 22 12 1,-  T 446,Q 16 15 6,T 47,T 783,Q 30 28 21,Q 24 17 13,Q 18 4 1,T 397,T 717,-  Q 21 18 11,T 43,Q 11 7 3,Q 18 7 1,T 61,Q 20 18 15,T 249,T 594,Q 19 14 13,-  T 7,T 639,Q 18 17 14,T 55,Q 24 10 4,T 605,T 1336,Q 19 17 3,T 806,T 127,-  Q 15 10 2,T 717,Q 23 20 6,T 1,T 618,Q 14 9 3,T 436,T 1019,Q 12 8 2,T 1641,-  Q 22 17 7,T 585,T 58,Q 17 10 4,T 20,T 567,Q 28 14 10,T 173,Q 25 19 10,-  T 1145,T 875,Q 17 9 2,T 525,T 191,Q 18 17 11,T 587,Q 16 8 7,Q 6 4 1,T 636,-  Q 11 10 5,T 370,T 1155,Q 22 16 12,Q 11 7 5,Q 25 19 12,Q 9 6 5,T 73,Q 30 27 15,-  T 796,Q 15 6 1,Q 23 18 16,T 177,Q 20 19 17,T 1401,T 731,Q 21 20 19,T 389,-  Q 10 9 3,Q 10 6 4,T 339,Q 24 17 15,Q 19 8 6,T 99,Q 18 15 5,Q 12 10 4,-  Q 11 7 4,Q 14 10 2,T 85,Q 24 15 2,T 257,T 136,Q 7 5 1,T 1541,Q 15 10 1,-  Q 30 29 18,T 47,Q 14 6 4,T 417,T 49,Q 11 9 1,T 236,T 623,Q 25 20 9,T 659,-  Q 7 4 1,T 217,T 956,Q 21 9 3,T 603,Q 19 9 2,Q 26 25 16,T 169,Q 17 15 4,-  T 1381,T 465,Q 23 13 6,T 1615,Q 13 12 3,Q 22 10 6,Q 13 6 1,Q 19 4 1,T 245,-  T 416,Q 14 13 6,T 531,T 387,Q 15 12 6,T 173,Q 24 9 2,Q 22 13 12,T 507,-  Q 16 15 6,T 244,T 1023,Q 14 8 5,T 325,Q 14 9 6,T 93,T 1272,Q 28 27 1,-  T 32,T 15,Q 12 9 3,T 423,Q 19 14 5,T 1121,T 11,Q 22 15 6,T 189,T 1071,-  Q 16 12 1,Q 17 16 13,Q 16 12 6,T 153,T 153,Q 25 2 1,Q 28 25 12,Q 14 13 12,-  Q 15 14 5,T 159,Q 18 16 10,T 393,T 147,Q 27 16 1,T 394,Q 8 7 3,Q 26 19 3,-  T 69,Q 21 5 2,Q 21 17 8,T 404,Q 17 11 6,T 917,Q 11 8 3,Q 19 14 9,T 1145,-  Q 16 6 1,Q 25 23 21,T 21,Q 19 18 9,T 120,T 519,Q 19 18 12,T 1495,Q 20 10 7,-  T 225,T 289,Q 11 6 3,T 304,T 43,Q 28 26 6,T 921,Q 38 16 6,T 917,T 314,-  Q 17 14 7,T 720,T 735,Q 30 16 13,T 525,Q 16 15 12,T 465,T 155,Q 19 15 13,-  T 546,Q 15 5 4,Q 12 5 2,T 1329,Q 8 7 4,T 1085,T 120,Q 12 11 1,T 518,Q 16 12 3,-  Q 19 14 7,T 57,Q 19 18 1,Q 25 19 9,T 254,Q 35 21 4,T 1025,T 567,Q 29 24 4,-  T 375,Q 15 8 2,Q 15 13 6,T 993,Q 23 17 10,T 103,Q 13 5 3,Q 21 14 6,Q 10 7 6,-  Q 23 12 7,T 81,T 1141,Q 37 35 6,T 41,Q 11 9 4,Q 17 10 9,T 667,Q 22 14 12,-  Q 16 14 9,T 569,Q 32 29 3,T 129,T 399,Q 23 12 2,T 1439,Q 10 7 5,Q 12 11 10,-  T 476,Q 25 18 7,T 270,Q 10 9 5,Q 18 3 1,T 1561,Q 30 3 2,T 973,T 162,Q 12 7 5,-  T 218,Q 13 6 5,Q 16 2 1,T 75,Q 23 7 2,T 345,T 377,Q 21 14 2,T 998,T 151,-  Q 26 23 12,T 255,Q 14 6 3,T 1269,T 183,Q 15 9 6,Q 13 3 2,Q 24 23 17,Q 28 25 15,-  T 127,Q 14 8 5,T 397,T 69,Q 17 3 2,T 257,T 927,Q 18 15 6,T 225,Q 22 17 12,-  Q 8 6 1,Q 24 20 12,Q 21 12 10,T 1028,T 699,Q 30 13 3,T 1143,Q 13 8 2,-  T 889,T 339,Q 19 10 3,T 348,Q 17 9 5,Q 20 14 6,T 915,Q 22 15 2,T 713,-  T 747,Q 25 12 10,T 7,Q 19 14 8,Q 26 6 5,T 843,Q 30 28 8,T 1713,T 509,-  Q 38 33 14,T 72,T 59,Q 28 14 2,T 383,Q 22 9 3,Q 24 5 1,T 114,Q 9 5 2,-  T 669,Q 10 2 1,Q 23 11 6,T 637,Q 8 7 4,T 861,T 142,Q 15 14 10,T 1016,-  Q 12 5 2,Q 18 7 1,T 215,Q 17 7 6,T 29,T 47,Q 25 18 7,T 377,T 1539,Q 13 12 5,-  T 231,Q 22 21 16,T 481,Q 10 9 7,Q 29 27 12,T 279,Q 26 25 13,Q 7 6 4,T 957,-  Q 15 10 2,T 729,T 90,Q 26 17 5,T 553,T 651,Q 15 8 2,T 391,Q 7 6 5,Q 28 8 1,-  T 76,Q 20 15 10,T 1626,T 771,Q 14 13 8,T 1365,Q 21 14 6,Q 20 17 6,T 45,-  Q 23 7 2,T 394,T 1691,Q 15 13 6,T 721,Q 10 9 8,T 273,T 112,Q 17 12 11,-  T 928,T 1471,Q 18 13 2,T 61,Q 16 11 6,T 1365,T 130,Q 35 24 14,T 189,Q 30 20 11,-  Q 15 6 4,T 269,Q 22 7 4,Q 23 4 3,T 101,Q 19 17 8,T 544,Q 27 15 11,Q 30 10 9,-  T 609,Q 25 20 7,T 501,T 21,Q 14 13 7,T 115,T 471,Q 15 13 10,T 81,Q 9 4 3,-  T 81,T 889,Q 32 13 11,T 759,T 839,Q 26 9 2,Q 6 5 3,Q 26 20 18,T 1129,-  T 62,Q 36 33 22,T 91,T 1719,Q 24 21 5,T 675,Q 4 2 1,T 1281,T 429,Q 14 13 1,-  T 148,T 1195,Q 11 6 1,T 147,Q 16 14 6,T 797,T 1735,Q 13 12 7,T 413,T 459,-  Q 20 18 11,Q 24 11 4,Q 18 15 4,Q 23 18 10,T 488,Q 17 15 11,T 31,Q 15 7 5,-  Q 18 6 4,Q 10 9 8,Q 21 14 8,T 609,T 42,Q 9 4 2,T 184,T 1191,Q 26 20 5,-  T 1327,Q 8 7 3,T 1305,T 46,Q 33 22 18,T 287,T 75,Q 18 10 5,T 95,Q 16 15 4,-  Q 25 18 11,T 279,Q 27 14 2,T 684,Q 22 9 7,Q 32 22 11,Q 19 11 8,Q 15 4 1,-  T 1013,T 435,Q 9 4 2,T 407,T 1611,Q 15 13 8,T 291,Q 18 16 5,Q 21 20 9,-  T 208,Q 23 9 1,T 30,T 383,Q 23 10 2,T 1307,Q 28 19 12,Q 21 15 1,T 672,-  Q 14 7 2,T 300,T 107,Q 13 10 9,T 61,Q 10 9 4,Q 24 9 4,T 1416,Q 7 5 4,-  T 1414,Q 9 5 1,Q 23 8 2,T 63,Q 10 9 6,T 1785,T 272,Q 29 13 6,T 87,T 1027,-  Q 14 6 1,T 1173,Q 16 15 4,Q 22 21 17,T 45,Q 20 7 5,T 481,Q 17 4 3,Q 8 7 5,-  T 127,Q 16 8 6,T 1337,T 202,Q 24 23 21,T 112,Q 16 15 8,Q 18 15 6,T 349,-  Q 18 12 9,Q 9 7 5,T 68,Q 29 18 4,T 938,T 323,Q 9 8 4,T 1799,Q 11 8 7,-  Q 22 21 11,T 143,Q 19 13 9,T 252,Q 17 8 6,Q 16 6 3,Q 20 11 3,Q 8 7 6,-  T 29,T 609,Q 19 13 2,T 437,Q 23 8 1,Q 18 13 8,T 1217,Q 13 9 6,T 713,T 310,-  Q 35 13 2,T 35,T 567,Q 15 5 4,T 681,Q 22 18 3,T 273,T 503,Q 27 9 1,T 840,-  T 1331,Q 16 5 2,T 1063,Q 11 10 9,T 693,T 108,Q 29 18 13,T 71,T 583,Q 29 24 19,-  T 169,Q 12 7 5,T 765,T 1399,Q 39 25 3,T 50,T 459,Q 14 8 7,T 35,Q 31 10 2,-  Q 18 16 5,T 834,Q 19 15 9,T 289,T 315,Q 20 14 6,Q 13 12 9,Q 24 22 13,-  T 913,T 264,Q 10 3 2,T 32,Q 20 8 3,Q 11 10 4,T 157,Q 17 11 4,Q 19 9 2,-  T 121,Q 27 5 1,T 810,T 1775,Q 20 9 2,T 45,Q 15 8 3,T 273,T 915,Q 45 42 6,-  T 340,Q 20 19 10,Q 17 9 2,T 289,Q 16 13 2,T 1197,T 777,Q 15 7 5,T 310,-  Q 25 9 1,Q 21 20 12,T 65,Q 26 6 1,T 1845,T 350,Q 17 13 2,T 26,T 251,Q 15 4 1,-  T 855,Q 14 12 11,Q 28 22 13,T 1673,Q 24 11 2,T 393,T 531,Q 25 22 9,T 445,-  Q 16 12 11,T 117,T 285,Q 15 13 8,T 785,Q 26 21 1,Q 24 21 3,T 245,Q 18 16 5,-  Q 17 16 12,T 367,Q 8 7 5,T 1440,T 199,Q 23 9 4,T 1563,Q 30 19 3,Q 28 12 5,-  Q 20 15 8,Q 15 5 3,T 252,T 1835,Q 28 19 10,Q 21 5 2,Q 19 11 6,T 57,T 1125,-  Q 31 29 28,T 427,T 1155,Q 22 10 5,T 293,Q 28 22 3,T 873,T 752,Q 11 6 5,-  T 698,T 503,Q 24 8 5,T 429,Q 18 16 10,Q 27 4 2,T 891,Q 29 15 2,T 756,-  T 255,Q 13 8 1,T 735,Q 14 3 2,T 337,T 357,Q 25 18 14,T 196,T 163,Q 10 7 2,-  T 595,Q 13 11 8,T 861,T 322,Q 36 3 1,T 221,Q 19 9 7,Q 25 9 2,Q 16 9 4,-  Q 21 11 8,Q 21 13 8,T 11,Q 19 5 2,T 1038,Q 12 8 7,Q 11 4 2,T 1017,Q 6 5 2,-  T 469,T 168,Q 27 8 6,T 1468,Q 19 12 9,Q 12 9 8,T 19,Q 16 13 3,T 153,T 1250,-  Q 31 18 17,T 137,Q 24 11 6,Q 14 12 5,T 1479,Q 17 12 2,Q 17 6 1,T 705,-  Q 24 9 6,T 124,Q 18 15 2,Q 28 15 9,Q 21 20 8,Q 18 17 15,T 125,T 249,Q 33 32 23,-  T 22,T 1467,Q 7 6 1,T 375,Q 24 19 16,Q 7 4 2,T 985,Q 16 9 7,T 599,Q 23 20 10,-  Q 9 7 4,Q 22 12 7,Q 14 11 4,T 93,T 1805,Q 15 13 6,T 223,T 1163,Q 25 16 1,-  T 157,Q 21 14 10,T 953,T 1408,Q 29 20 15,T 410,Q 23 21 13,Q 6 5 1,T 1659,-  Q 22 12 10,T 981,T 158,Q 21 5 2,T 215,T 71,Q 24 14 7,T 17,Q 17 14 5,T 981,-  T 854,Q 21 17 6,T 871,T 419,Q 13 6 3,T 435,Q 28 20 10,T 765,T 118,Q 33 29 7,-  T 356,T 847,Q 24 8 5,T 825,Q 18 9 1,T 1529,T 661,Q 13 10 6,T 575,T 595,-  Q 21 10 6,Q 19 15 7,Q 24 18 2,Q 29 18 16,T 224,Q 15 9 6,T 78,Q 16 10 3,-  Q 19 10 4,T 1435,Q 12 11 6,T 1445,T 769,Q 15 7 2,T 463,T 79,Q 23 12 10,-  T 1491,Q 23 22 18,T 321,T 616,Q 27 15 1,T 1232,T 3,Q 19 18 2,T 615,Q 18 10 6,-  T 57,T 1278,Q 30 13 3,T 252,T 123,Q 27 6 2,T 1615,Q 19 12 1,Q 16 12 1,-  T 201,Q 23 12 1,T 913,T 219,Q 16 12 1,T 245,Q 19 18 13,Q 22 12 1,T 1015,-  Q 26 17 9,Q 12 6 3,T 595,Q 10 9 1,T 345,T 2,T 133,T 276,Q 31 2 1,T 1315,-  Q 21 7 5,Q 18 14 5,T 873,Q 19 14 12,T 1045,T 1554,Q 31 29 15,T 862,T 1899,-  Q 15 7 2,T 549,Q 28 23 2,T 525,T 421,Q 15 10 1,T 51,T 131,Q 14 10 5,T 1857,-  Q 28 8 2,T 573,T 186,Q 25 13 3,Q 20 13 5,T 231,Q 17 10 7,T 1165,Q 19 17 10,-  T 133,T 81,Q 27 18 12,T 1361,T 2047,Q 22 15 5,T 2045,Q 18 13 2,T 645,-  T 698,Q 17 10 6,T 105,T 387,Q 24 8 1,Q 13 9 5,Q 16 12 10,T 1297,T 1698,-  Q 26 15 5,T 805,Q 18 2 1,Q 14 6 3,T 273,Q 26 18 1,T 1985,T 1984,Q 29 15 7,-  T 341,T 1411,Q 15 14 6,T 947,Q 16 10 1,Q 11 7 6,T 454,Q 15 11 5,T 200,-  Q 18 5 2,Q 21 13 2,T 1565,Q 16 13 6,Q 19 14 6,T 225,Q 12 5 2,T 76,T 1031,-  Q 10 4 1,T 1327,Q 8 4 3,T 381,T 1846,Q 15 6 3,T 826,T 1491,Q 14 12 6,-  T 243,Q 18 15 10,T 473,T 34,Q 13 3 2,T 347,T 287,Q 24 6 4,T 525,Q 13 10 3,-  Q 18 10 1,T 144,Q 8 3 2,T 9,Q 30 23 10,Q 19 11 2,T 145,Q 7 6 1,T 533,-  T 756,Q 18 13 7,T 5,T 799,Q 15 3 2,T 459,Q 21 19 14,T 389,T 904,Q 31 6 1,-  T 273,T 503,Q 14 12 10,T 387,Q 26 20 15,T 273,T 783,Q 11 6 2,T 387,Q 7 6 4,-  Q 23 18 17,Q 28 10 7,Q 21 12 11,Q 11 5 3,T 754,Q 15 13 8,T 578,Q 9 7 5,-  Q 17 12 7,T 99,Q 23 20 18,T 1301,T 217,Q 15 14 5,T 362,T 727,Q 24 8 2,-  T 147,Q 19 17 16,Q 18 11 7,T 1775,Q 11 8 1,T 385,T 1859,Q 13 12 10,T 1471,-  Q 26 3 1,T 309,T 945,Q 17 14 5,T 226,T 1671,Q 30 27 15,T 81,Q 20 18 11,-  Q 12 5 4,T 679,Q 5 4 3,T 689,T 99,Q 18 14 10,Q 22 18 7,Q 20 19 17,Q 9 8 7,-  T 302,Q 14 5 2,Q 15 4 2,Q 30 24 11,Q 17 16 14,T 175,Q 12 11 2,T 569,T 84,-  Q 12 7 2,T 116,Q 9 5 1,Q 28 24 2,T 901,Q 23 15 10,Q 13 10 2,T 455,Q 21 5 2,-  T 1016,T 1071,Q 9 8 4,T 431,Q 20 18 11,T 973,T 1850,Q 21 20 14,T 390,-  T 111,Q 16 6 3,T 987,Q 22 16 12,T 485,T 540,Q 20 17 15,T 833,T 1351,Q 12 9 2,-  T 593,Q 21 17 10,Q 17 12 6,T 826,Q 18 11 5,T 1991,T 287,Q 25 22 16,T 725,-  Q 28 14 11,T 1477,T 678,Q 8 7 5,T 271,T 1911,Q 10 8 5,T 429,Q 13 11 10,-  T 301,T 900,Q 33 27 20,T 1042,Q 11 5 3,Q 24 23 14,T 667,Q 16 7 6,T 645,-  T 595,Q 21 4 2,T 272,T 539,Q 15 8 2,T 1523,Q 22 12 10,T 1773,T 197,Q 27 12 6,-  T 154,Q 26 15 11,Q 18 15 5,T 151,Q 8 7 1,T 729,T 253,Q 18 7 1,T 155,T 1939,-  Q 16 13 8,T 745,Q 22 19 12,T 1541,T 886,Q 27 19 17,Q 19 17 10,T 175,Q 23 18 4,-  Q 18 8 5,Q 15 10 3,T 1029,T 84,Q 20 19 5,Q 15 13 9,T 1535,Q 33 25 18,-  T 925,Q 25 18 11,T 933,T 585,Q 37 35 3,T 394,T 351,Q 15 14 4,T 543,Q 21 13 2,-  T 137,Q 21 3 2,Q 9 8 7,T 218,T 211,Q 22 6 3,T 1769,Q 23 22 20,Q 19 6 4,-  T 1269,Q 31 10 6,T 442,Q 23 19 7,Q 13 11 8,T 865,Q 32 22 18,T 1069,T 271,-  Q 21 19 13,T 533,Q 11 6 1,Q 27 22 16,T 63,Q 16 6 4,Q 14 4 1,T 47,Q 25 5 3,-  T 350,T 207,Q 12 5 2,T 273,Q 20 8 2,Q 8 6 1,T 869,Q 26 21 14,T 909,T 1187,-  Q 16 6 4,T 1839,T 254,T 589,T 21,Q 11 9 8,T 644,T 1603,Q 17 12 8,T 905,-  Q 26 15 2,T 621,T 1189,Q 24 9 7,T 329,T 255,Q 13 9 6,T 155,Q 15 10 6,-  Q 21 16 3,T 582,Q 13 3 1,T 351,T 639,Q 30 29 11,T 1621,Q 19 18 16,T 2117,-  T 471,Q 30 7 2,T 112,T 799,Q 16 5 3,T 595,Q 37 22 4,Q 25 21 8,T 1165,-  Q 28 21 15,T 273,T 919,Q 8 7 2,T 975,Q 8 2 1,T 1749,T 843,Q 38 35 13,-  T 193,T 1907,Q 18 7 3,T 895,Q 22 8 1,T 401,T 1,Q 17 10 7,T 299,Q 23 8 1,-  Q 27 8 5,T 5,Q 7 6 1,T 657,Q 7 5 1,Q 12 9 6,T 794,Q 13 9 3,Q 14 9 4,T 285,-  Q 14 5 4,Q 20 13 9,T 173,Q 12 3 1,T 196,T 323,Q 8 6 3,T 715,Q 21 16 11,-  T 577,T 1191,Q 39 25 23,T 650,T 1327,Q 17 12 7,T 1339,Q 16 11 8,T 849,-  T 674,Q 23 13 9,T 345,T 151,Q 8 5 1,Q 25 22 20,Q 15 4 1,T 381,T 993,Q 25 11 7,-  T 21,T 2223,Q 11 8 6,T 715,Q 12 11 2,T 897,T 358,Q 25 14 7,T 523,Q 27 23 16,-  Q 6 5 1,T 831,Q 23 12 7,T 297,T 730,Q 34 27 18,T 704,T 207,Q 25 22 12,-  Q 26 21 12,T 98,T 1869,T 1356,Q 14 13 7,T 835,T 87,Q 20 11 1,T 165,Q 18 6 2,-  T 905,T 126,Q 22 17 6,T 2110,T 2079,Q 10 6 1,T 81,Q 24 15 6,T 69,T 638,-  Q 26 19 9,Q 9 8 4,T 1419,Q 10 6 2,Q 21 12 5,Q 27 13 10,Q 14 12 1,T 1358,-  Q 19 15 9,T 223,T 483,Q 13 6 1,T 265,Q 26 18 16,T 497,T 1254,Q 21 16 11,-  Q 22 16 12,Q 30 11 4,Q 15 14 1,T 371,Q 34 13 12,Q 32 28 9,T 25,Q 17 14 1,-  T 68,T 675,Q 24 22 5,T 1907,Q 8 5 2,T 2013,T 1026,Q 23 20 13,T 780,T 239,-  Q 23 13 10,T 1557,Q 27 14 10,T 965,T 232,Q 27 23 5,T 287,T 975,Q 10 8 7,-  T 77,Q 28 15 4,Q 21 20 17,T 136,Q 26 23 10,T 42,T 367,Q 16 8 5,T 1779,-  Q 20 3 2,Q 14 3 2,Q 25 17 7,Q 19 16 2,T 1035,T 1535,Q 21 16 1,T 901,Q 18 17 3,-  Q 30 24 15,T 448,Q 25 8 7,T 149,T 1311,Q 15 13 10,T 189,Q 24 11 5,Q 16 13 9,-  T 959,Q 8 5 3,T 207,T 567,Q 29 24 8,T 95,Q 30 21 13,Q 21 20 1,T 474,Q 27 25 4,-  T 417,T 1943,Q 8 7 5,T 885,Q 26 21 2,T 297,T 841,Q 37 6 5,T 1663,Q 24 17 11,-  Q 36 25 20,T 917,Q 18 14 10,Q 29 12 2,T 392,Q 27 25 23,T 147,Q 10 5 4,-  Q 26 25 21,T 603,Q 19 11 10,T 2245,T 1146,Q 10 9 3,T 216,T 119,Q 35 28 14,-  T 819,Q 24 10 1,T 285,T 1330,Q 13 7 6,T 421,T 283,Q 26 21 3,T 21,Q 26 13 6,-  T 1725,T 1522,Q 18 17 11,T 386,T 351,Q 36 7 5,T 873,Q 23 21 18,Q 17 3 2,-  T 248,Q 11 8 1,T 1033,T 2151,Q 17 16 11,T 1543,Q 21 12 11,T 2257,T 426,-  Q 25 16 6,T 67,Q 19 17 6,Q 26 24 7,T 97,Q 30 17 16,Q 16 14 1,T 466,Q 24 19 9,-  Q 10 9 7,Q 24 19 18,Q 19 14 2,T 617,Q 13 10 8,T 1693,T 408,Q 26 21 14,-  T 73,Q 19 12 10,Q 14 6 5,T 157,Q 14 9 5,T 2193,T 412,Q 15 10 1,T 248,-  Q 12 7 5,Q 27 26 6,T 1941,Q 21 10 8,T 2201,T 857,Q 19 14 6,T 281,T 363,-  Q 25 24 8,T 1257,Q 29 19 16,T 541,T 1946,Q 29 5 2,T 2368,T 923,Q 19 6 4,-  T 279,Q 30 22 17,T 401,T 883,Q 28 11 9,T 170,Q 7 6 4,Q 17 16 7,T 477,-  Q 30 19 7,Q 25 22 21,T 178,Q 25 17 3,T 119,T 507,Q 24 5 4,T 213,Q 26 12 5,-  Q 16 13 6,T 2381,Q 27 23 6,T 348,Q 18 5 3,Q 14 8 1,T 321,Q 22 19 5,T 1397,-  T 369,Q 30 29 7,T 382,Q 20 3 1,Q 19 6 5,T 9,Q 14 7 2,T 1233,T 707,Q 29 18 4,-  T 413,Q 19 12 7,Q 23 7 2,Q 18 8 7,Q 15 14 3,T 117,T 158,Q 29 19 11,T 1146,-  T 291,Q 7 5 4,Q 18 15 4,T 1922,T 2349,T 12,Q 13 4 2,T 91,T 1171,Q 13 10 2,-  Q 22 15 13,Q 18 7 6,Q 22 10 9,T 638,Q 33 31 25,T 491,T 459,Q 28 25 7,-  T 515,Q 16 13 2,Q 33 17 13,T 1094,Q 25 16 3,T 558,Q 24 19 17,Q 29 20 14,-  T 913,Q 20 14 2,T 1493,T 337,Q 33 30 5,T 458,Q 19 17 2,Q 28 10 5,T 301,-  Q 14 9 1,Q 17 12 7,T 238,Q 25 21 2,Q 19 13 3,Q 33 29 18,Q 22 21 3,Q 16 15 1,-  Q 38 21 17,T 1477,T 1085,Q 28 27 6,T 184,T 243,Q 24 17 2,T 561,Q 17 7 4,-  T 633,T 172,Q 27 23 21,T 34,T 355,Q 25 22 14,T 81,Q 15 7 6,Q 15 8 1,T 166,-  Q 29 22 17,T 1551,Q 23 15 2,Q 18 11 1,T 593,Q 22 16 4,T 213,T 1251,Q 24 9 2,-  T 1798,T 555,Q 26 16 10,T 585,Q 23 20 6,T 1457,T 1342,Q 32 21 7,T 1276,-  Q 28 7 4,Q 26 8 2,T 91,Q 27 21 12,T 1989,T 139,Q 35 21 8,T 45,T 1967,-  Q 25 19 16,T 2381,Q 15 12 2,T 469,T 623,Q 21 19 12,T 210,Q 25 12 2,Q 33 28 6,-  T 697,Q 20 18 14,T 1253,T 774,Q 27 18 15,T 296,Q 22 21 6,Q 14 10 3,T 111,-  Q 30 16 11,T 377,T 1955,Q 30 29 7,T 693,T 259,Q 16 9 1,T 1793,Q 34 5 4,-  T 889,T 380,Q 11 9 5,T 277,T 2387,Q 10 3 1,T 1545,Q 19 6 2,T 693,T 21,-  Q 29 9 3,T 49,T 2143,Q 23 21 18,T 1039,Q 13 11 8,T 413,T 133,Q 27 22 15,-  T 63,Q 19 9 3,Q 24 8 1,T 383,Q 17 14 1,Q 13 12 9,T 494,Q 19 6 4,T 1011,-  Q 23 9 1,Q 24 6 4,T 601,Q 30 25 2,T 517,T 217,Q 29 11 5,T 938,Q 15 10 7,-  Q 27 12 5,T 559,Q 11 6 5,T 1709,T 920,Q 25 20 6,T 843,Q 23 11 6,Q 20 17 15,-  Q 13 10 5,Q 13 12 6,T 2205,T 1292,Q 26 25 17,T 1084,T 1131,Q 12 6 2,T 709,-  Q 26 22 16,T 1229,T 2301,Q 42 7 1,T 644,T 315,Q 29 11 8,T 111,Q 33 15 12,-  T 1701,T 1070,Q 23 16 9,T 384,T 239,Q 10 7 4,T 375,Q 15 8 2,Q 23 19 3,-  T 201,Q 15 8 6,T 39,T 1791,Q 28 25 19,Q 18 15 13,Q 31 11 6,T 161,Q 13 11 9,-  Q 17 15 7,T 637,Q 33 13 8,Q 18 16 8,T 671,Q 22 13 6,Q 12 3 2,T 464,Q 21 10 3,-  T 38,Q 17 8 6,Q 29 20 15,T 33,Q 38 35 15,T 1197,T 206,Q 15 12 9,T 385,-  T 731,Q 23 19 2,T 97,Q 14 11 2,T 329,T 777,Q 33 23 14,T 1379,Q 20 15 11,-  Q 28 9 5,T 1089,Q 22 3 2,T 2373,T 496,Q 25 6 2,T 1122,T 387,Q 24 21 10,-  T 1295,Q 22 15 3,T 45,T 489,Q 24 5 3,T 646,T 1607,Q 23 17 8,T 1165,Q 25 24 2,-  Q 17 11 4,T 415,Q 34 15 10,T 133,T 2467,Q 22 17 15,T 833,Q 26 18 11,T 1493,-  T 211,Q 22 9 6,T 126,T 1411,Q 20 19 14,T 161,Q 16 11 7,T 141,T 795,Q 21 12 11,-  T 126,T 783,Q 12 6 2,T 1635,Q 18 5 3,Q 16 13 7,T 258,Q 25 5 3,T 476,T 2119,-  Q 18 15 5,T 1467,Q 18 11 5,T 2201,T 35,Q 21 7 6,T 1562,T 35,Q 25 19 6,-  T 173,Q 20 14 13,Q 23 18 14,T 210,Q 22 21 3,T 88,T 147,Q 18 13 10,T 843,-  Q 15 6 2,T 1377,T 489,Q 19 18 13,T 454,T 243,Q 24 2 1,T 675,Q 18 16 15,-  Q 22 18 11,T 148,Q 30 13 2,T 72,T 1307,Q 17 2 1,T 191,Q 26 19 7,T 2209,-  T 279,Q 42 33 9,T 559,T 899,Q 14 8 5,T 1387,Q 19 14 6,T 2045,T 130,Q 33 27 5,-  T 457,T 199,Q 11 8 5,T 279,Q 23 18 4,Q 22 14 9,T 1519,Q 24 15 6,T 1514,-  T 603,Q 21 7 4,T 15,Q 15 11 8,T 1629,T 141,Q 27 25 4,T 1701,T 1571,Q 36 22 1,-  T 1015,Q 24 14 5,Q 12 11 3,T 1767,Q 15 11 5,T 308,T 1771,Q 12 10 2,T 103,-  Q 30 22 2,T 213,T 724,Q 15 8 1,T 708,Q 16 5 2,Q 15 14 1,Q 14 6 1,Q 8 6 3,-  Q 21 20 2,T 494,Q 35 31 13,T 315,T 419,Q 20 17 5,Q 12 7 3,Q 18 16 10,-  T 117,T 2193,Q 15 11 5,T 1196,T 1411,Q 18 3 2,T 2247,Q 23 22 2,T 189,-  T 347,Q 24 21 3,T 963,Q 15 13 10,Q 30 12 9,T 2055,Q 23 7 2,Q 16 13 6,-  T 1869,Q 20 11 5,T 373,T 1755,Q 16 8 5,T 2305,Q 28 22 2,T 677,T 330,Q 11 8 2,-  T 1006,Q 25 15 13,Q 27 11 6,T 617,Q 20 15 7,Q 27 10 8,T 1546,Q 33 27 19,-  T 125,T 1519,Q 14 4 3,T 917,Q 9 8 6,T 465,T 588,Q 23 22 2,T 156,T 2219,-  Q 20 19 1,T 487,Q 19 8 7,Q 12 9 8,T 354,Q 27 19 2,T 1507,T 2335,Q 23 3 2,-  T 205,Q 12 11 8,T 1637,T 1787,Q 29 15 1,T 503,T 2607,Q 24 10 7,T 327,-  Q 28 19 13,Q 13 12 11,T 1188,Q 21 11 2,T 205,T 275,Q 16 6 1,T 475,Q 12 10 7,-  T 765,T 549,Q 33 27 21,T 101,T 895,Q 10 9 1,T 2321,Q 28 23 3,T 2477,T 235,-  Q 27 18 1,T 197,T 1371,Q 35 25 14,T 627,Q 24 17 14,T 1305,T 167,Q 9 5 2,-  T 1537,T 1359,Q 10 8 4,T 1455,Q 22 10 9,Q 22 20 1,T 769,Q 16 11 9,T 41,-  T 483,Q 31 25 14,T 297,Q 23 6 1,T 341,T 1106,Q 29 18 10,T 1395,Q 17 11 10,-  Q 16 10 1,T 609,Q 9 7 6,T 2337,T 1299,Q 13 11 1,Q 29 9 4,Q 13 10 9,Q 25 17 2,-  Q 16 9 5,Q 25 24 23,Q 20 14 7,T 196,Q 11 10 1,T 1424,Q 17 9 4,Q 24 18 5,-  T 315,Q 25 9 2,Q 14 3 1,T 1133,Q 8 3 2,T 446,T 575,Q 17 12 1,T 2195,Q 14 8 1,-  T 2205,T 434,Q 27 6 5,T 1863,Q 15 4 1,Q 12 10 4,Q 18 14 11,Q 7 6 1,T 837,-  T 142,Q 22 3 2,T 598,T 7,Q 18 14 3,T 1067,Q 17 4 3,T 125,T 1573,Q 19 17 3,-  T 351,T 1199,Q 15 11 2,T 15,Q 18 14 11,T 1545,T 723,Q 30 27 9,T 1219,-  T 803,Q 18 5 3,T 171,Q 25 24 19,T 545,Q 16 15 11,Q 23 21 8,T 2279,T 1647,-  Q 17 16 15,T 731,Q 22 15 13,Q 27 9 3,T 485,Q 17 11 10,T 339,T 171,Q 24 22 11,-  T 2259,Q 16 13 10,Q 15 14 5,T 707,Q 23 20 1,T 1419,Q 22 7 6,Q 16 11 2,-  T 51,Q 29 24 10,T 2485,T 81,Q 19 11 1,T 35,Q 15 7 1,Q 20 7 1,T 863,Q 14 13 8,-  Q 20 3 2,T 194,Q 19 18 3,T 152,T 1919,Q 18 15 6,T 1151,Q 20 14 13,Q 24 19 14,-  T 188,Q 7 4 1,T 547,T 1059,Q 23 17 4,T 423,Q 13 11 10,Q 26 24 17,T 1509,-  Q 17 15 4,T 376,T 2055,Q 28 21 8,T 2261,Q 18 10 9,T 2409,T 434,Q 7 3 2,-  T 215,T 1523,Q 18 13 1,T 2255,Q 9 5 2,T 357,T 485,Q 33 17 3,T 420,Q 18 15 9,-  Q 14 11 6,T 387,Q 17 14 12,T 1205,T 955,Q 30 23 1,T 1720,T 2343,Q 28 10 3,-  T 917,Q 21 18 7,Q 25 2 1,T 331,Q 34 31 19,T 1256,T 303,Q 25 24 23,T 945,-  Q 30 29 6,T 445,T 311,Q 16 15 13,T 186,Q 18 11 8,Q 18 12 11,T 117,Q 40 22 5,-  T 513,T 2163,Q 37 34 23,T 791,Q 19 18 15,Q 24 18 14,T 1229,Q 21 8 2,T 1289,-  T 203,Q 24 15 10,T 1254,T 1635,Q 20 10 6,T 1235,Q 20 19 7,T 865,T 860,-  Q 43 33 15,T 103,T 479,Q 30 19 16,T 2691,Q 13 4 2,T 893,T 91,Q 21 14 10,-  T 767,T 1839,Q 36 20 2,T 29,Q 30 28 5,Q 15 11 1,T 167,Q 15 5 2,T 54,Q 32 23 10,-  Q 22 8 5,T 95,Q 32 23 2,Q 13 12 1,T 198,Q 21 15 3,T 589,T 1247,Q 18 16 13,-  Q 30 23 11,Q 23 18 10,T 305,T 370,Q 13 10 3,T 167,Q 20 17 9,Q 22 2 1,-  T 1029,Q 16 8 2,Q 14 9 8,T 1834,Q 21 19 9,T 1290,T 1143,Q 24 14 1,T 135,-  Q 15 12 7,T 537,T 279,Q 13 11 4,T 1729,Q 19 12 7,Q 29 21 18,T 175,Q 27 19 2,-  T 2537,T 237,Q 20 19 1,T 98,Q 23 20 12,Q 15 10 7,T 729,Q 11 9 4,Q 19 15 2,-  T 554,Q 13 11 6,T 1814,T 535,Q 19 3 2,T 1563,Q 40 13 11,Q 26 23 7,T 773,-  Q 10 5 2,T 1209,Q 26 15 2,Q 26 20 13,T 2113,Q 24 21 6,T 1505,T 318,Q 25 18 14,-  T 1756,T 1467,Q 20 15 1,T 1017,Q 19 16 10,T 1425,T 217,Q 20 5 3,T 492,-  Q 28 22 7,Q 14 9 7,T 1089,Q 15 9 4,T 957,T 248,Q 11 10 2,T 298,Q 23 12 6,-  Q 22 4 3,T 403,Q 33 11 10,T 1273,T 712,Q 15 9 8,T 116,Q 16 5 2,Q 24 20 5,-  T 269,Q 39 35 8,T 1301,T 938,Q 55 46 10,T 773,T 995,Q 22 19 13,T 705,-  Q 17 14 5,T 2185,T 239,Q 33 22 7,T 4,Q 17 16 3,Q 27 11 2,T 1053,Q 18 11 6,-  T 901,T 699,Q 27 23 6,T 328,Q 15 9 3,Q 25 20 12,T 81,Q 20 6 4,T 1697,-  T 1037,Q 13 9 7,T 1338,T 371,Q 21 16 7,T 39,Q 29 27 8,T 1381,T 870,Q 29 20 7,-  T 124,T 15,Q 21 12 2,T 853,Q 20 6 3,T 101,T 565,Q 8 5 3,T 487,T 963,Q 22 20 4,-  T 2251,Q 32 23 1,T 1905,T 43,Q 22 5 2,T 287,T 271,Q 20 9 7,T 135,Q 20 17 14,-  Q 6 3 1,T 461,Q 30 15 6,T 6,Q 17 15 2,Q 11 8 6,T 1251,Q 12 11 4,T 2465,-  T 709,Q 21 18 14,T 28,T 943,Q 13 9 8,T 863,Q 23 12 4,T 357,T 1502,Q 17 15 5,-  T 143,T 759,Q 17 10 3,T 555,Q 8 6 5,Q 20 17 13,T 1365,Q 29 27 23,T 568,-  Q 33 23 2,Q 10 3 1,T 2233,Q 19 16 2,Q 23 8 5,Q 17 16 9,Q 21 15 8,T 49,-  T 967,Q 10 7 2,T 929,Q 16 11 5,T 149,T 434,Q 27 12 9,T 165,Q 9 4 3,Q 12 8 2,-  T 39,Q 26 14 10,T 2637,T 90,Q 31 29 11,T 714,T 1215,Q 10 8 1,Q 34 27 3,-  Q 27 4 1,T 41,T 37,Q 26 25 10,T 82,Q 18 15 13,Q 17 15 4,T 1259,Q 27 26 2,-  Q 31 21 8,T 271,Q 40 17 2,T 326,Q 35 16 1,Q 22 18 11,T 87,Q 10 7 5,Q 27 7 3,-  T 2007,Q 41 20 11,T 1384,T 1623,Q 21 15 4,T 561,Q 24 4 2,T 1609,T 732,-  Q 26 21 14,Q 19 8 2,Q 14 9 5,Q 12 8 5,T 705,Q 16 6 5,Q 22 15 8,T 82,Q 27 25 14,-  T 248,T 2199,Q 24 21 16,T 1151,Q 22 9 1,T 409,T 441,Q 10 9 3,T 27,T 1775,-  Q 28 6 3,Q 14 13 8,Q 21 6 5,T 1361,T 375,Q 32 11 2,T 1562,Q 19 18 14,-  Q 28 19 6,T 103,Q 22 9 3,T 309,T 1310,Q 25 24 7,T 515,Q 25 18 10,Q 13 11 8,-  T 2267,Q 10 8 5,T 2629,T 744,Q 25 18 10,T 507,Q 30 17 4,Q 18 15 13,T 115,-  Q 16 6 4,T 1085,T 1621,Q 21 11 8,T 544,T 279,Q 13 4 2,Q 18 17 2,Q 26 19 18,-  T 377,T 127,Q 21 20 7,T 1721,T 1235,Q 8 7 2,T 371,Q 22 18 16,T 805,T 1431,-  Q 29 23 10,T 615,T 2759,Q 18 13 1,T 2019,Q 17 10 7,Q 13 10 4,T 124,Q 21 14 3,-  T 83,Q 9 7 2,Q 16 14 13,T 343,Q 12 11 8,Q 15 5 4,T 266,Q 19 12 1,T 134,-  T 1071,Q 21 7 4,T 1535,Q 24 14 6,T 2377,T 954,Q 25 22 6,T 1161,Q 20 19 7,-  Q 30 20 15,T 1585,Q 21 14 12,T 197,T 2101,Q 33 13 11,T 437,T 2383,Q 15 14 3,-  T 831,Q 33 26 23,T 1853,T 934,Q 25 7 6,T 129,T 1015,Q 16 15 10,Q 13 8 1,-  Q 10 7 3,T 369,T 731,Q 43 10 1,T 369,T 47,Q 21 17 2,T 295,Q 14 13 1,T 2233,-  T 1083,Q 17 15 7,T 343,T 763,T 1058,T 61,Q 18 11 4,T 2145,T 916,Q 23 17 10,-  T 323,T 2027,Q 28 16 10,Q 17 8 5,Q 24 6 5,Q 27 23 11,T 275,Q 21 18 13,-  T 264,T 935,Q 13 5 2,T 91,Q 13 9 2,T 153,T 169,Q 23 14 2,T 250,Q 21 18 7,-  Q 20 7 6,T 1809,Q 18 5 1,Q 20 17 3,T 1013,Q 19 8 6,T 105,T 27,Q 9 6 1,-  Q 15 13 10,Q 46 36 18,T 2217,T 1334,Q 23 15 6,T 516,T 2735,Q 28 25 16,-  T 1899,Q 16 2 1,Q 18 3 2,T 58,Q 27 11 10,T 1249,Q 30 23 2,Q 17 6 2,T 373,-  Q 26 23 4,Q 15 9 5,T 287,Q 19 15 10,T 113,T 267,Q 20 13 9,T 243,Q 37 36 30,-  Q 24 9 1,T 2556,Q 21 10 3,T 81,T 975,Q 19 6 4,Q 14 11 10,Q 38 29 14,T 297,-  T 142,Q 23 10 4,T 541,Q 13 8 3,Q 20 15 9,T 63,Q 28 3 1,Q 21 15 2,T 781,-  Q 30 23 1,T 390,T 247,Q 35 21 10,T 125,Q 23 15 12,T 1981,T 380,Q 32 19 5,-  T 172,Q 23 18 15,Q 25 17 2,T 2101,Q 34 24 14,T 449,T 2545,Q 33 22 13,-  T 292,Q 25 13 7,Q 30 29 28,Q 20 15 3,Q 21 12 6,Q 13 12 8,T 1843,Q 16 15 6,-  T 311,T 495,Q 18 10 5,T 1017,Q 24 7 3,T 325,T 1305,Q 16 7 2,Q 16 6 4,-  Q 17 13 10,Q 30 26 14,T 2673,Q 15 11 6,Q 28 25 4,T 84,Q 27 4 1,T 49,Q 23 7 3,-  Q 12 5 3,T 99,Q 20 18 11,T 245,T 1075,Q 23 21 14,Q 9 5 3,Q 33 20 3,Q 14 11 4,-  T 117,Q 23 21 18,Q 32 13 8,T 216,Q 25 23 2,T 1767,T 95,Q 28 8 5,T 385,-  Q 18 6 2,T 2297,T 1864,Q 37 35 25,T 2081,T 2599,Q 35 28 6,T 1475,Q 27 19 12,-  T 609,T 2359,Q 21 14 4,T 24,T 399,Q 11 3 2,T 315,Q 20 8 3,Q 23 19 3,T 284,-  Q 18 9 6,T 657,T 1151,Q 29 25 2,T 1951,Q 21 14 13,T 45,T 1960,Q 17 7 1,-  T 203,T 895,Q 23 18 4,T 1067,Q 36 20 2,T 2729,T 680,Q 29 9 2,T 1133,Q 17 9 5,-  Q 26 25 20,Q 20 18 3,Q 10 8 1,T 1765,T 362,Q 23 21 12,T 648,T 2895,Q 25 19 14,-  T 2287,Q 22 13 8,T 1025,T 435,Q 30 27 15,T 346,T 2907,Q 36 30 5,T 533,-  Q 31 24 16,Q 21 14 9,T 91,Q 35 34 2,T 261,T 1315,Q 19 18 11,T 645,Q 32 22 17,-  T 2217,T 143,Q 39 33 26,T 586,T 915,T 98,Q 18 8 7,Q 22 17 3,T 1377,T 613,-  Q 44 21 14,T 406,T 439,Q 28 14 13,T 1577,Q 10 7 1,Q 21 17 11,T 1556,Q 25 11 5,-  T 1476,Q 21 3 2,Q 15 12 6,T 2525,Q 19 16 10,Q 16 3 2,T 411,Q 17 15 8,-  T 988,T 1227,Q 34 17 1,T 127,Q 15 11 2,Q 24 22 21,T 1242,Q 7 6 1,T 2378,-  T 1155,Q 39 34 20,T 243,Q 31 25 6,Q 15 7 2,Q 28 24 9,Q 23 18 11,T 129,-  T 67,Q 30 18 10,T 1149,Q 21 5 2,T 37,T 789,Q 28 15 13,T 1753,T 35,Q 26 24 6,-  T 1387,Q 17 11 8,T 1241,T 382,Q 19 8 6,T 1081,Q 20 2 1,Q 33 26 6,T 279,-  Q 16 13 7,T 557,T 1948,Q 23 10 3,T 1062,T 11,Q 15 9 4,T 1475,Q 14 9 6,-  T 973,T 2186,Q 20 11 2,T 346,T 1395,Q 22 16 14,T 577,Q 24 20 11,Q 22 17 16,-  T 376,Q 13 11 6,T 823,T 2079,Q 23 12 10,T 213,Q 17 11 4,Q 26 19 13,T 467,-  Q 35 12 1,T 1283,Q 11 6 5,Q 22 19 10,T 873,Q 34 33 30,T 1765,T 287,Q 4 3 1,-  T 490,Q 32 24 11,Q 25 22 6,T 19,Q 22 8 6,Q 20 15 5,Q 31 9 4,Q 34 15 2,-  T 1421,Q 24 22 7,Q 36 34 7,T 135,Q 16 7 3,T 2445,T 572,Q 17 7 5,T 1682,-  Q 26 11 10,Q 14 13 3,T 135,Q 16 13 6,T 2245,T 1005,Q 26 7 1,T 348,T 71,-  Q 29 24 6,Q 25 18 16,Q 23 20 14,T 1297,T 538,Q 28 27 13,T 77,Q 23 12 10,-  Q 34 33 4,T 25,Q 17 16 14,Q 14 6 5,T 1165,Q 38 15 10,T 1556,T 603,Q 17 12 7,-  T 1179,Q 25 15 12,Q 5 4 2,T 33,Q 20 11 2,T 1204,T 1179,Q 22 10 8,T 3,-  Q 10 9 1,T 1029,T 823,Q 29 15 1,T 430,T 1719,Q 16 8 1,T 245,Q 22 13 6,-  T 1773,T 56,Q 39 13 12,T 308,Q 15 6 4,Q 26 25 18,T 1223,Q 26 8 5,T 877,-  T 1074,Q 20 5 2,T 919,Q 21 9 2,Q 30 24 23,T 1807,Q 25 14 4,T 213,T 109,-  Q 29 10 7,T 922,T 867,Q 20 15 10,T 691,Q 14 12 1,Q 22 7 5,T 1363,Q 25 23 14,-  T 935,T 711,Q 19 18 5,Q 27 16 14,Q 15 14 12,T 913,T 134,Q 39 30 9,T 711,-  T 383,Q 17 14 4,T 889,Q 21 12 3,T 693,T 1033,Q 13 4 2,T 317,T 1035,Q 18 9 8,-  T 2691,Q 12 7 6,T 1317,T 359,Q 17 3 1,T 777,Q 22 18 7,Q 23 18 10,T 1701,-  Q 32 14 9,T 2353,T 921,Q 11 10 2,T 592,Q 32 28 27,Q 17 10 5,T 475,Q 28 26 4,-  T 1565,T 586,Q 18 7 2,T 1000,T 363,Q 35 34 31,Q 15 10 6,Q 14 10 2,Q 30 29 4,-  T 2318,Q 11 10 5,T 852,T 647,Q 18 12 3,T 1601,Q 17 14 12,T 261,T 1466,-  Q 17 16 7,T 502,Q 10 7 5,Q 26 8 5,T 973,Q 31 8 3,T 737,T 54,Q 17 10 6,-  T 1106,T 999,Q 15 14 5,T 1787,Q 16 10 6,T 749,T 290,Q 9 7 5,T 2021,T 1895,-  Q 14 11 4,Q 16 13 8,Q 26 14 5,T 741,T 104,Q 34 25 5,T 237,T 1127,Q 29 6 5,-  T 2317,Q 30 20 18,T 57,T 82,Q 35 19 10,T 190,Q 15 10 1,Q 25 13 2,T 7,-  Q 17 8 7,T 2105,T 467,Q 13 3 1,T 1052,T 2079,Q 28 27 5,T 405,Q 23 13 10,-  Q 11 7 2,T 1155,Q 35 33 14,T 355,Q 16 11 7,Q 42 40 31,T 21,Q 11 6 1,T 333,-  T 1213,Q 29 28 10,T 1,T 387,Q 19 15 14,T 1273,Q 18 4 2,T 1029,Q 22 15 10,-  Q 15 6 1,Q 21 16 1,T 623,Q 21 12 1,T 2781,Q 22 14 2,T 1977,T 368,Q 22 15 9,-  T 2086,T 459,Q 17 10 7,T 1137,Q 16 14 9,T 1309,T 939,Q 21 15 2,T 2566,-  Q 31 22 16,Q 11 6 2,T 75,Q 8 6 1,Q 11 7 6,T 1234,Q 21 11 4,T 1025,T 1155,-  Q 30 27 16,T 1115,Q 37 27 12,T 229,T 305,Q 13 11 1,Q 31 17 3,T 1967,Q 32 23 14,-  T 67,Q 21 14 5,T 273,T 142,Q 31 9 1,Q 19 11 10,T 1147,Q 30 18 17,T 135,-  Q 21 18 9,Q 12 9 8,T 313,Q 28 27 5,T 275,T 2643,Q 30 10 5,T 1085,Q 33 26 3,-  T 2061,T 1013,Q 34 29 7,T 364,T 543,Q 28 14 4,T 2731,Q 19 17 4,T 581,-  T 324,Q 39 34 10,T 103,T 1447,Q 29 7 4,T 91,Q 17 6 4,Q 12 11 10,T 146,-  Q 37 12 3,T 1146,T 947,Q 15 10 4,T 1779,Q 18 10 7,T 613,T 231,Q 31 12 10,-  T 72,Q 18 15 2,Q 23 18 14,T 1131,Q 18 17 10,Q 34 15 9,T 663,Q 29 15 7,-  T 19,T 1095,Q 9 7 4,T 903,Q 24 16 14,T 621,Q 26 19 1,Q 29 18 5,T 231,-  T 207,Q 35 29 18,T 791,Q 18 16 13,T 1333,T 3,Q 26 13 7,T 810,T 651,Q 15 9 4,-  T 1141,Q 23 18 4,T 425,T 630,Q 21 18 14,T 41,Q 19 18 5,Q 25 17 16,T 1647,-  Q 30 10 4,T 2633,T 1547,Q 25 23 8,T 777,T 1707,Q 26 14 13,T 381,Q 29 24 14,-  T 825,T 732,Q 31 25 17,T 840,T 119,Q 25 17 2,T 2073,Q 36 15 6,Q 24 3 2,-  T 93,Q 25 22 6,T 224,Q 26 8 7,Q 7 6 2,T 217,Q 24 22 6,T 477,T 1910,Q 31 30 2,-  T 1211,T 563,Q 18 13 2,T 1535,Q 31 18 15,T 213,T 84,Q 11 10 1,T 538,Q 17 8 3,-  Q 10 5 1,T 43,Q 21 8 6,Q 23 11 1,T 880,Q 21 13 7,T 706,T 111,Q 17 16 6,-  T 1169,Q 38 11 4,Q 29 27 5,T 283,Q 21 5 2,T 1736,T 2079,Q 26 9 2,T 375,-  Q 24 21 14,T 465,T 330,Q 23 15 9,T 1911,Q 15 7 5,Q 25 12 9,Q 20 11 3,-  Q 14 12 7,T 61,T 2673,Q 29 27 13,T 682,T 2571,Q 27 26 12,Q 18 12 3,Q 24 11 2,-  T 513,T 725,Q 37 29 11,T 695,T 675,Q 12 6 3,T 1283,Q 16 12 10,T 2137,-  T 242,Q 16 7 2,T 765,Q 15 9 5,Q 17 14 12,Q 15 10 7,Q 18 11 9,T 45,T 31,-  Q 25 10 9,T 542,T 31,Q 12 8 2,T 333,Q 14 11 7,Q 33 29 9,Q 28 21 7,Q 19 15 1,-  T 1322,T 279,Q 12 11 10,T 945,Q 34 15 6,T 2401,T 941,Q 27 22 6,T 265,-  T 159,Q 28 24 22,T 885,Q 34 30 17,T 153,T 879,Q 19 13 11,T 1834,T 651,-  Q 35 30 21,T 525,Q 19 15 8,Q 10 3 1,T 1112,Q 19 15 1,T 1410,T 1323,Q 14 13 6,-  Q 20 15 11,Q 17 10 5,Q 29 15 14,T 884,Q 27 25 19,T 2341,T 1587,Q 32 15 6,-  T 2577,Q 10 8 6,Q 17 13 8,T 859,Q 37 23 7,T 476,Q 34 32 15,Q 27 4 2,T 1617,-  Q 30 25 7,T 957,T 1999,Q 45 42 1,T 279,T 2679,Q 33 8 5,T 665,Q 18 14 5,-  T 885,T 189,Q 21 19 16,T 457,Q 14 8 3,Q 30 20 8,T 1279,Q 25 15 14,T 2365,-  T 813,Q 9 4 2,T 286,Q 27 26 8,Q 13 10 3,T 289,Q 28 22 15,T 2105,T 136,-  Q 33 9 3,T 71,T 2379,Q 7 6 1,T 341,Q 21 19 6,T 645,T 491,Q 15 14 9,T 549,-  Q 20 3 1,Q 26 7 5,T 2259,Q 11 9 4,T 1617,T 823,Q 27 20 17,T 535,T 559,-  Q 14 13 9,T 1189,Q 29 26 21,T 3185,T 2135,Q 43 32 9,T 167,T 1063,Q 42 25 9,-  T 917,Q 23 18 3,Q 9 8 5,T 77,Q 25 19 16,T 202,T 1391,Q 22 19 14,T 1143,-  Q 8 7 3,T 1809,T 54,Q 19 15 1,T 839,Q 31 30 19,Q 20 16 1,T 475,Q 14 12 1,-  T 2901,T 416,Q 24 15 6,T 147,T 999,Q 13 8 2,T 221,Q 16 7 5,T 673,T 930,-  Q 26 21 5,T 256,T 983,Q 16 10 1,T 3141,Q 26 9 7,T 41,T 550,Q 29 7 3,T 124,-  Q 38 21 5,Q 12 5 3,T 1275,Q 18 11 1,T 617,T 872,Q 55 32 9,T 1764,T 1911,-  Q 15 12 1,T 2237,Q 10 6 4,T 2989,T 3072,Q 45 19 7,T 2613,Q 18 14 11,Q 14 12 3,-  T 625,Q 19 8 4,T 1145,T 675,Q 11 10 6,T 218,T 1683,Q 32 15 14,T 189,Q 18 12 7,-  T 1397,T 2929,Q 31 26 2,T 11,T 751,Q 17 6 1,T 1781,Q 16 11 7,Q 14 9 7,-  T 455,Q 12 9 7,T 210,T 2387,Q 21 18 4,T 1017,Q 23 3 2,T 21,T 397,Q 21 8 2,-  T 631,T 3,Q 32 27 6,T 965,Q 8 5 3,Q 21 14 9,T 1241,Q 27 14 2,T 1197,Q 35 24 5,-  Q 29 24 1,T 41,Q 18 15 11,Q 9 4 3,T 240,Q 29 21 15,T 136,T 1563,Q 22 21 1,-  T 1273,Q 18 16 4,T 2781,T 1104,Q 11 8 2,T 35,T 1483,Q 30 20 3,T 225,T 466,-  T 3105,T 29,Q 37 15 7,T 15,Q 28 4 3,Q 32 21 11,T 989,Q 23 3 2,Q 17 5 4,-  T 300,Q 18 15 10,T 97,Q 34 31 24,Q 36 13 12,T 321,Q 32 20 6,T 733,T 1293,-  Q 25 11 6,T 925,Q 34 33 1,Q 16 6 2,T 655,Q 16 15 4,T 3321,T 518,Q 16 15 1,-  T 452,T 171,Q 25 5 2,T 2345,Q 28 19 9,Q 22 8 5,T 107,Q 27 25 24,T 571,-  T 707,Q 17 2 1,T 895,Q 20 10 6,T 1029,T 1240,Q 26 25 1,T 140,Q 29 25 3,-  Q 32 21 16,T 49,Q 24 20 7,Q 25 23 16,T 1568,Q 37 19 13,Q 27 10 5,T 679,-  Q 21 20 8,T 1115,Q 24 19 16,Q 32 26 25,T 518,Q 22 5 2,T 682,T 1571,Q 21 11 8,-  T 747,Q 19 13 8,T 1425,Q 14 5 1,Q 21 14 10,T 133,T 435,Q 26 12 8,T 63,-  Q 20 16 6,T 537,T 115,Q 35 32 25,T 35,Q 23 14 1,Q 23 4 2,T 473,Q 21 17 14,-  T 357,T 96,Q 14 9 3,T 427,Q 18 17 7,Q 26 9 6,Q 20 15 5,Q 26 20 6,T 2497,-  T 2247,Q 29 22 18,T 221,Q 21 7 4,Q 31 30 4,T 839,Q 28 27 15,Q 21 14 1,-  T 254,Q 30 29 17,T 386,T 747,Q 16 12 9,T 531,Q 21 10 3,T 1405,T 956,Q 11 5 2,-  T 2494,T 647,Q 16 4 2,T 43,Q 17 10 1,Q 27 22 21,T 1719,Q 25 13 2,T 2056,-  T 2631,Q 22 21 4,T 287,Q 15 14 2,Q 21 15 5,Q 9 6 2,Q 31 30 19,T 152,T 1883,-  Q 32 26 25,T 383,Q 22 21 12,T 565,T 495,Q 24 11 9,T 652,Q 16 15 8,Q 30 15 10,-  T 421,Q 20 12 6,Q 12 9 8,T 256,Q 29 17 11,Q 27 18 8,T 439,Q 6 5 2,T 915,-  Q 6 4 1,T 645,T 2981,Q 36 13 11,T 2513,T 1667,Q 23 12 2,T 1613,Q 36 35 8,-  T 1953,T 1031,Q 25 15 12,T 414,Q 16 11 4,Q 18 15 7,Q 13 4 1,Q 22 13 8,-  T 1653,Q 15 14 2,Q 8 3 1,T 1046,Q 25 15 13,Q 17 9 2,T 93,Q 24 9 7,Q 29 9 3,-  T 653,Q 8 7 5,T 3216,T 699,Q 21 14 13,T 627,Q 35 26 4,Q 15 10 9,T 678,-  Q 37 31 30,T 582,T 963,Q 16 12 6,T 399,Q 27 12 11,T 1949,T 211,Q 23 21 8,-  Q 17 3 2,Q 23 16 14,Q 25 19 18,T 63,Q 16 5 2,Q 11 9 3,T 434,Q 32 21 19,-  T 1820,T 735,Q 13 7 4,T 1727,Q 24 10 3,T 2113,T 1070,Q 14 9 3,T 570,Q 16 11 1,-  Q 24 20 6,T 13,Q 18 8 7,T 249,T 2269,Q 35 32 17,T 1073,T 1867,Q 28 20 6,-  T 455,Q 36 34 14,T 369,T 992,Q 19 18 9,T 285,Q 23 18 3,Q 11 8 6,T 485,-  Q 17 16 11,Q 21 16 8,T 168,Q 8 3 2,T 439,T 579,Q 21 6 4,T 445,Q 15 12 2,-  T 1673,T 510,Q 27 11 9,T 166,Q 28 12 3,Q 25 12 4,T 1025,Q 27 17 4,T 1241,-  T 623,Q 27 26 11,T 1631,T 3375,Q 16 6 5,T 291,Q 14 11 4,T 981,T 914,Q 33 25 6,-  T 1932,Q 14 13 6,Q 5 2 1,T 273,Q 8 5 2,T 633,T 1483,Q 23 10 7,T 175,T 1695,-  Q 33 14 13,T 117,Q 23 6 4,T 1337,T 242,Q 22 15 10,T 1701,T 195,Q 20 9 2,-  Q 25 16 2,Q 29 23 16,T 793,T 1029,Q 19 13 9,T 16,T 2679,Q 29 9 8,T 1353,-  Q 26 24 20,T 2961,T 669,Q 19 18 7,T 587,T 2871,Q 15 12 6,T 23,Q 19 6 3,-  T 1961,T 238,Q 39 17 4,T 794,T 1379,Q 7 6 3,T 3471,Q 13 6 1,Q 17 11 1,-  T 803,Q 27 24 10,T 937,T 1103,Q 31 17 4,T 765,Q 24 23 1,T 2597,T 265,-  Q 11 5 2,T 599,Q 21 14 11,Q 19 11 10,T 549,Q 28 17 14,T 1217,T 137,Q 37 26 17,-  T 2202,T 259,Q 31 26 20,T 677,T 674,Q 11 10 2,T 351,Q 27 18 16,T 333,-  T 423,Q 26 22 2,T 345,Q 20 15 14,Q 22 6 3,T 1245,Q 32 5 2,T 2519,Q 21 15 1,-  Q 9 7 4,T 1929,Q 22 18 2,Q 23 13 12,T 67,Q 27 17 13,T 936,T 2695,Q 16 4 1,-  T 921,Q 8 7 1,Q 28 21 8,T 63,Q 15 10 4,T 1954,T 3123,Q 8 2 1,T 235,Q 26 21 8,-  T 41,T 1665,Q 35 5 2,T 1618,Q 13 12 3,Q 34 9 5,T 3417,Q 27 26 10,T 1113,-  T 935,Q 17 15 5,T 953,Q 35 13 2,Q 26 22 6,T 89,Q 11 10 5,T 2785,T 42,-  Q 19 13 2,T 130,Q 35 24 21,Q 21 10 7,T 273,Q 36 34 10,T 729,T 553,Q 16 3 2,-  T 337,Q 20 7 6,Q 26 21 11,T 225,Q 26 9 1,Q 27 20 15,T 2426,Q 33 13 3,-  T 1127,T 259,Q 20 17 9,T 935,Q 9 7 6,T 33,T 660,Q 37 23 16,T 301,Q 15 14 8,-  Q 34 21 18,T 1117,Q 20 18 16,Q 33 23 12,T 1332,Q 27 26 9,T 49,T 1647,-  Q 7 3 2,T 33,Q 21 17 2,T 3521,T 3529,Q 13 10 6,T 1110,T 1887,Q 22 18 3,-  T 2549,Q 28 26 19,Q 16 13 4,T 584,Q 33 31 21,T 918,Q 16 7 6,Q 30 20 15,-  T 415,Q 24 13 11,T 245,T 30,Q 33 27 2,T 1064,Q 19 10 1,Q 18 14 12,Q 23 19 7,-  Q 18 14 8,T 897,T 1201,Q 29 14 6,T 2412,T 1763,Q 32 30 7,T 1607,Q 17 14 12,-  Q 11 2 1,T 21,Q 29 23 3,T 153,T 1631,T 686,T 1695,Q 21 5 2,T 2349,T 246,-  Q 29 23 21,T 460,T 3111,Q 29 8 6,Q 29 26 4,Q 25 15 8,Q 28 7 2,T 19,Q 15 8 1,-  T 891,T 3263,Q 23 6 5,T 2975,Q 13 12 10,T 2733,T 245,Q 15 12 10,T 333,-  T 2807,Q 29 22 7,T 1165,Q 19 4 2,T 2421,T 2185,Q 35 12 9,T 1435,Q 29 22 18,-  Q 19 18 7,T 75,Q 21 10 2,Q 19 14 6,T 1610,Q 33 14 2,T 308,T 87,Q 25 10 1,-  T 497,Q 26 23 9,T 2505,T 726,Q 17 7 4,T 274,T 2427,Q 19 14 13,T 1885,-  Q 32 13 7,T 933,T 283,Q 22 21 7,T 3472,T 2731,Q 38 19 1,T 121,Q 28 3 2,-  Q 32 13 12,T 256,Q 41 36 19,T 776,T 139,Q 32 17 6,Q 14 4 3,Q 33 32 30,-  T 829,T 1325,Q 23 10 4,T 789,Q 38 31 18,Q 8 2 1,T 1621,Q 24 23 7,T 1741,-  T 3247,Q 37 6 4,T 179,Q 26 8 7,Q 34 22 12,T 625,Q 29 18 5,T 1793,T 1349,-  Q 25 23 17,T 1253,T 1431,Q 29 24 1,T 3033,Q 34 14 8,Q 22 13 10,T 1961,-  Q 37 7 2,T 570,Q 15 13 11,Q 26 11 3,T 925,Q 23 22 7,T 1521,T 3280,Q 37 30 17,-  T 602,T 7,Q 19 15 2,T 287,Q 23 15 2,T 3557,T 341,Q 25 24 3,T 45,T 2787,-  Q 25 10 4,T 1415,Q 20 19 4,T 2625,T 330,Q 35 28 10,T 202,T 1587,Q 26 11 2,-  T 523,Q 35 29 6,T 381,T 2947,Q 41 30 26,T 70,Q 11 10 9,Q 28 19 6,T 643,-  Q 26 21 5,T 237,T 1421,Q 34 21 5,T 828,T 1351,Q 14 5 1,T 311,Q 29 5 2,-  T 577,T 170,Q 33 28 3,T 1344,T 671,Q 27 26 2,T 2863,Q 12 6 2,T 573,T 601,-  Q 20 5 3,T 410,T 2443,Q 27 26 7,T 1179,Q 30 16 8,Q 20 15 6,T 2864,Q 23 18 2,-  T 155,T 355,Q 34 24 19,T 377,Q 26 20 5,T 397,T 213,Q 19 13 11,T 1041,-  T 1683,Q 28 16 9,T 1429,Q 11 8 6,T 829,T 172,Q 41 22 16,T 407,T 523,Q 22 8 4,-  T 105,Q 32 10 2,T 2537,T 20,Q 31 26 9,T 912,T 751,Q 23 20 10,T 629,Q 22 17 13,-  Q 13 12 10,T 35,Q 33 27 21,T 1407,T 1127,Q 8 4 2,Q 29 16 2,Q 28 26 21,-  T 145,T 2715,Q 19 9 5,T 1814,T 871,Q 30 20 14,T 297,Q 17 14 6,Q 27 20 1,-  Q 27 21 17,Q 13 3 1,T 854,T 2179,Q 24 18 16,T 1797,Q 17 6 2,Q 13 12 2,-  Q 10 9 5,Q 35 23 9,T 634,T 867,Q 32 29 2,Q 26 25 5,Q 26 14 2,T 2961,T 285,-  Q 18 13 7,T 371,T 1371,Q 30 17 1,T 343,Q 30 10 4,Q 11 9 6,T 65,Q 30 19 7,-  T 420,T 2295,Q 13 5 2,T 315,Q 31 20 19,T 3285,T 2505,Q 22 21 15,T 1053,-  Q 10 6 5,Q 23 12 6,T 679,Q 12 5 2,T 1217,T 1,Q 21 20 14,T 625,T 379,Q 16 14 9,-  T 1701,Q 30 29 7,Q 24 13 5,T 284,Q 27 8 1,Q 12 9 2,T 3127,Q 40 32 14,-  T 1535,Q 20 19 7,T 345,T 2939,Q 21 18 14,T 277,T 2087,Q 25 20 4,T 789,-  Q 30 26 22,Q 17 8 3,T 400,Q 23 13 7,T 457,Q 23 17 15,Q 24 10 8,T 423,-  Q 23 16 2,T 1797,T 1069,Q 32 15 2,T 887,Q 18 4 3,Q 25 18 2,T 3305,Q 26 8 1,-  Q 22 19 16,T 2940,Q 21 16 6,T 2644,T 2843,Q 10 9 7,T 1015,Q 20 10 3,Q 20 9 8,-  T 241,Q 23 21 12,T 49,Q 33 15 12,Q 27 14 9,T 125,Q 21 13 2,Q 20 17 8,-  T 628,Q 45 17 2,T 1451,T 135,Q 34 14 9,T 3503,Q 21 10 4,Q 26 7 2,T 51,-  Q 22 21 3,T 2697,Q 38 21 5,Q 18 17 11,Q 27 25 18,Q 20 19 10,T 3653,T 15,-  Q 19 9 7,T 1501,T 2331,Q 35 22 1,T 75,Q 17 11 4,T 533,T 1507,Q 18 13 1,-  T 953,T 307,Q 13 10 3,T 705,Q 11 8 7,T 2349,T 2726,Q 42 21 14,T 1377,-  T 735,Q 26 19 10,T 2127,Q 28 10 2,T 549,T 1173,Q 23 13 7,T 1679,Q 15 8 5,-  Q 24 22 11,T 1689,Q 22 16 12,Q 27 26 9,T 145,Q 17 8 3,T 492,Q 12 11 6,-  Q 26 13 2,T 2835,Q 18 16 12,T 1501,T 185,Q 41 21 3,T 846,T 1547,Q 29 8 7,-  T 1845,Q 24 22 13,T 209,T 151,Q 15 5 3,T 3409,T 3303,Q 16 14 7,T 2413,-  Q 12 7 6,T 197,T 2174,Q 41 40 11,T 846,T 423,Q 14 11 3,T 761,Q 23 21 14,-  Q 13 6 2,T 653,Q 51 46 10,T 268,T 3251,Q 15 9 4,T 655,Q 15 10 7,T 869,-  T 1236,Q 45 10 1,T 1210,T 3471,Q 34 32 13,T 55,Q 32 11 7,T 1469,T 2066,-  Q 19 18 2,T 2555,T 555,Q 6 5 2,T 1257,Q 28 15 3,Q 24 9 7,T 111,Q 39 25 10,-  T 495,Q 18 11 2,Q 32 27 6,T 1671,Q 25 8 6,T 945,Q 19 13 7,Q 31 21 14,-  Q 18 5 3,Q 22 17 6,Q 29 18 6,T 203,Q 32 29 19,T 581,T 637,Q 9 2 1,T 474,-  T 291,Q 40 15 2,T 3773,Q 35 10 7,T 2833,T 92,Q 54 3 2,Q 24 14 7,T 2963,-  Q 27 11 2,T 733,Q 13 10 8,T 2673,T 3729,Q 29 3 2,T 925,T 663,Q 16 5 1,-  T 161,Q 28 15 10,T 1233,T 1105,Q 37 33 10,T 2222,T 199,Q 24 16 13,T 2165,-  Q 21 14 11,Q 20 14 1,T 3629,Q 30 13 7,T 1069,T 3627,Q 17 13 10,T 2287,-  Q 30 20 4,T 2473,T 1203,Q 30 23 5,T 97,T 1351,Q 27 26 7,T 77,Q 30 6 3,-  Q 13 11 4,T 769,Q 39 5 1,T 120,T 1891,Q 9 6 1,Q 21 14 11,Q 38 25 11,T 2325,-  T 1497,Q 27 9 3,T 1500,T 479,Q 23 14 7,T 1419,Q 10 9 8,T 581,T 867,Q 35 16 6,-  T 728,Q 23 19 11,Q 36 29 2,T 1683,Q 30 9 4,T 2685,T 119,Q 17 16 15,T 282,-  T 111,Q 10 6 3,T 177,Q 20 14 8,T 541,T 2786,Q 15 12 10,T 1962,T 831,Q 19 18 15,-  T 13,Q 18 4 2,T 3853,T 3084,Q 27 22 5,T 1060,T 367,Q 22 16 14,T 1157,-  Q 7 6 1,Q 11 5 3,T 1993,Q 27 25 4,T 1382,T 15,Q 30 21 9,T 1967,Q 23 22 17,-  Q 30 23 7,T 1007,Q 21 6 3,T 594,T 1979,Q 11 10 1,T 49,Q 15 8 3,T 2089,-  T 717,Q 22 11 3,Q 13 5 1,T 3499,Q 48 33 29,T 47,Q 32 22 11,T 377,T 3007,-  Q 33 28 27,T 1364,Q 22 19 10,Q 28 26 12,T 1155,Q 28 25 2,T 721,T 273,-  Q 35 30 2,T 1459,Q 31 7 5,Q 16 7 2,Q 29 6 4,Q 17 10 7,T 1633,T 42,Q 32 23 21,-  T 2074,T 231,Q 14 10 6,T 499,Q 18 17 1,T 1341,T 410,Q 27 18 15,T 2933,-  T 1943,Q 38 35 27,T 2879,Q 30 19 18,T 3585,T 243,Q 41 39 36,T 150,Q 24 23 3,-  Q 40 22 14,T 325,Q 24 22 5,Q 25 17 1,T 118,Q 7 4 2,T 818,Q 16 15 9,Q 26 18 7,-  T 435,Q 17 13 2,T 1533,T 749,Q 47 31 29,T 233,T 675,Q 38 33 8,T 1841,-  Q 14 10 1,Q 29 22 3,T 137,Q 11 10 5,T 558,T 2103,Q 19 14 2,Q 9 8 2,Q 23 14 5,-  Q 17 12 6,T 1533,Q 25 24 10,T 2233,T 699,Q 34 23 18,T 413,Q 38 30 28,-  T 2121,T 994,Q 20 3 2,T 47,T 1291,Q 8 5 3,T 35,Q 14 10 8,T 2929,T 458,-  Q 39 36 14,T 966,T 3483,Q 31 28 6,T 163,Q 15 14 8,T 1281,T 825,Q 37 19 3,-  T 613,Q 16 15 9,Q 28 20 10,Q 23 20 7,Q 30 23 1,T 3789,T 374,Q 33 29 23,-  T 2829,Q 29 10 4,Q 16 9 6,Q 23 10 7,Q 32 31 7,Q 23 22 2,T 270,Q 34 31 21,-  T 967,T 3591,Q 28 13 5,T 2235,Q 30 28 26,T 213,T 1087,Q 12 3 2,T 215,-  T 3643,Q 22 3 2,T 2505,Q 20 16 2,Q 17 13 10,T 1568,Q 19 13 1,T 654,T 79,-  Q 40 35 21,T 1227,Q 17 6 2,T 981,T 2462,Q 27 22 18,T 154,T 855,Q 28 21 13,-  T 3165,Q 18 7 4,T 129,Q 24 19 8,Q 25 19 17,Q 26 9 6,Q 17 15 10,Q 17 16 6,-  T 215,Q 35 30 13,Q 25 15 13,T 664,Q 12 9 7,T 2400,T 531,Q 18 5 1,T 1113,-  Q 20 5 2,Q 21 16 13,T 197,Q 45 39 7,T 940,Q 29 8 2,Q 11 10 2,T 1681,Q 17 13 10,-  T 2729,T 612,Q 45 34 25,T 1612,Q 15 11 1,Q 20 10 6,T 1333,Q 20 2 1,T 221,-  T 197,Q 7 3 2,T 1466,Q 29 11 4,Q 32 22 6,Q 25 12 4,Q 27 26 23,Q 19 6 1,-  T 756,Q 20 19 5,T 2206,T 1335,Q 26 21 14,T 1089,Q 10 3 2,T 1653,T 321,-  Q 23 15 5,T 1178,Q 17 10 5,Q 27 24 17,T 515,Q 15 11 10,T 137,T 133,Q 40 23 21,-  T 617,T 891,Q 11 4 2,T 795,Q 15 14 2,T 1057,T 80,Q 14 7 1,T 2967,T 51,-  Q 18 13 10,T 3001,Q 28 17 7,Q 38 27 6,T 498,Q 19 13 2,T 413,Q 23 21 20,-  Q 16 11 1,T 1557,Q 26 14 1,T 1121,T 424,Q 19 13 12,T 1412,T 1463,Q 11 7 2,-  T 1253,Q 36 31 15,T 1153,T 483,Q 27 13 12,T 1054,Q 29 19 3,Q 18 16 15,-  T 1695,Q 21 14 3,Q 13 12 10,T 387,Q 44 5 3,T 1249,Q 14 4 3,Q 24 2 1,T 15,-  Q 20 15 14,Q 25 8 4,T 2678,Q 37 18 2,T 504,Q 28 10 3,Q 7 6 1,T 1679,Q 24 22 12,-  T 1041,T 2160,Q 26 25 17,T 2073,T 2423,Q 17 12 8,T 2581,Q 16 3 2,T 1989,-  T 952,Q 16 3 1,T 127,Q 12 4 3,Q 26 21 2,T 3087,Q 18 16 11,T 2201,T 554,-  Q 23 22 17,T 3159,T 687,Q 20 16 5,T 1541,Q 28 26 20,T 1753,T 776,Q 31 30 25,-  T 141,Q 18 15 9,Q 39 33 16,T 1713,Q 32 18 3,T 917,Q 16 11 9,Q 21 14 11,-  T 229,T 1843,Q 11 10 9,T 279,Q 33 19 16,T 53,Q 13 12 3,Q 19 15 13,T 2240,-  T 695,Q 30 24 4,T 131,Q 34 33 30,Q 13 9 8,T 98,Q 39 13 7,T 1305,Q 15 8 5,-  Q 25 17 16,T 3627,Q 18 8 3,T 1389,T 1444,Q 30 23 3,T 1009,Q 31 12 11,-  Q 24 15 5,Q 11 9 2,Q 20 19 12,T 1025,T 1069,Q 27 16 5,T 960,T 1115,Q 34 21 6,-  T 297,Q 10 7 2,T 2449,T 273,Q 27 23 9,T 253,Q 32 27 15,Q 42 29 17,T 1603,-  Q 15 14 4,T 413,T 358,Q 23 11 6,T 883,Q 28 26 3,Q 29 24 16,T 1731,Q 30 27 18,-  T 669,T 1523,Q 39 14 11,T 768,T 239,Q 31 17 6,T 2519,Q 31 22 13,T 1597,-  T 989,Q 25 10 8,T 967,T 3759,Q 16 9 1,T 351,Q 20 5 3,T 2889,T 907,Q 32 11 2,-  T 2513,T 2667,Q 28 25 23,T 9,Q 15 6 4,Q 31 2 1,T 2333,Q 30 23 17,T 1611,-  T 771,Q 25 16 1,T 627,Q 15 9 4,T 217,T 1130,Q 15 12 2,T 3058,T 1667,Q 20 17 5,-  T 1057,Q 32 15 14,Q 21 15 1,T 10,Q 8 3 2,T 3494,Q 19 12 4,Q 47 22 18,-  T 269,Q 26 18 10,Q 28 25 15,T 218,Q 25 24 19,T 548,T 719,Q 25 7 6,Q 9 5 4,-  Q 30 19 18,T 25,T 468,Q 11 3 2,T 739,T 1043,Q 24 12 10,T 1683,Q 32 8 6,-  Q 29 28 20,T 1890,Q 28 27 17,T 728,T 1911,Q 22 8 1,T 133,Q 18 8 4,T 89,-  T 3841,Q 29 25 14,T 1020,T 995,Q 18 10 5,T 3641,Q 19 16 14,Q 23 17 7,-  T 1026,Q 52 45 10,T 292,T 1391,Q 29 28 25,T 471,Q 29 26 9,T 381,T 2553,-  Q 25 16 6,T 481,Q 17 6 5,Q 21 17 8,T 539,Q 11 8 7,Q 21 9 8,T 661,Q 43 32 21,-  T 905,T 2611,Q 24 21 13,T 185,Q 9 6 4,T 1477,T 1139,Q 32 27 6,T 777,Q 10 7 3,-  Q 29 22 16,T 1155,Q 41 10 4,T 1869,T 714,Q 9 5 2,T 1055,T 3847,Q 15 14 4,-  T 2477,Q 21 8 2,T 657,T 2758,Q 18 15 3,T 365,Q 15 12 11,Q 33 28 23,T 1727,-  Q 21 18 13,Q 16 14 9,T 5,Q 19 13 11,T 943,T 3507,Q 34 18 13,T 1773,Q 24 10 4,-  Q 21 16 3,T 469,Q 27 24 17,T 94,T 1443,Q 29 27 10,T 327,Q 24 22 11,T 2345,-  T 308,Q 39 36 25,T 2588,T 447,Q 25 18 12,Q 23 18 6,Q 36 29 3,T 2149,T 3564,-  Q 22 15 9,T 1407,T 215,Q 38 36 21,T 351,Q 23 18 11,Q 15 5 3,T 1462,Q 14 13 7,-  T 1694,Q 36 35 2,Q 35 14 2,T 343,Q 18 16 14,T 173,T 2050,Q 25 15 13,Q 20 11 9,-  T 3399,Q 13 10 3,T 2861,Q 9 5 2,T 3157,T 1496,Q 32 21 14,T 1530,T 1407,-  Q 21 15 4,T 225,Q 20 17 14,T 693,T 2232,Q 15 6 3,T 161,Q 12 7 6,Q 21 16 2,-  T 477,Q 24 13 2,Q 21 17 4,T 44,Q 32 25 23,T 3500,T 419,Q 35 10 9,T 915,-  Q 30 8 3,T 193,T 2439,Q 30 19 9,T 226,T 351,Q 25 23 4,T 2197,Q 47 42 24,-  T 3957,T 1755,Q 27 5 4,T 98,Q 43 24 14,Q 28 26 19,T 637,Q 14 12 8,Q 21 12 11,-  T 938,Q 37 19 6,T 2846,Q 21 14 11,Q 29 28 8,T 185,Q 27 13 10,T 1305,T 3789,-  Q 32 17 15,T 417,Q 17 12 9,Q 19 17 10,Q 16 9 8,Q 28 26 10,T 3333,T 1470,-  Q 45 44 30,T 4117,Q 18 15 9,Q 20 15 2,T 405,Q 30 28 19,Q 21 16 10,T 458,-  Q 41 39 5,T 2985,Q 7 5 2,Q 35 12 10,T 1149,Q 31 14 10,Q 14 5 4,T 596,-  Q 37 23 14,T 775,T 1107,Q 37 34 10,T 651,Q 26 18 14,T 3285,T 129,Q 33 10 2,-  T 643,Q 16 15 7,Q 13 12 7,T 553,Q 50 48 19,T 2921,T 1667,Q 27 15 1,T 777,-  Q 26 25 10,Q 29 7 6,T 1737,Q 29 22 7,T 3177,T 170,Q 35 18 14,T 2548,T 1515,-  Q 18 6 5,Q 22 18 13,Q 22 12 5,T 677,T 1905,Q 15 14 5,Q 24 20 8,T 655,-  Q 20 3 2,T 2443,Q 22 12 4,T 2381,T 154,Q 35 17 4,Q 29 15 1,T 1643,Q 13 8 2,-  T 17,Q 14 5 2,T 4125,T 2316,Q 45 39 17,T 2035,T 3851,Q 26 15 8,T 1815,-  Q 22 15 5,Q 32 22 13,Q 23 13 8,Q 19 4 2,T 2369,T 907,Q 14 12 3,T 691,-  Q 39 16 13,T 3797,T 1336,Q 17 11 1,T 312,Q 30 10 3,Q 18 12 4,Q 17 14 11,-  Q 25 6 1,T 3481,T 4191,Q 29 28 11,T 1105,T 287,Q 22 6 1,T 805,Q 32 22 16,-  Q 30 9 1,T 1557,Q 20 9 2,T 2506,Q 33 17 5,Q 30 27 5,T 1049,Q 26 25 24,-  T 3197,T 1061,Q 40 33 22,T 2240,T 2187,Q 15 10 1,T 2751,Q 27 26 20,Q 33 22 9,-  T 168,Q 33 31 28,T 3,T 1539,Q 14 13 8,T 129,Q 35 14 6,T 361,T 97,Q 17 15 13,-  T 1255,T 1459,Q 33 28 26,T 401,Q 34 27 15,Q 17 10 7,T 43,Q 18 9 6,T 992,-  T 1863,Q 16 12 6,T 905,Q 38 6 5,T 3201,T 213,Q 21 17 6,T 25,Q 38 36 7,-  Q 13 5 2,Q 11 8 6,Q 14 11 5,Q 21 6 4,T 412,Q 15 13 8,T 230,Q 19 10 6,-  Q 10 9 7,T 127,Q 24 22 14,Q 33 32 31,T 397,Q 34 15 5,T 936,T 451,Q 31 24 21,-  Q 15 11 3,Q 26 14 13,T 1713,T 827,Q 30 21 5,T 2398,Q 37 6 1,Q 6 4 1,T 85,-  Q 46 34 26,T 405,T 1425,Q 21 6 3,T 641,T 331,Q 26 19 10,T 1421,Q 23 10 5,-  Q 22 21 19,T 4112,Q 13 6 3,T 3096,Q 26 16 13,Q 35 32 25,T 497,Q 33 26 23,-  Q 10 7 4,T 122,Q 25 19 3,T 540,Q 15 14 11,Q 28 18 15,T 753,Q 37 36 31,-  T 3157,T 91,Q 35 24 10,T 109,T 3555,Q 31 6 5,T 1207,Q 19 16 15,T 2709,-  T 4177,Q 33 27 4,T 3044,Q 19 14 8,Q 27 10 7,T 1221,Q 14 8 5,T 721,T 36,-  Q 28 15 13,T 2646,T 3603,Q 21 18 5,T 1575,Q 36 19 2,T 637,T 435,Q 15 4 2,-  T 2296,T 2019,Q 18 2 1,T 787,Q 23 20 4,Q 27 7 1,T 2996,Q 19 10 3,T 242,-  Q 20 11 4,Q 12 9 4,T 465,Q 26 9 5,Q 30 28 9,T 969,Q 31 5 2,T 1944,Q 19 11 10,-  Q 21 13 10,T 519,Q 41 23 6,T 893,T 639,Q 29 10 1,T 4171,Q 33 17 7,Q 14 13 7,-  T 2011,Q 30 23 17,T 4193,T 2161,Q 21 13 3,Q 15 5 1,T 939,Q 13 5 2,T 801,-  Q 33 14 11,T 2581,Q 24 16 11,Q 28 25 10,T 1429,Q 37 10 3,Q 12 8 2,T 1081,-  Q 22 14 4,Q 22 13 2,T 457,Q 19 9 1,T 439,Q 30 7 4,Q 13 11 6,T 143,Q 8 7 3,-  T 1817,T 3448,Q 32 15 13,T 137,T 407,Q 34 8 2,T 29,Q 15 12 10,Q 27 23 17,-  T 431,Q 23 5 4,T 94,Q 21 20 5,Q 17 13 10,Q 13 7 6,Q 33 27 26,Q 23 14 1,-  T 2385,Q 21 14 3,T 734,T 1431,Q 16 9 1,T 1381,Q 30 23 7,Q 19 17 7,T 203,-  Q 47 44 33,T 434,Q 21 17 14,Q 25 18 1,T 287,Q 24 15 14,T 1585,T 3713,-  Q 22 19 11,T 1150,T 1947,Q 29 28 5,T 1197,Q 22 10 2,Q 33 24 19,T 1483,-  Q 4 3 2,T 256,T 103,Q 38 15 11,Q 25 24 7,Q 33 16 11,Q 20 6 3,T 857,Q 41 32 3,-  T 3234,Q 19 14 8,Q 23 14 13,T 2345,Q 20 13 7,T 3961,T 441,Q 23 10 4,T 81,-  Q 15 11 6,Q 26 18 2,T 103,Q 17 14 12,T 4293,T 145,Q 31 17 6,T 280,T 783,-  Q 26 11 3,T 833,Q 26 18 10,T 2529,T 2863,Q 39 14 4,T 884,T 3323,Q 14 9 4,-  T 1157,Q 30 7 1,Q 31 22 18,T 2306,Q 29 19 11,T 2416,T 2111,Q 22 21 18,-  T 1839,Q 20 12 3,T 1061,T 1329,Q 29 23 12,T 28,T 3403,Q 18 17 10,T 927,-  Q 13 11 6,Q 25 19 15,T 1370,Q 32 7 2,T 1175,T 947,Q 19 18 11,T 3815,Q 31 9 6,-  T 2653,Q 21 18 3,Q 25 20 7,T 855,Q 24 14 11,Q 40 17 5,T 1095,Q 32 24 15,-  T 1809,T 2283,Q 25 20 6,T 164,T 2583,Q 26 20 3,T 1295,Q 33 5 2,Q 24 17 15,-  T 281,Q 39 20 2,T 59,Q 25 22 6,Q 8 6 1,T 417,Q 19 16 10,Q 26 25 18,T 360,-  Q 30 13 3,T 1785,T 231,Q 33 32 8,Q 36 22 21,Q 37 18 16,T 3465,T 7,Q 27 17 5,-  T 467,T 1551,Q 32 12 2,T 2279,Q 25 9 6,Q 21 19 8,T 748,Q 13 7 1,T 68,-  T 959,Q 30 26 16,T 525,Q 40 32 31,T 2817,T 1326,Q 35 33 24,T 3235,Q 28 18 11,-  Q 28 20 2,T 2835,Q 32 27 21,T 1053,T 90,Q 45 12 11,T 79,T 4183,Q 18 14 7,-  T 63,Q 29 22 6,T 53,T 1922,Q 30 29 11,T 693,T 2871,Q 25 24 14,T 1181,-  Q 35 26 12,Q 17 8 4,T 3675,Q 27 9 4,Q 27 25 15,T 2159,Q 18 17 5,Q 10 3 1,-  Q 14 9 3,T 1677,T 70,Q 27 10 8,T 188,T 603,Q 37 4 2,T 37,Q 20 5 3,Q 30 29 11,-  T 508,Q 26 19 9,T 257,Q 16 5 2,Q 45 5 2,T 495,Q 34 10 1,Q 33 10 4,T 860,-  Q 26 25 7,T 1597,Q 30 18 3,Q 49 45 22,Q 22 15 13,Q 27 7 2,Q 17 2 1,T 463,-  Q 24 9 2,T 272,Q 14 7 2,Q 12 5 3,T 1585,Q 26 18 7,T 1301,T 656,Q 25 14 6,-  T 309,T 2139,Q 31 21 4,T 549,Q 42 16 9,T 1773,T 3569,Q 15 9 6,T 1089,-  Q 24 17 7,Q 22 8 2,T 2295,Q 37 4 2,T 1497,T 1174,Q 17 8 6,T 1654,Q 29 11 9,-  Q 15 13 4,T 147,Q 28 24 23,Q 32 28 25,T 1028,Q 19 14 6,T 303,T 4275,Q 30 17 10,-  T 1133,Q 15 9 8,T 3889,T 891,Q 15 9 6,T 328,T 683,Q 20 16 5,T 1171,Q 20 10 6,-  T 1653,T 285,Q 33 22 16,T 539,T 4143,Q 33 20 17,T 355,Q 31 24 2,Q 21 20 12,-  T 1100,Q 33 4 3,T 2324,T 1191,Q 33 14 4,T 1697,Q 23 17 16,Q 12 5 1,T 138,-  Q 14 5 2,T 2493,Q 29 23 17,Q 35 30 27,T 3577,Q 18 16 10,T 49,T 1099,Q 37 12 7,-  T 2713,Q 29 16 5,Q 32 9 5,T 623,Q 34 19 7,T 1029,T 2422,Q 51 4 2,T 689,-  T 2239,Q 19 18 1,T 381,Q 21 13 10,T 3949,T 2369,Q 36 9 6,T 990,Q 17 11 6,-  Q 28 27 10,T 2121,Q 30 26 20,T 469,T 1107,Q 43 13 9,T 1216,T 2007,Q 10 9 4,-  T 249,Q 27 7 6,Q 17 6 5,T 958,Q 41 10 6,T 1439,T 287,Q 29 2 1,T 2285,-  Q 17 12 2,Q 10 9 2,T 222,Q 40 25 10,T 433,Q 35 16 13,Q 22 21 16,T 3031,-  Q 22 17 9,T 1749,T 963,Q 18 17 1,T 158,Q 16 4 3,Q 11 6 5,T 2259,Q 28 21 3,-  Q 16 10 9,T 2479,Q 33 32 31,T 6,T 787,Q 11 8 6,T 797,Q 22 11 7,T 853,-  T 1425,Q 35 29 2,T 358,T 83,Q 17 6 5,T 507,Q 24 10 4,T 1125,T 861,Q 17 3 1,-  T 3733,T 2295,Q 22 21 14,T 529,Q 36 35 31,Q 21 16 13,T 3635,Q 39 34 1,-  T 563,T 967,Q 28 20 6,T 2637,Q 29 22 13,Q 9 5 1,T 506,Q 27 14 2,T 25,-  Q 25 23 1,Q 18 13 1,T 4231,Q 16 10 3,T 1029,T 225,Q 12 7 5,T 176,T 691,-  Q 30 26 10,T 939,Q 30 7 5,T 1233,T 2744,Q 29 11 10,T 435,T 2191,Q 23 5 4,-  T 1619,Q 24 19 12,T 981,T 1128,Q 23 8 2,T 966,Q 18 17 5,Q 29 22 16,T 3093,-  Q 22 2 1,T 169,T 345,Q 9 8 6,T 2674,T 495,Q 16 12 10,T 1513,Q 15 7 2,-  T 333,T 2020,Q 35 6 2,T 2079,T 1051,Q 19 16 13,Q 25 16 12,Q 33 22 1,Q 23 10 2,-  T 1386,Q 28 19 17,T 1599,T 3995,Q 37 20 10,T 649,Q 19 14 4,T 1477,T 222,-  Q 31 17 7,T 29,Q 17 12 1,Q 31 14 10,T 1053,Q 32 9 7,T 1217,Q 12 3 1,Q 23 21 8,-  T 155,T 1327,Q 26 22 15,T 287,Q 28 22 10,T 861,T 4350,Q 32 29 11,T 744,-  T 35,Q 23 14 3,T 2935,Q 36 26 1,Q 32 8 1,T 714,Q 45 19 1,T 1615,T 2095,-  Q 30 22 5,T 449,Q 28 14 5,Q 21 9 8,T 1741,Q 9 6 4,T 813,T 103,Q 27 26 23,-  T 2819,Q 33 8 6,Q 36 30 15,T 287,Q 23 16 10,T 2490,T 1319,Q 17 10 7,T 2725,-  Q 21 15 12,T 609,T 946,Q 11 3 2,T 2345,T 235,Q 24 15 6,T 151,Q 26 18 7,-  T 3929,T 2320,Q 33 4 2,T 2022,Q 15 6 1,Q 9 2 1,T 2565,Q 36 31 12,Q 23 13 3,-  T 2276,Q 45 38 6,Q 20 16 5,T 207,Q 30 17 15,T 2395,Q 16 6 4,T 2681,T 2179,-  Q 17 10 7,T 190,Q 19 17 14,Q 31 18 5,T 1699,Q 26 13 5,T 2445,Q 23 19 7,-  Q 33 31 1,T 440,Q 18 7 3,Q 20 9 7,T 29,Q 11 8 4,T 2769,T 2546,Q 27 26 11,-  T 1260,Q 25 15 14,Q 16 9 1,T 55,Q 14 8 6,Q 15 14 2,T 4200,Q 47 33 24,-  T 1493,T 1723,Q 28 13 6,T 575,Q 9 5 2,Q 32 17 8,T 487,Q 9 7 5,T 3563,-  T 539,Q 30 9 7,T 1841,Q 18 16 7,Q 21 11 10,T 917,Q 35 25 5,T 249,Q 47 29 23,-  Q 15 13 10,Q 23 17 12,Q 26 12 10,T 181,T 1120,Q 39 25 22,T 23,T 2991,-  Q 7 5 4,T 207,Q 26 9 4,T 1545,T 944,Q 21 14 1,T 2163,T 2671,Q 10 3 1,-  T 1365,Q 36 7 1,T 4545,T 1268,Q 35 25 4,T 546,Q 12 2 1,Q 31 16 2,T 1921,-  Q 30 28 7,T 469,T 1330,Q 33 29 7,T 682,T 3087,Q 25 11 6,T 281,Q 30 10 7,-  T 809,T 3470,Q 22 15 3,T 1046,T 2807,Q 20 7 6,T 1913,Q 13 12 3,Q 19 10 3,-  Q 12 3 2,Q 15 10 4,T 229,T 1103,Q 38 5 4,Q 33 26 8,Q 31 17 12,Q 29 23 8,-  T 2806,Q 43 37 30,T 884,Q 19 17 8,Q 10 6 5,T 1153,Q 23 13 6,T 1769,Q 30 13 1,-  Q 33 26 14,T 207,T 3159,Q 20 18 4,T 4305,Q 26 14 8,T 2217,T 3936,Q 21 18 13,-  T 1216,Q 16 10 5,Q 14 13 1,Q 31 12 5,Q 14 12 5,T 1365,T 109,Q 31 24 2,-  T 146,T 211,Q 28 20 6,T 645,Q 14 11 3,T 4085,T 397,Q 35 10 9,T 2181,T 2603,-  Q 36 19 17,T 3839,Q 38 7 5,T 397,T 1217,Q 21 14 8,T 1956,T 2919,Q 30 6 4,-  T 1875,Q 33 26 5,Q 33 23 11,T 1023,Q 35 21 7,T 181,T 4315,Q 38 29 3,T 145,-  Q 20 19 17,Q 17 12 8,T 3899,Q 49 18 8,T 545,T 315,Q 23 22 2,Q 22 14 9,-  Q 18 16 12,T 49,T 1629,Q 17 11 7,T 909,T 239,Q 5 2 1,T 441,Q 43 35 18,-  Q 27 18 3,T 48,Q 37 18 13,T 1663,T 531,Q 8 3 2,T 327,Q 42 28 10,Q 24 17 13,-  T 298,Q 19 6 4,T 1364,T 3843,Q 22 16 6,T 2729,Q 30 18 10,T 1549,T 3173,-  Q 39 17 14,T 1123,Q 23 14 6,Q 23 8 5,T 3183,Q 42 18 14,T 837,T 1488,Q 13 4 3,-  T 502,T 1219,Q 10 6 2,T 135,Q 11 3 2,T 2145,T 1526,Q 23 7 2,T 2049,T 2307,-  Q 20 7 6,T 1883,Q 29 6 5,Q 25 20 14,T 2520,Q 49 43 18,T 358,T 1731,Q 8 5 1,-  T 3087,Q 20 18 3,T 3373,T 2149,Q 29 17 15,T 1838,T 2139,Q 22 21 1,T 135,-  Q 35 25 18,T 605,T 208,Q 27 13 9,T 3344,T 675,Q 31 25 4,T 1559,Q 19 16 10,-  T 3141,T 2657,Q 21 19 16,T 924,Q 27 23 12,Q 26 21 8,T 1233,Q 23 20 2,-  Q 18 6 3,T 477,Q 55 22 8,T 2627,T 4027,Q 18 4 1,T 665,Q 18 16 1,Q 35 23 20,-  T 4165,Q 21 14 8,T 2910,T 4263,Q 31 30 2,T 2081,Q 26 14 8,T 3141,T 1176,-  Q 17 5 3,T 546,Q 23 8 5,Q 23 14 1,T 1339,Q 19 18 14,Q 19 10 8,T 2700,-  Q 51 44 5,T 353,Q 18 10 3,Q 16 14 7,Q 19 9 3,Q 25 18 2,T 1221,T 56,Q 31 26 15,-  T 3221,Q 16 7 4,Q 22 16 4,T 1773,Q 35 34 2,T 453,T 1227,Q 28 23 1,T 369,-  Q 23 13 1,Q 26 21 17,T 3297,Q 21 20 7,T 2245,T 3172,Q 38 7 1,T 116,T 2311,-  Q 28 21 17,T 269,Q 28 10 4,Q 18 9 2,T 4459,Q 23 5 1,T 914,T 1347,Q 14 9 5,-  T 561,Q 19 9 6,T 3297,T 1124,Q 17 11 6,T 523,T 3863,Q 31 30 9,Q 24 7 3,-  Q 20 7 3,T 2601,T 1239,Q 29 24 11,T 623,T 3471,Q 17 15 4,T 369,Q 32 14 7,-  T 2769,T 1295,Q 18 13 1,T 429,T 267,Q 30 8 1,T 2009,Q 18 4 1,Q 28 27 7,-  T 260,Q 28 15 6,T 405,Q 32 11 8,Q 24 22 1,Q 11 9 2,Q 11 10 9,T 673,T 1678,-  Q 19 11 6,T 218,T 823,Q 30 19 13,T 2701,Q 14 9 5,Q 22 10 9,T 1280,Q 22 9 6,-  T 699,Q 21 6 5,Q 23 18 8,Q 21 17 7,Q 21 9 2,Q 37 18 5,T 3113,Q 52 43 25,-  T 42,Q 19 14 12,Q 7 5 4,T 225,Q 14 12 1,Q 15 13 6,T 105,Q 25 22 14,T 479,-  T 4611,Q 30 19 2,T 3513,Q 34 14 12,Q 12 5 3,T 458,Q 23 21 20,T 584,T 1431,-  Q 13 12 3,Q 18 14 13,Q 32 29 23,T 4189,T 2807,Q 35 19 5,T 4,Q 25 16 6,-  Q 36 18 13,Q 20 17 1,Q 32 28 6,Q 34 14 5,T 327,Q 37 18 13,T 197,Q 23 14 1,-  Q 27 14 7,T 1695,Q 28 22 18,T 2289,T 1459,Q 45 40 15,T 656,Q 23 20 7,-  Q 29 25 2,T 2583,Q 26 11 7,T 909,T 200,Q 18 9 2,T 4060,Q 19 12 4,Q 20 10 5,-  T 853,Q 23 22 9,T 945,T 211,Q 25 12 7,T 2089,T 999,Q 19 6 5,T 373,Q 38 22 3,-  T 477,Q 23 20 18,Q 29 17 15,T 2301,Q 41 17 10,Q 29 20 10,T 1175,Q 29 26 4,-  T 621,T 99,Q 19 15 6,Q 15 10 1,Q 12 7 5,Q 29 28 14,T 1141,Q 13 9 2,T 2349,-  T 399,Q 39 17 16,T 686,Q 28 21 9,Q 18 9 2,T 903,Q 32 18 11,T 1797,T 1573,-  Q 13 5 2,T 116,T 243,Q 8 4 2,T 3207,Q 30 27 2,Q 16 10 1,T 1650,Q 37 33 22,-  T 43,T 1623,Q 32 14 2,T 2103,Q 36 31 5,T 1193,T 1119,Q 31 26 6,T 565,-  Q 24 9 3,Q 38 27 13,T 3059,Q 31 21 14,T 1185,T 533,Q 43 32 9,T 539,T 47,-  Q 12 8 2,T 335,Q 37 34 32,Q 19 15 11,T 126,Q 11 4 1,T 1498,Q 29 28 15,-  Q 24 22 10,Q 21 9 1,Q 27 20 1,T 2041,T 702,Q 27 13 2,T 3059,T 687,Q 25 9 2,-  T 387,Q 6 5 4,T 1901,T 1883,Q 49 26 14,T 60,T 487,Q 24 16 5,Q 31 19 9,-  Q 8 6 5,Q 38 37 8,T 888,Q 29 25 7,T 1668,T 1503,Q 34 33 6,T 1771,Q 12 7 4,-  T 3177,T 790,Q 36 29 27,T 2524,T 1867,Q 36 29 22,T 525,Q 28 22 15,T 2061,-  T 841,Q 15 8 1,T 284,T 499,Q 28 18 15,Q 18 11 5,Q 28 25 22,T 4309,T 14,-  Q 19 6 4,T 963,Q 21 5 2,Q 19 10 4,Q 13 11 9,Q 37 26 12,Q 15 12 1,T 262,-  Q 14 13 1,T 1526,T 2883,Q 14 6 5,T 93,Q 32 16 3,T 4577,T 361,Q 25 8 2,-  T 1385,Q 16 3 1,Q 29 14 10,T 557,Q 29 20 11,T 2145,T 2429,Q 31 17 7,T 508,-  Q 7 6 1,Q 25 19 18,T 31,Q 16 15 10,T 37,T 295,Q 30 23 5,T 2333,T 3075,-  Q 26 21 10,T 515,Q 21 18 6,Q 21 19 13,T 700,Q 33 7 3,T 3287,T 3591,Q 18 14 11,-  T 1671,Q 9 7 6,Q 31 30 17,T 1227,Q 31 24 21,T 657,Q 32 18 11,Q 22 14 4,-  T 2733,Q 22 15 2,T 1969,T 3558,Q 19 16 2,T 1192,T 3691,Q 15 14 8,T 57,-  Q 22 14 6,Q 22 9 8,T 446,Q 35 21 1,T 2763,T 435,Q 34 22 6,T 225,Q 29 27 24,-  Q 35 34 3,T 1086,Q 17 9 3,T 3538,T 759,Q 44 25 23,T 3367,Q 30 27 12,T 4277,-  T 864,Q 25 6 2,T 910,T 3175,Q 46 37 21,T 2405,Q 17 14 4,T 2333,T 2054,-  Q 20 9 2,T 84,T 1503,Q 17 14 1,T 3381,Q 10 6 3,Q 50 18 17,T 207,Q 36 27 21,-  T 1201,Q 38 27 24,Q 30 6 1,T 565,Q 23 12 3,T 1533,Q 13 7 1,Q 7 3 2,T 1802,-  Q 22 15 11,Q 26 15 1,T 1753,Q 16 13 10,Q 30 15 9,T 917,Q 27 19 17,T 2933,-  T 1227,Q 27 10 6,T 263,Q 9 6 2,Q 46 29 11,T 3492,Q 37 4 2,T 171,Q 12 11 8,-  Q 32 29 25,Q 30 28 15,Q 14 8 5,Q 29 28 23,T 760,Q 30 5 2,T 938,T 663,-  Q 16 12 10,T 3747,Q 22 21 8,T 4125,T 2086,Q 15 7 6,T 275,T 3663,Q 15 14 2,-  T 3015,Q 11 8 1,Q 30 18 15,T 869,Q 36 9 2,T 2361,T 2559,Q 26 8 1,T 889,-  Q 20 7 6,T 833,T 1093,Q 42 17 3,T 1078,T 3891,Q 6 5 1,T 1701,Q 22 14 6,-  T 1557,T 706,Q 56 49 47,T 2588,T 4455,Q 30 18 1,Q 25 13 9,Q 28 17 11,-  T 585,T 1668,Q 41 23 22,T 1390,T 1091,Q 29 8 1,T 741,Q 32 10 6,T 401,-  T 537,Q 24 19 1,T 773,Q 24 18 15,Q 40 21 20,T 711,Q 40 28 15,T 161,T 88,-  Q 38 37 9,T 2036,T 4147,Q 20 13 9,T 2007,Q 17 8 2,T 177,T 390,Q 27 26 21,-  T 339,Q 24 15 6,Q 26 5 4,T 321,Q 35 32 2,T 2677,T 139,Q 42 41 10,T 284,-  Q 12 10 3,Q 18 10 2,T 1165,Q 22 21 18,Q 30 9 8,T 337,Q 43 32 21,Q 19 15 10,-  T 711,Q 41 28 27,Q 31 30 22,Q 26 17 12,T 1545,Q 27 26 8,Q 46 33 22,T 4420,-  Q 30 19 10,Q 18 4 3,T 105,Q 34 23 18,T 305,T 144,Q 13 10 3,T 2563,Q 22 10 7,-  Q 13 12 5,T 207,Q 4 3 1,T 1541,T 1159,Q 39 37 25,T 104,Q 32 25 7,Q 32 29 1,-  Q 18 13 10,Q 35 16 2,Q 25 19 12,T 389,Q 49 47 13,T 1788,Q 35 28 24,Q 18 12 2,-  T 565,Q 38 18 11,T 2349,T 3537,Q 25 23 10,T 329,Q 19 16 4,Q 11 6 5,T 3379,-  Q 18 11 10,T 317,T 803,Q 36 15 1,T 4386,T 4235,Q 34 28 1,T 2997,Q 33 18 16,-  Q 13 10 3,T 1809,Q 35 32 21,T 2604,Q 34 27 14,Q 26 8 2,T 339,Q 23 8 6,-  T 2681,T 903,Q 13 11 3,T 3842,T 4279,Q 19 18 2,T 183,Q 19 16 15,T 573,-  T 1181,Q 35 28 5,Q 27 7 5,T 747,Q 35 34 11,T 389,Q 38 15 3,T 3673,T 710,-  Q 33 6 4,T 2019,T 2583,Q 46 38 7,Q 31 4 1,Q 32 28 18,Q 27 7 1,T 787,Q 39 38 26,-  T 430,Q 23 13 5,Q 34 21 13,T 11,Q 10 4 3,Q 27 19 10,T 40,Q 21 10 2,T 219,-  T 2027,Q 10 7 1,T 2699,Q 11 10 7,Q 27 16 15,T 483,Q 42 35 15,T 1899,T 95,-  Q 29 17 8,T 4483,Q 32 9 6,T 381,T 1185,Q 49 18 14,T 901,T 2691,Q 37 33 26,-  Q 30 29 26,Q 12 9 7,T 1445,T 1987,Q 39 38 31,T 1382,T 331,Q 34 10 3,T 2397,-  Q 23 6 2,Q 34 7 3,T 2216,Q 22 21 1,T 451,Q 25 19 9,Q 32 26 17,T 2059,-  Q 29 12 10,T 133,T 3069,Q 15 14 6,T 1882,T 2355,Q 23 17 8,T 1535,Q 32 24 10,-  T 2453,T 1334,Q 31 30 11,T 539,T 343,Q 9 8 5,T 851,Q 25 11 4,Q 17 14 4,-  T 381,Q 30 15 10,T 2707,Q 20 14 3,Q 34 29 20,T 2691,Q 34 24 23,T 1701,-  T 4399,Q 36 3 2,T 295,T 2587,Q 11 8 5,T 519,Q 27 24 12,T 2045,T 124,Q 21 19 5,-  T 2954,T 1483,Q 26 10 2,T 707,Q 30 27 22,T 993,T 785,Q 27 10 7,T 1974,-  T 1143,Q 14 11 10,T 3129,Q 21 20 6,T 573,T 495,Q 7 4 2,T 121,Q 29 22 3,-  Q 41 40 31,T 1447,Q 26 10 6,T 4013,T 2951,Q 19 13 9]
Crypto/Classes.hs view
@@ -13,38 +13,38 @@ -}  module Crypto.Classes-	(-	-- * Hash class and helper functions-	  Hash(..)-	, hash-	, hash'-	, hashFunc-	, hashFunc'-	-- * Cipher classes and helper functions-	, BlockCipher(..)-	, blockSizeBytes-	, buildKeyIO-	, StreamCipher(..)-	, buildStreamKeyIO-	, AsymCipher(..)-	, buildKeyPairIO-	, Signing(..)-	, buildSigningKeyPairIO-	-- * Misc helper functions-	, for-	, (.::.)+        (+        -- * Hash class and helper functions+          Hash(..)+        , hashFunc+        , hashFunc'+        -- * Cipher classes and helper functions+        , BlockCipher(..)+        , blockSizeBytes+        , buildKeyIO+        , StreamCipher(..)+        , buildStreamKeyIO+        , AsymCipher(..)+        , buildKeyPairIO+        , Signing(..)+        , buildSigningKeyPairIO+        -- * Misc helper functions+        , for+        , (.::.)         , constTimeEq         , encode-	) where+        ) where  import Data.Serialize import qualified Data.ByteString.Lazy as L import qualified Data.ByteString as B import qualified Data.ByteString.Internal as I import Data.ByteString.Unsafe (unsafeUseAsCStringLen)+import Control.Monad.Trans.Class (lift)+import Control.Monad.Trans.State (StateT(..), runStateT) import Data.Bits ((.|.), xor)-import Data.List (foldl')-import Data.Word (Word64)+import Data.List (foldl', genericDrop)+import Data.Word (Word8, Word64) import Data.Tagged import Crypto.Types import Crypto.Random@@ -59,33 +59,36 @@ -- such as 'hash' and 'hash'' provide a useful API -- for comsumers of hash implementations. ----- Any instantiated implementation must handle unaligned data+-- Any instantiated implementation must handle unaligned data.+--+-- Minimum complete definition: 'outputLength', 'blockLength', 'initialCtx',+-- 'updateCtx', and 'finalize'. class (Serialize d, Eq d, Ord d)     => Hash ctx d | d -> ctx, ctx -> d where-  outputLength	:: Tagged d BitLength	      -- ^ The size of the digest when encoded-  blockLength	:: Tagged d BitLength	      -- ^ The amount of data operated on in each round of the digest computation-  initialCtx	:: ctx			      -- ^ An initial context, provided with the first call to 'updateCtx'-  updateCtx	:: ctx -> B.ByteString -> ctx -- ^ Used to update a context, repeatedly called until all data is exhausted+  outputLength  :: Tagged d BitLength         -- ^ The size of the digest when encoded+  blockLength   :: Tagged d BitLength         -- ^ The amount of data operated on in each round of the digest computation+  initialCtx    :: ctx                        -- ^ An initial context, provided with the first call to 'updateCtx'+  updateCtx     :: ctx -> B.ByteString -> ctx -- ^ Used to update a context, repeatedly called until all data is exhausted                                               --   must operate correctly for imputs of @n*blockLength@ bytes for @n `elem` [0..]@-  finalize	:: ctx -> B.ByteString -> d   -- ^ Finializing a context, plus any message data less than the block size, into a digest+  finalize      :: ctx -> B.ByteString -> d   -- ^ Finializing a context, plus any message data less than the block size, into a digest --- |Hash a lazy ByteString, creating a digest-hash :: (Hash ctx d) => L.ByteString -> d-hash msg = res-  where-  res = finalize ctx end-  ctx = foldl' updateCtx initialCtx blks-  (blks,end) = makeBlocks msg blockLen-  blockLen = (blockLength .::. res) `div` 8+  -- |Hash a lazy ByteString, creating a digest+  hash :: (Hash ctx d) => L.ByteString -> d+  hash msg = res+    where+    res = finalize ctx end+    ctx = foldl' updateCtx initialCtx blks+    (blks,end) = makeBlocks msg blockLen+    blockLen = (blockLength .::. res) `div` 8 --- |Hash a strict ByteString, creating a digest-hash' :: (Hash ctx d) => B.ByteString -> d-hash' msg = res-  where-  res = finalize (updateCtx initialCtx top) end-  (top, end) = B.splitAt remlen msg-  remlen = B.length msg - (B.length msg `rem` bLen)-  bLen = blockLength `for` res `div` 8+  -- |Hash a strict ByteString, creating a digest+  hash' :: (Hash ctx d) => B.ByteString -> d+  hash' msg = res+    where+    res = finalize (updateCtx initialCtx top) end+    (top, end) = B.splitAt remlen msg+    remlen = B.length msg - (B.length msg `rem` bLen)+    bLen = blockLength `for` res `div` 8  -- |Obtain a lazy hash function whose result is the same type -- as the given digest, which is discarded.  If the type is already inferred then@@ -105,21 +108,21 @@   f = hash'   a = f undefined `asTypeOf` d -{-# INLINE makeBlocks #-}+{-# INLINABLE makeBlocks #-} makeBlocks :: L.ByteString -> ByteLength -> ([B.ByteString], B.ByteString) makeBlocks msg len = go (L.toChunks msg)   where   go [] = ([],B.empty)   go (x:xs)     | B.length x >= len =-	let l = B.length x - B.length x `rem` len-	    (top,end) = B.splitAt l x-	    (rest,trueEnd) = go (end:xs)-	in (top:rest, trueEnd)+        let l = B.length x - B.length x `rem` len+            (top,end) = B.splitAt l x+            (rest,trueEnd) = go (end:xs)+        in (top:rest, trueEnd)     | otherwise =-	case xs of-		[] -> ([], x)-		(a:as) -> go (B.append x a : as)+        case xs of+                [] -> ([], x)+                (a:as) -> go (B.append x a : as)  -- |The BlockCipher class is intended as the generic interface -- targeted by maintainers of Haskell cipher implementations.@@ -129,35 +132,74 @@ -- -- Instances must handle unaligned data class ( Serialize k) => BlockCipher k where-  blockSize	:: Tagged k BitLength			-- ^ The size of a single block; the smallest unit on which the cipher operates.-  encryptBlock	:: k -> B.ByteString -> B.ByteString	-- ^ encrypt data of size @n*blockSize@ where @n `elem` [0..]@  (ecb encryption)-  decryptBlock	:: k -> B.ByteString -> B.ByteString	-- ^ decrypt data of size @n*blockSize@ where @n `elem` [0..]@  (ecb decryption)-  buildKey	:: B.ByteString -> Maybe k		-- ^ smart constructor for keys from a bytestring.-  keyLength	:: Tagged k BitLength			-- ^ length of the cryptographic key+  blockSize     :: Tagged k BitLength                   -- ^ The size of a single block; the smallest unit on which the cipher operates.+  encryptBlock  :: k -> B.ByteString -> B.ByteString    -- ^ encrypt data of size @n*blockSize@ where @n `elem` [0..]@  (ecb encryption)+  decryptBlock  :: k -> B.ByteString -> B.ByteString    -- ^ decrypt data of size @n*blockSize@ where @n `elem` [0..]@  (ecb decryption)+  buildKey      :: B.ByteString -> Maybe k              -- ^ smart constructor for keys from a bytestring.+  keyLength     :: Tagged k BitLength                   -- ^ length of the cryptographic key +  -- * Modes of operation over strict bytestrings+  -- | Electronic Cookbook (encryption)+  ecb           :: k -> B.ByteString -> B.ByteString+  ecb = modeEcb'+  -- | Electronic Cookbook (decryption)+  unEcb         :: k -> B.ByteString -> B.ByteString+  unEcb = modeUnEcb'+  -- | Cipherblock Chaining (encryption)+  cbc           :: k -> IV k -> B.ByteString -> (B.ByteString, IV k)+  cbc = modeCbc'+  -- | Cipherblock Chaining (decryption)+  unCbc         :: k -> IV k -> B.ByteString -> (B.ByteString, IV k)+  unCbc = modeUnCbc'+  -- | Counter (encryption)+  ctr           :: k -> IV k -> B.ByteString -> (B.ByteString, IV k)+  ctr = modeCtr' incIV+  -- | Counter (decryption)+  unCtr         :: k -> IV k -> B.ByteString -> (B.ByteString, IV k)+  unCtr = modeUnCtr' incIV+  -- | Ciphertext feedback (encryption)+  cfb           :: k -> IV k -> B.ByteString -> (B.ByteString, IV k)+  cfb = modeCfb'+  -- | Ciphertext feedback (decryption)+  unCfb         :: k -> IV k -> B.ByteString -> (B.ByteString, IV k)+  unCfb = modeUnCfb'+  -- | Output feedback (encryption)+  ofb           :: k -> IV k -> B.ByteString -> (B.ByteString, IV k)+  ofb = modeOfb'+  -- | Output feedback (decryption)+  unOfb         :: k -> IV k -> B.ByteString -> (B.ByteString, IV k)+  unOfb = modeUnOfb'+ -- |The number of bytes in a block cipher block blockSizeBytes :: (BlockCipher k) => Tagged k ByteLength blockSizeBytes = fmap (`div` 8) blockSize  -- |Build a symmetric key using the system entropy (see 'System.Crypto.Random') buildKeyIO :: (BlockCipher k) => IO k-buildKeyIO = go 0+buildKeyIO = buildKeyM getEntropy fail++-- |Build a symmetric key using a given 'Crypto.Random.CryptoRandomGen'+buildKeyGen :: (BlockCipher k, CryptoRandomGen g) => g -> Either GenError (k, g)+buildKeyGen = runStateT (buildKeyM (StateT . genBytes) (lift . Left . GenErrorOther))++buildKeyM :: (BlockCipher k, Monad m) => (Int -> m B.ByteString) -> (String -> m k) -> m k+buildKeyM getMore err = go (0::Int)   where-  go 1000 = error "Tried 1000 times to generate a key from the system entropy.\-                  \  No keys were returned! Perhaps the system entropy is broken\-                  \ or perhaps the BlockCipher instance being used has a non-flat\-                  \ keyspace."+  go 1000 = err "Tried 1000 times to generate a key from the system entropy.\+                \  No keys were returned! Perhaps the system entropy is broken\+                \ or perhaps the BlockCipher instance being used has a non-flat\+                \ keyspace."   go i = do-	let bs = keyLength-	kd <- getEntropy ((7 + untag bs) `div` 8)-	case buildKey kd of-		Nothing -> go (i+1)-		Just k  -> return $ k `asTaggedTypeOf` bs+    let bs = keyLength+    kd <- getMore ((7 + untag bs) `div` 8)+    case buildKey kd of+        Nothing -> go (i+1)+        Just k  -> return $ k `asTaggedTypeOf` bs  -- |Asymetric ciphers (common ones being RSA or EC based) class (Serialize p, Serialize v) => AsymCipher p v | p -> v, v -> p where   buildKeyPair :: CryptoRandomGen g => g -> BitLength -> Either GenError ((p,v),g) -- ^ build a public/private key pair using the provided generator-  encryptAsym      :: (CryptoRandomGen g) => g -> p -> B.ByteString -> Either GenError (B.ByteString,g)	-- ^ Asymetric encryption+  encryptAsym      :: (CryptoRandomGen g) => g -> p -> B.ByteString -> Either GenError (B.ByteString,g) -- ^ Asymetric encryption   decryptAsym      :: v -> B.ByteString -> Maybe B.ByteString  -- ^ Asymetric decryption   publicKeyLength  :: p -> BitLength   privateKeyLength :: v -> BitLength@@ -165,39 +207,50 @@ -- |Build a pair of asymmetric keys using the system random generator. buildKeyPairIO :: AsymCipher p v => BitLength -> IO (Either GenError (p,v)) buildKeyPairIO bl = do-	g <- newGenIO :: IO SystemRandom-	case buildKeyPair g bl of-		Left err -> return (Left err)-		Right (k,_) -> return (Right k)+        g <- newGenIO :: IO SystemRandom+        case buildKeyPair g bl of+                Left err -> return (Left err)+                Right (k,_) -> return (Right k) +-- |Flipped 'buildKeyPair' for ease of use with state monads.+buildKeyPairGen :: (CryptoRandomGen g, AsymCipher p v) => BitLength -> g -> Either GenError ((p,v),g)+buildKeyPairGen = flip buildKeyPair+ -- | A stream cipher class.  Instance are expected to work on messages as small as one byte -- The length of the resulting cipher text should be equal -- to the length of the input message. class (Serialize k) => StreamCipher k iv | k -> iv where-  buildStreamKey	:: B.ByteString -> Maybe k-  encryptStream		:: k -> iv -> B.ByteString -> (B.ByteString, iv)-  decryptStream 	:: k -> iv -> B.ByteString -> (B.ByteString, iv)-  streamKeyLength	:: Tagged k BitLength+  buildStreamKey        :: B.ByteString -> Maybe k+  encryptStream         :: k -> iv -> B.ByteString -> (B.ByteString, iv)+  decryptStream         :: k -> iv -> B.ByteString -> (B.ByteString, iv)+  streamKeyLength       :: Tagged k BitLength  -- |Build a stream key using the system random generator buildStreamKeyIO :: StreamCipher k iv => IO k-buildStreamKeyIO = go 0+buildStreamKeyIO = buildStreamKeyM getEntropy fail++-- |Build a stream key using the provided random generator+buildStreamKeyGen :: (StreamCipher k iv, CryptoRandomGen g) => g -> Either GenError (k, g)+buildStreamKeyGen = runStateT (buildStreamKeyM (StateT . genBytes) (lift . Left . GenErrorOther))++buildStreamKeyM :: (Monad m, StreamCipher k iv) => (Int -> m B.ByteString) -> (String -> m k) -> m k+buildStreamKeyM getMore err = go (0::Int)   where-  go 1000 = error "Tried 1000 times to generate a stream key from the system entropy.\-                  \  No keys were returned! Perhaps the system entropy is broken\-                  \ or perhaps the BlockCipher instance being used has a non-flat\-                  \ keyspace."+  go 1000 = err "Tried 1000 times to generate a stream key from the system entropy.\+                \  No keys were returned! Perhaps the system entropy is broken\+                \ or perhaps the BlockCipher instance being used has a non-flat\+                \ keyspace."   go i = do-	let k = streamKeyLength-	kd <- getEntropy ((untag k + 7) `div` 8)-	case buildStreamKey kd of-		Nothing -> go (i+1)-		Just k' -> return $ k' `asTaggedTypeOf` k+    let k = streamKeyLength+    kd <- getMore ((untag k + 7) `div` 8)+    case buildStreamKey kd of+        Nothing -> go (i+1)+        Just k' -> return $ k' `asTaggedTypeOf` k  -- | A class for signing operations which inherently can not be as generic -- as asymetric ciphers (ex: DSA). class (Serialize p, Serialize v) => Signing p v | p -> v, v -> p  where-  sign	 :: CryptoRandomGen g => g -> v -> L.ByteString -> Either GenError (B.ByteString, g)+  sign   :: CryptoRandomGen g => g -> v -> L.ByteString -> Either GenError (B.ByteString, g)   verify :: p -> L.ByteString -> B.ByteString -> Bool   buildSigningPair :: CryptoRandomGen g => g -> BitLength -> Either GenError ((p, v), g)   signingKeyLength :: v -> BitLength@@ -206,11 +259,15 @@ -- |Build a signing key using the system random generator buildSigningKeyPairIO :: (Signing p v) => BitLength -> IO (Either GenError (p,v)) buildSigningKeyPairIO bl = do-	g <- newGenIO :: IO SystemRandom-	case buildSigningPair g bl of-		Left err -> return $ Left err-		Right (k,_) -> return $ Right k+        g <- newGenIO :: IO SystemRandom+        case buildSigningPair g bl of+                Left err -> return $ Left err+                Right (k,_) -> return $ Right k +-- |Flipped 'buildSigningPair' for ease of use with state monads.+buildSigningKeyPairGen :: (Signing p v, CryptoRandomGen g) => BitLength -> g -> Either GenError ((p, v), g)+buildSigningKeyPairGen = flip buildSigningPair+ -- |Obtain a tagged value for a given type for :: Tagged a b -> a -> b for t _ = unTagged t@@ -243,3 +300,142 @@  foreign import ccall unsafe    c_constTimeEq :: Ptr CChar -> Ptr CChar -> CInt -> IO CInt++-- | Like `ecb` but for strict bytestrings+modeEcb' :: BlockCipher k => k -> B.ByteString -> B.ByteString+modeEcb' k msg =+        let chunks = chunkFor' k msg+        in B.concat $ map (encryptBlock k) chunks+{-# INLINE modeEcb' #-}++-- |Decryption complement to `ecb'`+modeUnEcb' :: BlockCipher k => k -> B.ByteString -> B.ByteString+modeUnEcb' k ct =+        let chunks = chunkFor' k ct+        in B.concat $ map (decryptBlock k) chunks+{-# INLINE modeUnEcb' #-}++-- |Cipher block chaining encryption mode on strict bytestrings+modeCbc' :: BlockCipher k => k -> IV k -> B.ByteString -> (B.ByteString, IV k)+modeCbc' k (IV v) plaintext =+        let blks = chunkFor' k plaintext+            (cts, iv) = go blks v+        in (B.concat cts, IV iv)+  where+  go [] iv = ([], iv)+  go (b:bs) iv =+        let c = encryptBlock k (zwp' iv b)+            (cs, ivFinal) = go bs c+        in (c:cs, ivFinal)+{-# INLINEABLE modeCbc' #-}++-- |Cipher block chaining decryption for strict bytestrings+modeUnCbc' :: BlockCipher k => k -> IV k -> B.ByteString -> (B.ByteString, IV k)+modeUnCbc' k (IV v) ciphertext =+        let blks = chunkFor' k ciphertext+            (pts, iv) = go blks v+        in (B.concat pts, IV iv)+  where+  go [] iv = ([], iv)+  go (c:cs) iv =+        let p = zwp' (decryptBlock k c) iv+            (ps, ivFinal) = go cs c+        in (p:ps, ivFinal)+{-# INLINEABLE modeUnCbc' #-}++-- |Output feedback mode for strict bytestrings+modeOfb' :: BlockCipher k => k -> IV k -> B.ByteString -> (B.ByteString, IV k)+modeOfb' = modeUnOfb'+{-# INLINEABLE modeOfb' #-}++-- |Output feedback mode for strict bytestrings+modeUnOfb' :: BlockCipher k => k -> IV k -> B.ByteString -> (B.ByteString, IV k)+modeUnOfb' k (IV iv) msg =+        let ivStr = collect (B.length msg + ivLen) (drop 1 (iterate (encryptBlock k) iv))+            ivLen = B.length iv+            mLen = fromIntegral (B.length msg)+            newIV = IV . B.concat . L.toChunks . L.take (fromIntegral ivLen) . L.drop mLen . L.fromChunks $ ivStr+        in (zwp' (B.concat ivStr) msg, newIV)+{-# INLINEABLE modeUnOfb' #-}++-- |Counter mode for strict bytestrings+modeCtr' :: BlockCipher k => (IV k -> IV k) -> k -> IV k -> B.ByteString -> (B.ByteString, IV k)+modeCtr' = modeUnCtr'+{-# INLINEABLE modeCtr' #-}++-- |Counter mode for strict bytestrings+modeUnCtr' :: BlockCipher k => (IV k -> IV k) -> k -> IV k -> B.ByteString -> (B.ByteString, IV k)+modeUnCtr' f k (IV iv) msg =+       let ivStr = iterate f $ IV iv+           ivLen = fromIntegral $ B.length iv+           newIV = head $ genericDrop ((ivLen - 1 + B.length msg) `div` ivLen) ivStr+       in (zwp' (B.concat $ collect (B.length msg) (map (encryptBlock k . initializationVector) ivStr)) msg, newIV)+{-# INLINEABLE modeUnCtr' #-}++-- |Ciphertext feed-back encryption mode for strict bytestrings (with+-- s == blockSize)+modeCfb' :: BlockCipher k => k -> IV k -> B.ByteString -> (B.ByteString, IV k)+modeCfb' k (IV v) msg =+        let blks = chunkFor' k msg+            (cs,ivF) = go v blks+        in (B.concat cs, IV ivF)+  where+  go iv [] = ([],iv)+  go iv (b:bs) =+        let c = zwp' (encryptBlock k iv) b+            (cs,ivFinal) = go c bs+        in (c:cs, ivFinal)+{-# INLINEABLE modeCfb' #-}++-- |Ciphertext feed-back decryption mode for strict bytestrings (with s == blockSize)+modeUnCfb' :: BlockCipher k => k -> IV k -> B.ByteString -> (B.ByteString, IV k)+modeUnCfb' k (IV v) msg =+        let blks = chunkFor' k msg+            (ps, ivF) = go v blks+        in (B.concat ps, IV ivF)+  where+  go iv [] = ([], iv)+  go iv (b:bs) =+        let p = zwp' (encryptBlock k iv) b+            (ps, ivF) = go b bs+        in (p:ps, ivF)+{-# INLINEABLE modeUnCfb' #-}++++chunkFor' :: (BlockCipher k) => k -> B.ByteString -> [B.ByteString]+chunkFor' k = go+  where+  blkSz = (blockSize `for` k) `div` 8+  go bs | B.length bs < blkSz = []+        | otherwise           = let (blk,rest) = B.splitAt blkSz bs in blk : go rest+{-# INLINE chunkFor' #-}++-- |Increase an `IV` by one.  This is way faster than decoding,+-- increasing, encoding+incIV :: BlockCipher k => IV k -> IV k+incIV (IV b) = IV $ snd $ B.mapAccumR (incw) True b+  where+       incw :: Bool -> Word8 -> (Bool, Word8)+       incw True w = (w == maxBound, w + 1)+       incw False w = (False, w)++-- |zipWith xor + Pack+--+-- As a result of rewrite rules, this should automatically be+-- optimized (at compile time) to use the bytestring libraries+-- 'zipWith'' function.+zwp' :: B.ByteString -> B.ByteString -> B.ByteString+zwp' a = B.pack . B.zipWith xor a+{-# INLINEABLE zwp' #-}++-- gather a specified number of bytes from the list of bytestrings+collect :: Int -> [B.ByteString] -> [B.ByteString]+collect 0 _ = []+collect _ [] = []+collect i (b:bs)+        | len < i  = b : collect (i - len) bs+        | len >= i = [B.take i b]+  where+  len = B.length b+{-# INLINE collect #-}
Crypto/HMAC.hs view
@@ -5,10 +5,10 @@ -}  module Crypto.HMAC-	( hmac-	, hmac'-	, MacKey(..)-	) where+        ( hmac+        , hmac'+        , MacKey(..)+        ) where  import qualified Data.ByteString as B import qualified Data.ByteString.Lazy as L
Crypto/Modes.hs view
@@ -3,36 +3,28 @@  Maintainer: Thomas.DuBuisson@gmail.com  Stability: beta  Portability: portable - Authors: Thomas DuBuisson, Francisco Blas Izquierdo Riera (klondike)+ Authors: Thomas DuBuisson    Generic mode implementations useable by any correct BlockCipher-instance Be aware there are no tests for CFB mode yet.  See-'Test.Crypto'. + instance Be aware there are no tests for CFB mode yet.  See+ 'Test.Crypto'. -} module Crypto.Modes (-	-- * Initialization Vector Type, Modifiers (for all ciphers, all modes that use IVs)-	  IV-	, getIV, getIVIO, zeroIV-	, incIV, dblIV-	-- * Blockcipher modes. Names with a prime (') means strict, without a prime means lazy bytestrings.-	, ecb, unEcb-	, cbc, unCbc-	, cfb, unCfb-	, ofb, unOfb-	, ecb', unEcb'-	, cbc', unCbc'-	, cfb', unCfb'-	, ofb', unOfb'-	, ctr, unCtr, ctr', unCtr'-	, siv, unSiv, siv', unSiv'-	-- * Authentication modes-	, cbcMac', cbcMac, cMac, cMac'-	-- * Combined modes (nothing here yet)-	-- , gmc-	-- , xts-	-- , ccm-	) where+        -- * Initialization Vector Type, Modifiers (for all ciphers, all modes that use IVs)+          getIV, getIVIO, zeroIV+        , incIV+        -- * Blockcipher modes for lazy bytestrings. Versions for strict bytestrings are in 'Crypto.Classes'.+        , Crypto.Modes.ecb, Crypto.Modes.unEcb+        , Crypto.Modes.cbc, Crypto.Modes.unCbc+        , Crypto.Modes.cfb, Crypto.Modes.unCfb+        , Crypto.Modes.ofb, Crypto.Modes.unOfb+        , Crypto.Modes.ctr, Crypto.Modes.unCtr, ctr', unCtr'+        -- * Combined modes (nothing here yet)+        -- , gmc+        -- , xts+        -- , ccm+        ) where  import qualified Data.ByteString as B import qualified Data.ByteString.Lazy as L@@ -41,10 +33,10 @@ import qualified Data.Serialize.Get as SG import Data.Bits (xor, shift, (.&.), (.|.), testBit, setBit, clearBit, Bits, complementBit) import Data.Tagged-import Crypto.Classes+import Crypto.Classes (BlockCipher(..), for, blockSizeBytes) import Crypto.Random import Crypto.Util-import Crypto.CPoly+import Crypto.Types import System.Entropy (getEntropy) import Control.Monad (liftM, forM_) import Data.List (genericDrop)@@ -55,22 +47,12 @@ import Data.Proxy #endif --- |Initilization Vectors for BlockCipher implementations (IV k) are--- used for various modes and guarrenteed to be blockSize bits long.--- The common ways to obtain an IV are to generate one ('getIV' or--- 'getIVIO') or to use one provided with the ciphertext (using the--- 'Serialize' instance of IV).------ 'zeroIV' also exists and is of particular use for starting 'ctr'--- mode with a fresh key.-data IV k = IV { initializationVector :: {-# UNPACK #-} !B.ByteString } deriving (Eq, Ord, Show)- -- gather a specified number of bytes from the list of bytestrings collect :: Int -> [B.ByteString] -> [B.ByteString] collect 0 _ = [] collect _ [] = [] collect i (b:bs)-	| len < i  = b : collect (i - len) bs+        | len < i  = b : collect (i - len) bs         | len >= i = [B.take i b]   where   len = B.length b@@ -101,19 +83,19 @@ -- than either of the two inputs. zwp :: L.ByteString -> L.ByteString -> L.ByteString zwp  a b = -	let as = L.toChunks a-	    bs = L.toChunks b-	in L.fromChunks (go as bs)+        let as = L.toChunks a+            bs = L.toChunks b+        in L.fromChunks (go as bs)   where   go [] _ = []   go _ [] = []   go (a:as) (b:bs) =-	let l = min (B.length a) (B.length b)-	    (a',ar) = B.splitAt l a-	    (b',br) = B.splitAt l b-	    as' = if B.length ar == 0 then as else ar : as-	    bs' = if B.length br == 0 then bs else br : bs-	in (zwp' a' b') : go as' bs'+        let l = min (B.length a) (B.length b)+            (a',ar) = B.splitAt l a+            (b',br) = B.splitAt l b+            as' = if B.length ar == 0 then as else ar : as+            bs' = if B.length br == 0 then bs else br : bs+        in (zwp' a' b') : go as' bs' {-# INLINEABLE zwp #-}  -- |zipWith xor + Pack@@ -128,15 +110,15 @@ -- |Cipher block chaining encryption mode on strict bytestrings cbc' :: BlockCipher k => k -> IV k -> B.ByteString -> (B.ByteString, IV k) cbc' k (IV v) plaintext =-	let blks = chunkFor' k plaintext-	    (cts, iv) = go blks v-	in (B.concat cts, IV iv)+        let blks = chunkFor' k plaintext+            (cts, iv) = go blks v+        in (B.concat cts, IV iv)   where   go [] iv = ([], iv)   go (b:bs) iv =-	let c = encryptBlock k (zwp' iv b)-	    (cs, ivFinal) = go bs c-	in (c:cs, ivFinal)+        let c = encryptBlock k (zwp' iv b)+            (cs, ivFinal) = go bs c+        in (c:cs, ivFinal) {-# INLINEABLE cbc' #-}  -- |Cipher block chaining message authentication@@ -146,54 +128,54 @@  -- |Cipher block chaining message authentication cbcMac :: BlockCipher k => k -> L.ByteString -> L.ByteString-cbcMac k pt = L.fromChunks [encode $ snd $ cbc k zeroIV pt]+cbcMac k pt = L.fromChunks [encode $ snd $ Crypto.Modes.cbc k zeroIV pt] {-# INLINEABLE cbcMac #-}  -- |Cipher block chaining decryption for strict bytestrings unCbc' :: BlockCipher k => k -> IV k -> B.ByteString -> (B.ByteString, IV k) unCbc' k (IV v) ciphertext =-	let blks = chunkFor' k ciphertext-	    (pts, iv) = go blks v-	in (B.concat pts, IV iv)+        let blks = chunkFor' k ciphertext+            (pts, iv) = go blks v+        in (B.concat pts, IV iv)   where   go [] iv = ([], iv)   go (c:cs) iv =-	let p = zwp' (decryptBlock k c) iv-	    (ps, ivFinal) = go cs c-	in (p:ps, ivFinal)+        let p = zwp' (decryptBlock k c) iv+            (ps, ivFinal) = go cs c+        in (p:ps, ivFinal) {-# INLINEABLE unCbc' #-}  -- |Cipher block chaining encryption for lazy bytestrings cbc :: BlockCipher k => k -> IV k -> L.ByteString -> (L.ByteString, IV k) cbc k (IV v) plaintext =-	let blks = chunkFor k plaintext-	    (cts, iv) = go blks v-	in (L.fromChunks cts, IV iv)+        let blks = chunkFor k plaintext+            (cts, iv) = go blks v+        in (L.fromChunks cts, IV iv)   where   go [] iv = ([], iv)   go (b:bs) iv =-	let c = encryptBlock k (zwp' iv b)-	    (cs, ivFinal) = go bs c-	in (c:cs, ivFinal)+        let c = encryptBlock k (zwp' iv b)+            (cs, ivFinal) = go bs c+        in (c:cs, ivFinal) {-# INLINEABLE cbc #-}  -- |Cipher block chaining decryption for lazy bytestrings unCbc :: BlockCipher k => k -> IV k -> L.ByteString -> (L.ByteString, IV k) unCbc k (IV v) ciphertext =-	let blks = chunkFor k ciphertext-	    (pts, iv) = go blks v-	in (L.fromChunks pts, IV iv)+        let blks = chunkFor k ciphertext+            (pts, iv) = go blks v+        in (L.fromChunks pts, IV iv)   where   go [] iv = ([], iv)   go (c:cs) iv =-	let p = zwp' (decryptBlock k c) iv-	    (ps, ivFinal) = go cs c-	in (p:ps, ivFinal)+        let p = zwp' (decryptBlock k c) iv+            (ps, ivFinal) = go cs c+        in (p:ps, ivFinal) {-# INLINEABLE unCbc #-}  -- |Counter mode for lazy bytestrings ctr :: BlockCipher k => (IV k -> IV k) -> k -> IV k -> L.ByteString -> (L.ByteString, IV k)-ctr = unCtr+ctr = Crypto.Modes.unCtr  -- |Counter  mode for lazy bytestrings unCtr :: BlockCipher k => (IV k -> IV k) -> k -> IV k -> L.ByteString -> (L.ByteString, IV k)@@ -215,15 +197,6 @@            newIV = head $ genericDrop ((ivLen - 1 + B.length msg) `div` ivLen) ivStr        in (zwp' (B.concat $ collect (B.length msg) (map (encryptBlock k . initializationVector) ivStr)) msg, newIV) --- |Generate cmac subkeys.  The usage of seq tries to force evaluation--- of both keys avoiding posible timing attacks-cMacSubk :: BlockCipher k => k -> (IV k, IV k)-cMacSubk k = (k1, k2) `seq` (k1, k2)-  where-       bSize = blockSizeBytes `for` k-       k1 = dblIV $ IV $ encryptBlock k $ B.replicate bSize 0-       k2 = dblIV $ k1- -- |Pad the string as required by the cmac algorithm. In theory this --  should work at bit level but since the API works at byte level we --  do the same@@ -246,10 +219,6 @@        go [] c = encryptBlock k (zwp' c fe)        go (x:xs) c = go xs $ encryptBlock k $ zwp' c x --- |Obtain the cmac for lazy bytestrings-cMac :: BlockCipher k => k -> L.ByteString -> L.ByteString-cMac k = cMacWithSubK k (cMacSubk k)- -- |Obtain the cmac with the specified subkey for strict bytestrings cMacWithSubK' :: BlockCipher k => k -> (IV k, IV k) -> B.ByteString -> B.ByteString cMacWithSubK' k (IV k1, IV k2) b = go (chunkFor' k t) $ B.replicate bSize1 0@@ -263,39 +232,12 @@        go [] c = encryptBlock k (zwp' c fe)        go (x:xs) c = go xs $ encryptBlock k $ zwp' c x --- |Obtain the cmac for strict bytestrings-cMac' :: BlockCipher k => k -> B.ByteString -> B.ByteString-cMac' k = cMacWithSubK' k (cMacSubk k)- -- |Generate the xor stream for the last step of the CMAC* algorithm xorend  :: Int -> (Int,[Word8]) -> Maybe (Word8,(Int,[Word8])) xorend bsize (0, []) = Nothing xorend bsize (n, x:xs) | n <= bsize = Just (x,((n-1),xs))                        | otherwise = Just (0,((n-1),(x:xs))) --- |Obtain the CMAC* on lazy bytestrings-cMacStar :: BlockCipher k => k -> [L.ByteString] -> L.ByteString-cMacStar k l = go (lcmac (L.replicate bSize 0)) l-  where-       bSize = fromIntegral $ blockSizeBytes `for` k-       bSizeb = fromIntegral $ blockSize `for` k-       lcmac = cMacWithSubK k (cMacSubk k)-       go s [] = s---- |Obtain the CMAC* on strict bytestrings-cMacStar' :: BlockCipher k => k -> [B.ByteString] -> B.ByteString-cMacStar' k s = go (lcmac (B.replicate bSize 0)) s-  where-       bSize = fromIntegral $ blockSizeBytes `for` k-       bSizeb = fromIntegral $ blockSize `for` k-       lcmac = cMacWithSubK' k (cMacSubk k)-       go s [] = s-       go s [x] | (B.length x) >= bSize = lcmac $ zwp' x $ fst $ B.unfoldrN (B.length x) (xorend bSize) (fromIntegral $ B.length x,B.unpack s)-                | otherwise = lcmac $ zwp' (dblB s) (fst $ B.unfoldrN bSize cMacPad (B.unpack x,True,bSize))-       go s (x:xs) = go (zwp' (dblB s) (lcmac x)) xs--- -- |Create the mask for SIV based ciphers sivMask :: B.ByteString -> B.ByteString sivMask b = snd $ B.mapAccumR (go) 0 b@@ -305,63 +247,6 @@        go 56 w = (64,clearBit w 7)        go n w = (n+8,w) --- |SIV (Synthetic IV) mode for lazy bytestrings. First argument is--- the optional list of bytestrings to be authenticated but not--- encrypted As required by the specification this algorithm may--- return nothing when certain constraints aren't met.-siv :: BlockCipher k => k -> k -> [L.ByteString] -> L.ByteString -> Maybe L.ByteString-siv k1 k2 xs m | length xs > bSizeb - 1 = Nothing-               | otherwise = Just $ L.append iv $ fst $ ctr incIV k2 (IV $ sivMask $ B.concat $ L.toChunks iv) m-  where-       bSize = fromIntegral $ blockSizeBytes `for` k1-       bSizeb = fromIntegral $ blockSize `for` k1-       iv = cMacStar k1 $ xs ++ [m]----- |SIV (Synthetic IV) for lazy bytestrings.  First argument is the--- optional list of bytestrings to be authenticated but not encrypted.--- As required by the specification this algorithm may return nothing--- when authentication fails.-unSiv :: BlockCipher k => k -> k -> [L.ByteString] -> L.ByteString -> Maybe L.ByteString-unSiv k1 k2 xs c | length xs > bSizeb - 1 = Nothing-                 | L.length c < fromIntegral bSize = Nothing-                 | iv /= (cMacStar k1 $ xs ++ [dm]) = Nothing-                 | otherwise = Just dm-  where-       bSize = fromIntegral $ blockSizeBytes `for` k1-       bSizeb = fromIntegral $ blockSize `for` k1-       (iv,m) = L.splitAt (fromIntegral bSize) c-       dm = fst $ unCtr incIV k2 (IV $ sivMask $ B.concat $ L.toChunks iv) m---- |SIV (Synthetic IV) mode for strict bytestrings.  First argument is--- the optional list of bytestrings to be authenticated but not--- encrypted.  As required by the specification this algorithm may--- return nothing when certain constraints aren't met.-siv' :: BlockCipher k => k -> k -> [B.ByteString] -> B.ByteString -> Maybe B.ByteString-siv' k1 k2 xs m | length xs > bSizeb - 1 = Nothing-                | otherwise = Just $ B.append iv $ fst $ ctr' incIV k2 (IV $ sivMask iv) m-  where-       bSize = fromIntegral $ blockSizeBytes `for` k1-       bSizeb = fromIntegral $ blockSize `for` k1-       iv = cMacStar' k1 $ xs ++ [m]------ |SIV (Synthetic IV) for strict bytestrings First argument is the--- optional list of bytestrings to be authenticated but not encrypted--- As required by the specification this algorithm may return nothing--- when authentication fails.-unSiv' :: BlockCipher k => k -> k -> [B.ByteString] -> B.ByteString -> Maybe B.ByteString-unSiv' k1 k2 xs c | length xs > bSizeb - 1 = Nothing-                  | B.length c < bSize = Nothing-                  | iv /= (cMacStar' k1 $ xs ++ [dm]) = Nothing-                  | otherwise = Just dm-  where-       bSize = fromIntegral $ blockSizeBytes `for` k1-       bSizeb = fromIntegral $ blockSize `for` k1-       (iv,m) = B.splitAt bSize c-       dm = fst $ unCtr' incIV k2 (IV $ sivMask iv) m- -- |Increase an `IV` by one.  This is way faster than decoding, -- increasing, encoding incIV :: BlockCipher k => IV k -> IV k@@ -371,37 +256,6 @@        incw True w = (w == maxBound, w + 1)        incw False w = (False, w) --- |Accumulator based double operation-dblw :: Bool -> (Int,[Int],Bool) -> Word8 -> ((Int,[Int],Bool), Word8)-dblw hb (i,xs,b) w = dblw' hb-  where-       slw True w = (setBit (shift w 1) 0)-       slw False w = (clearBit (shift w 1) 0)-       cpolyw i [] w = ((i+8,[]),w)-       cpolyw i (x:xs) w-         | x < i +8 = (\(a,b) -> (a,complementBit b (x-i))) $ cpolyw i xs w-         |otherwise = ((i+8,(x:xs)),w)-       b' = testBit w 7-       w' = slw b w-       ((i',xs'),w'') = cpolyw i xs w'-       dblw' False = i'`seq`xs'`seq`w''`seq`((i,xs,b'),w')-       dblw' True  = ((i',xs',b'),w'')----- |Perform doubling as defined by the CMAC and SIV papers-dblIV :: BlockCipher k => IV k -> IV k-dblIV (IV b) = IV $ dblB b---- |Perform doubling as defined by the CMAC and SIV papers-dblB :: B.ByteString -> B.ByteString-dblB b | B.null b = b-       | otherwise = snd $ B.mapAccumR (dblw (testBit (B.head b) 7)) (0,cpoly2revlist (B.length b * 8),False) b---- |Perform doubling as defined by the CMAC and SIV papers-dblL :: L.ByteString -> L.ByteString-dblL b | L.null b = b-       | otherwise = snd $ L.mapAccumR (dblw (testBit (L.head b) 7)) (0,cpoly2revlist (L.length b * 8),False) b- -- |Cast a bigEndian ByteString into an Integer decodeB :: B.ByteString -> Integer decodeB = B.foldl' (\acc w -> (shift acc 8) + toInteger(w)) 0@@ -449,102 +303,102 @@ -- |Cook book mode - not really a mode at all.  If you don't know what you're doing, don't use this mode^H^H^H^H library. ecb :: BlockCipher k => k -> L.ByteString -> L.ByteString ecb k msg =-	let chunks = chunkFor k msg-	in L.fromChunks $ map (encryptBlock k) chunks+        let chunks = chunkFor k msg+        in L.fromChunks $ map (encryptBlock k) chunks {-# INLINEABLE ecb #-}  -- |ECB decrypt, complementary to `ecb`. unEcb :: BlockCipher k => k -> L.ByteString -> L.ByteString unEcb k msg =-	let chunks = chunkFor k msg-	in L.fromChunks $ map (decryptBlock k) chunks+        let chunks = chunkFor k msg+        in L.fromChunks $ map (decryptBlock k) chunks {-# INLINEABLE unEcb #-}  -- | Like `ecb` but for strict bytestrings ecb' :: BlockCipher k => k -> B.ByteString -> B.ByteString ecb' k msg =-	let chunks = chunkFor' k msg-	in B.concat $ map (encryptBlock k) chunks+        let chunks = chunkFor' k msg+        in B.concat $ map (encryptBlock k) chunks {-# INLINEABLE ecb' #-}  -- |Decryption complement to `ecb'` unEcb' :: BlockCipher k => k -> B.ByteString -> B.ByteString unEcb' k ct =-	let chunks = chunkFor' k ct-	in B.concat $ map (decryptBlock k) chunks+        let chunks = chunkFor' k ct+        in B.concat $ map (decryptBlock k) chunks {-# INLINEABLE unEcb' #-}  -- |Ciphertext feed-back encryption mode for lazy bytestrings (with s -- == blockSize) cfb :: BlockCipher k => k -> IV k -> L.ByteString -> (L.ByteString, IV k) cfb k (IV v) msg =-	let blks = chunkFor k msg-	    (cs,ivF) = go v blks-	in (L.fromChunks cs, IV ivF)+        let blks = chunkFor k msg+            (cs,ivF) = go v blks+        in (L.fromChunks cs, IV ivF)   where   go iv [] = ([],iv)   go iv (b:bs) =-	let c = zwp' (encryptBlock k iv) b-	    (cs,ivFinal) = go c bs-	in (c:cs, ivFinal)+        let c = zwp' (encryptBlock k iv) b+            (cs,ivFinal) = go c bs+        in (c:cs, ivFinal) {-# INLINEABLE cfb #-}  -- |Ciphertext feed-back decryption mode for lazy bytestrings (with s -- == blockSize) unCfb :: BlockCipher k => k -> IV k -> L.ByteString -> (L.ByteString, IV k) unCfb k (IV v) msg = -	let blks = chunkFor k msg-	    (ps, ivF) = go v blks-	in (L.fromChunks ps, IV ivF)+        let blks = chunkFor k msg+            (ps, ivF) = go v blks+        in (L.fromChunks ps, IV ivF)   where   go iv [] = ([], iv)   go iv (b:bs) =-	let p = zwp' (encryptBlock k iv) b-	    (ps, ivF) = go b bs-	in (p:ps, ivF)+        let p = zwp' (encryptBlock k iv) b+            (ps, ivF) = go b bs+        in (p:ps, ivF) {-# INLINEABLE unCfb #-}  -- |Ciphertext feed-back encryption mode for strict bytestrings (with -- s == blockSize) cfb' :: BlockCipher k => k -> IV k -> B.ByteString -> (B.ByteString, IV k) cfb' k (IV v) msg =-	let blks = chunkFor' k msg-	    (cs,ivF) = go v blks-	in (B.concat cs, IV ivF)+        let blks = chunkFor' k msg+            (cs,ivF) = go v blks+        in (B.concat cs, IV ivF)   where   go iv [] = ([],iv)   go iv (b:bs) =-	let c = zwp' (encryptBlock k iv) b-	    (cs,ivFinal) = go c bs-	in (c:cs, ivFinal)+        let c = zwp' (encryptBlock k iv) b+            (cs,ivFinal) = go c bs+        in (c:cs, ivFinal) {-# INLINEABLE cfb' #-}  -- |Ciphertext feed-back decryption mode for strict bytestrings (with s == blockSize) unCfb' :: BlockCipher k => k -> IV k -> B.ByteString -> (B.ByteString, IV k) unCfb' k (IV v) msg =-	let blks = chunkFor' k msg-	    (ps, ivF) = go v blks-	in (B.concat ps, IV ivF)+        let blks = chunkFor' k msg+            (ps, ivF) = go v blks+        in (B.concat ps, IV ivF)   where   go iv [] = ([], iv)   go iv (b:bs) =-	let p = zwp' (encryptBlock k iv) b-	    (ps, ivF) = go b bs-	in (p:ps, ivF)+        let p = zwp' (encryptBlock k iv) b+            (ps, ivF) = go b bs+        in (p:ps, ivF) {-# INLINEABLE unCfb' #-}  -- |Output feedback mode for lazy bytestrings ofb :: BlockCipher k => k -> IV k -> L.ByteString -> (L.ByteString, IV k)-ofb = unOfb+ofb = Crypto.Modes.unOfb {-# INLINEABLE ofb #-}  -- |Output feedback mode for lazy bytestrings unOfb :: BlockCipher k => k -> IV k -> L.ByteString -> (L.ByteString, IV k) unOfb k (IV iv) msg =-	let ivStr = drop 1 (iterate (encryptBlock k) iv)-	    ivLen = fromIntegral (B.length iv)-	    newIV = IV . B.concat . L.toChunks . L.take ivLen . L.drop (L.length msg) . L.fromChunks $ ivStr-	in (zwp (L.fromChunks ivStr) msg, newIV)+        let ivStr = drop 1 (iterate (encryptBlock k) iv)+            ivLen = fromIntegral (B.length iv)+            newIV = IV . B.concat . L.toChunks . L.take ivLen . L.drop (L.length msg) . L.fromChunks $ ivStr+        in (zwp (L.fromChunks ivStr) msg, newIV) {-# INLINEABLE unOfb #-}  -- |Output feedback mode for strict bytestrings@@ -555,35 +409,35 @@ -- |Output feedback mode for strict bytestrings unOfb' :: BlockCipher k => k -> IV k -> B.ByteString -> (B.ByteString, IV k) unOfb' k (IV iv) msg =-	let ivStr = collect (B.length msg + ivLen) (drop 1 (iterate (encryptBlock k) iv))-	    ivLen = B.length iv-	    mLen = fromIntegral (B.length msg)-	    newIV = IV . B.concat . L.toChunks . L.take (fromIntegral ivLen) . L.drop mLen . L.fromChunks $ ivStr-	in (zwp' (B.concat ivStr) msg, newIV)+        let ivStr = collect (B.length msg + ivLen) (drop 1 (iterate (encryptBlock k) iv))+            ivLen = B.length iv+            mLen = fromIntegral (B.length msg)+            newIV = IV . B.concat . L.toChunks . L.take (fromIntegral ivLen) . L.drop mLen . L.fromChunks $ ivStr+        in (zwp' (B.concat ivStr) msg, newIV) {-# INLINEABLE unOfb' #-}  -- |Obtain an `IV` using the provided CryptoRandomGenerator. getIV :: (BlockCipher k, CryptoRandomGen g) => g -> Either GenError (IV k, g) getIV g =-	let bytes = ivBlockSizeBytes iv-	    gen = genBytes bytes g-	    fromRight (Right x) = x-	    iv  = IV (fst  . fromRight $ gen)-	in case gen of-		Left err -> Left err-		Right (bs,g')-			| B.length bs == bytes	-> Right (iv, g')-			| otherwise		-> Left (GenErrorOther "Generator failed to provide requested number of bytes")+        let bytes = ivBlockSizeBytes iv+            gen = genBytes bytes g+            fromRight (Right x) = x+            iv  = IV (fst  . fromRight $ gen)+        in case gen of+                Left err -> Left err+                Right (bs,g')+                        | B.length bs == bytes  -> Right (iv, g')+                        | otherwise             -> Left (GenErrorOther "Generator failed to provide requested number of bytes") {-# INLINEABLE getIV #-}  -- | Obtain an 'IV' using the system entropy (see 'System.Crypto.Random') getIVIO :: (BlockCipher k) => IO (IV k) getIVIO = do-	let p = Proxy-	    getTypedIV :: BlockCipher k => Proxy k -> IO (IV k)-	    getTypedIV pr = liftM IV (getEntropy (proxy blockSize pr `div` 8))-	iv <- getTypedIV p-	return (iv `asProxyTypeOf` ivProxy p)+        let p = Proxy+            getTypedIV :: BlockCipher k => Proxy k -> IO (IV k)+            getTypedIV pr = liftM IV (getEntropy (proxy blockSize pr `div` 8))+        iv <- getTypedIV p+        return (iv `asProxyTypeOf` ivProxy p) {-# INLINEABLE getIVIO #-}  ivProxy :: Proxy k -> Proxy (IV k)@@ -597,18 +451,18 @@  ivBlockSizeBytes :: BlockCipher k => IV k -> Int ivBlockSizeBytes iv =-	let p = deIVProxy (proxyOf iv)-	in proxy blockSize p `div` 8+        let p = deIVProxy (proxyOf iv)+        in proxy blockSize p `div` 8 {-# INLINEABLE ivBlockSizeBytes #-}  instance (BlockCipher k) => Serialize (IV k) where-	get = do-		let p = Proxy-		    doGet :: BlockCipher k => Proxy k -> Get (IV k)-	            doGet pr = liftM IV (SG.getByteString (proxy blockSizeBytes pr))-		iv <- doGet p-		return (iv `asProxyTypeOf` ivProxy p)-	put (IV iv) = SP.putByteString iv+        get = do+                let p = Proxy+                    doGet :: BlockCipher k => Proxy k -> Get (IV k)+                    doGet pr = liftM IV (SG.getByteString (proxy blockSizeBytes pr))+                iv <- doGet p+                return (iv `asProxyTypeOf` ivProxy p)+        put (IV iv) = SP.putByteString iv  -- TODO: GCM, GMAC -- Consider the AES-only modes of XTS, CCM
Crypto/Padding.hs view
@@ -13,18 +13,18 @@ -}  module Crypto.Padding-	(-	-- * PKCS5 (RFC 1423) based [un]padding routines-	  padPKCS5-	, padBlockSize-	, putPaddedPKCS5-	, unpadPKCS5safe-	, unpadPKCS5-	-- * ESP (RFC 4303) [un]padding routines-	, padESP, unpadESP-	, padESPBlockSize-	, putPadESPBlockSize, putPadESP-	) where+        (+        -- * PKCS5 (RFC 1423) based [un]padding routines+          padPKCS5+        , padBlockSize+        , putPaddedPKCS5+        , unpadPKCS5safe+        , unpadPKCS5+        -- * ESP (RFC 4303) [un]padding routines+        , padESP, unpadESP+        , padESPBlockSize+        , putPadESPBlockSize, putPadESP+        ) where  import Data.Serialize.Put import Crypto.Classes@@ -69,8 +69,8 @@ -- This routine verifies all pad bytes and pad length match correctly. unpadPKCS5safe :: B.ByteString -> Maybe B.ByteString unpadPKCS5safe bs-	| bsLen > 0 && B.all (== padLen) pad && B.length pad == pLen = Just msg-	| otherwise = Nothing+        | bsLen > 0 && B.all (== padLen) pad && B.length pad == pLen = Just msg+        | otherwise = Nothing   where   bsLen = B.length bs   padLen = B.last bs@@ -126,9 +126,9 @@ putPadESP :: Int -> B.ByteString -> Put putPadESP 0 bs = putByteString bs >> putWord8 0 putPadESP l bs = do-	putByteString bs-	putByteString pad-	putWord8 pLen+        putByteString bs+        putByteString pad+        putWord8 pLen   where   pad = B.take padLen espPad   padLen = l - ((B.length bs + 1) `rem` l)@@ -137,14 +137,14 @@ -- |A static espPad allows reuse of a single B.pack'ed pad for all calls to padESP espPad = B.pack [1..255] --- | unpad and return the padded message (Nothing is returned if the padding is invalid)+-- | unpad and return the padded message ('Nothing' is returned if the padding is invalid) unpadESP :: B.ByteString -> Maybe B.ByteString unpadESP bs =-	if bsLen == 0 || B.take pLen pad /= B.take pLen espPad-		then Nothing-		else Just msg+        if bsLen == 0 || not (constTimeEq (B.take pLen pad) (B.take pLen espPad))+                then Nothing+                else Just msg   where-  bsLen = B.length bs+  bsLen  = B.length bs   padLen = B.last bs-  pLen = fromIntegral padLen+  pLen   = fromIntegral padLen   (msg,pad) = B.splitAt (bsLen - (pLen + 1)) bs
Crypto/Random.hs view
@@ -55,20 +55,20 @@ -- if you don't want execptions from code that uses 'throw' then -- pass in a generator that never has an error for the used functions) data GenError =-	  GenErrorOther String	-- ^ Misc-	| RequestedTooManyBytes	-- ^ Requested more bytes than a+          GenErrorOther String  -- ^ Misc+        | RequestedTooManyBytes -- ^ Requested more bytes than a                                 -- single pass can generate (The                                 -- maximum request is generator                                 -- dependent)-	| RangeInvalid		-- ^ When using @genInteger g (l,h)@+        | RangeInvalid          -- ^ When using @genInteger g (l,h)@                                 -- and @logBase 2 (h - l) > (maxBound                                 -- :: Int)@.-	| NeedReseed		-- ^ Some generators cease operation+        | NeedReseed            -- ^ Some generators cease operation                                 -- after too high a count without a                                 -- reseed (ex: NIST SP 800-90)-	| NotEnoughEntropy	-- ^ For instantiating new generators+        | NotEnoughEntropy      -- ^ For instantiating new generators                                 -- (or reseeding)-	| NeedsInfiniteSeed	-- ^ This generator can not be+        | NeedsInfiniteSeed     -- ^ This generator can not be                                 -- instantiated or reseeded with a                                 -- finite seed (ex: 'SystemRandom')   deriving (Eq, Ord, Show, Typeable)@@ -82,83 +82,83 @@ -- Minimum complete definition: `newGen`, `genSeedLength`, `genBytes`, -- `reseed`. class CryptoRandomGen g where-	-- |Instantiate a new random bit generator.  The provided-	-- bytestring should be of length >= genSeedLength.  If the-	-- bytestring is shorter then the call may fail (suggested-	-- error: `NotEnoughEntropy`).  If the bytestring is of-	-- sufficent length the call should always succeed.-	newGen :: B.ByteString -> Either GenError g+        -- |Instantiate a new random bit generator.  The provided+        -- bytestring should be of length >= genSeedLength.  If the+        -- bytestring is shorter then the call may fail (suggested+        -- error: `NotEnoughEntropy`).  If the bytestring is of+        -- sufficent length the call should always succeed.+        newGen :: B.ByteString -> Either GenError g -	-- |Length of input entropy necessary to instantiate or reseed-	-- a generator-	genSeedLength :: Tagged g ByteLength+        -- |Length of input entropy necessary to instantiate or reseed+        -- a generator+        genSeedLength :: Tagged g ByteLength -	-- | @genBytes len g@ generates a random ByteString of length-	-- @len@ and new generator.  The "MonadCryptoRandom" package-	-- has routines useful for converting the ByteString to-	-- commonly needed values (but "cereal" or other-	-- deserialization libraries would also work).-	---	-- This routine can fail if the generator has gone too long-	-- without a reseed (usually this is in the ball-park of 2^48-	-- requests).  Suggested error in this cases is `NeedReseed`-	genBytes	:: ByteLength -> g -> Either GenError (B.ByteString, g)+        -- | @genBytes len g@ generates a random ByteString of length+        -- @len@ and new generator.  The "MonadCryptoRandom" package+        -- has routines useful for converting the ByteString to+        -- commonly needed values (but "cereal" or other+        -- deserialization libraries would also work).+        --+        -- This routine can fail if the generator has gone too long+        -- without a reseed (usually this is in the ball-park of 2^48+        -- requests).  Suggested error in this cases is `NeedReseed`+        genBytes        :: ByteLength -> g -> Either GenError (B.ByteString, g) -	-- |@genBytesWithEntropy g i entropy@ generates @i@ random-	-- bytes and use the additional input @entropy@ in the-	-- generation of the requested data to increase the confidence-	-- our generated data is a secure random stream.-	---	-- Some generators use @entropy@ to perturb the state of the-	-- generator, meaning:-	---	-- @-	--     (_,g2') <- genBytesWithEntropy len g1 ent-	--     (_,g2 ) <- genBytes len g1-	--     g2 /= g2'-	-- @-	---	-- But this is not required.-	---	-- Default:-	-- -	-- @-	--     genBytesWithEntropy g bytes entropy = xor entropy (genBytes g bytes)-	-- @-	genBytesWithEntropy	:: ByteLength -> B.ByteString -> g -> Either GenError (B.ByteString, g)-	genBytesWithEntropy len entropy g =-		let res = genBytes len g-		in case res of-			Left err -> Left err-			Right (bs,g') ->-				let entropy' = B.append entropy (B.replicate (len - B.length entropy) 0)-				in Right (zwp' entropy' bs, g')+        -- |@genBytesWithEntropy g i entropy@ generates @i@ random+        -- bytes and use the additional input @entropy@ in the+        -- generation of the requested data to increase the confidence+        -- our generated data is a secure random stream.+        --+        -- Some generators use @entropy@ to perturb the state of the+        -- generator, meaning:+        --+        -- @+        --     (_,g2') <- genBytesWithEntropy len g1 ent+        --     (_,g2 ) <- genBytes len g1+        --     g2 /= g2'+        -- @+        --+        -- But this is not required.+        --+        -- Default:+        -- +        -- @+        --     genBytesWithEntropy g bytes entropy = xor entropy (genBytes g bytes)+        -- @+        genBytesWithEntropy     :: ByteLength -> B.ByteString -> g -> Either GenError (B.ByteString, g)+        genBytesWithEntropy len entropy g =+                let res = genBytes len g+                in case res of+                        Left err -> Left err+                        Right (bs,g') ->+                                let entropy' = B.append entropy (B.replicate (len - B.length entropy) 0)+                                in Right (zwp' entropy' bs, g') -	-- |If the generator has produced too many random bytes on its-	-- existing seed it will throw `NeedReseed`.  In that case,-	-- reseed the generator using this function and a new-	-- high-entropy seed of length >= `genSeedLength`.  Using-	-- bytestrings that are too short can result in an error-	-- (`NotEnoughEntropy`).-	reseed		:: B.ByteString -> g -> Either GenError g+        -- |If the generator has produced too many random bytes on its+        -- existing seed it will throw `NeedReseed`.  In that case,+        -- reseed the generator using this function and a new+        -- high-entropy seed of length >= `genSeedLength`.  Using+        -- bytestrings that are too short can result in an error+        -- (`NotEnoughEntropy`).+        reseed          :: B.ByteString -> g -> Either GenError g -	-- |By default this uses "System.Crypto.Random" to obtain-	-- entropy for `newGen`.-	newGenIO :: IO g-	newGenIO = go 0-	  where-	  go 1000 = throw $ GenErrorOther $ +        -- |By default this uses "System.Crypto.Random" to obtain+        -- entropy for `newGen`.+        newGenIO :: IO g+        newGenIO = go 0+          where+          go 1000 = throw $ GenErrorOther $                            "The generator instance requested by" ++                           "newGenIO never instantiates (1000 tries). " ++                           "It must be broken."-	  go i = do-		let p = Proxy-		    getTypedGen :: (CryptoRandomGen g) => Proxy g -> IO (Either GenError g)-		    getTypedGen pr = liftM newGen (getEntropy $ proxy genSeedLength pr)-		res <- getTypedGen p-		case res of-			Left _ -> go (i+1)-			Right g -> return (g `asProxyTypeOf` p)+          go i = do+                let p = Proxy+                    getTypedGen :: (CryptoRandomGen g) => Proxy g -> IO (Either GenError g)+                    getTypedGen pr = liftM newGen (getEntropy $ proxy genSeedLength pr)+                res <- getTypedGen p+                case res of+                        Left _ -> go (i+1)+                        Right g -> return (g `asProxyTypeOf` p)  -- |get a random number generator based on the standard system entropy source getSystemGen :: IO SystemRandom@@ -211,8 +211,8 @@     Left e -> Left e     Right (ent,g') ->         case newGen ent of-		Right new -> Right (g',new)-		Left e -> Left e+                Right new -> Right (g',new)+                Left e -> Left e  -- | Useful utility to extract the result of a generator operation -- and translate error results to exceptions.
Crypto/Types.hs view
@@ -4,6 +4,19 @@ import Data.ByteString as B import Data.ByteString.Lazy as L +-- |Initilization Vectors for BlockCipher implementations (IV k) are+-- used for various modes and guarrenteed to be blockSize bits long.+-- The common ways to obtain an IV are to generate one ('getIV' or+-- 'getIVIO') or to use one provided with the ciphertext (using the+-- 'Serialize' instance of IV).+--+-- 'zeroIV' also exists and is of particular use for starting 'ctr'+-- mode with a fresh key.+data IV k = IV { initializationVector :: {-# UNPACK #-} !B.ByteString+               } deriving (Eq, Ord, Show)+++ -- |The length of a field (usually a ByteString) in bits type BitLength = Int 
crypto-api.cabal view
@@ -1,9 +1,9 @@ name:           crypto-api-version:        0.10.2+version:        0.11 license:        BSD3 license-file:   LICENSE-copyright:      Thomas DuBuisson <thomas.dubuisson@gmail.com>, Francisco Blas Izquierdo Riera (klondike) (see AUTHORS)-author:         Thomas DuBuisson <thomas.dubuisson@gmail.com>, Francisco Blas Izquierdo Riera (klondike)+copyright:      Thomas DuBuisson <thomas.dubuisson@gmail.com>+author:         Thomas DuBuisson <thomas.dubuisson@gmail.com> maintainer:     Thomas DuBuisson <thomas.dubuisson@gmail.com> description:    A generic interface for cryptographic operations (hashes, ciphers, randomness). @@ -34,12 +34,12 @@                  bytestring >= 0.9 && < 0.11,                  cereal >= 0.2 && < 0.4,                  tagged >= 0.1 && < 0.5,-                 largeword >= 1.0.0, array, entropy+                 entropy, transformers   ghc-options:   hs-source-dirs:-  exposed-modules: Crypto.Classes, Crypto.Types, Crypto.HMAC, -                   Crypto.Modes, Crypto.Random, Crypto.Padding-  other-modules: Crypto.Util, Crypto.CPoly+  exposed-modules: Crypto.Classes, Crypto.Types, Crypto.HMAC,+                   Crypto.Random, Crypto.Padding, Crypto.Modes+  other-modules: Crypto.Util   extensions: ForeignFunctionInterface, MultiParamTypeClasses,               BangPatterns, FunctionalDependencies, FlexibleInstances,               TypeSynonymInstances