{-# LANGUAGE OverloadedStrings #-}
module Network.HPACK.Huffman.Decode (
decodeH,
decodeHuffman,
HuffmanDecoder,
decH,
GCBuffer,
) where
import qualified Control.Exception as E
import Data.Array (Array, listArray)
import Data.Array.Base (unsafeAt)
import qualified Data.ByteString as BS
import Network.ByteOrder
import Imports
import Network.HPACK.Huffman.Bit
import Network.HPACK.Huffman.Params
import Network.HPACK.Huffman.Table
import Network.HPACK.Huffman.Tree
import Network.HPACK.Types (DecodeError (..))
type HuffmanDecoder = ReadBuffer -> Int -> IO ByteString
data Pin
= EndOfString
| Forward {-# UNPACK #-} Word8
| GoBack
{-# UNPACK #-} Word8
{-# UNPACK #-} Word8
| GoBack2
{-# UNPACK #-} Word8
{-# UNPACK #-} Word8
{-# UNPACK #-} Word8
deriving (Int -> Pin -> ShowS
[Pin] -> ShowS
Pin -> String
(Int -> Pin -> ShowS)
-> (Pin -> String) -> ([Pin] -> ShowS) -> Show Pin
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Pin -> ShowS
showsPrec :: Int -> Pin -> ShowS
$cshow :: Pin -> String
show :: Pin -> String
$cshowList :: [Pin] -> ShowS
showList :: [Pin] -> ShowS
Show)
data WayStep = WayStep (Maybe Int) (Array Word8 Pin)
type Way256 = Array Word8 WayStep
next :: WayStep -> Word8 -> Pin
next :: WayStep -> Word8 -> Pin
next (WayStep Maybe Int
_ Array Word8 Pin
a16) Word8
w = Array Word8 Pin
a16 Array Word8 Pin -> Int -> Pin
forall i. Ix i => Array i Pin -> Int -> Pin
forall (a :: * -> * -> *) e i.
(IArray a e, Ix i) =>
a i e -> Int -> e
`unsafeAt` Word8 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
w
decodeH
:: GCBuffer
-> BufferSize
-> ReadBuffer
-> Int
-> IO ByteString
decodeH :: GCBuffer -> Int -> ReadBuffer -> Int -> IO ByteString
decodeH GCBuffer
gcbuf Int
bufsiz ReadBuffer
rbuf Int
len
| Int -> Int
maxDecodedLength Int
len Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
bufsiz =
Int -> (WriteBuffer -> IO ()) -> IO ByteString
withWriteBuffer (Int -> Int
maxDecodedLength Int
len) ((WriteBuffer -> IO ()) -> IO ByteString)
-> (WriteBuffer -> IO ()) -> IO ByteString
forall a b. (a -> b) -> a -> b
$ \WriteBuffer
wbuf -> WriteBuffer -> ReadBuffer -> Int -> IO ()
decH WriteBuffer
wbuf ReadBuffer
rbuf Int
len
| Bool
otherwise = GCBuffer -> (Ptr Word8 -> IO ByteString) -> IO ByteString
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr GCBuffer
gcbuf ((Ptr Word8 -> IO ByteString) -> IO ByteString)
-> (Ptr Word8 -> IO ByteString) -> IO ByteString
forall a b. (a -> b) -> a -> b
$ \Ptr Word8
buf -> do
WriteBuffer
wbuf <- Ptr Word8 -> Int -> IO WriteBuffer
newWriteBuffer Ptr Word8
buf Int
bufsiz
WriteBuffer -> ReadBuffer -> Int -> IO ()
decH WriteBuffer
wbuf ReadBuffer
rbuf Int
len
WriteBuffer -> IO ByteString
toByteString WriteBuffer
wbuf
maxDecodedLength :: Int -> Int
maxDecodedLength :: Int -> Int
maxDecodedLength Int
len = Int
len Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
8 Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div` Int
5
decH :: WriteBuffer -> ReadBuffer -> Int -> IO ()
decH :: WriteBuffer -> ReadBuffer -> Int -> IO ()
decH WriteBuffer
wbuf ReadBuffer
rbuf Int
len = Int -> WayStep -> IO ()
forall {t}. (Eq t, Num t) => t -> WayStep -> IO ()
go Int
len (Way256
way256 Way256 -> Int -> WayStep
forall i. Ix i => Array i WayStep -> Int -> WayStep
forall (a :: * -> * -> *) e i.
(IArray a e, Ix i) =>
a i e -> Int -> e
`unsafeAt` Int
0)
where
go :: t -> WayStep -> IO ()
go t
0 WayStep
way0 = case WayStep
way0 of
WayStep Maybe Int
Nothing Array Word8 Pin
_ -> DecodeError -> IO ()
forall e a. Exception e => e -> IO a
E.throwIO DecodeError
IllegalEos
WayStep (Just Int
i) Array Word8 Pin
_
| Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
8 -> () -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
| Bool
otherwise -> DecodeError -> IO ()
forall e a. Exception e => e -> IO a
E.throwIO DecodeError
TooLongEos
go t
n WayStep
way0 = do
Word8
w <- ReadBuffer -> IO Word8
forall a. Readable a => a -> IO Word8
read8 ReadBuffer
rbuf
WayStep
way <- WayStep -> Word8 -> IO WayStep
doit WayStep
way0 Word8
w
t -> WayStep -> IO ()
go (t
n t -> t -> t
forall a. Num a => a -> a -> a
- t
1) WayStep
way
doit :: WayStep -> Word8 -> IO WayStep
doit WayStep
way Word8
w = case WayStep -> Word8 -> Pin
next WayStep
way Word8
w of
Pin
EndOfString -> DecodeError -> IO WayStep
forall e a. Exception e => e -> IO a
E.throwIO DecodeError
EosInTheMiddle
Forward Word8
n -> WayStep -> IO WayStep
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (WayStep -> IO WayStep) -> WayStep -> IO WayStep
forall a b. (a -> b) -> a -> b
$ Way256
way256 Way256 -> Int -> WayStep
forall i. Ix i => Array i WayStep -> Int -> WayStep
forall (a :: * -> * -> *) e i.
(IArray a e, Ix i) =>
a i e -> Int -> e
`unsafeAt` Word8 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
n
GoBack Word8
n Word8
v -> do
WriteBuffer -> Word8 -> IO ()
write8 WriteBuffer
wbuf Word8
v
WayStep -> IO WayStep
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (WayStep -> IO WayStep) -> WayStep -> IO WayStep
forall a b. (a -> b) -> a -> b
$ Way256
way256 Way256 -> Int -> WayStep
forall i. Ix i => Array i WayStep -> Int -> WayStep
forall (a :: * -> * -> *) e i.
(IArray a e, Ix i) =>
a i e -> Int -> e
`unsafeAt` Word8 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
n
GoBack2 Word8
n Word8
v1 Word8
v2 -> do
WriteBuffer -> Word8 -> IO ()
write8 WriteBuffer
wbuf Word8
v1
WriteBuffer -> Word8 -> IO ()
write8 WriteBuffer
wbuf Word8
v2
WayStep -> IO WayStep
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (WayStep -> IO WayStep) -> WayStep -> IO WayStep
forall a b. (a -> b) -> a -> b
$ Way256
way256 Way256 -> Int -> WayStep
forall i. Ix i => Array i WayStep -> Int -> WayStep
forall (a :: * -> * -> *) e i.
(IArray a e, Ix i) =>
a i e -> Int -> e
`unsafeAt` Word8 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
n
decodeHuffman :: ByteString -> IO ByteString
decodeHuffman :: ByteString -> IO ByteString
decodeHuffman ByteString
bs = Int -> (WriteBuffer -> IO ()) -> IO ByteString
withWriteBuffer (Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
1 (Int -> Int) -> Int -> Int
forall a b. (a -> b) -> a -> b
$ Int -> Int
maxDecodedLength (Int -> Int) -> Int -> Int
forall a b. (a -> b) -> a -> b
$ ByteString -> Int
BS.length ByteString
bs) ((WriteBuffer -> IO ()) -> IO ByteString)
-> (WriteBuffer -> IO ()) -> IO ByteString
forall a b. (a -> b) -> a -> b
$ \WriteBuffer
wbuf ->
ByteString -> (ReadBuffer -> IO ()) -> IO ()
forall a. ByteString -> (ReadBuffer -> IO a) -> IO a
withReadBuffer ByteString
bs ((ReadBuffer -> IO ()) -> IO ()) -> (ReadBuffer -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ReadBuffer
rbuf -> WriteBuffer -> ReadBuffer -> Int -> IO ()
decH WriteBuffer
wbuf ReadBuffer
rbuf (Int -> IO ()) -> Int -> IO ()
forall a b. (a -> b) -> a -> b
$ ByteString -> Int
BS.length ByteString
bs
{-# NOINLINE way256 #-}
way256 :: Way256
way256 :: Way256
way256 = HTree -> Way256
construct (HTree -> Way256) -> HTree -> Way256
forall a b. (a -> b) -> a -> b
$ [Bits] -> HTree
toHTree [Bits]
huffmanTable
construct :: HTree -> Way256
construct :: HTree -> Way256
construct HTree
decoder = (Word8, Word8) -> [WayStep] -> Way256
forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (Word8
0, Word8
255) ([WayStep] -> Way256) -> [WayStep] -> Way256
forall a b. (a -> b) -> a -> b
$ (HTree -> WayStep) -> [HTree] -> [WayStep]
forall a b. (a -> b) -> [a] -> [b]
map HTree -> WayStep
to16ways ([HTree] -> [WayStep]) -> [HTree] -> [WayStep]
forall a b. (a -> b) -> a -> b
$ HTree -> [HTree]
flatten HTree
decoder
where
to16ways :: HTree -> WayStep
to16ways HTree
x = Maybe Int -> Array Word8 Pin -> WayStep
WayStep Maybe Int
ei Array Word8 Pin
a16
where
ei :: Maybe Int
ei = HTree -> Maybe Int
eosInfo HTree
x
a16 :: Array Word8 Pin
a16 = (Word8, Word8) -> [Pin] -> Array Word8 Pin
forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (Word8
0, Word8
255) ([Pin] -> Array Word8 Pin) -> [Pin] -> Array Word8 Pin
forall a b. (a -> b) -> a -> b
$ (Bits -> Pin) -> [Bits] -> [Pin]
forall a b. (a -> b) -> [a] -> [b]
map (HTree -> HTree -> Chara -> Bits -> Pin
step HTree
decoder HTree
x Chara
Non) [Bits]
bits8s
data Chara
= Non
| One Word8
| Two Word8 Word8
inc :: Chara -> Word8 -> Chara
inc :: Chara -> Word8 -> Chara
inc Chara
Non Word8
w = Word8 -> Chara
One Word8
w
inc (One Word8
v) Word8
w = Word8 -> Word8 -> Chara
Two Word8
v Word8
w
inc Chara
_ Word8
_ = String -> Chara
forall a. HasCallStack => String -> a
error String
"inc"
step :: HTree -> HTree -> Chara -> [B] -> Pin
step :: HTree -> HTree -> Chara -> Bits -> Pin
step HTree
root (Tip Maybe Int
_ Int
v) Chara
x Bits
bss
| Int
v Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
idxEos = Pin
EndOfString
| Bool
otherwise = let w :: Word8
w = Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
v
x' :: Chara
x' = Chara -> Word8 -> Chara
inc Chara
x Word8
w
in HTree -> HTree -> Chara -> Bits -> Pin
step HTree
root HTree
root Chara
x' Bits
bss
step HTree
_ (Bin Maybe Int
_ Int
n HTree
_ HTree
_) Chara
Non [] = Word8 -> Pin
Forward (Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
n)
step HTree
_ (Bin Maybe Int
_ Int
n HTree
_ HTree
_) (One Word8
w) [] = Word8 -> Word8 -> Pin
GoBack (Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
n) Word8
w
step HTree
_ (Bin Maybe Int
_ Int
n HTree
_ HTree
_) (Two Word8
w Word8
z) [] = Word8 -> Word8 -> Word8 -> Pin
GoBack2 (Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
n) Word8
w Word8
z
step HTree
root (Bin Maybe Int
_ Int
_ HTree
l HTree
_) Chara
mx (B
F:Bits
bs) = HTree -> HTree -> Chara -> Bits -> Pin
step HTree
root HTree
l Chara
mx Bits
bs
step HTree
root (Bin Maybe Int
_ Int
_ HTree
_ HTree
r) Chara
mx (B
T:Bits
bs) = HTree -> HTree -> Chara -> Bits -> Pin
step HTree
root HTree
r Chara
mx Bits
bs
bits8s :: [[B]]
bits8s :: [Bits]
bits8s = [
[B
F,B
F,B
F,B
F,B
F,B
F,B
F,B
F]
, [B
F,B
F,B
F,B
F,B
F,B
F,B
F,B
T]
, [B
F,B
F,B
F,B
F,B
F,B
F,B
T,B
F]
, [B
F,B
F,B
F,B
F,B
F,B
F,B
T,B
T]
, [B
F,B
F,B
F,B
F,B
F,B
T,B
F,B
F]
, [B
F,B
F,B
F,B
F,B
F,B
T,B
F,B
T]
, [B
F,B
F,B
F,B
F,B
F,B
T,B
T,B
F]
, [B
F,B
F,B
F,B
F,B
F,B
T,B
T,B
T]
, [B
F,B
F,B
F,B
F,B
T,B
F,B
F,B
F]
, [B
F,B
F,B
F,B
F,B
T,B
F,B
F,B
T]
, [B
F,B
F,B
F,B
F,B
T,B
F,B
T,B
F]
, [B
F,B
F,B
F,B
F,B
T,B
F,B
T,B
T]
, [B
F,B
F,B
F,B
F,B
T,B
T,B
F,B
F]
, [B
F,B
F,B
F,B
F,B
T,B
T,B
F,B
T]
, [B
F,B
F,B
F,B
F,B
T,B
T,B
T,B
F]
, [B
F,B
F,B
F,B
F,B
T,B
T,B
T,B
T]
, [B
F,B
F,B
F,B
T,B
F,B
F,B
F,B
F]
, [B
F,B
F,B
F,B
T,B
F,B
F,B
F,B
T]
, [B
F,B
F,B
F,B
T,B
F,B
F,B
T,B
F]
, [B
F,B
F,B
F,B
T,B
F,B
F,B
T,B
T]
, [B
F,B
F,B
F,B
T,B
F,B
T,B
F,B
F]
, [B
F,B
F,B
F,B
T,B
F,B
T,B
F,B
T]
, [B
F,B
F,B
F,B
T,B
F,B
T,B
T,B
F]
, [B
F,B
F,B
F,B
T,B
F,B
T,B
T,B
T]
, [B
F,B
F,B
F,B
T,B
T,B
F,B
F,B
F]
, [B
F,B
F,B
F,B
T,B
T,B
F,B
F,B
T]
, [B
F,B
F,B
F,B
T,B
T,B
F,B
T,B
F]
, [B
F,B
F,B
F,B
T,B
T,B
F,B
T,B
T]
, [B
F,B
F,B
F,B
T,B
T,B
T,B
F,B
F]
, [B
F,B
F,B
F,B
T,B
T,B
T,B
F,B
T]
, [B
F,B
F,B
F,B
T,B
T,B
T,B
T,B
F]
, [B
F,B
F,B
F,B
T,B
T,B
T,B
T,B
T]
, [B
F,B
F,B
T,B
F,B
F,B
F,B
F,B
F]
, [B
F,B
F,B
T,B
F,B
F,B
F,B
F,B
T]
, [B
F,B
F,B
T,B
F,B
F,B
F,B
T,B
F]
, [B
F,B
F,B
T,B
F,B
F,B
F,B
T,B
T]
, [B
F,B
F,B
T,B
F,B
F,B
T,B
F,B
F]
, [B
F,B
F,B
T,B
F,B
F,B
T,B
F,B
T]
, [B
F,B
F,B
T,B
F,B
F,B
T,B
T,B
F]
, [B
F,B
F,B
T,B
F,B
F,B
T,B
T,B
T]
, [B
F,B
F,B
T,B
F,B
T,B
F,B
F,B
F]
, [B
F,B
F,B
T,B
F,B
T,B
F,B
F,B
T]
, [B
F,B
F,B
T,B
F,B
T,B
F,B
T,B
F]
, [B
F,B
F,B
T,B
F,B
T,B
F,B
T,B
T]
, [B
F,B
F,B
T,B
F,B
T,B
T,B
F,B
F]
, [B
F,B
F,B
T,B
F,B
T,B
T,B
F,B
T]
, [B
F,B
F,B
T,B
F,B
T,B
T,B
T,B
F]
, [B
F,B
F,B
T,B
F,B
T,B
T,B
T,B
T]
, [B
F,B
F,B
T,B
T,B
F,B
F,B
F,B
F]
, [B
F,B
F,B
T,B
T,B
F,B
F,B
F,B
T]
, [B
F,B
F,B
T,B
T,B
F,B
F,B
T,B
F]
, [B
F,B
F,B
T,B
T,B
F,B
F,B
T,B
T]
, [B
F,B
F,B
T,B
T,B
F,B
T,B
F,B
F]
, [B
F,B
F,B
T,B
T,B
F,B
T,B
F,B
T]
, [B
F,B
F,B
T,B
T,B
F,B
T,B
T,B
F]
, [B
F,B
F,B
T,B
T,B
F,B
T,B
T,B
T]
, [B
F,B
F,B
T,B
T,B
T,B
F,B
F,B
F]
, [B
F,B
F,B
T,B
T,B
T,B
F,B
F,B
T]
, [B
F,B
F,B
T,B
T,B
T,B
F,B
T,B
F]
, [B
F,B
F,B
T,B
T,B
T,B
F,B
T,B
T]
, [B
F,B
F,B
T,B
T,B
T,B
T,B
F,B
F]
, [B
F,B
F,B
T,B
T,B
T,B
T,B
F,B
T]
, [B
F,B
F,B
T,B
T,B
T,B
T,B
T,B
F]
, [B
F,B
F,B
T,B
T,B
T,B
T,B
T,B
T]
, [B
F,B
T,B
F,B
F,B
F,B
F,B
F,B
F]
, [B
F,B
T,B
F,B
F,B
F,B
F,B
F,B
T]
, [B
F,B
T,B
F,B
F,B
F,B
F,B
T,B
F]
, [B
F,B
T,B
F,B
F,B
F,B
F,B
T,B
T]
, [B
F,B
T,B
F,B
F,B
F,B
T,B
F,B
F]
, [B
F,B
T,B
F,B
F,B
F,B
T,B
F,B
T]
, [B
F,B
T,B
F,B
F,B
F,B
T,B
T,B
F]
, [B
F,B
T,B
F,B
F,B
F,B
T,B
T,B
T]
, [B
F,B
T,B
F,B
F,B
T,B
F,B
F,B
F]
, [B
F,B
T,B
F,B
F,B
T,B
F,B
F,B
T]
, [B
F,B
T,B
F,B
F,B
T,B
F,B
T,B
F]
, [B
F,B
T,B
F,B
F,B
T,B
F,B
T,B
T]
, [B
F,B
T,B
F,B
F,B
T,B
T,B
F,B
F]
, [B
F,B
T,B
F,B
F,B
T,B
T,B
F,B
T]
, [B
F,B
T,B
F,B
F,B
T,B
T,B
T,B
F]
, [B
F,B
T,B
F,B
F,B
T,B
T,B
T,B
T]
, [B
F,B
T,B
F,B
T,B
F,B
F,B
F,B
F]
, [B
F,B
T,B
F,B
T,B
F,B
F,B
F,B
T]
, [B
F,B
T,B
F,B
T,B
F,B
F,B
T,B
F]
, [B
F,B
T,B
F,B
T,B
F,B
F,B
T,B
T]
, [B
F,B
T,B
F,B
T,B
F,B
T,B
F,B
F]
, [B
F,B
T,B
F,B
T,B
F,B
T,B
F,B
T]
, [B
F,B
T,B
F,B
T,B
F,B
T,B
T,B
F]
, [B
F,B
T,B
F,B
T,B
F,B
T,B
T,B
T]
, [B
F,B
T,B
F,B
T,B
T,B
F,B
F,B
F]
, [B
F,B
T,B
F,B
T,B
T,B
F,B
F,B
T]
, [B
F,B
T,B
F,B
T,B
T,B
F,B
T,B
F]
, [B
F,B
T,B
F,B
T,B
T,B
F,B
T,B
T]
, [B
F,B
T,B
F,B
T,B
T,B
T,B
F,B
F]
, [B
F,B
T,B
F,B
T,B
T,B
T,B
F,B
T]
, [B
F,B
T,B
F,B
T,B
T,B
T,B
T,B
F]
, [B
F,B
T,B
F,B
T,B
T,B
T,B
T,B
T]
, [B
F,B
T,B
T,B
F,B
F,B
F,B
F,B
F]
, [B
F,B
T,B
T,B
F,B
F,B
F,B
F,B
T]
, [B
F,B
T,B
T,B
F,B
F,B
F,B
T,B
F]
, [B
F,B
T,B
T,B
F,B
F,B
F,B
T,B
T]
, [B
F,B
T,B
T,B
F,B
F,B
T,B
F,B
F]
, [B
F,B
T,B
T,B
F,B
F,B
T,B
F,B
T]
, [B
F,B
T,B
T,B
F,B
F,B
T,B
T,B
F]
, [B
F,B
T,B
T,B
F,B
F,B
T,B
T,B
T]
, [B
F,B
T,B
T,B
F,B
T,B
F,B
F,B
F]
, [B
F,B
T,B
T,B
F,B
T,B
F,B
F,B
T]
, [B
F,B
T,B
T,B
F,B
T,B
F,B
T,B
F]
, [B
F,B
T,B
T,B
F,B
T,B
F,B
T,B
T]
, [B
F,B
T,B
T,B
F,B
T,B
T,B
F,B
F]
, [B
F,B
T,B
T,B
F,B
T,B
T,B
F,B
T]
, [B
F,B
T,B
T,B
F,B
T,B
T,B
T,B
F]
, [B
F,B
T,B
T,B
F,B
T,B
T,B
T,B
T]
, [B
F,B
T,B
T,B
T,B
F,B
F,B
F,B
F]
, [B
F,B
T,B
T,B
T,B
F,B
F,B
F,B
T]
, [B
F,B
T,B
T,B
T,B
F,B
F,B
T,B
F]
, [B
F,B
T,B
T,B
T,B
F,B
F,B
T,B
T]
, [B
F,B
T,B
T,B
T,B
F,B
T,B
F,B
F]
, [B
F,B
T,B
T,B
T,B
F,B
T,B
F,B
T]
, [B
F,B
T,B
T,B
T,B
F,B
T,B
T,B
F]
, [B
F,B
T,B
T,B
T,B
F,B
T,B
T,B
T]
, [B
F,B
T,B
T,B
T,B
T,B
F,B
F,B
F]
, [B
F,B
T,B
T,B
T,B
T,B
F,B
F,B
T]
, [B
F,B
T,B
T,B
T,B
T,B
F,B
T,B
F]
, [B
F,B
T,B
T,B
T,B
T,B
F,B
T,B
T]
, [B
F,B
T,B
T,B
T,B
T,B
T,B
F,B
F]
, [B
F,B
T,B
T,B
T,B
T,B
T,B
F,B
T]
, [B
F,B
T,B
T,B
T,B
T,B
T,B
T,B
F]
, [B
F,B
T,B
T,B
T,B
T,B
T,B
T,B
T]
, [B
T,B
F,B
F,B
F,B
F,B
F,B
F,B
F]
, [B
T,B
F,B
F,B
F,B
F,B
F,B
F,B
T]
, [B
T,B
F,B
F,B
F,B
F,B
F,B
T,B
F]
, [B
T,B
F,B
F,B
F,B
F,B
F,B
T,B
T]
, [B
T,B
F,B
F,B
F,B
F,B
T,B
F,B
F]
, [B
T,B
F,B
F,B
F,B
F,B
T,B
F,B
T]
, [B
T,B
F,B
F,B
F,B
F,B
T,B
T,B
F]
, [B
T,B
F,B
F,B
F,B
F,B
T,B
T,B
T]
, [B
T,B
F,B
F,B
F,B
T,B
F,B
F,B
F]
, [B
T,B
F,B
F,B
F,B
T,B
F,B
F,B
T]
, [B
T,B
F,B
F,B
F,B
T,B
F,B
T,B
F]
, [B
T,B
F,B
F,B
F,B
T,B
F,B
T,B
T]
, [B
T,B
F,B
F,B
F,B
T,B
T,B
F,B
F]
, [B
T,B
F,B
F,B
F,B
T,B
T,B
F,B
T]
, [B
T,B
F,B
F,B
F,B
T,B
T,B
T,B
F]
, [B
T,B
F,B
F,B
F,B
T,B
T,B
T,B
T]
, [B
T,B
F,B
F,B
T,B
F,B
F,B
F,B
F]
, [B
T,B
F,B
F,B
T,B
F,B
F,B
F,B
T]
, [B
T,B
F,B
F,B
T,B
F,B
F,B
T,B
F]
, [B
T,B
F,B
F,B
T,B
F,B
F,B
T,B
T]
, [B
T,B
F,B
F,B
T,B
F,B
T,B
F,B
F]
, [B
T,B
F,B
F,B
T,B
F,B
T,B
F,B
T]
, [B
T,B
F,B
F,B
T,B
F,B
T,B
T,B
F]
, [B
T,B
F,B
F,B
T,B
F,B
T,B
T,B
T]
, [B
T,B
F,B
F,B
T,B
T,B
F,B
F,B
F]
, [B
T,B
F,B
F,B
T,B
T,B
F,B
F,B
T]
, [B
T,B
F,B
F,B
T,B
T,B
F,B
T,B
F]
, [B
T,B
F,B
F,B
T,B
T,B
F,B
T,B
T]
, [B
T,B
F,B
F,B
T,B
T,B
T,B
F,B
F]
, [B
T,B
F,B
F,B
T,B
T,B
T,B
F,B
T]
, [B
T,B
F,B
F,B
T,B
T,B
T,B
T,B
F]
, [B
T,B
F,B
F,B
T,B
T,B
T,B
T,B
T]
, [B
T,B
F,B
T,B
F,B
F,B
F,B
F,B
F]
, [B
T,B
F,B
T,B
F,B
F,B
F,B
F,B
T]
, [B
T,B
F,B
T,B
F,B
F,B
F,B
T,B
F]
, [B
T,B
F,B
T,B
F,B
F,B
F,B
T,B
T]
, [B
T,B
F,B
T,B
F,B
F,B
T,B
F,B
F]
, [B
T,B
F,B
T,B
F,B
F,B
T,B
F,B
T]
, [B
T,B
F,B
T,B
F,B
F,B
T,B
T,B
F]
, [B
T,B
F,B
T,B
F,B
F,B
T,B
T,B
T]
, [B
T,B
F,B
T,B
F,B
T,B
F,B
F,B
F]
, [B
T,B
F,B
T,B
F,B
T,B
F,B
F,B
T]
, [B
T,B
F,B
T,B
F,B
T,B
F,B
T,B
F]
, [B
T,B
F,B
T,B
F,B
T,B
F,B
T,B
T]
, [B
T,B
F,B
T,B
F,B
T,B
T,B
F,B
F]
, [B
T,B
F,B
T,B
F,B
T,B
T,B
F,B
T]
, [B
T,B
F,B
T,B
F,B
T,B
T,B
T,B
F]
, [B
T,B
F,B
T,B
F,B
T,B
T,B
T,B
T]
, [B
T,B
F,B
T,B
T,B
F,B
F,B
F,B
F]
, [B
T,B
F,B
T,B
T,B
F,B
F,B
F,B
T]
, [B
T,B
F,B
T,B
T,B
F,B
F,B
T,B
F]
, [B
T,B
F,B
T,B
T,B
F,B
F,B
T,B
T]
, [B
T,B
F,B
T,B
T,B
F,B
T,B
F,B
F]
, [B
T,B
F,B
T,B
T,B
F,B
T,B
F,B
T]
, [B
T,B
F,B
T,B
T,B
F,B
T,B
T,B
F]
, [B
T,B
F,B
T,B
T,B
F,B
T,B
T,B
T]
, [B
T,B
F,B
T,B
T,B
T,B
F,B
F,B
F]
, [B
T,B
F,B
T,B
T,B
T,B
F,B
F,B
T]
, [B
T,B
F,B
T,B
T,B
T,B
F,B
T,B
F]
, [B
T,B
F,B
T,B
T,B
T,B
F,B
T,B
T]
, [B
T,B
F,B
T,B
T,B
T,B
T,B
F,B
F]
, [B
T,B
F,B
T,B
T,B
T,B
T,B
F,B
T]
, [B
T,B
F,B
T,B
T,B
T,B
T,B
T,B
F]
, [B
T,B
F,B
T,B
T,B
T,B
T,B
T,B
T]
, [B
T,B
T,B
F,B
F,B
F,B
F,B
F,B
F]
, [B
T,B
T,B
F,B
F,B
F,B
F,B
F,B
T]
, [B
T,B
T,B
F,B
F,B
F,B
F,B
T,B
F]
, [B
T,B
T,B
F,B
F,B
F,B
F,B
T,B
T]
, [B
T,B
T,B
F,B
F,B
F,B
T,B
F,B
F]
, [B
T,B
T,B
F,B
F,B
F,B
T,B
F,B
T]
, [B
T,B
T,B
F,B
F,B
F,B
T,B
T,B
F]
, [B
T,B
T,B
F,B
F,B
F,B
T,B
T,B
T]
, [B
T,B
T,B
F,B
F,B
T,B
F,B
F,B
F]
, [B
T,B
T,B
F,B
F,B
T,B
F,B
F,B
T]
, [B
T,B
T,B
F,B
F,B
T,B
F,B
T,B
F]
, [B
T,B
T,B
F,B
F,B
T,B
F,B
T,B
T]
, [B
T,B
T,B
F,B
F,B
T,B
T,B
F,B
F]
, [B
T,B
T,B
F,B
F,B
T,B
T,B
F,B
T]
, [B
T,B
T,B
F,B
F,B
T,B
T,B
T,B
F]
, [B
T,B
T,B
F,B
F,B
T,B
T,B
T,B
T]
, [B
T,B
T,B
F,B
T,B
F,B
F,B
F,B
F]
, [B
T,B
T,B
F,B
T,B
F,B
F,B
F,B
T]
, [B
T,B
T,B
F,B
T,B
F,B
F,B
T,B
F]
, [B
T,B
T,B
F,B
T,B
F,B
F,B
T,B
T]
, [B
T,B
T,B
F,B
T,B
F,B
T,B
F,B
F]
, [B
T,B
T,B
F,B
T,B
F,B
T,B
F,B
T]
, [B
T,B
T,B
F,B
T,B
F,B
T,B
T,B
F]
, [B
T,B
T,B
F,B
T,B
F,B
T,B
T,B
T]
, [B
T,B
T,B
F,B
T,B
T,B
F,B
F,B
F]
, [B
T,B
T,B
F,B
T,B
T,B
F,B
F,B
T]
, [B
T,B
T,B
F,B
T,B
T,B
F,B
T,B
F]
, [B
T,B
T,B
F,B
T,B
T,B
F,B
T,B
T]
, [B
T,B
T,B
F,B
T,B
T,B
T,B
F,B
F]
, [B
T,B
T,B
F,B
T,B
T,B
T,B
F,B
T]
, [B
T,B
T,B
F,B
T,B
T,B
T,B
T,B
F]
, [B
T,B
T,B
F,B
T,B
T,B
T,B
T,B
T]
, [B
T,B
T,B
T,B
F,B
F,B
F,B
F,B
F]
, [B
T,B
T,B
T,B
F,B
F,B
F,B
F,B
T]
, [B
T,B
T,B
T,B
F,B
F,B
F,B
T,B
F]
, [B
T,B
T,B
T,B
F,B
F,B
F,B
T,B
T]
, [B
T,B
T,B
T,B
F,B
F,B
T,B
F,B
F]
, [B
T,B
T,B
T,B
F,B
F,B
T,B
F,B
T]
, [B
T,B
T,B
T,B
F,B
F,B
T,B
T,B
F]
, [B
T,B
T,B
T,B
F,B
F,B
T,B
T,B
T]
, [B
T,B
T,B
T,B
F,B
T,B
F,B
F,B
F]
, [B
T,B
T,B
T,B
F,B
T,B
F,B
F,B
T]
, [B
T,B
T,B
T,B
F,B
T,B
F,B
T,B
F]
, [B
T,B
T,B
T,B
F,B
T,B
F,B
T,B
T]
, [B
T,B
T,B
T,B
F,B
T,B
T,B
F,B
F]
, [B
T,B
T,B
T,B
F,B
T,B
T,B
F,B
T]
, [B
T,B
T,B
T,B
F,B
T,B
T,B
T,B
F]
, [B
T,B
T,B
T,B
F,B
T,B
T,B
T,B
T]
, [B
T,B
T,B
T,B
T,B
F,B
F,B
F,B
F]
, [B
T,B
T,B
T,B
T,B
F,B
F,B
F,B
T]
, [B
T,B
T,B
T,B
T,B
F,B
F,B
T,B
F]
, [B
T,B
T,B
T,B
T,B
F,B
F,B
T,B
T]
, [B
T,B
T,B
T,B
T,B
F,B
T,B
F,B
F]
, [B
T,B
T,B
T,B
T,B
F,B
T,B
F,B
T]
, [B
T,B
T,B
T,B
T,B
F,B
T,B
T,B
F]
, [B
T,B
T,B
T,B
T,B
F,B
T,B
T,B
T]
, [B
T,B
T,B
T,B
T,B
T,B
F,B
F,B
F]
, [B
T,B
T,B
T,B
T,B
T,B
F,B
F,B
T]
, [B
T,B
T,B
T,B
T,B
T,B
F,B
T,B
F]
, [B
T,B
T,B
T,B
T,B
T,B
F,B
T,B
T]
, [B
T,B
T,B
T,B
T,B
T,B
T,B
F,B
F]
, [B
T,B
T,B
T,B
T,B
T,B
T,B
F,B
T]
, [B
T,B
T,B
T,B
T,B
T,B
T,B
T,B
F]
, [B
T,B
T,B
T,B
T,B
T,B
T,B
T,B
T]
]