http2 0.2.0 → 0.3.0
raw patch · 18 files changed
+417/−372 lines, 18 filesdep ~bytestring
Dependency ranges changed: bytestring
Files
- Network/HPACK/Context.hs +4/−0
- Network/HPACK/HeaderBlock/Decode.hs +41/−19
- Network/HPACK/HeaderBlock/Encode.hs +26/−11
- Network/HPACK/HeaderBlock/From.hs +9/−1
- Network/HPACK/HeaderBlock/HeaderField.hs +4/−2
- Network/HPACK/HeaderBlock/String.hs +1/−6
- Network/HPACK/HeaderBlock/To.hs +1/−1
- Network/HPACK/Huffman/Encode.hs +0/−1
- Network/HPACK/Huffman/Table.hs +223/−225
- Network/HPACK/Table/Static.hs +6/−5
- http2.cabal +2/−2
- test-hpack/HPACKDecode.hs +3/−3
- test-hpack/HPACKEncode.hs +3/−3
- test-hpack/Types.hs +15/−14
- test/DecodeSpec.hs +12/−12
- test/HeaderBlock.hs +43/−43
- test/HeaderBlockSpec.hs +12/−12
- test/HuffmanSpec.hs +12/−12
Network/HPACK/Context.hs view
@@ -4,6 +4,7 @@ , Context , newContextForEncoding , newContextForDecoding+ , changeContextForDecoding , DecodeError(..) , printContext -- * Initialization and final results@@ -64,6 +65,9 @@ newContextForDecoding maxsiz = do hdrtbl <- newHeaderTableForDecoding maxsiz return $ Context hdrtbl emptyReferenceSet++changeContextForDecoding :: Context -> Size -> IO Context+changeContextForDecoding _ctx siz = newContextForDecoding siz -- fixme: copy table ----------------------------------------------------------------
Network/HPACK/HeaderBlock/Decode.hs view
@@ -28,45 +28,61 @@ -> Either DecodeError (HeaderField, ByteString) toHeaderField bs | BS.null bs = Left EmptyBlock- | w `testBit` 7 = Right $ indexed w bs'- | w `testBit` 6 = withoutIndexing w bs'- | otherwise = incrementalIndexing w bs'+ | w `testBit` 7 = indexed w bs'+ | w `testBit` 6 = incrementalIndexing w bs'+ | w `testBit` 5 = if w `testBit` 4 then clear w bs' else maxSize w bs'+ | w `testBit` 4 = neverIndexing w bs'+ | otherwise = withoutIndexing w bs' where w = BS.head bs bs' = BS.tail bs ---------------------------------------------------------------- -indexed :: Word8 -> ByteString -> (HeaderField, ByteString)-indexed w ws = (Indexed idx , ws')+indexed :: Word8 -> ByteString -> Either DecodeError (HeaderField, ByteString)+indexed w ws = Right (Indexed idx , ws') where w' = clearBit w 7 (idx, ws') = I.parseInteger 7 w' ws +incrementalIndexing :: Word8 -> ByteString+ -> Either DecodeError (HeaderField, ByteString)+incrementalIndexing w ws+ | isIndexedName1 w = indexedName Add w ws 6 mask6+ | otherwise = newName Add ws++clear :: Word8 -> ByteString -> Either DecodeError (HeaderField, ByteString)+clear _ ws = Right (Clear, ws)++maxSize :: Word8 -> ByteString -> Either DecodeError (HeaderField, ByteString)+maxSize w ws = Right (ChangeTableSize siz, ws')+ where+ w' = mask4 w+ (siz, ws') = I.parseInteger 4 w' ws+ withoutIndexing :: Word8 -> ByteString -> Either DecodeError (HeaderField, ByteString) withoutIndexing w ws- | isIndexedName w = indexedName NotAdd w ws- | otherwise = newName NotAdd ws+ | isIndexedName2 w = indexedName NotAdd w ws 4 mask4+ | otherwise = newName NotAdd ws -incrementalIndexing :: Word8 -> ByteString- -> Either DecodeError (HeaderField, ByteString)-incrementalIndexing w ws- | isIndexedName w = indexedName Add w ws- | otherwise = newName Add ws+neverIndexing :: Word8 -> ByteString+ -> Either DecodeError (HeaderField, ByteString)+neverIndexing w ws+ | isIndexedName2 w = indexedName Never w ws 4 mask4+ | otherwise = newName Never ws ---------------------------------------------------------------- -indexedName :: Indexing -> Word8 -> ByteString+indexedName :: Indexing -> Word8 -> ByteString -> Int -> (Word8 -> Word8) -> Either DecodeError (HeaderField, ByteString)-indexedName indexing w ws = do+indexedName indexing w ws n mask = do (val,ws'') <- headerStuff ws' let hf = Literal indexing (Idx idx) val return (hf, ws'') where- p = mask6 w- (idx,ws') = I.parseInteger 6 p ws-+ p = mask w+ (idx,ws') = I.parseInteger n p ws newName :: Indexing -> ByteString -> Either DecodeError (HeaderField, ByteString)@@ -95,8 +111,14 @@ mask6 :: Word8 -> Word8 mask6 w = w .&. 63 -isIndexedName :: Word8 -> Bool-isIndexedName w = mask6 w /= 0+mask4 :: Word8 -> Word8+mask4 w = w .&. 15++isIndexedName1 :: Word8 -> Bool+isIndexedName1 w = mask6 w /= 0++isIndexedName2 :: Word8 -> Bool+isIndexedName2 w = mask4 w /= 0 ----------------------------------------------------------------
Network/HPACK/HeaderBlock/Encode.hs view
@@ -23,14 +23,27 @@ toBB = fromHeaderField huff fromHeaderField :: Bool -> HeaderField -> Builder+fromHeaderField _ Clear = clear+fromHeaderField _ (ChangeTableSize siz) = change siz fromHeaderField _ (Indexed idx) = index idx-fromHeaderField huff (Literal NotAdd (Idx idx) v) = indexedName huff set01 idx v-fromHeaderField huff (Literal NotAdd (Lit key) v) = newName huff set01 key v-fromHeaderField huff (Literal Add (Idx idx) v) = indexedName huff set00 idx v-fromHeaderField huff (Literal Add (Lit key) v) = newName huff set00 key v+fromHeaderField huff (Literal Add (Idx idx) v) = indexedName huff 6 set01 idx v+fromHeaderField huff (Literal Add (Lit key) v) = newName huff set01 key v+fromHeaderField huff (Literal NotAdd (Idx idx) v) = indexedName huff 4 set0000 idx v+fromHeaderField huff (Literal NotAdd (Lit key) v) = newName huff set0000 key v+fromHeaderField huff (Literal Never (Idx idx) v) = indexedName huff 4 set0001 idx v+fromHeaderField huff (Literal Never (Lit key) v) = newName huff set0001 key v ---------------------------------------------------------------- +clear :: Builder+clear = BB.fromWord8s [48]++change :: Int -> Builder+change i = BB.fromWord8s (w':ws)+ where+ (w:ws) = I.encode 4 i+ w' = set001 w+ index :: Int -> Builder index i = BB.fromWord8s (w':ws) where@@ -38,10 +51,10 @@ w' = set1 w -- Using Huffman encoding-indexedName :: Bool -> Setter -> Int -> HeaderValue -> Builder-indexedName huff set idx v = pre <> vlen <> val+indexedName :: Bool -> Int -> Setter -> Int -> HeaderValue -> Builder+indexedName huff n set idx v = pre <> vlen <> val where- (p:ps) = I.encode 6 idx+ (p:ps) = I.encode n idx pre = BB.fromWord8s $ set p : ps value = S.encode huff v valueLen = BS.length value@@ -73,10 +86,12 @@ type Setter = Word8 -> Word8 -- Assuming MSBs are 0.-set1, set01, set00 :: Setter-set1 x = x `setBit` 7-set01 x = x `setBit` 6-set00 = id+set1, set01, set001, set0001, set0000 :: Setter+set1 x = x `setBit` 7+set01 x = x `setBit` 6+set001 x = x `setBit` 5+set0001 x = x `setBit` 4+set0000 = id setH :: [Word8] -> [Word8] setH [] = error "setH"
Network/HPACK/HeaderBlock/From.hs view
@@ -33,8 +33,11 @@ -- | Decoding step for one 'HeaderField'. Exporting for the -- test purpose. decodeStep :: Step+decodeStep (!ctx,!builder) Clear = return (clearRefSets ctx,builder)+decodeStep (!ctx,!builder) (ChangeTableSize siz) = do+ ctx' <- changeContextForDecoding ctx siz+ return (ctx',builder) decodeStep (!ctx,!builder) (Indexed idx)- | idx == 0 = return (clearRefSets ctx,builder) | isPresent = return (removeRef ctx idx, builder) | otherwise = do w <- whichTable idx ctx@@ -50,6 +53,11 @@ where isPresent = idx `isPresentIn` ctx decodeStep (!ctx,!builder) (Literal NotAdd naming v) = do+ k <- fromNaming naming ctx+ let b = builder << (k,v)+ return (ctx, b)+-- fixme: how to treat Never?+decodeStep (!ctx,!builder) (Literal Never naming v) = do k <- fromNaming naming ctx let b = builder << (k,v) return (ctx, b)
Network/HPACK/HeaderBlock/HeaderField.hs view
@@ -22,12 +22,14 @@ emptyHeaderBlock = [] -- | Type for representation.-data HeaderField = Indexed Index+data HeaderField = Clear+ | ChangeTableSize Int+ | Indexed Index | Literal Indexing Naming HeaderValue deriving (Eq,Show) -- | Whether or not adding to a table.-data Indexing = Add | NotAdd deriving (Eq,Show)+data Indexing = Add | NotAdd | Never deriving (Eq,Show) -- | Index or literal. data Naming = Idx Index | Lit HeaderName deriving (Eq,Show)
Network/HPACK/HeaderBlock/String.hs view
@@ -13,11 +13,6 @@ encode True h = Huffman.encode h encode _ h = h --- fixme: removing--- | Decoding 'ByteString' to 'HeaderStuff' according to 'HuffmanDecoding'.-decode :: ByteString -> Either DecodeError HeaderStuff-decode ws = Huffman.decode ws- -- | Parsing 'HeaderStuff' from 'ByteString'. -- The second 'Bool' is whether or not huffman encoding is used. -- The third 'Int' is the length of the encoded string.@@ -26,6 +21,6 @@ parseString False len bs = Right (es, bs') where (es, bs') = BS.splitAt len bs-parseString True len bs = decode es >>= \x -> return (x,bs')+parseString True len bs = Huffman.decode es >>= \x -> return (x,bs') where (es, bs') = BS.splitAt len bs
Network/HPACK/HeaderBlock/To.hs view
@@ -46,7 +46,7 @@ reset :: Context -> IO Ctx reset ctx = do let ctx' = clearRefSets ctx- initialHeaderBlock = singleton $ Indexed 0+ initialHeaderBlock = singleton Clear return (ctx', initialHeaderBlock) ----------------------------------------------------------------
Network/HPACK/Huffman/Encode.hs view
@@ -38,7 +38,6 @@ aosa :: AOSA aosa = listArray (0,idxEos) $ map toShiftedArray huffmanTable --- fixme -- | -- -- >>> toShifted [T,T,T,T] 0
Network/HPACK/Huffman/Table.hs view
@@ -4,229 +4,7 @@ huffmanTable :: [Bits] huffmanTable = [- [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,T]- , [T,T,T,F,T,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,F,T]- , [T,F,F,T,F,F]- , [T,T,F,T,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,F]- , [T,T,T,T,T,T,T,T,F,T,F]- , [T,T,T,T,T,T,T,T,F,T,T]- , [T,T,T,T,T,T,T,F,T,F]- , [T,T,T,T,T,T,T,T,T,F,F]- , [T,T,T,F,T,F,F,T]- , [T,F,F,T,F,T]- , [F,F,T,F,F]- , [F,F,F,F]- , [F,F,T,F,T]- , [F,F,T,T,F]- , [F,F,T,T,T]- , [T,F,F,T,T,F]- , [T,F,F,T,T,T]- , [T,F,T,F,F,F]- , [T,F,T,F,F,T]- , [T,F,T,F,T,F]- , [T,F,T,F,T,T]- , [T,F,T,T,F,F]- , [T,T,T,T,F,T,T,F,F]- , [T,T,T,F,T,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F]- , [T,F,T,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F]- , [T,T,T,T,F,T,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,F,T,T]- , [T,T,F,T,T,T,T]- , [T,T,T,F,T,F,T,T]- , [T,T,T,F,T,T,F,F]- , [T,T,T,F,T,T,F,T]- , [T,T,T,F,T,T,T,F]- , [T,T,T,F,F,F,F]- , [T,T,T,T,F,T,T,T,F]- , [T,T,T,T,F,T,T,T,T]- , [T,T,T,T,T,F,F,F,F]- , [T,T,T,T,T,F,F,F,T]- , [T,T,T,T,T,T,T,F,T,T]- , [T,T,T,T,T,F,F,T,F]- , [T,T,T,F,T,T,T,T]- , [T,T,T,T,T,F,F,T,T]- , [T,T,T,T,T,F,T,F,F]- , [T,T,T,T,T,F,T,F,T]- , [T,T,T,T,T,F,T,T,F]- , [T,T,T,T,T,F,T,T,T]- , [T,T,T,T,F,F,F,F]- , [T,T,T,T,F,F,F,T]- , [T,T,T,T,T,T,F,F,F]- , [T,T,T,T,T,T,F,F,T]- , [T,T,T,T,T,T,F,T,F]- , [T,T,T,T,T,T,F,T,T]- , [T,T,T,T,T,T,T,F,F]- , [T,T,T,T,T,T,T,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,F,T]- , [T,F,T,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F]- , [F,T,F,F,F]- , [T,F,T,T,T,T]- , [F,T,F,F,T]- , [T,T,F,F,F,F]- , [F,F,F,T]- , [T,T,F,F,F,T]- , [T,T,F,F,T,F]- , [T,T,F,F,T,T]- , [F,T,F,T,F]- , [T,T,T,F,F,F,T]- , [T,T,T,F,F,T,F]- , [F,T,F,T,T]- , [T,T,F,T,F,F]- , [F,T,T,F,F]- , [F,T,T,F,T]- , [F,T,T,T,F]- , [T,T,T,T,F,F,T,F]- , [F,T,T,T,T]- , [T,F,F,F,F]- , [T,F,F,F,T]- , [T,T,F,T,F,T]- , [T,T,T,F,F,T,T]- , [T,T,F,T,T,F]- , [T,T,T,T,F,F,T,T]- , [T,T,T,T,F,T,F,F]- , [T,T,T,T,F,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T]- , [T,T,T,T,T,T,T,T,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,T,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,T,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,F,F]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,F,T]- , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,T,F]+ [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,T,F] , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,T,T] , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,F,F] , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,F,T]@@ -258,9 +36,229 @@ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,T] , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,F] , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,T]+ , [F,F,T,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,F,F]+ , [T,T,T,T,T,F,F,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,F,F]+ , [F,T,T,T,T,F]+ , [T,T,F,F,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,F,T]+ , [T,T,T,T,T,T,T,F,T,F]+ , [T,T,T,T,T,F,F,F,T]+ , [T,T,T,T,T,T,T,F,T,T]+ , [T,T,T,T,T,T,T,T,F,F]+ , [T,T,F,F,T,F,T]+ , [T,T,F,F,T,T,F]+ , [F,T,T,T,T,T]+ , [F,F,T,T,T]+ , [F,F,F,F]+ , [F,F,F,T]+ , [F,F,T,F]+ , [F,T,F,F,F]+ , [T,F,F,F,F,F]+ , [T,F,F,F,F,T]+ , [T,F,F,F,T,F]+ , [T,F,F,F,T,T]+ , [T,F,F,T,F,F]+ , [T,F,F,T,F,T]+ , [T,F,F,T,T,F]+ , [T,T,T,F,T,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F]+ , [T,F,F,T,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,F,T]+ , [T,T,T,T,T,T,T,T,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,F]+ , [T,T,F,F,T,T,T]+ , [T,T,T,F,T,T,F,T]+ , [T,T,T,F,T,T,T,F]+ , [T,T,F,T,F,F,F]+ , [T,T,T,F,T,T,T,T]+ , [T,T,F,T,F,F,T]+ , [T,T,F,T,F,T,F]+ , [T,T,T,T,T,F,F,T,F]+ , [T,T,T,T,F,F,F,F]+ , [T,T,T,T,T,F,F,T,T]+ , [T,T,T,T,T,F,T,F,F]+ , [T,T,T,T,T,F,T,F,T]+ , [T,T,F,T,F,T,T]+ , [T,T,F,T,T,F,F]+ , [T,T,T,T,F,F,F,T]+ , [T,T,T,T,F,F,T,F]+ , [T,T,T,T,T,F,T,T,F]+ , [T,T,T,T,T,F,T,T,T]+ , [T,T,F,T,T,F,T]+ , [T,F,T,F,F,F]+ , [T,T,T,T,F,F,T,T]+ , [T,T,T,T,T,T,F,F,F]+ , [T,T,T,T,T,T,F,F,T]+ , [T,T,T,T,F,T,F,F]+ , [T,T,T,T,T,T,F,T,F]+ , [T,T,T,T,T,T,F,T,T]+ , [T,T,T,T,T,T,T,T,T,F,F] , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,F]+ , [T,T,T,T,T,T,T,T,T,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,F,T]+ , [T,T,F,T,T,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F]+ , [F,T,F,F,T]+ , [T,T,F,T,T,T,T]+ , [F,T,F,T,F]+ , [T,F,T,F,F,T]+ , [F,T,F,T,T]+ , [T,T,T,F,F,F,F]+ , [T,F,T,F,T,F]+ , [T,F,T,F,T,T]+ , [F,T,T,F,F]+ , [T,T,T,T,F,T,F,T]+ , [T,T,T,T,F,T,T,F]+ , [T,F,T,T,F,F]+ , [T,F,T,T,F,T]+ , [T,F,T,T,T,F]+ , [F,T,T,F,T]+ , [T,F,T,T,T,T]+ , [T,T,T,T,T,T,T,F,F]+ , [T,T,F,F,F,F]+ , [T,T,F,F,F,T]+ , [F,T,T,T,F]+ , [T,T,T,F,F,F,T]+ , [T,T,T,F,F,T,F]+ , [T,T,T,F,F,T,T]+ , [T,T,T,F,T,F,F]+ , [T,T,T,F,T,F,T]+ , [T,T,T,T,F,T,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T]+ , [T,T,T,T,T,T,T,T,T,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F]+ , [T,T,T,T,T,T,T,T,T,T,F,T] , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,T] , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,F]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,T]+ , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,F] ]--
Network/HPACK/Table/Static.hs view
@@ -36,7 +36,7 @@ -- -- >>> toStaticEntry (SIndex 8) -- (42,(":status","200"))--- >>> toStaticEntry (SIndex 49)+-- >>> toStaticEntry (SIndex 50) -- (37,("range","")) toStaticEntry :: SIndex -> Entry toStaticEntry (SIndex sidx) = staticTable ! sidx@@ -63,11 +63,12 @@ , (":scheme","http") , (":scheme","https") , (":status","200")- , (":status","500")- , (":status","404")- , (":status","403")+ , (":status","204")+ , (":status","206")+ , (":status","304") , (":status","400")- , (":status","401")+ , (":status","404")+ , (":status","500") , ("accept-charset","") , ("accept-encoding","") , ("accept-language","")
http2.cabal view
@@ -1,12 +1,12 @@ Name: http2-Version: 0.2.0+Version: 0.3.0 Author: Kazu Yamamoto <kazu@iij.ad.jp> Maintainer: Kazu Yamamoto <kazu@iij.ad.jp> License: BSD3 License-File: LICENSE Synopsis: HTTP/2.0 library including HPACK Description: HTTP/2.0 library including HPACK.- Currently only HPACK 06 is supported.+ Currently only HPACK 07 is supported. Category: Network Cabal-Version: >= 1.10 Build-Type: Simple
test-hpack/HPACKDecode.hs view
@@ -27,9 +27,9 @@ data Result = Pass | Fail String deriving (Eq,Show) run :: Bool -> Test -> IO Result-run _ (Test _ _ _ []) = return $ Pass-run d (Test _ _ _ ccs@(c:_)) = do- let siz = size c+run _ (Test _ _ []) = return $ Pass+run d (Test _ _ ccs@(c:_)) = do+ let siz = maybe 4096 id $ size c dctx <- newContextForDecoding siz let conf = Conf { debug = d } testLoop conf ccs dctx
test-hpack/HPACKEncode.hs view
@@ -21,9 +21,9 @@ } run :: Bool -> EncodeStrategy -> Test -> IO [ByteString]-run _ _ (Test _ _ _ []) = return []-run d stgy (Test _ _ _ ccs@(c:_)) = do- let siz = size c+run _ _ (Test _ _ []) = return []+run d stgy (Test _ _ ccs@(c:_)) = do+ let siz = maybe 4096 id $ size c ectx <- newContextForEncoding siz let conf = Conf { debug = d, enc = encodeHeader stgy } testLoop conf ccs ectx []
test-hpack/Types.hs view
@@ -32,13 +32,12 @@ data Test = Test { draft :: Int- , context :: String , description :: String , cases :: [Case] } deriving Show data Case = Case {- size :: Int+ size :: Maybe Int , wire :: ByteString , headers :: HeaderSet , seqno :: Maybe Int@@ -46,31 +45,33 @@ instance FromJSON Test where parseJSON (Object o) = Test <$> o .: "draft"- <*> o .: "context" <*> o .: "description" <*> o .: "cases" parseJSON _ = mzero instance ToJSON Test where- toJSON (Test n ctx desc cs) = object ["draft" .= n- ,"context" .= ctx- ,"description" .= desc- ,"cases" .= cs- ]+ toJSON (Test n desc cs) = object ["draft" .= n+ ,"description" .= desc+ ,"cases" .= cs+ ] instance FromJSON Case where- parseJSON (Object o) = Case <$> o .: "header_table_size"+ parseJSON (Object o) = Case <$> o .:? "header_table_size" <*> (textToByteString <$> (o .: "wire")) <*> o .: "headers" <*> o .:? "seqno" parseJSON _ = mzero instance ToJSON Case where- toJSON (Case siz w hs no) = object ["header_table_size" .= siz- ,"wire" .= byteStringToText w- ,"headers" .= hs- ,"seqno" .= no- ]+ toJSON (Case (Just siz) w hs no) = object ["header_table_size" .= siz+ ,"wire" .= byteStringToText w+ ,"headers" .= hs+ ,"seqno" .= no+ ]+ toJSON (Case Nothing w hs no) = object ["wire" .= byteStringToText w+ ,"headers" .= hs+ ,"seqno" .= no+ ] instance FromJSON HeaderSet where parseJSON (Array a) = mapM parseJSON $ V.toList a
test/DecodeSpec.hs view
@@ -14,16 +14,16 @@ spec = do describe "fromHeaderBlock" $ do it "decodes HeaderSet in request" $ do- (c1,h1) <- newContextForDecoding 4096 >>= flip fromHeaderBlock e31- h1 `shouldBeSameAs` e31h- (c2,h2) <- fromHeaderBlock c1 e32- h2 `shouldBeSameAs` e32h- (_,h3) <- fromHeaderBlock c2 e33- h3 `shouldBeSameAs` e33h+ (c1,h1) <- newContextForDecoding 4096 >>= flip fromHeaderBlock d41+ h1 `shouldBeSameAs` d41h+ (c2,h2) <- fromHeaderBlock c1 d42+ h2 `shouldBeSameAs` d42h+ (_,h3) <- fromHeaderBlock c2 d43+ h3 `shouldBeSameAs` d43h it "decodes HeaderSet in response" $ do- (c1,h1) <- newContextForDecoding 256 >>= flip fromHeaderBlock e51- h1 `shouldBeSameAs` e51h- (c2,h2) <- fromHeaderBlock c1 e52- h2 `shouldBeSameAs` e52h- (_,h3) <- fromHeaderBlock c2 e53- h3 `shouldBeSameAs` e53h+ (c1,h1) <- newContextForDecoding 256 >>= flip fromHeaderBlock d61+ h1 `shouldBeSameAs` d61h+ (c2,h2) <- fromHeaderBlock c1 d62+ h2 `shouldBeSameAs` d62h+ (_,h3) <- fromHeaderBlock c2 d63+ h3 `shouldBeSameAs` d63h
test/HeaderBlock.hs view
@@ -10,42 +10,42 @@ ---------------------------------------------------------------- -e31 :: HeaderBlock-e31 = [+d41 :: HeaderBlock+d41 = [ Indexed 2 , Indexed 7 , Indexed 6 , Literal Add (Idx 4) "www.example.com" ] -e31h :: HeaderSet-e31h = [(":method","GET")+d41h :: HeaderSet+d41h = [(":method","GET") ,(":scheme","http") ,(":path","/") ,(":authority","www.example.com") ] -e31b :: ByteStream-e31b = fromHexString "828786048bdb6d883e68d1cb1225ba7f"+d41b :: ByteStream+d41b = fromHexString "828786448ce7cf9bebe89b6fb16fa9b6ff" -e32 :: HeaderBlock-e32 = [- Literal Add (Idx 27) "no-cache"+d42 :: HeaderBlock+d42 = [+ Literal Add (Idx 28) "no-cache" ] -e32h :: HeaderSet-e32h = [("cache-control","no-cache")+d42h :: HeaderSet+d42h = [("cache-control","no-cache") ,(":method","GET") ,(":scheme","http") ,(":path","/") ,(":authority","www.example.com")] -e32b :: ByteStream-e32b = fromHexString "1b8663654a1398ff"+d42b :: ByteStream+d42b = fromHexString "5c86b9b9949556bf" -e33 :: HeaderBlock-e33 = [- Indexed 0+d43 :: HeaderBlock+d43 = [+ Clear , Indexed 5 , Indexed 12 , Indexed 11@@ -53,72 +53,72 @@ , Literal Add (Lit "custom-key") "custom-value" ] -e33h :: HeaderSet-e33h = [(":method","GET")+d43h :: HeaderSet+d43h = [(":method","GET") ,(":scheme","https") ,(":path","/index.html") ,(":authority","www.example.com") ,("custom-key","custom-value") ] -e33b :: ByteStream-e33b = fromHexString "80858c8b8400884eb08b749790fa7f894eb08b74979a17a8ff"+d43b :: ByteStream+d43b = fromHexString "30858c8b844088571c5cdb737b2faf89571c5cdb73724d9c57" ---------------------------------------------------------------- -e51 :: HeaderBlock-e51 = [+d61 :: HeaderBlock+d61 = [ Literal Add (Idx 8) "302"- , Literal Add (Idx 24) "private"- , Literal Add (Idx 34) "Mon, 21 Oct 2013 20:13:21 GMT"- , Literal Add (Idx 48) "https://www.example.com"+ , Literal Add (Idx 25) "private"+ , Literal Add (Idx 35) "Mon, 21 Oct 2013 20:13:21 GMT"+ , Literal Add (Idx 49) "https://www.example.com" ] -e51h :: HeaderSet-e51h = [(":status","302")+d61h :: HeaderSet+d61h = [(":status","302") ,("cache-control","private") ,("date","Mon, 21 Oct 2013 20:13:21 GMT") ,("location","https://www.example.com") ] -e51b :: ByteStream-e51b = fromHexString "088298a7188573d5cd111f2298ef6b3a7a0e6e8fa263d0729a6e8397d869bd873747bbbfc73090ce31743d801b6db107cd1a396244b74f"+d61b :: ByteStream+d61b = fromHexString "488240175985bf06724b976393d6dbb29884de2a718805062098513109b56ba37191adcebf198e7e7cf9bebe89b6fb16fa9b6f" -e52 :: HeaderBlock-e52 = [+d62 :: HeaderBlock+d62 = [ Indexed 12 ] -e52h :: HeaderSet-e52h = [(":status","200")+d62h :: HeaderSet+d62h = [(":status","200") ,("cache-control","private") ,("date","Mon, 21 Oct 2013 20:13:21 GMT") ,("location","https://www.example.com") ] -e52b :: ByteStream-e52b = fromHexString "8c"+d62b :: ByteStream+d62b = fromHexString "8c" -e53 :: HeaderBlock-e53 = [+d63 :: HeaderBlock+d63 = [ Indexed 4 , Indexed 4 , Literal Add (Idx 3) "Mon, 21 Oct 2013 20:13:22 GMT"- , Literal Add (Idx 29) "gzip"+ , Literal Add (Idx 30) "gzip" , Indexed 4 , Indexed 4 , Indexed 3 , Indexed 3- ,Literal Add (Idx 58) "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1"+ ,Literal Add (Idx 59) "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1" ] -e53h :: HeaderSet-e53h = [("cache-control","private")+d63h :: HeaderSet+d63h = [("cache-control","private") ,("date","Mon, 21 Oct 2013 20:13:22 GMT") ,("content-encoding","gzip") ,("location","https://www.example.com") ,(":status","200") ,("set-cookie","foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1")] -e53b :: ByteStream-e53b = fromHexString "84840398ef6b3a7a0e6e8fa263d0729a6e8397d869bd873f47bbbfc71d83cbd54e848483833ab3c5adb77f876fc7fbf7fdbfbebff3f7f4fb7ebbbe9f5f87e37fefedfaeefa7c3f1d5d1a23ce546436cd494bd5d1cc5f0535969b"+d63b :: ByteStream+d63b = fromHexString "84844393d6dbb29884de2a718805062098513111b56ba35e84abdd97ff848483837bb1e0d6cf9f6e8f9fd3e5f6fa76fefd3c7edf9eff1f2f0f3cfe9f6fcf7f8f879f61ad4f4cc9a973a2200ec3725e18b1b74e3f"
test/HeaderBlockSpec.hs view
@@ -13,21 +13,21 @@ spec = do describe "toByteStream" $ do it "encodes HeaderBlock" $ do- toByteStream True e31 `shouldBe` e31b- toByteStream True e32 `shouldBe` e32b- toByteStream True e33 `shouldBe` e33b- toByteStream True e51 `shouldBe` e51b- toByteStream True e52 `shouldBe` e52b- toByteStream True e53 `shouldBe` e53b+ toByteStream True d41 `shouldBe` d41b+ toByteStream True d42 `shouldBe` d42b+ toByteStream True d43 `shouldBe` d43b+ toByteStream True d61 `shouldBe` d61b+ toByteStream True d62 `shouldBe` d62b+ toByteStream True d63 `shouldBe` d63b describe "fromByteStream" $ do it "encodes HeaderBlock" $ do- fromByteStream e31b `shouldBe` Right e31- fromByteStream e32b `shouldBe` Right e32- fromByteStream e33b `shouldBe` Right e33- fromByteStream e51b `shouldBe` Right e51- fromByteStream e52b `shouldBe` Right e52- fromByteStream e53b `shouldBe` Right e53+ fromByteStream d41b `shouldBe` Right d41+ fromByteStream d42b `shouldBe` Right d42+ fromByteStream d43b `shouldBe` Right d43+ fromByteStream d61b `shouldBe` Right d61+ fromByteStream d62b `shouldBe` Right d62+ fromByteStream d63b `shouldBe` Right d63 describe "toByteStream & fromByteStream" $ do prop "duality for request" $ \k v -> do let key = BS.pack ('k':k)
test/HuffmanSpec.hs view
@@ -14,16 +14,16 @@ testData :: [(ByteString, ByteString)] testData = [ ("", "")- , ("www.example.com", "db6d883e68d1cb1225ba7f")- , ("no-cache", "63654a1398ff")- , ("custom-key", "4eb08b749790fa7f")- , ("custom-value", "4eb08b74979a17a8ff")- , ("private", "73d5cd111f")- , ("Mon, 21 Oct 2013 20:13:21 GMT", "ef6b3a7a0e6e8fa263d0729a6e8397d869bd873747bbbfc7")- , ("https://www.example.com", "ce31743d801b6db107cd1a396244b74f")- , ("Mon, 21 Oct 2013 20:13:22 GMT", "ef6b3a7a0e6e8fa263d0729a6e8397d869bd873f47bbbfc7")- , ("gzip", "cbd54e")- , ("foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1", "c5adb77f876fc7fbf7fdbfbebff3f7f4fb7ebbbe9f5f87e37fefedfaeefa7c3f1d5d1a23ce546436cd494bd5d1cc5f0535969b")+ , ("www.example.com", "e7cf9bebe89b6fb16fa9b6ff")+ , ("no-cache", "b9b9949556bf")+ , ("custom-key", "571c5cdb737b2faf")+ , ("custom-value", "571c5cdb73724d9c57")+ , ("private", "bf06724b97")+ , ("Mon, 21 Oct 2013 20:13:21 GMT", "d6dbb29884de2a718805062098513109b56ba3")+ , ("https://www.example.com", "adcebf198e7e7cf9bebe89b6fb16fa9b6f")+ , ("Mon, 21 Oct 2013 20:13:22 GMT", "d6dbb29884de2a718805062098513111b56ba3")+ , ("gzip", "abdd97ff")+ , ("foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1", "e0d6cf9f6e8f9fd3e5f6fa76fefd3c7edf9eff1f2f0f3cfe9f6fcf7f8f879f61ad4f4cc9a973a2200ec3725e18b1b74e3f") ] shouldBeEncoded :: ByteString -> ByteString -> Expectation@@ -48,6 +48,6 @@ describe "decode" $ do it "decodes" $ do "ff" `shouldBeDecoded` Left TooLongEos- "fffff77f" `shouldBeDecoded` Right "\1"- "fffff77fff" `shouldBeDecoded` Left TooLongEos+ "ffffeeff" `shouldBeDecoded` Right "\1"+ "ffffeeffff" `shouldBeDecoded` Left TooLongEos mapM_ (\(x,y) -> y `shouldBeDecoded` Right x) testData