---input---
// public domain

module Deflate

open System
open System.Collections.Generic
open System.IO
open System.Linq
open Crc

let maxbuf = 32768
let maxlen = 258

let getBit (b:byte) (bit:int) =
    if b &&& (1uy <<< bit) = 0uy then 0 else 1

type BitReader(sin:Stream) =
    let mutable bit = 8
    let mutable cur = 0uy
    
    member x.Skip() =
        bit <- 8
    
    member x.ReadBit() =
        if bit = 8 then
            bit <- 0
            let b = sin.ReadByte()
            if b = -1 then
                failwith "バッファを超過しました"
            cur <- byte b
        let ret = if cur &&& (1uy <<< bit) = 0uy then 0 else 1
        bit <- bit + 1
        ret
    
    member x.ReadLE n =
        let mutable ret = 0
        for i = 0 to n - 1 do
            if x.ReadBit() = 1 then ret <- ret ||| (1 <<< i)
        ret
    
    member x.ReadBE n =
        let mutable ret = 0
        for i = 0 to n - 1 do
            ret <- (ret <<< 1) ||| x.ReadBit()
        ret
    
    member x.ReadBytes len =
        if bit <> 8 then bit <- 8
        let buf = Array.zeroCreate<byte> len
        ignore <| sin.Read(buf, 0, len)
        buf

type WriteBuffer(sout:Stream) =
    let mutable prev:byte[] = null
    let mutable buf = Array.zeroCreate<byte> maxbuf
    let mutable p = 0
    
    let next newbuf =
        prev <- buf
        buf <- if newbuf then Array.zeroCreate<byte> maxbuf else null
        p <- 0
    
    member x.Close() =
        next false
        next false
    
    interface IDisposable with
        member x.Dispose() = x.Close()
    
    member x.WriteByte (b:byte) =
        buf.[p] <- b
        sout.WriteByte b
        p <- p + 1
        if p = maxbuf then next true

    member x.Write (src:byte[]) start len =
        let maxlen = maxbuf - p
        if len <= maxlen then
            Array.Copy(src, start, buf, p, len)
            sout.Write(src, start, len)
            p <- p + len
            if p = maxbuf then next true
        else
            x.Write src start maxlen
            x.Write src (start + maxlen) (len - maxlen)
    
    member x.Copy len dist =
        if dist < 1 then
            failwith <| sprintf "dist too small: %d < 1" dist
        elif dist > maxbuf then
            failwith <| sprintf "dist too big: %d > %d" dist maxbuf
        let pp = p - dist
        if pp < 0 then
            if prev = null then
                failwith <| sprintf "dist too big: %d > %d" dist p
            let pp = pp + maxbuf
            let maxlen = maxbuf - pp
            if len <= maxlen then
                x.Write prev pp len
            else
                x.Write prev pp maxlen
                x.Copy (len - maxlen) dist
        else
            let maxlen = p - pp
            if len <= maxlen then
                x.Write buf pp len
            else
                if dist = 1 then
                    let b = buf.[pp]
                    for i = 1 to len do
                        x.WriteByte b
                else
                    let buf' = buf
                    let mutable len' = len
                    while len' > 0 do
                        let len'' = Math.Min(len', maxlen)
                        x.Write buf' pp len''
                        len' <- len' - len''

type Huffman(lens:int[]) =
    let vals = Array.zeroCreate<int> lens.Length
    let min = lens.Where(fun x -> x > 0).Min()
    let max = lens.Max()
    let counts = Array.zeroCreate<int>  (max + 1)
    let firsts = Array.zeroCreate<int>  (max + 1)
    let nexts  = Array.zeroCreate<int>  (max + 1)
    let tables = Array.zeroCreate<int[]>(max + 1)
    
    do
        for len in lens do
            if len > 0 then counts.[len] <- counts.[len] + 1
        for i = 1 to max do
            firsts.[i] <- (firsts.[i - 1] + counts.[i - 1]) <<< 1
        Array.Copy(firsts, 0, nexts, 0, max + 1)
        for i = 0 to vals.Length - 1 do
            let len = lens.[i]
            if len > 0 then
                vals.[i] <- nexts.[len]
                nexts.[len] <- nexts.[len] + 1
        
        for i = 0 to vals.Length - 1 do
            let len = lens.[i]
            if len > 0 then
                let start = firsts.[len]
                if tables.[len] = null then
                    let count = nexts.[len] - start
                    tables.[len] <- Array.zeroCreate<int> count
                tables.[len].[vals.[i] - start] <- i
    
    member x.GetValue h =
        let rec getv i =
            if i > max then -1 else
                if h < nexts.[i] then
                    tables.[i].[h - firsts.[i]]
                else
                    getv (i + 1)
        getv min
    
    member x.Read(br:BitReader) =
        let rec read h i =
            if h < nexts.[i] then
                tables.[i].[h - firsts.[i]]
            else
                read ((h <<< 1) ||| br.ReadBit()) (i + 1)
        read (br.ReadBE min) min

type [<AbstractClass>] HuffmanDecoder() =
    abstract GetValue: unit->int
    abstract GetDistance: unit->int

type FixedHuffman(br:BitReader) =
    inherit HuffmanDecoder()
    
    override x.GetValue() =
        let v = br.ReadBE 7
        if v < 24 then v + 256 else
            let v = (v <<< 1) ||| br.ReadBit()
            if v < 192 then v - 48
            elif v < 200 then v + 88
            else ((v <<< 1) ||| br.ReadBit()) - 256
    
    override x.GetDistance() = br.ReadBE 5

type DynamicHuffman(br:BitReader) =
    inherit HuffmanDecoder()
    
    let lit, dist =
        let hlit =
            let hlit = (br.ReadLE 5) + 257
            if hlit > 286 then failwith <| sprintf "hlit: %d > 286" hlit
            hlit
        
        let hdist =
            let hdist = (br.ReadLE 5) + 1
            if hdist > 32 then failwith <| sprintf "hdist: %d > 32" hdist
            hdist
        
        let hclen =
            let hclen = (br.ReadLE 4) + 4
            if hclen > 19 then failwith <| sprintf "hclen: %d > 19" hclen
            hclen
        
        let clen =
            let hclens = Array.zeroCreate<int> 19
            let order = [| 16; 17; 18; 0; 8; 7; 9; 6; 10; 5;
                           11; 4; 12; 3; 13; 2; 14; 1; 15 |]
            for i = 0 to hclen - 1 do
                hclens.[order.[i]] <- br.ReadLE 3
            new Huffman(hclens)
        
        let ld = Array.zeroCreate<int>(hlit + hdist)
        let mutable i = 0
        while i < ld.Length do
            let v = clen.Read(br)
            if v < 16 then
                ld.[i] <- v
                i <- i + 1
            else
                let r, v =
                    match v with
                    | 16 -> (br.ReadLE 2) + 3, ld.[i - 1]
                    | 17 -> (br.ReadLE 3) + 3, 0
                    | 18 -> (br.ReadLE 7) + 11, 0
                    | _  -> failwith "不正な値です。"
                for j = 0 to r - 1 do
                    ld.[i + j] <- v
                i <- i + r
        
        new Huffman(ld.[0 .. hlit - 1]),
        new Huffman(ld.[hlit .. hlit + hdist - 1])
    
    override x.GetValue() = lit.Read br
    override x.GetDistance() = dist.Read br

let getLitExLen v = if v < 265 || v = 285 then 0 else (v - 261) >>> 2
let getDistExLen d = if d < 4 then 0 else (d - 2) >>> 1

let litlens =
    let litlens = Array.zeroCreate<int> 286
    let mutable v = 3
    for i = 257 to 284 do
        litlens.[i] <- v
        v <- v + (1 <<< (getLitExLen i))
    litlens.[285] <- maxlen
    litlens.[257..285]

let distlens =
    let distlens = Array.zeroCreate<int> 30
    let mutable v = 1
    for i = 0 to 29 do
        distlens.[i] <- v
        v <- v + (1 <<< (getDistExLen i))
    distlens

type Reader(sin:Stream) =
    inherit Stream()
    
    let br = new BitReader(sin)
    let fh = new FixedHuffman(br)
    
    let sout = new MemoryStream()
    let dbuf = new WriteBuffer(sout)
    
    let mutable cache:byte[] = null
    let mutable canRead = true

    let rec read (h:HuffmanDecoder) =
        let v = h.GetValue()
        if v > 285 then failwith <| sprintf "不正な値: %d" v
        if v < 256 then
            dbuf.WriteByte(byte v)
        elif v > 256 then
            let len =
                if v < 265 then v - 254 else
                    litlens.[v - 257] + (br.ReadLE (getLitExLen v))
            let dist =
                let d = h.GetDistance()
                if d > 29 then failwith <| sprintf "不正な距離: %d" d
                if d < 4 then d + 1 else
                    distlens.[d] + (br.ReadLE (getDistExLen d))
            dbuf.Copy len dist
        if v <> 256 then read h
    
    override x.CanRead  = canRead
    override x.CanWrite = false
    override x.CanSeek  = false
    override x.Flush()  = ()
    
    override x.Close() =
        dbuf.Close()
        canRead <- false
    
    override x.Read(buffer, offset, count) =
        let offset =
            if cache = null then 0 else
                let clen = cache.Length
                let len = Math.Min(clen, count)
                Array.Copy(cache, 0, buffer, offset, len)
                cache <- if len = clen then null
                         else cache.[len .. clen - 1]
                len
        let req = int64 <| count - offset
        while canRead && sout.Length < req do
            x.readBlock()
        let len =
            if sout.Length = 0L then 0 else
                let data = sout.ToArray()
                sout.SetLength(0L)
                let dlen = data.Length
                let len = Math.Min(int req, dlen)
                Array.Copy(data, 0, buffer, offset, len)
                if dlen > len then
                    cache <- data.[len..]
                len
        offset + len
    
    override x.Position
        with get() = raise <| new NotImplementedException()
        and set(v) = raise <| new NotImplementedException()
    
    override x.Length         = raise <| new NotImplementedException()
    override x.Seek(_, _)     = raise <| new NotImplementedException()
    override x.Write(_, _, _) = raise <| new NotImplementedException()
    override x.SetLength(_)   = raise <| new NotImplementedException()
    
    member private x.readBlock() =
        let bfinal = br.ReadBit()
        match br.ReadLE 2 with
        | 0 -> br.Skip()
               let len = br.ReadLE 16
               let nlen = br.ReadLE 16
               if len + nlen <> 0x10000 then
                   failwith "不正な非圧縮長"
               dbuf.Write (br.ReadBytes len) 0 len
        | 1 -> read fh
        | 2 -> read (new DynamicHuffman(br))
        | _ -> failwith "不正なブロックタイプ"
        if bfinal = 1 then
            canRead <- false
            x.Close()

type BitWriter(sout:Stream) =
    let mutable bit = 0
    let mutable cur = 0uy
    
    member x.Skip() =
        if bit > 0 then
            sout.WriteByte(cur)
            bit <- 0
            cur <- 0uy
    
    interface IDisposable with
        member x.Dispose() =
            x.Skip()
            sout.Flush()
    
    member x.WriteBit(b:int) =
        cur <- cur ||| ((byte b) <<< bit)
        bit <- bit + 1
        if bit = 8 then
            sout.WriteByte(cur)
            bit <- 0
            cur <- 0uy
    
    member x.WriteLE (len:int) (b:int) =
        for i = 0 to len - 1 do
            x.WriteBit <| if (b &&& (1 <<< i)) = 0 then 0 else 1
    
    member x.WriteBE (len:int) (b:int) =
        for i = len - 1 downto 0 do
            x.WriteBit <| if (b &&& (1 <<< i)) = 0 then 0 else 1
    
    member x.WriteBytes(data:byte[]) =
        x.Skip()
        sout.Write(data, 0, data.Length)

type FixedHuffmanWriter(bw:BitWriter) =
    member x.Write (b:int) =
        if b < 144 then
            bw.WriteBE 8 (b + 0b110000)
        elif b < 256 then
            bw.WriteBE 9 (b - 144 + 0b110010000)
        elif b < 280 then
            bw.WriteBE 7 (b - 256)
        elif b < 288 then
            bw.WriteBE 8 (b - 280 + 0b11000000)
    
    member x.WriteLen (len:int) =
        if len < 3 || len > maxlen then
            failwith <| sprintf "不正な長さ: %d" len
        let mutable ll = 285
        while len < litlens.[ll - 257] do
            ll <- ll - 1
        x.Write ll
        bw.WriteLE (getLitExLen ll) (len - litlens.[ll - 257])
    
    member x.WriteDist (d:int) =
        if d < 1 || d > maxbuf then
            failwith <| sprintf "不正な距離: %d" d
        let mutable dl = 29
        while d < distlens.[dl] do
            dl <- dl - 1
        bw.WriteBE 5 dl
        bw.WriteLE (getDistExLen dl) (d - distlens.[dl])

let maxbuf2 = maxbuf * 2
let buflen = maxbuf2 + maxlen

let inline getHash (buf:byte[]) pos =
    ((int buf.[pos]) <<< 4) ^^^ ((int buf.[pos + 1]) <<< 2) ^^^ (int buf.[pos + 2])

let inline addHash (hash:List<int>[]) (buf:byte[]) pos =
    if buf.[pos] <> buf.[pos + 1] then
        hash.[getHash buf pos].Add pos

let inline addHash2 (tables:int[,]) (counts:int[]) (buf:byte[]) pos =
    if buf.[pos] <> buf.[pos + 1] then
        let h = getHash buf pos
        let c = counts.[h]
        tables.[h, c &&& 15] <- pos
        counts.[h] <- c + 1

type Writer(t:int, sin:Stream) =
    let mutable length = buflen
    let buf = Array.zeroCreate<byte> buflen
    let tables, counts =
        if t = 2 then Array2D.zeroCreate<int> 4096 16, Array.create 4096 0 else null, null
    let hash = if tables = null then [| for _ in 0..4095 -> new List<int>() |] else null
    let mutable crc = ~~~0u
    
    let read pos len =
        let rlen = sin.Read(buf, pos, len)
        if rlen < len then length <- pos + rlen
        for i = pos to pos + rlen - 1 do
            let b = int(crc ^^^ (uint32 buf.[i])) &&& 0xff
            crc <- (crc >>> 8) ^^^ crc32_table.[b]
        if hash <> null then
            for list in hash do list.Clear()
        else
            Array.fill counts 0 counts.Length 0
    
    do
        read 0 buflen
    
    let search (pos:int) =
        let mutable maxp = -1
        let mutable maxl = 2
        let mlen = Math.Min(maxlen, length - pos)
        let last = Math.Max(0, pos - maxbuf)
        let h = getHash buf pos
        if hash <> null then
            let list = hash.[h]
            let mutable i = list.Count - 1
            while i >= 0 do
                let p = list.[i]
                if p < last then i <- 0 else
                    let mutable len = 0
                    while len < mlen && buf.[p + len] = buf.[pos + len] do
                        len <- len + 1
                    if len > maxl then
                        maxp <- p
                        maxl <- len
                i <- i - 1
        else
            let c = counts.[h]
            let p1, p2 = if c < 16 then 0, c - 1 else c + 1, c + 16
            let mutable i = p2
            while i >= p1 do
                let p = tables.[h, i &&& 15]
                if p < last then i <- 0 else
                    let mutable len = 0
                    while len < mlen && buf.[p + len] = buf.[pos + len] do
                        len <- len + 1
                    if len > maxl then
                        maxp <- p
                        maxl <- len
                i <- i - 1
        maxp, maxl
    
    member x.Crc = ~~~crc

    member x.Compress (sout:Stream) =
        use bw = new BitWriter(sout)
        bw.WriteBit 1
        bw.WriteLE 2 1
        let hw = new FixedHuffmanWriter(bw)
        let mutable p = 0
        match t with
        | 2 ->
            while p < length do
                let b = buf.[p]
                if p < length - 4 && b = buf.[p + 1] && b = buf.[p + 2] && b = buf.[p + 3] then
                    let mutable len = 4
                    let mlen = Math.Min(maxlen + 1, length - p)
                    while len < mlen && b = buf.[p + len] do
                        len <- len + 1
                    hw.Write(int b)
                    hw.WriteLen(len - 1)
                    hw.WriteDist 1
                    p <- p + len
                else
                    let maxp, maxl = search p
                    if maxp < 0 then
                        hw.Write(int b)
                        addHash2 tables counts buf p
                        p <- p + 1
                    else
                        hw.WriteLen maxl
                        hw.WriteDist (p - maxp)
                        for i = p to p + maxl - 1 do
                            addHash2 tables counts buf i
                        p <- p + maxl
                if p > maxbuf2 then
                    Array.Copy(buf, maxbuf, buf, 0, maxbuf + maxlen)
                    if length < buflen then length <- length - maxbuf else
                        read (maxbuf + maxlen) maxbuf
                    p <- p - maxbuf
                    for i = 0 to p - 1 do
                        addHash2 tables counts buf i
        | 1 ->
            while p < length do
                let b = buf.[p]
                if p < length - 4 && b = buf.[p + 1] && b = buf.[p + 2] && b = buf.[p + 3] then
                    let mutable len = 4
                    let mlen = Math.Min(maxlen + 1, length - p)
                    while len < mlen && b = buf.[p + len] do
                        len <- len + 1
                    hw.Write(int b)
                    hw.WriteLen(len - 1)
                    hw.WriteDist 1
                    p <- p + len
                else
                    let maxp, maxl = search p
                    if maxp < 0 then
                        hw.Write(int b)
                        addHash hash buf p
                        p <- p + 1
                    else
                        hw.WriteLen maxl
                        hw.WriteDist (p - maxp)
                        for i = p to p + maxl - 1 do
                            addHash hash buf i
                        p <- p + maxl
                if p > maxbuf2 then
                    Array.Copy(buf, maxbuf, buf, 0, maxbuf + maxlen)
                    if length < buflen then length <- length - maxbuf else
                        read (maxbuf + maxlen) maxbuf
                    p <- p - maxbuf
                    for i = 0 to p - 1 do
                        addHash hash buf i
        | _ ->
            while p < length do
                let maxp, maxl = search p
                if maxp < 0 then
                    hw.Write(int buf.[p])
                    hash.[getHash buf p].Add p
                    p <- p + 1
                else
                    hw.WriteLen maxl
                    hw.WriteDist (p - maxp)
                    for i = p to p + maxl - 1 do
                        hash.[getHash buf i].Add i
                    p <- p + maxl
                if p > maxbuf2 then
                    Array.Copy(buf, maxbuf, buf, 0, maxbuf + maxlen)
                    if length < buflen then length <- length - maxbuf else
                        read (maxbuf + maxlen) maxbuf
                    p <- p - maxbuf
                    for i = 0 to p - 1 do
                        hash.[getHash buf i].Add i
        hw.Write 256

let GetCompressBytes (sin:Stream) =
    let now = DateTime.Now
    let ms = new MemoryStream()
    let w = new Writer(1, sin)
    w.Compress ms
    ms.ToArray(), w.Crc

---tokens---
'// public domain\n' Comment.Single

'\n'          Text

'module'      Keyword
' '           Text
'Deflate'     Name.Namespace
'\n\n'        Text

'open'        Keyword
' '           Text
'System'      Name.Namespace
'\n'          Text

'open'        Keyword
' '           Text
'System.Collections.Generic' Name.Namespace
'\n'          Text

'open'        Keyword
' '           Text
'System.IO'   Name.Namespace
'\n'          Text

'open'        Keyword
' '           Text
'System.Linq' Name.Namespace
'\n'          Text

'open'        Keyword
' '           Text
'Crc'         Name.Namespace
'\n\n'        Text

'let'         Keyword
' '           Text
'maxbuf'      Name.Variable
' '           Text
'='           Operator
' '           Text
'32768'       Literal.Number.Integer
'\n'          Text

'let'         Keyword
' '           Text
'maxlen'      Name.Variable
' '           Text
'='           Operator
' '           Text
'258'         Literal.Number.Integer
'\n\n'        Text

'let'         Keyword
' '           Text
'getBit'      Name.Variable
' '           Text
'('           Operator
'b'           Name
':'           Operator
'byte'        Keyword.Type
')'           Operator
' '           Text
'('           Operator
'bit'         Name
':'           Operator
'int'         Name
')'           Operator
' '           Text
'='           Operator
'\n    '      Text
'if'          Keyword
' '           Text
'b'           Name
' '           Text
'&&'          Operator
'&'           Operator
' '           Text
'('           Operator
'1uy'         Literal.Number.Integer
' '           Text
'<'           Operator
'<'           Operator
'<'           Operator
' '           Text
'bit'         Name
')'           Operator
' '           Text
'='           Operator
' '           Text
'0uy'         Literal.Number.Integer
' '           Text
'then'        Keyword
' '           Text
'0'           Literal.Number.Integer
' '           Text
'else'        Keyword
' '           Text
'1'           Literal.Number.Integer
'\n\n'        Text

'type'        Keyword
' '           Text
'BitReader'   Name.Class
'('           Operator
'sin'         Name
':'           Operator
'Stream'      Name
')'           Operator
' '           Text
'='           Operator
'\n    '      Text
'let'         Keyword
' '           Text
'mutable'     Name.Variable
' '           Text
'bit'         Name
' '           Text
'='           Operator
' '           Text
'8'           Literal.Number.Integer
'\n    '      Text
'let'         Keyword
' '           Text
'mutable'     Name.Variable
' '           Text
'cur'         Name
' '           Text
'='           Operator
' '           Text
'0uy'         Literal.Number.Integer
'\n    \n    ' Text
'member'      Keyword
' '           Text
'x'           Name
'.'           Punctuation
'Skip'        Name.Function
'()'          Name.Builtin.Pseudo
' '           Text
'='           Operator
'\n        '  Text
'bit'         Name
' '           Text
'<-'          Operator
' '           Text
'8'           Literal.Number.Integer
'\n    \n    ' Text
'member'      Keyword
' '           Text
'x'           Name
'.'           Punctuation
'ReadBit'     Name.Function
'()'          Name.Builtin.Pseudo
' '           Text
'='           Operator
'\n        '  Text
'if'          Keyword
' '           Text
'bit'         Name
' '           Text
'='           Operator
' '           Text
'8'           Literal.Number.Integer
' '           Text
'then'        Keyword
'\n            ' Text
'bit'         Name
' '           Text
'<-'          Operator
' '           Text
'0'           Literal.Number.Integer
'\n            ' Text
'let'         Keyword
' '           Text
'b'           Name.Variable
' '           Text
'='           Operator
' '           Text
'sin'         Name
'.'           Operator
'ReadByte'    Name
'()'          Name.Builtin.Pseudo
'\n            ' Text
'if'          Keyword
' '           Text
'b'           Name
' '           Text
'='           Operator
' '           Text
'-'           Operator
'1'           Literal.Number.Integer
' '           Text
'then'        Keyword
'\n                ' Text
'failwith'    Name
' '           Text
'"'           Literal.String
'バッファを超過しました' Literal.String
'"'           Literal.String
'\n            ' Text
'cur'         Name
' '           Text
'<-'          Operator
' '           Text
'byte'        Keyword.Type
' '           Text
'b'           Name
'\n        '  Text
'let'         Keyword
' '           Text
'ret'         Name.Variable
' '           Text
'='           Operator
' '           Text
'if'          Keyword
' '           Text
'cur'         Name
' '           Text
'&&'          Operator
'&'           Operator
' '           Text
'('           Operator
'1uy'         Literal.Number.Integer
' '           Text
'<'           Operator
'<'           Operator
'<'           Operator
' '           Text
'bit'         Name
')'           Operator
' '           Text
'='           Operator
' '           Text
'0uy'         Literal.Number.Integer
' '           Text
'then'        Keyword
' '           Text
'0'           Literal.Number.Integer
' '           Text
'else'        Keyword
' '           Text
'1'           Literal.Number.Integer
'\n        '  Text
'bit'         Name
' '           Text
'<-'          Operator
' '           Text
'bit'         Name
' '           Text
'+'           Operator
' '           Text
'1'           Literal.Number.Integer
'\n        '  Text
'ret'         Name
'\n    \n    ' Text
'member'      Keyword
' '           Text
'x'           Name
'.'           Punctuation
'ReadLE'      Name.Function
' '           Text
'n'           Name
' '           Text
'='           Operator
'\n        '  Text
'let'         Keyword
' '           Text
'mutable'     Name.Variable
' '           Text
'ret'         Name
' '           Text
'='           Operator
' '           Text
'0'           Literal.Number.Integer
'\n        '  Text
'for'         Keyword
' '           Text
'i'           Name
' '           Text
'='           Operator
' '           Text
'0'           Literal.Number.Integer
' '           Text
'to'          Keyword
' '           Text
'n'           Name
' '           Text
'-'           Operator
' '           Text
'1'           Literal.Number.Integer
' '           Text
'do'          Keyword
'\n            ' Text
'if'          Keyword
' '           Text
'x'           Name
'.'           Operator
'ReadBit'     Name
'()'          Name.Builtin.Pseudo
' '           Text
'='           Operator
' '           Text
'1'           Literal.Number.Integer
' '           Text
'then'        Keyword
' '           Text
'ret'         Name
' '           Text
'<-'          Operator
' '           Text
'ret'         Name
' '           Text
'|'           Operator
'|'           Operator
'|'           Operator
' '           Text
'('           Operator
'1'           Literal.Number.Integer
' '           Text
'<'           Operator
'<'           Operator
'<'           Operator
' '           Text
'i'           Name
')'           Operator
'\n        '  Text
'ret'         Name
'\n    \n    ' Text
'member'      Keyword
' '           Text
'x'           Name
'.'           Punctuation
'ReadBE'      Name.Function
' '           Text
'n'           Name
' '           Text
'='           Operator
'\n        '  Text
'let'         Keyword
' '           Text
'mutable'     Name.Variable
' '           Text
'ret'         Name
' '           Text
'='           Operator
' '           Text
'0'           Literal.Number.Integer
'\n        '  Text
'for'         Keyword
' '           Text
'i'           Name
' '           Text
'='           Operator
' '           Text
'0'           Literal.Number.Integer
' '           Text
'to'          Keyword
' '           Text
'n'           Name
' '           Text
'-'           Operator
' '           Text
'1'           Literal.Number.Integer
' '           Text
'do'          Keyword
'\n            ' Text
'ret'         Name
' '           Text
'<-'          Operator
' '           Text
'('           Operator
'ret'         Name
' '           Text
'<'           Operator
'<'           Operator
'<'           Operator
' '           Text
'1'           Literal.Number.Integer
')'           Operator
' '           Text
'|'           Operator
'|'           Operator
'|'           Operator
' '           Text
'x'           Name
'.'           Operator
'ReadBit'     Name
'()'          Name.Builtin.Pseudo
'\n        '  Text
'ret'         Name
'\n    \n    ' Text
'member'      Keyword
' '           Text
'x'           Name
'.'           Punctuation
'ReadBytes'   Name.Function
' '           Text
'len'         Name
' '           Text
'='           Operator
'\n        '  Text
'if'          Keyword
' '           Text
'bit'         Name
' '           Text
'<'           Operator
'>'           Operator
' '           Text
'8'           Literal.Number.Integer
' '           Text
'then'        Keyword
' '           Text
'bit'         Name
' '           Text
'<-'          Operator
' '           Text
'8'           Literal.Number.Integer
'\n        '  Text
'let'         Keyword
' '           Text
'buf'         Name.Variable
' '           Text
'='           Operator
' '           Text
'Array'       Name.Namespace
'.'           Punctuation
'zeroCreate'  Name
'<'           Operator
'byte'        Keyword.Type
'>'           Operator
' '           Text
'len'         Name
'\n        '  Text
'ignore'      Name
' '           Text
'<'           Operator
'|'           Operator
' '           Text
'sin'         Name
'.'           Operator
'Read'        Name
'('           Operator
'buf'         Name
','           Operator
' '           Text
'0'           Literal.Number.Integer
','           Operator
' '           Text
'len'         Name
')'           Operator
'\n        '  Text
'buf'         Name
'\n\n'        Text

'type'        Keyword
' '           Text
'WriteBuffer' Name.Class
'('           Operator
'sout'        Name
':'           Operator
'Stream'      Name
')'           Operator
' '           Text
'='           Operator
'\n    '      Text
'let'         Keyword
' '           Text
'mutable'     Name.Variable
' '           Text
'prev'        Name
':'           Operator
'byte'        Keyword.Type
'[]'          Name.Builtin.Pseudo
' '           Text
'='           Operator
' '           Text
'null'        Keyword
'\n    '      Text
'let'         Keyword
' '           Text
'mutable'     Name.Variable
' '           Text
'buf'         Name
' '           Text
'='           Operator
' '           Text
'Array'       Name.Namespace
'.'           Punctuation
'zeroCreate'  Name
'<'           Operator
'byte'        Keyword.Type
'>'           Operator
' '           Text
'maxbuf'      Name
'\n    '      Text
'let'         Keyword
' '           Text
'mutable'     Name.Variable
' '           Text
'p'           Name
' '           Text
'='           Operator
' '           Text
'0'           Literal.Number.Integer
'\n    \n    ' Text
'let'         Keyword
' '           Text
'next'        Name.Variable
' '           Text
'newbuf'      Name
' '           Text
'='           Operator
'\n        '  Text
'prev'        Name
' '           Text
'<-'          Operator
' '           Text
'buf'         Name
'\n        '  Text
'buf'         Name
' '           Text
'<-'          Operator
' '           Text
'if'          Keyword
' '           Text
'newbuf'      Name
' '           Text
'then'        Keyword
' '           Text
'Array'       Name.Namespace
'.'           Punctuation
'zeroCreate'  Name
'<'           Operator
'byte'        Keyword.Type
'>'           Operator
' '           Text
'maxbuf'      Name
' '           Text
'else'        Keyword
' '           Text
'null'        Keyword
'\n        '  Text
'p'           Name
' '           Text
'<-'          Operator
' '           Text
'0'           Literal.Number.Integer
'\n    \n    ' Text
'member'      Keyword
' '           Text
'x'           Name
'.'           Punctuation
'Close'       Name.Function
'()'          Name.Builtin.Pseudo
' '           Text
'='           Operator
'\n        '  Text
'next'        Name
' '           Text
'false'       Keyword
'\n        '  Text
'next'        Name
' '           Text
'false'       Keyword
'\n    \n    ' Text
'interface'   Keyword
' '           Text
'IDisposable' Name
' '           Text
'with'        Keyword
'\n        '  Text
'member'      Keyword
' '           Text
'x'           Name
'.'           Punctuation
'Dispose'     Name.Function
'()'          Name.Builtin.Pseudo
' '           Text
'='           Operator
' '           Text
'x'           Name
'.'           Operator
'Close'       Name
'()'          Name.Builtin.Pseudo
'\n    \n    ' Text
'member'      Keyword
' '           Text
'x'           Name
'.'           Punctuation
'WriteByte'   Name.Function
' '           Text
'('           Operator
'b'           Name
':'           Operator
'byte'        Keyword.Type
')'           Operator
' '           Text
'='           Operator
'\n        '  Text
'buf'         Name
'.'           Operator
'['           Operator
'p'           Name
']'           Operator
' '           Text
'<-'          Operator
' '           Text
'b'           Name
'\n        '  Text
'sout'        Name
'.'           Operator
'WriteByte'   Name
' '           Text
'b'           Name
'\n        '  Text
'p'           Name
' '           Text
'<-'          Operator
' '           Text
'p'           Name
' '           Text
'+'           Operator
' '           Text
'1'           Literal.Number.Integer
'\n        '  Text
'if'          Keyword
' '           Text
'p'           Name
' '           Text
'='           Operator
' '           Text
'maxbuf'      Name
' '           Text
'then'        Keyword
' '           Text
'next'        Name
' '           Text
'true'        Keyword
'\n\n    '    Text
'member'      Keyword
' '           Text
'x'           Name
'.'           Punctuation
'Write'       Name.Function
' '           Text
'('           Operator
'src'         Name
':'           Operator
'byte'        Keyword.Type
'[]'          Name.Builtin.Pseudo
')'           Operator
' '           Text
'start'       Name
' '           Text
'len'         Name
' '           Text
'='           Operator
'\n        '  Text
'let'         Keyword
' '           Text
'maxlen'      Name.Variable
' '           Text
'='           Operator
' '           Text
'maxbuf'      Name
' '           Text
'-'           Operator
' '           Text
'p'           Name
'\n        '  Text
'if'          Keyword
' '           Text
'len'         Name
' '           Text
'<'           Operator
'='           Operator
' '           Text
'maxlen'      Name
' '           Text
'then'        Keyword
'\n            ' Text
'Array'       Name.Namespace
'.'           Punctuation
'Copy'        Name
'('           Operator
'src'         Name
','           Operator
' '           Text
'start'       Name
','           Operator
' '           Text
'buf'         Name
','           Operator
' '           Text
'p'           Name
','           Operator
' '           Text
'len'         Name
')'           Operator
'\n            ' Text
'sout'        Name
'.'           Operator
'Write'       Name
'('           Operator
'src'         Name
','           Operator
' '           Text
'start'       Name
','           Operator
' '           Text
'len'         Name
')'           Operator
'\n            ' Text
'p'           Name
' '           Text
'<-'          Operator
' '           Text
'p'           Name
' '           Text
'+'           Operator
' '           Text
'len'         Name
'\n            ' Text
'if'          Keyword
' '           Text
'p'           Name
' '           Text
'='           Operator
' '           Text
'maxbuf'      Name
' '           Text
'then'        Keyword
' '           Text
'next'        Name
' '           Text
'true'        Keyword
'\n        '  Text
'else'        Keyword
'\n            ' Text
'x'           Name
'.'           Operator
'Write'       Name
' '           Text
'src'         Name
' '           Text
'start'       Name
' '           Text
'maxlen'      Name
'\n            ' Text
'x'           Name
'.'           Operator
'Write'       Name
' '           Text
'src'         Name
' '           Text
'('           Operator
'start'       Name
' '           Text
'+'           Operator
' '           Text
'maxlen'      Name
')'           Operator
' '           Text
'('           Operator
'len'         Name
' '           Text
'-'           Operator
' '           Text
'maxlen'      Name
')'           Operator
'\n    \n    ' Text
'member'      Keyword
' '           Text
'x'           Name
'.'           Punctuation
'Copy'        Name.Function
' '           Text
'len'         Name
' '           Text
'dist'        Name
' '           Text
'='           Operator
'\n        '  Text
'if'          Keyword
' '           Text
'dist'        Name
' '           Text
'<'           Operator
' '           Text
'1'           Literal.Number.Integer
' '           Text
'then'        Keyword
'\n            ' Text
'failwith'    Name
' '           Text
'<'           Operator
'|'           Operator
' '           Text
'sprintf'     Name
' '           Text
'"'           Literal.String
'dist too small: %d < 1' Literal.String
'"'           Literal.String
' '           Text
'dist'        Name
'\n        '  Text
'elif'        Keyword
' '           Text
'dist'        Name
' '           Text
'>'           Operator
' '           Text
'maxbuf'      Name
' '           Text
'then'        Keyword
'\n            ' Text
'failwith'    Name
' '           Text
'<'           Operator
'|'           Operator
' '           Text
'sprintf'     Name
' '           Text
'"'           Literal.String
'dist too big: %d > %d' Literal.String
'"'           Literal.String
' '           Text
'dist'        Name
' '           Text
'maxbuf'      Name
'\n        '  Text
'let'         Keyword
' '           Text
'pp'          Name.Variable
' '           Text
'='           Operator
' '           Text
'p'           Name
' '           Text
'-'           Operator
' '           Text
'dist'        Name
'\n        '  Text
'if'          Keyword
' '           Text
'pp'          Name
' '           Text
'<'           Operator
' '           Text
'0'           Literal.Number.Integer
' '           Text
'then'        Keyword
'\n            ' Text
'if'          Keyword
' '           Text
'prev'        Name
' '           Text
'='           Operator
' '           Text
'null'        Keyword
' '           Text
'then'        Keyword
'\n                ' Text
'failwith'    Name
' '           Text
'<'           Operator
'|'           Operator
' '           Text
'sprintf'     Name
' '           Text
'"'           Literal.String
'dist too big: %d > %d' Literal.String
'"'           Literal.String
' '           Text
'dist'        Name
' '           Text
'p'           Name
'\n            ' Text
'let'         Keyword
' '           Text
'pp'          Name.Variable
' '           Text
'='           Operator
' '           Text
'pp'          Name
' '           Text
'+'           Operator
' '           Text
'maxbuf'      Name
'\n            ' Text
'let'         Keyword
' '           Text
'maxlen'      Name.Variable
' '           Text
'='           Operator
' '           Text
'maxbuf'      Name
' '           Text
'-'           Operator
' '           Text
'pp'          Name
'\n            ' Text
'if'          Keyword
' '           Text
'len'         Name
' '           Text
'<'           Operator
'='           Operator
' '           Text
'maxlen'      Name
' '           Text
'then'        Keyword
'\n                ' Text
'x'           Name
'.'           Operator
'Write'       Name
' '           Text
'prev'        Name
' '           Text
'pp'          Name
' '           Text
'len'         Name
'\n            ' Text
'else'        Keyword
'\n                ' Text
'x'           Name
'.'           Operator
'Write'       Name
' '           Text
'prev'        Name
' '           Text
'pp'          Name
' '           Text
'maxlen'      Name
'\n                ' Text
'x'           Name
'.'           Operator
'Copy'        Name
' '           Text
'('           Operator
'len'         Name
' '           Text
'-'           Operator
' '           Text
'maxlen'      Name
')'           Operator
' '           Text
'dist'        Name
'\n        '  Text
'else'        Keyword
'\n            ' Text
'let'         Keyword
' '           Text
'maxlen'      Name.Variable
' '           Text
'='           Operator
' '           Text
'p'           Name
' '           Text
'-'           Operator
' '           Text
'pp'          Name
'\n            ' Text
'if'          Keyword
' '           Text
'len'         Name
' '           Text
'<'           Operator
'='           Operator
' '           Text
'maxlen'      Name
' '           Text
'then'        Keyword
'\n                ' Text
'x'           Name
'.'           Operator
'Write'       Name
' '           Text
'buf'         Name
' '           Text
'pp'          Name
' '           Text
'len'         Name
'\n            ' Text
'else'        Keyword
'\n                ' Text
'if'          Keyword
' '           Text
'dist'        Name
' '           Text
'='           Operator
' '           Text
'1'           Literal.Number.Integer
' '           Text
'then'        Keyword
'\n                    ' Text
'let'         Keyword
' '           Text
'b'           Name.Variable
' '           Text
'='           Operator
' '           Text
'buf'         Name
'.'           Operator
'['           Operator
'pp'          Name
']'           Operator
'\n                    ' Text
'for'         Keyword
' '           Text
'i'           Name
' '           Text
'='           Operator
' '           Text
'1'           Literal.Number.Integer
' '           Text
'to'          Keyword
' '           Text
'len'         Name
' '           Text
'do'          Keyword
'\n                        ' Text
'x'           Name
'.'           Operator
'WriteByte'   Name
' '           Text
'b'           Name
'\n                ' Text
'else'        Keyword
'\n                    ' Text
'let'         Keyword
' '           Text
'buf'         Name.Variable
"'"           Keyword
' '           Text
'='           Operator
' '           Text
'buf'         Name
'\n                    ' Text
'let'         Keyword
' '           Text
'mutable'     Name.Variable
' '           Text
"len'"        Name
' '           Text
'='           Operator
' '           Text
'len'         Name
'\n                    ' Text
'while'       Keyword
' '           Text
"len'"        Name
' '           Text
'>'           Operator
' '           Text
'0'           Literal.Number.Integer
' '           Text
'do'          Keyword
'\n                        ' Text
'let'         Keyword
' '           Text
'len'         Name.Variable
"'"           Keyword
"'"           Keyword
' '           Text
'='           Operator
' '           Text
'Math'        Name.Namespace
'.'           Punctuation
'Min'         Name
'('           Operator
"len'"        Name
','           Operator
' '           Text
'maxlen'      Name
')'           Operator
'\n                        ' Text
'x'           Name
'.'           Operator
'Write'       Name
' '           Text
"buf'"        Name
' '           Text
'pp'          Name
' '           Text
"len''"       Name
'\n                        ' Text
"len'"        Name
' '           Text
'<-'          Operator
' '           Text
"len'"        Name
' '           Text
'-'           Operator
' '           Text
"len''"       Name
'\n\n'        Text

'type'        Keyword
' '           Text
'Huffman'     Name.Class
'('           Operator
'lens'        Name
':'           Operator
'int'         Name
'[]'          Name.Builtin.Pseudo
')'           Operator
' '           Text
'='           Operator
'\n    '      Text
'let'         Keyword
' '           Text
'vals'        Name.Variable
' '           Text
'='           Operator
' '           Text
'Array'       Name.Namespace
'.'           Punctuation
'zeroCreate'  Name
'<'           Operator
'int'         Name
'>'           Operator
' '           Text
'lens'        Name
'.'           Operator
'Length'      Name
'\n    '      Text
'let'         Keyword
' '           Text
'min'         Name.Variable
' '           Text
'='           Operator
' '           Text
'lens'        Name
'.'           Operator
'Where'       Name
'('           Operator
'fun'         Keyword
' '           Text
'x'           Name
' '           Text
'->'          Operator
' '           Text
'x'           Name
' '           Text
'>'           Operator
' '           Text
'0'           Literal.Number.Integer
')'           Operator
'.'           Operator
'Min'         Name
'()'          Name.Builtin.Pseudo
'\n    '      Text
'let'         Keyword
' '           Text
'max'         Name.Variable
' '           Text
'='           Operator
' '           Text
'lens'        Name
'.'           Operator
'Max'         Name
'()'          Name.Builtin.Pseudo
'\n    '      Text
'let'         Keyword
' '           Text
'counts'      Name.Variable
' '           Text
'='           Operator
' '           Text
'Array'       Name.Namespace
'.'           Punctuation
'zeroCreate'  Name
'<'           Operator
'int'         Name
'>'           Operator
'  '          Text
'('           Operator
'max'         Name
' '           Text
'+'           Operator
' '           Text
'1'           Literal.Number.Integer
')'           Operator
'\n    '      Text
'let'         Keyword
' '           Text
'firsts'      Name.Variable
' '           Text
'='           Operator
' '           Text
'Array'       Name.Namespace
'.'           Punctuation
'zeroCreate'  Name
'<'           Operator
'int'         Name
'>'           Operator
'  '          Text
'('           Operator
'max'         Name
' '           Text
'+'           Operator
' '           Text
'1'           Literal.Number.Integer
')'           Operator
'\n    '      Text
'let'         Keyword
' '           Text
'nexts'       Name.Variable
'  '          Text
'='           Operator
' '           Text
'Array'       Name.Namespace
'.'           Punctuation
'zeroCreate'  Name
'<'           Operator
'int'         Name
'>'           Operator
'  '          Text
'('           Operator
'max'         Name
' '           Text
'+'           Operator
' '           Text
'1'           Literal.Number.Integer
')'           Operator
'\n    '      Text
'let'         Keyword
' '           Text
'tables'      Name.Variable
' '           Text
'='           Operator
' '           Text
'Array'       Name.Namespace
'.'           Punctuation
'zeroCreate'  Name
'<'           Operator
'int'         Name
'[]'          Name.Builtin.Pseudo
'>'           Operator
'('           Operator
'max'         Name
' '           Text
'+'           Operator
' '           Text
'1'           Literal.Number.Integer
')'           Operator
'\n    \n    ' Text
'do'          Keyword
'\n        '  Text
'for'         Keyword
' '           Text
'len'         Name
' '           Text
'in'          Keyword
' '           Text
'lens'        Name
' '           Text
'do'          Keyword
'\n            ' Text
'if'          Keyword
' '           Text
'len'         Name
' '           Text
'>'           Operator
' '           Text
'0'           Literal.Number.Integer
' '           Text
'then'        Keyword
' '           Text
'counts'      Name
'.'           Operator
'['           Operator
'len'         Name
']'           Operator
' '           Text
'<-'          Operator
' '           Text
'counts'      Name
'.'           Operator
'['           Operator
'len'         Name
']'           Operator
' '           Text
'+'           Operator
' '           Text
'1'           Literal.Number.Integer
'\n        '  Text
'for'         Keyword
' '           Text
'i'           Name
' '           Text
'='           Operator
' '           Text
'1'           Literal.Number.Integer
' '           Text
'to'          Keyword
' '           Text
'max'         Name
' '           Text
'do'          Keyword
'\n            ' Text
'firsts'      Name
'.'           Operator
'['           Operator
'i'           Name
']'           Operator
' '           Text
'<-'          Operator
' '           Text
'('           Operator
'firsts'      Name
'.'           Operator
'['           Operator
'i'           Name
' '           Text
'-'           Operator
' '           Text
'1'           Literal.Number.Integer
']'           Operator
' '           Text
'+'           Operator
' '           Text
'counts'      Name
'.'           Operator
'['           Operator
'i'           Name
' '           Text
'-'           Operator
' '           Text
'1'           Literal.Number.Integer
']'           Operator
')'           Operator
' '           Text
'<'           Operator
'<'           Operator
'<'           Operator
' '           Text
'1'           Literal.Number.Integer
'\n        '  Text
'Array'       Name.Namespace
'.'           Punctuation
'Copy'        Name
'('           Operator
'firsts'      Name
','           Operator
' '           Text
'0'           Literal.Number.Integer
','           Operator
' '           Text
'nexts'       Name
','           Operator
' '           Text
'0'           Literal.Number.Integer
','           Operator
' '           Text
'max'         Name
' '           Text
'+'           Operator
' '           Text
'1'           Literal.Number.Integer
')'           Operator
'\n        '  Text
'for'         Keyword
' '           Text
'i'           Name
' '           Text
'='           Operator
' '           Text
'0'           Literal.Number.Integer
' '           Text
'to'          Keyword
' '           Text
'vals'        Name
'.'           Operator
'Length'      Name
' '           Text
'-'           Operator
' '           Text
'1'           Literal.Number.Integer
' '           Text
'do'          Keyword
'\n            ' Text
'let'         Keyword
' '           Text
'len'         Name.Variable
' '           Text
'='           Operator
' '           Text
'lens'        Name
'.'           Operator
'['           Operator
'i'           Name
']'           Operator
'\n            ' Text
'if'          Keyword
' '           Text
'len'         Name
' '           Text
'>'           Operator
' '           Text
'0'           Literal.Number.Integer
' '           Text
'then'        Keyword
'\n                ' Text
'vals'        Name
'.'           Operator
'['           Operator
'i'           Name
']'           Operator
' '           Text
'<-'          Operator
' '           Text
'nexts'       Name
'.'           Operator
'['           Operator
'len'         Name
']'           Operator
'\n                ' Text
'nexts'       Name
'.'           Operator
'['           Operator
'len'         Name
']'           Operator
' '           Text
'<-'          Operator
' '           Text
'nexts'       Name
'.'           Operator
'['           Operator
'len'         Name
']'           Operator
' '           Text
'+'           Operator
' '           Text
'1'           Literal.Number.Integer
'\n        \n        ' Text
'for'         Keyword
' '           Text
'i'           Name
' '           Text
'='           Operator
' '           Text
'0'           Literal.Number.Integer
' '           Text
'to'          Keyword
' '           Text
'vals'        Name
'.'           Operator
'Length'      Name
' '           Text
'-'           Operator
' '           Text
'1'           Literal.Number.Integer
' '           Text
'do'          Keyword
'\n            ' Text
'let'         Keyword
' '           Text
'len'         Name.Variable
' '           Text
'='           Operator
' '           Text
'lens'        Name
'.'           Operator
'['           Operator
'i'           Name
']'           Operator
'\n            ' Text
'if'          Keyword
' '           Text
'len'         Name
' '           Text
'>'           Operator
' '           Text
'0'           Literal.Number.Integer
' '           Text
'then'        Keyword
'\n                ' Text
'let'         Keyword
' '           Text
'start'       Name.Variable
' '           Text
'='           Operator
' '           Text
'firsts'      Name
'.'           Operator
'['           Operator
'len'         Name
']'           Operator
'\n                ' Text
'if'          Keyword
' '           Text
'tables'      Name
'.'           Operator
'['           Operator
'len'         Name
']'           Operator
' '           Text
'='           Operator
' '           Text
'null'        Keyword
' '           Text
'then'        Keyword
'\n                    ' Text
'let'         Keyword
' '           Text
'count'       Name.Variable
' '           Text
'='           Operator
' '           Text
'nexts'       Name
'.'           Operator
'['           Operator
'len'         Name
']'           Operator
' '           Text
'-'           Operator
' '           Text
'start'       Name
'\n                    ' Text
'tables'      Name
'.'           Operator
'['           Operator
'len'         Name
']'           Operator
' '           Text
'<-'          Operator
' '           Text
'Array'       Name.Namespace
'.'           Punctuation
'zeroCreate'  Name
'<'           Operator
'int'         Name
'>'           Operator
' '           Text
'count'       Name
'\n                ' Text
'tables'      Name
'.'           Operator
'['           Operator
'len'         Name
']'           Operator
'.'           Operator
'['           Operator
'vals'        Name
'.'           Operator
'['           Operator
'i'           Name
']'           Operator
' '           Text
'-'           Operator
' '           Text
'start'       Name
']'           Operator
' '           Text
'<-'          Operator
' '           Text
'i'           Name
'\n    \n    ' Text
'member'      Keyword
' '           Text
'x'           Name
'.'           Punctuation
'GetValue'    Name.Function
' '           Text
'h'           Name
' '           Text
'='           Operator
'\n        '  Text
'let'         Keyword
' '           Text
'rec'         Name.Variable
' '           Text
'getv'        Name
' '           Text
'i'           Name
' '           Text
'='           Operator
'\n            ' Text
'if'          Keyword
' '           Text
'i'           Name
' '           Text
'>'           Operator
' '           Text
'max'         Name
' '           Text
'then'        Keyword
' '           Text
'-'           Operator
'1'           Literal.Number.Integer
' '           Text
'else'        Keyword
'\n                ' Text
'if'          Keyword
' '           Text
'h'           Name
' '           Text
'<'           Operator
' '           Text
'nexts'       Name
'.'           Operator
'['           Operator
'i'           Name
']'           Operator
' '           Text
'then'        Keyword
'\n                    ' Text
'tables'      Name
'.'           Operator
'['           Operator
'i'           Name
']'           Operator
'.'           Operator
'['           Operator
'h'           Name
' '           Text
'-'           Operator
' '           Text
'firsts'      Name
'.'           Operator
'['           Operator
'i'           Name
']'           Operator
']'           Operator
'\n                ' Text
'else'        Keyword
'\n                    ' Text
'getv'        Name
' '           Text
'('           Operator
'i'           Name
' '           Text
'+'           Operator
' '           Text
'1'           Literal.Number.Integer
')'           Operator
'\n        '  Text
'getv'        Name
' '           Text
'min'         Name
'\n    \n    ' Text
'member'      Keyword
' '           Text
'x'           Name
'.'           Punctuation
'Read'        Name.Function
'('           Operator
'br'          Name
':'           Operator
'BitReader'   Name
')'           Operator
' '           Text
'='           Operator
'\n        '  Text
'let'         Keyword
' '           Text
'rec'         Name.Variable
' '           Text
'read'        Name
' '           Text
'h'           Name
' '           Text
'i'           Name
' '           Text
'='           Operator
'\n            ' Text
'if'          Keyword
' '           Text
'h'           Name
' '           Text
'<'           Operator
' '           Text
'nexts'       Name
'.'           Operator
'['           Operator
'i'           Name
']'           Operator
' '           Text
'then'        Keyword
'\n                ' Text
'tables'      Name
'.'           Operator
'['           Operator
'i'           Name
']'           Operator
'.'           Operator
'['           Operator
'h'           Name
' '           Text
'-'           Operator
' '           Text
'firsts'      Name
'.'           Operator
'['           Operator
'i'           Name
']'           Operator
']'           Operator
'\n            ' Text
'else'        Keyword
'\n                ' Text
'read'        Name
' '           Text
'('           Operator
'('           Operator
'h'           Name
' '           Text
'<'           Operator
'<'           Operator
'<'           Operator
' '           Text
'1'           Literal.Number.Integer
')'           Operator
' '           Text
'|'           Operator
'|'           Operator
'|'           Operator
' '           Text
'br'          Name
'.'           Operator
'ReadBit'     Name
'()'          Name.Builtin.Pseudo
')'           Operator
' '           Text
'('           Operator
'i'           Name
' '           Text
'+'           Operator
' '           Text
'1'           Literal.Number.Integer
')'           Operator
'\n        '  Text
'read'        Name
' '           Text
'('           Operator
'br'          Name
'.'           Operator
'ReadBE'      Name
' '           Text
'min'         Name
')'           Operator
' '           Text
'min'         Name
'\n\n'        Text

'type'        Keyword
' '           Text
'[<'          Operator
'AbstractClass' Name
'>]'          Operator
' '           Text
'HuffmanDecoder' Name
'()'          Name.Builtin.Pseudo
' '           Text
'='           Operator
'\n    '      Text
'abstract'    Keyword
' '           Text
'GetValue'    Name
':'           Operator
' '           Text
'unit'        Keyword.Type
'->'          Operator
'int'         Name
'\n    '      Text
'abstract'    Keyword
' '           Text
'GetDistance' Name
':'           Operator
' '           Text
'unit'        Keyword.Type
'->'          Operator
'int'         Name
'\n\n'        Text

'type'        Keyword
' '           Text
'FixedHuffman' Name.Class
'('           Operator
'br'          Name
':'           Operator
'BitReader'   Name
')'           Operator
' '           Text
'='           Operator
'\n    '      Text
'inherit'     Keyword
' '           Text
'HuffmanDecoder' Name
'()'          Name.Builtin.Pseudo
'\n    \n    ' Text
'override'    Keyword
' '           Text
'x'           Name
'.'           Punctuation
'GetValue'    Name.Function
'()'          Name.Builtin.Pseudo
' '           Text
'='           Operator
'\n        '  Text
'let'         Keyword
' '           Text
'v'           Name.Variable
' '           Text
'='           Operator
' '           Text
'br'          Name
'.'           Operator
'ReadBE'      Name
' '           Text
'7'           Literal.Number.Integer
'\n        '  Text
'if'          Keyword
' '           Text
'v'           Name
' '           Text
'<'           Operator
' '           Text
'24'          Literal.Number.Integer
' '           Text
'then'        Keyword
' '           Text
'v'           Name
' '           Text
'+'           Operator
' '           Text
'256'         Literal.Number.Integer
' '           Text
'else'        Keyword
'\n            ' Text
'let'         Keyword
' '           Text
'v'           Name.Variable
' '           Text
'='           Operator
' '           Text
'('           Operator
'v'           Name
' '           Text
'<'           Operator
'<'           Operator
'<'           Operator
' '           Text
'1'           Literal.Number.Integer
')'           Operator
' '           Text
'|'           Operator
'|'           Operator
'|'           Operator
' '           Text
'br'          Name
'.'           Operator
'ReadBit'     Name
'()'          Name.Builtin.Pseudo
'\n            ' Text
'if'          Keyword
' '           Text
'v'           Name
' '           Text
'<'           Operator
' '           Text
'192'         Literal.Number.Integer
' '           Text
'then'        Keyword
' '           Text
'v'           Name
' '           Text
'-'           Operator
' '           Text
'48'          Literal.Number.Integer
'\n            ' Text
'elif'        Keyword
' '           Text
'v'           Name
' '           Text
'<'           Operator
' '           Text
'200'         Literal.Number.Integer
' '           Text
'then'        Keyword
' '           Text
'v'           Name
' '           Text
'+'           Operator
' '           Text
'88'          Literal.Number.Integer
'\n            ' Text
'else'        Keyword
' '           Text
'('           Operator
'('           Operator
'v'           Name
' '           Text
'<'           Operator
'<'           Operator
'<'           Operator
' '           Text
'1'           Literal.Number.Integer
')'           Operator
' '           Text
'|'           Operator
'|'           Operator
'|'           Operator
' '           Text
'br'          Name
'.'           Operator
'ReadBit'     Name
'()'          Name.Builtin.Pseudo
')'           Operator
' '           Text
'-'           Operator
' '           Text
'256'         Literal.Number.Integer
'\n    \n    ' Text
'override'    Keyword
' '           Text
'x'           Name
'.'           Punctuation
'GetDistance' Name.Function
'()'          Name.Builtin.Pseudo
' '           Text
'='           Operator
' '           Text
'br'          Name
'.'           Operator
'ReadBE'      Name
' '           Text
'5'           Literal.Number.Integer
'\n\n'        Text

'type'        Keyword
' '           Text
'DynamicHuffman' Name.Class
'('           Operator
'br'          Name
':'           Operator
'BitReader'   Name
')'           Operator
' '           Text
'='           Operator
'\n    '      Text
'inherit'     Keyword
' '           Text
'HuffmanDecoder' Name
'()'          Name.Builtin.Pseudo
'\n    \n    ' Text
'let'         Keyword
' '           Text
'lit'         Name.Variable
','           Operator
' '           Text
'dist'        Name
' '           Text
'='           Operator
'\n        '  Text
'let'         Keyword
' '           Text
'hlit'        Name.Variable
' '           Text
'='           Operator
'\n            ' Text
'let'         Keyword
' '           Text
'hlit'        Name.Variable
' '           Text
'='           Operator
' '           Text
'('           Operator
'br'          Name
'.'           Operator
'ReadLE'      Name
' '           Text
'5'           Literal.Number.Integer
')'           Operator
' '           Text
'+'           Operator
' '           Text
'257'         Literal.Number.Integer
'\n            ' Text
'if'          Keyword
' '           Text
'hlit'        Name
' '           Text
'>'           Operator
' '           Text
'286'         Literal.Number.Integer
' '           Text
'then'        Keyword
' '           Text
'failwith'    Name
' '           Text
'<'           Operator
'|'           Operator
' '           Text
'sprintf'     Name
' '           Text
'"'           Literal.String
'hlit: %d > 286' Literal.String
'"'           Literal.String
' '           Text
'hlit'        Name
'\n            ' Text
'hlit'        Name
'\n        \n        ' Text
'let'         Keyword
' '           Text
'hdist'       Name.Variable
' '           Text
'='           Operator
'\n            ' Text
'let'         Keyword
' '           Text
'hdist'       Name.Variable
' '           Text
'='           Operator
' '           Text
'('           Operator
'br'          Name
'.'           Operator
'ReadLE'      Name
' '           Text
'5'           Literal.Number.Integer
')'           Operator
' '           Text
'+'           Operator
' '           Text
'1'           Literal.Number.Integer
'\n            ' Text
'if'          Keyword
' '           Text
'hdist'       Name
' '           Text
'>'           Operator
' '           Text
'32'          Literal.Number.Integer
' '           Text
'then'        Keyword
' '           Text
'failwith'    Name
' '           Text
'<'           Operator
'|'           Operator
' '           Text
'sprintf'     Name
' '           Text
'"'           Literal.String
'hdist: %d > 32' Literal.String
'"'           Literal.String
' '           Text
'hdist'       Name
'\n            ' Text
'hdist'       Name
'\n        \n        ' Text
'let'         Keyword
' '           Text
'hclen'       Name.Variable
' '           Text
'='           Operator
'\n            ' Text
'let'         Keyword
' '           Text
'hclen'       Name.Variable
' '           Text
'='           Operator
' '           Text
'('           Operator
'br'          Name
'.'           Operator
'ReadLE'      Name
' '           Text
'4'           Literal.Number.Integer
')'           Operator
' '           Text
'+'           Operator
' '           Text
'4'           Literal.Number.Integer
'\n            ' Text
'if'          Keyword
' '           Text
'hclen'       Name
' '           Text
'>'           Operator
' '           Text
'19'          Literal.Number.Integer
' '           Text
'then'        Keyword
' '           Text
'failwith'    Name
' '           Text
'<'           Operator
'|'           Operator
' '           Text
'sprintf'     Name
' '           Text
'"'           Literal.String
'hclen: %d > 19' Literal.String
'"'           Literal.String
' '           Text
'hclen'       Name
'\n            ' Text
'hclen'       Name
'\n        \n        ' Text
'let'         Keyword
' '           Text
'clen'        Name.Variable
' '           Text
'='           Operator
'\n            ' Text
'let'         Keyword
' '           Text
'hclens'      Name.Variable
' '           Text
'='           Operator
' '           Text
'Array'       Name.Namespace
'.'           Punctuation
'zeroCreate'  Name
'<'           Operator
'int'         Name
'>'           Operator
' '           Text
'19'          Literal.Number.Integer
'\n            ' Text
'let'         Keyword
' '           Text
'order'       Name.Variable
' '           Text
'='           Operator
' '           Text
'[|'          Operator
' '           Text
'16'          Literal.Number.Integer
';'           Operator
' '           Text
'17'          Literal.Number.Integer
';'           Operator
' '           Text
'18'          Literal.Number.Integer
';'           Operator
' '           Text
'0'           Literal.Number.Integer
';'           Operator
' '           Text
'8'           Literal.Number.Integer
';'           Operator
' '           Text
'7'           Literal.Number.Integer
';'           Operator
' '           Text
'9'           Literal.Number.Integer
';'           Operator
' '           Text
'6'           Literal.Number.Integer
';'           Operator
' '           Text
'10'          Literal.Number.Integer
';'           Operator
' '           Text
'5'           Literal.Number.Integer
';'           Operator
'\n                           ' Text
'11'          Literal.Number.Integer
';'           Operator
' '           Text
'4'           Literal.Number.Integer
';'           Operator
' '           Text
'12'          Literal.Number.Integer
';'           Operator
' '           Text
'3'           Literal.Number.Integer
';'           Operator
' '           Text
'13'          Literal.Number.Integer
';'           Operator
' '           Text
'2'           Literal.Number.Integer
';'           Operator
' '           Text
'14'          Literal.Number.Integer
';'           Operator
' '           Text
'1'           Literal.Number.Integer
';'           Operator
' '           Text
'15'          Literal.Number.Integer
' '           Text
'|]'          Operator
'\n            ' Text
'for'         Keyword
' '           Text
'i'           Name
' '           Text
'='           Operator
' '           Text
'0'           Literal.Number.Integer
' '           Text
'to'          Keyword
' '           Text
'hclen'       Name
' '           Text
'-'           Operator
' '           Text
'1'           Literal.Number.Integer
' '           Text
'do'          Keyword
'\n                ' Text
'hclens'      Name
'.'           Operator
'['           Operator
'order'       Name
'.'           Operator
'['           Operator
'i'           Name
']'           Operator
']'           Operator
' '           Text
'<-'          Operator
' '           Text
'br'          Name
'.'           Operator
'ReadLE'      Name
' '           Text
'3'           Literal.Number.Integer
'\n            ' Text
'new'         Keyword
' '           Text
'Huffman'     Name
'('           Operator
'hclens'      Name
')'           Operator
'\n        \n        ' Text
'let'         Keyword
' '           Text
'ld'          Name.Variable
' '           Text
'='           Operator
' '           Text
'Array'       Name.Namespace
'.'           Punctuation
'zeroCreate'  Name
'<'           Operator
'int'         Name
'>'           Operator
'('           Operator
'hlit'        Name
' '           Text
'+'           Operator
' '           Text
'hdist'       Name
')'           Operator
'\n        '  Text
'let'         Keyword
' '           Text
'mutable'     Name.Variable
' '           Text
'i'           Name
' '           Text
'='           Operator
' '           Text
'0'           Literal.Number.Integer
'\n        '  Text
'while'       Keyword
' '           Text
'i'           Name
' '           Text
'<'           Operator
' '           Text
'ld'          Name
'.'           Operator
'Length'      Name
' '           Text
'do'          Keyword
'\n            ' Text
'let'         Keyword
' '           Text
'v'           Name.Variable
' '           Text
'='           Operator
' '           Text
'clen'        Name
'.'           Operator
'Read'        Name
'('           Operator
'br'          Name
')'           Operator
'\n            ' Text
'if'          Keyword
' '           Text
'v'           Name
' '           Text
'<'           Operator
' '           Text
'16'          Literal.Number.Integer
' '           Text
'then'        Keyword
'\n                ' Text
'ld'          Name
'.'           Operator
'['           Operator
'i'           Name
']'           Operator
' '           Text
'<-'          Operator
' '           Text
'v'           Name
'\n                ' Text
'i'           Name
' '           Text
'<-'          Operator
' '           Text
'i'           Name
' '           Text
'+'           Operator
' '           Text
'1'           Literal.Number.Integer
'\n            ' Text
'else'        Keyword
'\n                ' Text
'let'         Keyword
' '           Text
'r'           Name.Variable
','           Operator
' '           Text
'v'           Name
' '           Text
'='           Operator
'\n                    ' Text
'match'       Keyword
' '           Text
'v'           Name
' '           Text
'with'        Keyword
'\n                    ' Text
'|'           Operator
' '           Text
'16'          Literal.Number.Integer
' '           Text
'->'          Operator
' '           Text
'('           Operator
'br'          Name
'.'           Operator
'ReadLE'      Name
' '           Text
'2'           Literal.Number.Integer
')'           Operator
' '           Text
'+'           Operator
' '           Text
'3'           Literal.Number.Integer
','           Operator
' '           Text
'ld'          Name
'.'           Operator
'['           Operator
'i'           Name
' '           Text
'-'           Operator
' '           Text
'1'           Literal.Number.Integer
']'           Operator
'\n                    ' Text
'|'           Operator
' '           Text
'17'          Literal.Number.Integer
' '           Text
'->'          Operator
' '           Text
'('           Operator
'br'          Name
'.'           Operator
'ReadLE'      Name
' '           Text
'3'           Literal.Number.Integer
')'           Operator
' '           Text
'+'           Operator
' '           Text
'3'           Literal.Number.Integer
','           Operator
' '           Text
'0'           Literal.Number.Integer
'\n                    ' Text
'|'           Operator
' '           Text
'18'          Literal.Number.Integer
' '           Text
'->'          Operator
' '           Text
'('           Operator
'br'          Name
'.'           Operator
'ReadLE'      Name
' '           Text
'7'           Literal.Number.Integer
')'           Operator
' '           Text
'+'           Operator
' '           Text
'11'          Literal.Number.Integer
','           Operator
' '           Text
'0'           Literal.Number.Integer
'\n                    ' Text
'|'           Operator
' '           Text
'_'           Operator
'  '          Text
'->'          Operator
' '           Text
'failwith'    Name
' '           Text
'"'           Literal.String
'不正な値です。'     Literal.String
'"'           Literal.String
'\n                ' Text
'for'         Keyword
' '           Text
'j'           Name
' '           Text
'='           Operator
' '           Text
'0'           Literal.Number.Integer
' '           Text
'to'          Keyword
' '           Text
'r'           Name
' '           Text
'-'           Operator
' '           Text
'1'           Literal.Number.Integer
' '           Text
'do'          Keyword
'\n                    ' Text
'ld'          Name
'.'           Operator
'['           Operator
'i'           Name
' '           Text
'+'           Operator
' '           Text
'j'           Name
']'           Operator
' '           Text
'<-'          Operator
' '           Text
'v'           Name
'\n                ' Text
'i'           Name
' '           Text
'<-'          Operator
' '           Text
'i'           Name
' '           Text
'+'           Operator
' '           Text
'r'           Name
'\n        \n        ' Text
'new'         Keyword
' '           Text
'Huffman'     Name
'('           Operator
'ld'          Name
'.'           Operator
'['           Operator
'0'           Literal.Number.Integer
' '           Text
'..'          Operator
' '           Text
'hlit'        Name
' '           Text
'-'           Operator
' '           Text
'1'           Literal.Number.Integer
']'           Operator
')'           Operator
','           Operator
'\n        '  Text
'new'         Keyword
' '           Text
'Huffman'     Name
'('           Operator
'ld'          Name
'.'           Operator
'['           Operator
'hlit'        Name
' '           Text
'..'          Operator
' '           Text
'hlit'        Name
' '           Text
'+'           Operator
' '           Text
'hdist'       Name
' '           Text
'-'           Operator
' '           Text
'1'           Literal.Number.Integer
']'           Operator
')'           Operator
'\n    \n    ' Text
'override'    Keyword
' '           Text
'x'           Name
'.'           Punctuation
'GetValue'    Name.Function
'()'          Name.Builtin.Pseudo
' '           Text
'='           Operator
' '           Text
'lit'         Name
'.'           Operator
'Read'        Name
' '           Text
'br'          Name
'\n    '      Text
'override'    Keyword
' '           Text
'x'           Name
'.'           Punctuation
'GetDistance' Name.Function
'()'          Name.Builtin.Pseudo
' '           Text
'='           Operator
' '           Text
'dist'        Name
'.'           Operator
'Read'        Name
' '           Text
'br'          Name
'\n\n'        Text

'let'         Keyword
' '           Text
'getLitExLen' Name.Variable
' '           Text
'v'           Name
' '           Text
'='           Operator
' '           Text
'if'          Keyword
' '           Text
'v'           Name
' '           Text
'<'           Operator
' '           Text
'265'         Literal.Number.Integer
' '           Text
'|'           Operator
'|'           Operator
' '           Text
'v'           Name
' '           Text
'='           Operator
' '           Text
'285'         Literal.Number.Integer
' '           Text
'then'        Keyword
' '           Text
'0'           Literal.Number.Integer
' '           Text
'else'        Keyword
' '           Text
'('           Operator
'v'           Name
' '           Text
'-'           Operator
' '           Text
'261'         Literal.Number.Integer
')'           Operator
' '           Text
'>'           Operator
'>'           Operator
'>'           Operator
' '           Text
'2'           Literal.Number.Integer
'\n'          Text

'let'         Keyword
' '           Text
'getDistExLen' Name.Variable
' '           Text
'd'           Name
' '           Text
'='           Operator
' '           Text
'if'          Keyword
' '           Text
'd'           Name
' '           Text
'<'           Operator
' '           Text
'4'           Literal.Number.Integer
' '           Text
'then'        Keyword
' '           Text
'0'           Literal.Number.Integer
' '           Text
'else'        Keyword
' '           Text
'('           Operator
'd'           Name
' '           Text
'-'           Operator
' '           Text
'2'           Literal.Number.Integer
')'           Operator
' '           Text
'>'           Operator
'>'           Operator
'>'           Operator
' '           Text
'1'           Literal.Number.Integer
'\n\n'        Text

'let'         Keyword
' '           Text
'litlens'     Name.Variable
' '           Text
'='           Operator
'\n    '      Text
'let'         Keyword
' '           Text
'litlens'     Name.Variable
' '           Text
'='           Operator
' '           Text
'Array'       Name.Namespace
'.'           Punctuation
'zeroCreate'  Name
'<'           Operator
'int'         Name
'>'           Operator
' '           Text
'286'         Literal.Number.Integer
'\n    '      Text
'let'         Keyword
' '           Text
'mutable'     Name.Variable
' '           Text
'v'           Name
' '           Text
'='           Operator
' '           Text
'3'           Literal.Number.Integer
'\n    '      Text
'for'         Keyword
' '           Text
'i'           Name
' '           Text
'='           Operator
' '           Text
'257'         Literal.Number.Integer
' '           Text
'to'          Keyword
' '           Text
'284'         Literal.Number.Integer
' '           Text
'do'          Keyword
'\n        '  Text
'litlens'     Name
'.'           Operator
'['           Operator
'i'           Name
']'           Operator
' '           Text
'<-'          Operator
' '           Text
'v'           Name
'\n        '  Text
'v'           Name
' '           Text
'<-'          Operator
' '           Text
'v'           Name
' '           Text
'+'           Operator
' '           Text
'('           Operator
'1'           Literal.Number.Integer
' '           Text
'<'           Operator
'<'           Operator
'<'           Operator
' '           Text
'('           Operator
'getLitExLen' Name
' '           Text
'i'           Name
')'           Operator
')'           Operator
'\n    '      Text
'litlens'     Name
'.'           Operator
'['           Operator
'285'         Literal.Number.Integer
']'           Operator
' '           Text
'<-'          Operator
' '           Text
'maxlen'      Name
'\n    '      Text
'litlens'     Name
'.'           Operator
'['           Operator
'257'         Literal.Number.Integer
'..'          Operator
'285'         Literal.Number.Integer
']'           Operator
'\n\n'        Text

'let'         Keyword
' '           Text
'distlens'    Name.Variable
' '           Text
'='           Operator
'\n    '      Text
'let'         Keyword
' '           Text
'distlens'    Name.Variable
' '           Text
'='           Operator
' '           Text
'Array'       Name.Namespace
'.'           Punctuation
'zeroCreate'  Name
'<'           Operator
'int'         Name
'>'           Operator
' '           Text
'30'          Literal.Number.Integer
'\n    '      Text
'let'         Keyword
' '           Text
'mutable'     Name.Variable
' '           Text
'v'           Name
' '           Text
'='           Operator
' '           Text
'1'           Literal.Number.Integer
'\n    '      Text
'for'         Keyword
' '           Text
'i'           Name
' '           Text
'='           Operator
' '           Text
'0'           Literal.Number.Integer
' '           Text
'to'          Keyword
' '           Text
'29'          Literal.Number.Integer
' '           Text
'do'          Keyword
'\n        '  Text
'distlens'    Name
'.'           Operator
'['           Operator
'i'           Name
']'           Operator
' '           Text
'<-'          Operator
' '           Text
'v'           Name
'\n        '  Text
'v'           Name
' '           Text
'<-'          Operator
' '           Text
'v'           Name
' '           Text
'+'           Operator
' '           Text
'('           Operator
'1'           Literal.Number.Integer
' '           Text
'<'           Operator
'<'           Operator
'<'           Operator
' '           Text
'('           Operator
'getDistExLen' Name
' '           Text
'i'           Name
')'           Operator
')'           Operator
'\n    '      Text
'distlens'    Name
'\n\n'        Text

'type'        Keyword
' '           Text
'Reader'      Name.Class
'('           Operator
'sin'         Name
':'           Operator
'Stream'      Name
')'           Operator
' '           Text
'='           Operator
'\n    '      Text
'inherit'     Keyword
' '           Text
'Stream'      Name
'()'          Name.Builtin.Pseudo
'\n    \n    ' Text
'let'         Keyword
' '           Text
'br'          Name.Variable
' '           Text
'='           Operator
' '           Text
'new'         Keyword
' '           Text
'BitReader'   Name
'('           Operator
'sin'         Name
')'           Operator
'\n    '      Text
'let'         Keyword
' '           Text
'fh'          Name.Variable
' '           Text
'='           Operator
' '           Text
'new'         Keyword
' '           Text
'FixedHuffman' Name
'('           Operator
'br'          Name
')'           Operator
'\n    \n    ' Text
'let'         Keyword
' '           Text
'sout'        Name.Variable
' '           Text
'='           Operator
' '           Text
'new'         Keyword
' '           Text
'MemoryStream' Name
'()'          Name.Builtin.Pseudo
'\n    '      Text
'let'         Keyword
' '           Text
'dbuf'        Name.Variable
' '           Text
'='           Operator
' '           Text
'new'         Keyword
' '           Text
'WriteBuffer' Name
'('           Operator
'sout'        Name
')'           Operator
'\n    \n    ' Text
'let'         Keyword
' '           Text
'mutable'     Name.Variable
' '           Text
'cache'       Name
':'           Operator
'byte'        Keyword.Type
'[]'          Name.Builtin.Pseudo
' '           Text
'='           Operator
' '           Text
'null'        Keyword
'\n    '      Text
'let'         Keyword
' '           Text
'mutable'     Name.Variable
' '           Text
'canRead'     Name
' '           Text
'='           Operator
' '           Text
'true'        Keyword
'\n\n    '    Text
'let'         Keyword
' '           Text
'rec'         Name.Variable
' '           Text
'read'        Name
' '           Text
'('           Operator
'h'           Name
':'           Operator
'HuffmanDecoder' Name
')'           Operator
' '           Text
'='           Operator
'\n        '  Text
'let'         Keyword
' '           Text
'v'           Name.Variable
' '           Text
'='           Operator
' '           Text
'h'           Name
'.'           Operator
'GetValue'    Name
'()'          Name.Builtin.Pseudo
'\n        '  Text
'if'          Keyword
' '           Text
'v'           Name
' '           Text
'>'           Operator
' '           Text
'285'         Literal.Number.Integer
' '           Text
'then'        Keyword
' '           Text
'failwith'    Name
' '           Text
'<'           Operator
'|'           Operator
' '           Text
'sprintf'     Name
' '           Text
'"'           Literal.String
'不正な値: %d'    Literal.String
'"'           Literal.String
' '           Text
'v'           Name
'\n        '  Text
'if'          Keyword
' '           Text
'v'           Name
' '           Text
'<'           Operator
' '           Text
'256'         Literal.Number.Integer
' '           Text
'then'        Keyword
'\n            ' Text
'dbuf'        Name
'.'           Operator
'WriteByte'   Name
'('           Operator
'byte'        Keyword.Type
' '           Text
'v'           Name
')'           Operator
'\n        '  Text
'elif'        Keyword
' '           Text
'v'           Name
' '           Text
'>'           Operator
' '           Text
'256'         Literal.Number.Integer
' '           Text
'then'        Keyword
'\n            ' Text
'let'         Keyword
' '           Text
'len'         Name.Variable
' '           Text
'='           Operator
'\n                ' Text
'if'          Keyword
' '           Text
'v'           Name
' '           Text
'<'           Operator
' '           Text
'265'         Literal.Number.Integer
' '           Text
'then'        Keyword
' '           Text
'v'           Name
' '           Text
'-'           Operator
' '           Text
'254'         Literal.Number.Integer
' '           Text
'else'        Keyword
'\n                    ' Text
'litlens'     Name
'.'           Operator
'['           Operator
'v'           Name
' '           Text
'-'           Operator
' '           Text
'257'         Literal.Number.Integer
']'           Operator
' '           Text
'+'           Operator
' '           Text
'('           Operator
'br'          Name
'.'           Operator
'ReadLE'      Name
' '           Text
'('           Operator
'getLitExLen' Name
' '           Text
'v'           Name
')'           Operator
')'           Operator
'\n            ' Text
'let'         Keyword
' '           Text
'dist'        Name.Variable
' '           Text
'='           Operator
'\n                ' Text
'let'         Keyword
' '           Text
'd'           Name.Variable
' '           Text
'='           Operator
' '           Text
'h'           Name
'.'           Operator
'GetDistance' Name
'()'          Name.Builtin.Pseudo
'\n                ' Text
'if'          Keyword
' '           Text
'd'           Name
' '           Text
'>'           Operator
' '           Text
'29'          Literal.Number.Integer
' '           Text
'then'        Keyword
' '           Text
'failwith'    Name
' '           Text
'<'           Operator
'|'           Operator
' '           Text
'sprintf'     Name
' '           Text
'"'           Literal.String
'不正な距離: %d'   Literal.String
'"'           Literal.String
' '           Text
'd'           Name
'\n                ' Text
'if'          Keyword
' '           Text
'd'           Name
' '           Text
'<'           Operator
' '           Text
'4'           Literal.Number.Integer
' '           Text
'then'        Keyword
' '           Text
'd'           Name
' '           Text
'+'           Operator
' '           Text
'1'           Literal.Number.Integer
' '           Text
'else'        Keyword
'\n                    ' Text
'distlens'    Name
'.'           Operator
'['           Operator
'd'           Name
']'           Operator
' '           Text
'+'           Operator
' '           Text
'('           Operator
'br'          Name
'.'           Operator
'ReadLE'      Name
' '           Text
'('           Operator
'getDistExLen' Name
' '           Text
'd'           Name
')'           Operator
')'           Operator
'\n            ' Text
'dbuf'        Name
'.'           Operator
'Copy'        Name
' '           Text
'len'         Name
' '           Text
'dist'        Name
'\n        '  Text
'if'          Keyword
' '           Text
'v'           Name
' '           Text
'<'           Operator
'>'           Operator
' '           Text
'256'         Literal.Number.Integer
' '           Text
'then'        Keyword
' '           Text
'read'        Name
' '           Text
'h'           Name
'\n    \n    ' Text
'override'    Keyword
' '           Text
'x'           Name
'.'           Punctuation
'CanRead'     Name.Function
'  '          Text
'='           Operator
' '           Text
'canRead'     Name
'\n    '      Text
'override'    Keyword
' '           Text
'x'           Name
'.'           Punctuation
'CanWrite'    Name.Function
' '           Text
'='           Operator
' '           Text
'false'       Keyword
'\n    '      Text
'override'    Keyword
' '           Text
'x'           Name
'.'           Punctuation
'CanSeek'     Name.Function
'  '          Text
'='           Operator
' '           Text
'false'       Keyword
'\n    '      Text
'override'    Keyword
' '           Text
'x'           Name
'.'           Punctuation
'Flush'       Name.Function
'()'          Name.Builtin.Pseudo
'  '          Text
'='           Operator
' '           Text
'()'          Name.Builtin.Pseudo
'\n    \n    ' Text
'override'    Keyword
' '           Text
'x'           Name
'.'           Punctuation
'Close'       Name.Function
'()'          Name.Builtin.Pseudo
' '           Text
'='           Operator
'\n        '  Text
'dbuf'        Name
'.'           Operator
'Close'       Name
'()'          Name.Builtin.Pseudo
'\n        '  Text
'canRead'     Name
' '           Text
'<-'          Operator
' '           Text
'false'       Keyword
'\n    \n    ' Text
'override'    Keyword
' '           Text
'x'           Name
'.'           Punctuation
'Read'        Name.Function
'('           Operator
'buffer'      Name
','           Operator
' '           Text
'offset'      Name
','           Operator
' '           Text
'count'       Name
')'           Operator
' '           Text
'='           Operator
'\n        '  Text
'let'         Keyword
' '           Text
'offset'      Name.Variable
' '           Text
'='           Operator
'\n            ' Text
'if'          Keyword
' '           Text
'cache'       Name
' '           Text
'='           Operator
' '           Text
'null'        Keyword
' '           Text
'then'        Keyword
' '           Text
'0'           Literal.Number.Integer
' '           Text
'else'        Keyword
'\n                ' Text
'let'         Keyword
' '           Text
'clen'        Name.Variable
' '           Text
'='           Operator
' '           Text
'cache'       Name
'.'           Operator
'Length'      Name
'\n                ' Text
'let'         Keyword
' '           Text
'len'         Name.Variable
' '           Text
'='           Operator
' '           Text
'Math'        Name.Namespace
'.'           Punctuation
'Min'         Name
'('           Operator
'clen'        Name
','           Operator
' '           Text
'count'       Name
')'           Operator
'\n                ' Text
'Array'       Name.Namespace
'.'           Punctuation
'Copy'        Name
'('           Operator
'cache'       Name
','           Operator
' '           Text
'0'           Literal.Number.Integer
','           Operator
' '           Text
'buffer'      Name
','           Operator
' '           Text
'offset'      Name
','           Operator
' '           Text
'len'         Name
')'           Operator
'\n                ' Text
'cache'       Name
' '           Text
'<-'          Operator
' '           Text
'if'          Keyword
' '           Text
'len'         Name
' '           Text
'='           Operator
' '           Text
'clen'        Name
' '           Text
'then'        Keyword
' '           Text
'null'        Keyword
'\n                         ' Text
'else'        Keyword
' '           Text
'cache'       Name
'.'           Operator
'['           Operator
'len'         Name
' '           Text
'..'          Operator
' '           Text
'clen'        Name
' '           Text
'-'           Operator
' '           Text
'1'           Literal.Number.Integer
']'           Operator
'\n                ' Text
'len'         Name
'\n        '  Text
'let'         Keyword
' '           Text
'req'         Name.Variable
' '           Text
'='           Operator
' '           Text
'int64'       Keyword.Type
' '           Text
'<'           Operator
'|'           Operator
' '           Text
'count'       Name
' '           Text
'-'           Operator
' '           Text
'offset'      Name
'\n        '  Text
'while'       Keyword
' '           Text
'canRead'     Name
' '           Text
'&&'          Operator
' '           Text
'sout'        Name
'.'           Operator
'Length'      Name
' '           Text
'<'           Operator
' '           Text
'req'         Name
' '           Text
'do'          Keyword
'\n            ' Text
'x'           Name
'.'           Operator
'readBlock'   Name
'()'          Name.Builtin.Pseudo
'\n        '  Text
'let'         Keyword
' '           Text
'len'         Name.Variable
' '           Text
'='           Operator
'\n            ' Text
'if'          Keyword
' '           Text
'sout'        Name
'.'           Operator
'Length'      Name
' '           Text
'='           Operator
' '           Text
'0L'          Literal.Number.Integer
' '           Text
'then'        Keyword
' '           Text
'0'           Literal.Number.Integer
' '           Text
'else'        Keyword
'\n                ' Text
'let'         Keyword
' '           Text
'data'        Name.Variable
' '           Text
'='           Operator
' '           Text
'sout'        Name
'.'           Operator
'ToArray'     Name
'()'          Name.Builtin.Pseudo
'\n                ' Text
'sout'        Name
'.'           Operator
'SetLength'   Name
'('           Operator
'0L'          Literal.Number.Integer
')'           Operator
'\n                ' Text
'let'         Keyword
' '           Text
'dlen'        Name.Variable
' '           Text
'='           Operator
' '           Text
'data'        Name
'.'           Operator
'Length'      Name
'\n                ' Text
'let'         Keyword
' '           Text
'len'         Name.Variable
' '           Text
'='           Operator
' '           Text
'Math'        Name.Namespace
'.'           Punctuation
'Min'         Name
'('           Operator
'int'         Name
' '           Text
'req'         Name
','           Operator
' '           Text
'dlen'        Name
')'           Operator
'\n                ' Text
'Array'       Name.Namespace
'.'           Punctuation
'Copy'        Name
'('           Operator
'data'        Name
','           Operator
' '           Text
'0'           Literal.Number.Integer
','           Operator
' '           Text
'buffer'      Name
','           Operator
' '           Text
'offset'      Name
','           Operator
' '           Text
'len'         Name
')'           Operator
'\n                ' Text
'if'          Keyword
' '           Text
'dlen'        Name
' '           Text
'>'           Operator
' '           Text
'len'         Name
' '           Text
'then'        Keyword
'\n                    ' Text
'cache'       Name
' '           Text
'<-'          Operator
' '           Text
'data'        Name
'.'           Operator
'['           Operator
'len'         Name
'..'          Operator
']'           Operator
'\n                ' Text
'len'         Name
'\n        '  Text
'offset'      Name
' '           Text
'+'           Operator
' '           Text
'len'         Name
'\n    \n    ' Text
'override'    Keyword
' '           Text
'x'           Name
'.'           Punctuation
'Position'    Name.Function
'\n        '  Text
'with'        Keyword
' '           Text
'get'         Name
'()'          Name.Builtin.Pseudo
' '           Text
'='           Operator
' '           Text
'raise'       Name
' '           Text
'<'           Operator
'|'           Operator
' '           Text
'new'         Keyword
' '           Text
'NotImplementedException' Name
'()'          Name.Builtin.Pseudo
'\n        '  Text
'and'         Operator.Word
' '           Text
'set'         Name
'('           Operator
'v'           Name
')'           Operator
' '           Text
'='           Operator
' '           Text
'raise'       Name
' '           Text
'<'           Operator
'|'           Operator
' '           Text
'new'         Keyword
' '           Text
'NotImplementedException' Name
'()'          Name.Builtin.Pseudo
'\n    \n    ' Text
'override'    Keyword
' '           Text
'x'           Name
'.'           Punctuation
'Length'      Name.Function
'         '   Text
'='           Operator
' '           Text
'raise'       Name
' '           Text
'<'           Operator
'|'           Operator
' '           Text
'new'         Keyword
' '           Text
'NotImplementedException' Name
'()'          Name.Builtin.Pseudo
'\n    '      Text
'override'    Keyword
' '           Text
'x'           Name
'.'           Punctuation
'Seek'        Name.Function
'('           Operator
'_'           Operator
','           Operator
' '           Text
'_'           Operator
')'           Operator
'     '       Text
'='           Operator
' '           Text
'raise'       Name
' '           Text
'<'           Operator
'|'           Operator
' '           Text
'new'         Keyword
' '           Text
'NotImplementedException' Name
'()'          Name.Builtin.Pseudo
'\n    '      Text
'override'    Keyword
' '           Text
'x'           Name
'.'           Punctuation
'Write'       Name.Function
'('           Operator
'_'           Operator
','           Operator
' '           Text
'_'           Operator
','           Operator
' '           Text
'_'           Operator
')'           Operator
' '           Text
'='           Operator
' '           Text
'raise'       Name
' '           Text
'<'           Operator
'|'           Operator
' '           Text
'new'         Keyword
' '           Text
'NotImplementedException' Name
'()'          Name.Builtin.Pseudo
'\n    '      Text
'override'    Keyword
' '           Text
'x'           Name
'.'           Punctuation
'SetLength'   Name.Function
'('           Operator
'_'           Operator
')'           Operator
'   '         Text
'='           Operator
' '           Text
'raise'       Name
' '           Text
'<'           Operator
'|'           Operator
' '           Text
'new'         Keyword
' '           Text
'NotImplementedException' Name
'()'          Name.Builtin.Pseudo
'\n    \n    ' Text
'member'      Keyword
' '           Text
'private'     Keyword
' '           Text
'x'           Name
'.'           Operator
'readBlock'   Name
'()'          Name.Builtin.Pseudo
' '           Text
'='           Operator
'\n        '  Text
'let'         Keyword
' '           Text
'bfinal'      Name.Variable
' '           Text
'='           Operator
' '           Text
'br'          Name
'.'           Operator
'ReadBit'     Name
'()'          Name.Builtin.Pseudo
'\n        '  Text
'match'       Keyword
' '           Text
'br'          Name
'.'           Operator
'ReadLE'      Name
' '           Text
'2'           Literal.Number.Integer
' '           Text
'with'        Keyword
'\n        '  Text
'|'           Operator
' '           Text
'0'           Literal.Number.Integer
' '           Text
'->'          Operator
' '           Text
'br'          Name
'.'           Operator
'Skip'        Name
'()'          Name.Builtin.Pseudo
'\n               ' Text
'let'         Keyword
' '           Text
'len'         Name.Variable
' '           Text
'='           Operator
' '           Text
'br'          Name
'.'           Operator
'ReadLE'      Name
' '           Text
'16'          Literal.Number.Integer
'\n               ' Text
'let'         Keyword
' '           Text
'nlen'        Name.Variable
' '           Text
'='           Operator
' '           Text
'br'          Name
'.'           Operator
'ReadLE'      Name
' '           Text
'16'          Literal.Number.Integer
'\n               ' Text
'if'          Keyword
' '           Text
'len'         Name
' '           Text
'+'           Operator
' '           Text
'nlen'        Name
' '           Text
'<'           Operator
'>'           Operator
' '           Text
'0'           Literal.Number.Integer
'x10000'      Name
' '           Text
'then'        Keyword
'\n                   ' Text
'failwith'    Name
' '           Text
'"'           Literal.String
'不正な非圧縮長'     Literal.String
'"'           Literal.String
'\n               ' Text
'dbuf'        Name
'.'           Operator
'Write'       Name
' '           Text
'('           Operator
'br'          Name
'.'           Operator
'ReadBytes'   Name
' '           Text
'len'         Name
')'           Operator
' '           Text
'0'           Literal.Number.Integer
' '           Text
'len'         Name
'\n        '  Text
'|'           Operator
' '           Text
'1'           Literal.Number.Integer
' '           Text
'->'          Operator
' '           Text
'read'        Name
' '           Text
'fh'          Name
'\n        '  Text
'|'           Operator
' '           Text
'2'           Literal.Number.Integer
' '           Text
'->'          Operator
' '           Text
'read'        Name
' '           Text
'('           Operator
'new'         Keyword
' '           Text
'DynamicHuffman' Name
'('           Operator
'br'          Name
')'           Operator
')'           Operator
'\n        '  Text
'|'           Operator
' '           Text
'_'           Operator
' '           Text
'->'          Operator
' '           Text
'failwith'    Name
' '           Text
'"'           Literal.String
'不正なブロックタイプ'  Literal.String
'"'           Literal.String
'\n        '  Text
'if'          Keyword
' '           Text
'bfinal'      Name
' '           Text
'='           Operator
' '           Text
'1'           Literal.Number.Integer
' '           Text
'then'        Keyword
'\n            ' Text
'canRead'     Name
' '           Text
'<-'          Operator
' '           Text
'false'       Keyword
'\n            ' Text
'x'           Name
'.'           Operator
'Close'       Name
'()'          Name.Builtin.Pseudo
'\n\n'        Text

'type'        Keyword
' '           Text
'BitWriter'   Name.Class
'('           Operator
'sout'        Name
':'           Operator
'Stream'      Name
')'           Operator
' '           Text
'='           Operator
'\n    '      Text
'let'         Keyword
' '           Text
'mutable'     Name.Variable
' '           Text
'bit'         Name
' '           Text
'='           Operator
' '           Text
'0'           Literal.Number.Integer
'\n    '      Text
'let'         Keyword
' '           Text
'mutable'     Name.Variable
' '           Text
'cur'         Name
' '           Text
'='           Operator
' '           Text
'0uy'         Literal.Number.Integer
'\n    \n    ' Text
'member'      Keyword
' '           Text
'x'           Name
'.'           Punctuation
'Skip'        Name.Function
'()'          Name.Builtin.Pseudo
' '           Text
'='           Operator
'\n        '  Text
'if'          Keyword
' '           Text
'bit'         Name
' '           Text
'>'           Operator
' '           Text
'0'           Literal.Number.Integer
' '           Text
'then'        Keyword
'\n            ' Text
'sout'        Name
'.'           Operator
'WriteByte'   Name
'('           Operator
'cur'         Name
')'           Operator
'\n            ' Text
'bit'         Name
' '           Text
'<-'          Operator
' '           Text
'0'           Literal.Number.Integer
'\n            ' Text
'cur'         Name
' '           Text
'<-'          Operator
' '           Text
'0uy'         Literal.Number.Integer
'\n    \n    ' Text
'interface'   Keyword
' '           Text
'IDisposable' Name
' '           Text
'with'        Keyword
'\n        '  Text
'member'      Keyword
' '           Text
'x'           Name
'.'           Punctuation
'Dispose'     Name.Function
'()'          Name.Builtin.Pseudo
' '           Text
'='           Operator
'\n            ' Text
'x'           Name
'.'           Operator
'Skip'        Name
'()'          Name.Builtin.Pseudo
'\n            ' Text
'sout'        Name
'.'           Operator
'Flush'       Name
'()'          Name.Builtin.Pseudo
'\n    \n    ' Text
'member'      Keyword
' '           Text
'x'           Name
'.'           Punctuation
'WriteBit'    Name.Function
'('           Operator
'b'           Name
':'           Operator
'int'         Name
')'           Operator
' '           Text
'='           Operator
'\n        '  Text
'cur'         Name
' '           Text
'<-'          Operator
' '           Text
'cur'         Name
' '           Text
'|'           Operator
'|'           Operator
'|'           Operator
' '           Text
'('           Operator
'('           Operator
'byte'        Keyword.Type
' '           Text
'b'           Name
')'           Operator
' '           Text
'<'           Operator
'<'           Operator
'<'           Operator
' '           Text
'bit'         Name
')'           Operator
'\n        '  Text
'bit'         Name
' '           Text
'<-'          Operator
' '           Text
'bit'         Name
' '           Text
'+'           Operator
' '           Text
'1'           Literal.Number.Integer
'\n        '  Text
'if'          Keyword
' '           Text
'bit'         Name
' '           Text
'='           Operator
' '           Text
'8'           Literal.Number.Integer
' '           Text
'then'        Keyword
'\n            ' Text
'sout'        Name
'.'           Operator
'WriteByte'   Name
'('           Operator
'cur'         Name
')'           Operator
'\n            ' Text
'bit'         Name
' '           Text
'<-'          Operator
' '           Text
'0'           Literal.Number.Integer
'\n            ' Text
'cur'         Name
' '           Text
'<-'          Operator
' '           Text
'0uy'         Literal.Number.Integer
'\n    \n    ' Text
'member'      Keyword
' '           Text
'x'           Name
'.'           Punctuation
'WriteLE'     Name.Function
' '           Text
'('           Operator
'len'         Name
':'           Operator
'int'         Name
')'           Operator
' '           Text
'('           Operator
'b'           Name
':'           Operator
'int'         Name
')'           Operator
' '           Text
'='           Operator
'\n        '  Text
'for'         Keyword
' '           Text
'i'           Name
' '           Text
'='           Operator
' '           Text
'0'           Literal.Number.Integer
' '           Text
'to'          Keyword
' '           Text
'len'         Name
' '           Text
'-'           Operator
' '           Text
'1'           Literal.Number.Integer
' '           Text
'do'          Keyword
'\n            ' Text
'x'           Name
'.'           Operator
'WriteBit'    Name
' '           Text
'<'           Operator
'|'           Operator
' '           Text
'if'          Keyword
' '           Text
'('           Operator
'b'           Name
' '           Text
'&&'          Operator
'&'           Operator
' '           Text
'('           Operator
'1'           Literal.Number.Integer
' '           Text
'<'           Operator
'<'           Operator
'<'           Operator
' '           Text
'i'           Name
')'           Operator
')'           Operator
' '           Text
'='           Operator
' '           Text
'0'           Literal.Number.Integer
' '           Text
'then'        Keyword
' '           Text
'0'           Literal.Number.Integer
' '           Text
'else'        Keyword
' '           Text
'1'           Literal.Number.Integer
'\n    \n    ' Text
'member'      Keyword
' '           Text
'x'           Name
'.'           Punctuation
'WriteBE'     Name.Function
' '           Text
'('           Operator
'len'         Name
':'           Operator
'int'         Name
')'           Operator
' '           Text
'('           Operator
'b'           Name
':'           Operator
'int'         Name
')'           Operator
' '           Text
'='           Operator
'\n        '  Text
'for'         Keyword
' '           Text
'i'           Name
' '           Text
'='           Operator
' '           Text
'len'         Name
' '           Text
'-'           Operator
' '           Text
'1'           Literal.Number.Integer
' '           Text
'downto'      Keyword
' '           Text
'0'           Literal.Number.Integer
' '           Text
'do'          Keyword
'\n            ' Text
'x'           Name
'.'           Operator
'WriteBit'    Name
' '           Text
'<'           Operator
'|'           Operator
' '           Text
'if'          Keyword
' '           Text
'('           Operator
'b'           Name
' '           Text
'&&'          Operator
'&'           Operator
' '           Text
'('           Operator
'1'           Literal.Number.Integer
' '           Text
'<'           Operator
'<'           Operator
'<'           Operator
' '           Text
'i'           Name
')'           Operator
')'           Operator
' '           Text
'='           Operator
' '           Text
'0'           Literal.Number.Integer
' '           Text
'then'        Keyword
' '           Text
'0'           Literal.Number.Integer
' '           Text
'else'        Keyword
' '           Text
'1'           Literal.Number.Integer
'\n    \n    ' Text
'member'      Keyword
' '           Text
'x'           Name
'.'           Punctuation
'WriteBytes'  Name.Function
'('           Operator
'data'        Name
':'           Operator
'byte'        Keyword.Type
'[]'          Name.Builtin.Pseudo
')'           Operator
' '           Text
'='           Operator
'\n        '  Text
'x'           Name
'.'           Operator
'Skip'        Name
'()'          Name.Builtin.Pseudo
'\n        '  Text
'sout'        Name
'.'           Operator
'Write'       Name
'('           Operator
'data'        Name
','           Operator
' '           Text
'0'           Literal.Number.Integer
','           Operator
' '           Text
'data'        Name
'.'           Operator
'Length'      Name
')'           Operator
'\n\n'        Text

'type'        Keyword
' '           Text
'FixedHuffmanWriter' Name.Class
'('           Operator
'bw'          Name
':'           Operator
'BitWriter'   Name
')'           Operator
' '           Text
'='           Operator
'\n    '      Text
'member'      Keyword
' '           Text
'x'           Name
'.'           Punctuation
'Write'       Name.Function
' '           Text
'('           Operator
'b'           Name
':'           Operator
'int'         Name
')'           Operator
' '           Text
'='           Operator
'\n        '  Text
'if'          Keyword
' '           Text
'b'           Name
' '           Text
'<'           Operator
' '           Text
'144'         Literal.Number.Integer
' '           Text
'then'        Keyword
'\n            ' Text
'bw'          Name
'.'           Operator
'WriteBE'     Name
' '           Text
'8'           Literal.Number.Integer
' '           Text
'('           Operator
'b'           Name
' '           Text
'+'           Operator
' '           Text
'0'           Literal.Number.Integer
'b110000'     Name
')'           Operator
'\n        '  Text
'elif'        Keyword
' '           Text
'b'           Name
' '           Text
'<'           Operator
' '           Text
'256'         Literal.Number.Integer
' '           Text
'then'        Keyword
'\n            ' Text
'bw'          Name
'.'           Operator
'WriteBE'     Name
' '           Text
'9'           Literal.Number.Integer
' '           Text
'('           Operator
'b'           Name
' '           Text
'-'           Operator
' '           Text
'144'         Literal.Number.Integer
' '           Text
'+'           Operator
' '           Text
'0'           Literal.Number.Integer
'b110010000'  Name
')'           Operator
'\n        '  Text
'elif'        Keyword
' '           Text
'b'           Name
' '           Text
'<'           Operator
' '           Text
'280'         Literal.Number.Integer
' '           Text
'then'        Keyword
'\n            ' Text
'bw'          Name
'.'           Operator
'WriteBE'     Name
' '           Text
'7'           Literal.Number.Integer
' '           Text
'('           Operator
'b'           Name
' '           Text
'-'           Operator
' '           Text
'256'         Literal.Number.Integer
')'           Operator
'\n        '  Text
'elif'        Keyword
' '           Text
'b'           Name
' '           Text
'<'           Operator
' '           Text
'288'         Literal.Number.Integer
' '           Text
'then'        Keyword
'\n            ' Text
'bw'          Name
'.'           Operator
'WriteBE'     Name
' '           Text
'8'           Literal.Number.Integer
' '           Text
'('           Operator
'b'           Name
' '           Text
'-'           Operator
' '           Text
'280'         Literal.Number.Integer
' '           Text
'+'           Operator
' '           Text
'0'           Literal.Number.Integer
'b11000000'   Name
')'           Operator
'\n    \n    ' Text
'member'      Keyword
' '           Text
'x'           Name
'.'           Punctuation
'WriteLen'    Name.Function
' '           Text
'('           Operator
'len'         Name
':'           Operator
'int'         Name
')'           Operator
' '           Text
'='           Operator
'\n        '  Text
'if'          Keyword
' '           Text
'len'         Name
' '           Text
'<'           Operator
' '           Text
'3'           Literal.Number.Integer
' '           Text
'|'           Operator
'|'           Operator
' '           Text
'len'         Name
' '           Text
'>'           Operator
' '           Text
'maxlen'      Name
' '           Text
'then'        Keyword
'\n            ' Text
'failwith'    Name
' '           Text
'<'           Operator
'|'           Operator
' '           Text
'sprintf'     Name
' '           Text
'"'           Literal.String
'不正な長さ: %d'   Literal.String
'"'           Literal.String
' '           Text
'len'         Name
'\n        '  Text
'let'         Keyword
' '           Text
'mutable'     Name.Variable
' '           Text
'll'          Name
' '           Text
'='           Operator
' '           Text
'285'         Literal.Number.Integer
'\n        '  Text
'while'       Keyword
' '           Text
'len'         Name
' '           Text
'<'           Operator
' '           Text
'litlens'     Name
'.'           Operator
'['           Operator
'll'          Name
' '           Text
'-'           Operator
' '           Text
'257'         Literal.Number.Integer
']'           Operator
' '           Text
'do'          Keyword
'\n            ' Text
'll'          Name
' '           Text
'<-'          Operator
' '           Text
'll'          Name
' '           Text
'-'           Operator
' '           Text
'1'           Literal.Number.Integer
'\n        '  Text
'x'           Name
'.'           Operator
'Write'       Name
' '           Text
'll'          Name
'\n        '  Text
'bw'          Name
'.'           Operator
'WriteLE'     Name
' '           Text
'('           Operator
'getLitExLen' Name
' '           Text
'll'          Name
')'           Operator
' '           Text
'('           Operator
'len'         Name
' '           Text
'-'           Operator
' '           Text
'litlens'     Name
'.'           Operator
'['           Operator
'll'          Name
' '           Text
'-'           Operator
' '           Text
'257'         Literal.Number.Integer
']'           Operator
')'           Operator
'\n    \n    ' Text
'member'      Keyword
' '           Text
'x'           Name
'.'           Punctuation
'WriteDist'   Name.Function
' '           Text
'('           Operator
'd'           Name
':'           Operator
'int'         Name
')'           Operator
' '           Text
'='           Operator
'\n        '  Text
'if'          Keyword
' '           Text
'd'           Name
' '           Text
'<'           Operator
' '           Text
'1'           Literal.Number.Integer
' '           Text
'|'           Operator
'|'           Operator
' '           Text
'd'           Name
' '           Text
'>'           Operator
' '           Text
'maxbuf'      Name
' '           Text
'then'        Keyword
'\n            ' Text
'failwith'    Name
' '           Text
'<'           Operator
'|'           Operator
' '           Text
'sprintf'     Name
' '           Text
'"'           Literal.String
'不正な距離: %d'   Literal.String
'"'           Literal.String
' '           Text
'd'           Name
'\n        '  Text
'let'         Keyword
' '           Text
'mutable'     Name.Variable
' '           Text
'dl'          Name
' '           Text
'='           Operator
' '           Text
'29'          Literal.Number.Integer
'\n        '  Text
'while'       Keyword
' '           Text
'd'           Name
' '           Text
'<'           Operator
' '           Text
'distlens'    Name
'.'           Operator
'['           Operator
'dl'          Name
']'           Operator
' '           Text
'do'          Keyword
'\n            ' Text
'dl'          Name
' '           Text
'<-'          Operator
' '           Text
'dl'          Name
' '           Text
'-'           Operator
' '           Text
'1'           Literal.Number.Integer
'\n        '  Text
'bw'          Name
'.'           Operator
'WriteBE'     Name
' '           Text
'5'           Literal.Number.Integer
' '           Text
'dl'          Name
'\n        '  Text
'bw'          Name
'.'           Operator
'WriteLE'     Name
' '           Text
'('           Operator
'getDistExLen' Name
' '           Text
'dl'          Name
')'           Operator
' '           Text
'('           Operator
'd'           Name
' '           Text
'-'           Operator
' '           Text
'distlens'    Name
'.'           Operator
'['           Operator
'dl'          Name
']'           Operator
')'           Operator
'\n\n'        Text

'let'         Keyword
' '           Text
'maxbuf2'     Name.Variable
' '           Text
'='           Operator
' '           Text
'maxbuf'      Name
' '           Text
'*'           Operator
' '           Text
'2'           Literal.Number.Integer
'\n'          Text

'let'         Keyword
' '           Text
'buflen'      Name.Variable
' '           Text
'='           Operator
' '           Text
'maxbuf2'     Name
' '           Text
'+'           Operator
' '           Text
'maxlen'      Name
'\n\n'        Text

'let'         Keyword
' '           Text
'inline'      Name.Variable
' '           Text
'getHash'     Name
' '           Text
'('           Operator
'buf'         Name
':'           Operator
'byte'        Keyword.Type
'[]'          Name.Builtin.Pseudo
')'           Operator
' '           Text
'pos'         Name
' '           Text
'='           Operator
'\n    '      Text
'('           Operator
'('           Operator
'int'         Name
' '           Text
'buf'         Name
'.'           Operator
'['           Operator
'pos'         Name
']'           Operator
')'           Operator
' '           Text
'<'           Operator
'<'           Operator
'<'           Operator
' '           Text
'4'           Literal.Number.Integer
')'           Operator
' '           Text
'^^'          Operator
'^'           Operator
' '           Text
'('           Operator
'('           Operator
'int'         Name
' '           Text
'buf'         Name
'.'           Operator
'['           Operator
'pos'         Name
' '           Text
'+'           Operator
' '           Text
'1'           Literal.Number.Integer
']'           Operator
')'           Operator
' '           Text
'<'           Operator
'<'           Operator
'<'           Operator
' '           Text
'2'           Literal.Number.Integer
')'           Operator
' '           Text
'^^'          Operator
'^'           Operator
' '           Text
'('           Operator
'int'         Name
' '           Text
'buf'         Name
'.'           Operator
'['           Operator
'pos'         Name
' '           Text
'+'           Operator
' '           Text
'2'           Literal.Number.Integer
']'           Operator
')'           Operator
'\n\n'        Text

'let'         Keyword
' '           Text
'inline'      Name.Variable
' '           Text
'addHash'     Name
' '           Text
'('           Operator
'hash'        Name
':'           Operator
'List'        Name
'<'           Operator
'int'         Name
'>'           Operator
'[]'          Name.Builtin.Pseudo
')'           Operator
' '           Text
'('           Operator
'buf'         Name
':'           Operator
'byte'        Keyword.Type
'[]'          Name.Builtin.Pseudo
')'           Operator
' '           Text
'pos'         Name
' '           Text
'='           Operator
'\n    '      Text
'if'          Keyword
' '           Text
'buf'         Name
'.'           Operator
'['           Operator
'pos'         Name
']'           Operator
' '           Text
'<'           Operator
'>'           Operator
' '           Text
'buf'         Name
'.'           Operator
'['           Operator
'pos'         Name
' '           Text
'+'           Operator
' '           Text
'1'           Literal.Number.Integer
']'           Operator
' '           Text
'then'        Keyword
'\n        '  Text
'hash'        Name
'.'           Operator
'['           Operator
'getHash'     Name
' '           Text
'buf'         Name
' '           Text
'pos'         Name
']'           Operator
'.'           Operator
'Add'         Name
' '           Text
'pos'         Name
'\n\n'        Text

'let'         Keyword
' '           Text
'inline'      Name.Variable
' '           Text
'addHash2'    Name
' '           Text
'('           Operator
'tables'      Name
':'           Operator
'int'         Name
'['           Operator
','           Operator
']'           Operator
')'           Operator
' '           Text
'('           Operator
'counts'      Name
':'           Operator
'int'         Name
'[]'          Name.Builtin.Pseudo
')'           Operator
' '           Text
'('           Operator
'buf'         Name
':'           Operator
'byte'        Keyword.Type
'[]'          Name.Builtin.Pseudo
')'           Operator
' '           Text
'pos'         Name
' '           Text
'='           Operator
'\n    '      Text
'if'          Keyword
' '           Text
'buf'         Name
'.'           Operator
'['           Operator
'pos'         Name
']'           Operator
' '           Text
'<'           Operator
'>'           Operator
' '           Text
'buf'         Name
'.'           Operator
'['           Operator
'pos'         Name
' '           Text
'+'           Operator
' '           Text
'1'           Literal.Number.Integer
']'           Operator
' '           Text
'then'        Keyword
'\n        '  Text
'let'         Keyword
' '           Text
'h'           Name.Variable
' '           Text
'='           Operator
' '           Text
'getHash'     Name
' '           Text
'buf'         Name
' '           Text
'pos'         Name
'\n        '  Text
'let'         Keyword
' '           Text
'c'           Name.Variable
' '           Text
'='           Operator
' '           Text
'counts'      Name
'.'           Operator
'['           Operator
'h'           Name
']'           Operator
'\n        '  Text
'tables'      Name
'.'           Operator
'['           Operator
'h'           Name
','           Operator
' '           Text
'c'           Name
' '           Text
'&&'          Operator
'&'           Operator
' '           Text
'15'          Literal.Number.Integer
']'           Operator
' '           Text
'<-'          Operator
' '           Text
'pos'         Name
'\n        '  Text
'counts'      Name
'.'           Operator
'['           Operator
'h'           Name
']'           Operator
' '           Text
'<-'          Operator
' '           Text
'c'           Name
' '           Text
'+'           Operator
' '           Text
'1'           Literal.Number.Integer
'\n\n'        Text

'type'        Keyword
' '           Text
'Writer'      Name.Class
'('           Operator
't'           Name
':'           Operator
'int'         Name
','           Operator
' '           Text
'sin'         Name
':'           Operator
'Stream'      Name
')'           Operator
' '           Text
'='           Operator
'\n    '      Text
'let'         Keyword
' '           Text
'mutable'     Name.Variable
' '           Text
'length'      Name
' '           Text
'='           Operator
' '           Text
'buflen'      Name
'\n    '      Text
'let'         Keyword
' '           Text
'buf'         Name.Variable
' '           Text
'='           Operator
' '           Text
'Array'       Name.Namespace
'.'           Punctuation
'zeroCreate'  Name
'<'           Operator
'byte'        Keyword.Type
'>'           Operator
' '           Text
'buflen'      Name
'\n    '      Text
'let'         Keyword
' '           Text
'tables'      Name.Variable
','           Operator
' '           Text
'counts'      Name
' '           Text
'='           Operator
'\n        '  Text
'if'          Keyword
' '           Text
't'           Name
' '           Text
'='           Operator
' '           Text
'2'           Literal.Number.Integer
' '           Text
'then'        Keyword
' '           Text
'Array2D'     Name.Namespace
'.'           Punctuation
'zeroCreate'  Name
'<'           Operator
'int'         Name
'>'           Operator
' '           Text
'4096'        Literal.Number.Integer
' '           Text
'16'          Literal.Number.Integer
','           Operator
' '           Text
'Array'       Name.Namespace
'.'           Punctuation
'create'      Name
' '           Text
'4096'        Literal.Number.Integer
' '           Text
'0'           Literal.Number.Integer
' '           Text
'else'        Keyword
' '           Text
'null'        Keyword
','           Operator
' '           Text
'null'        Keyword
'\n    '      Text
'let'         Keyword
' '           Text
'hash'        Name.Variable
' '           Text
'='           Operator
' '           Text
'if'          Keyword
' '           Text
'tables'      Name
' '           Text
'='           Operator
' '           Text
'null'        Keyword
' '           Text
'then'        Keyword
' '           Text
'[|'          Operator
' '           Text
'for'         Keyword
' '           Text
'_'           Operator
' '           Text
'in'          Keyword
' '           Text
'0'           Literal.Number.Integer
'..'          Operator
'4095'        Literal.Number.Integer
' '           Text
'->'          Operator
' '           Text
'new'         Keyword
' '           Text
'List'        Name
'<'           Operator
'int'         Name
'>'           Operator
'()'          Name.Builtin.Pseudo
' '           Text
'|]'          Operator
' '           Text
'else'        Keyword
' '           Text
'null'        Keyword
'\n    '      Text
'let'         Keyword
' '           Text
'mutable'     Name.Variable
' '           Text
'crc'         Name
' '           Text
'='           Operator
' '           Text
'~'           Operator
'~'           Operator
'~'           Operator
'0u'          Literal.Number.Integer
'\n    \n    ' Text
'let'         Keyword
' '           Text
'read'        Name.Variable
' '           Text
'pos'         Name
' '           Text
'len'         Name
' '           Text
'='           Operator
'\n        '  Text
'let'         Keyword
' '           Text
'rlen'        Name.Variable
' '           Text
'='           Operator
' '           Text
'sin'         Name
'.'           Operator
'Read'        Name
'('           Operator
'buf'         Name
','           Operator
' '           Text
'pos'         Name
','           Operator
' '           Text
'len'         Name
')'           Operator
'\n        '  Text
'if'          Keyword
' '           Text
'rlen'        Name
' '           Text
'<'           Operator
' '           Text
'len'         Name
' '           Text
'then'        Keyword
' '           Text
'length'      Name
' '           Text
'<-'          Operator
' '           Text
'pos'         Name
' '           Text
'+'           Operator
' '           Text
'rlen'        Name
'\n        '  Text
'for'         Keyword
' '           Text
'i'           Name
' '           Text
'='           Operator
' '           Text
'pos'         Name
' '           Text
'to'          Keyword
' '           Text
'pos'         Name
' '           Text
'+'           Operator
' '           Text
'rlen'        Name
' '           Text
'-'           Operator
' '           Text
'1'           Literal.Number.Integer
' '           Text
'do'          Keyword
'\n            ' Text
'let'         Keyword
' '           Text
'b'           Name.Variable
' '           Text
'='           Operator
' '           Text
'int'         Name
'('           Operator
'crc'         Name
' '           Text
'^^'          Operator
'^'           Operator
' '           Text
'('           Operator
'uint32'      Keyword.Type
' '           Text
'buf'         Name
'.'           Operator
'['           Operator
'i'           Name
']'           Operator
')'           Operator
')'           Operator
' '           Text
'&&'          Operator
'&'           Operator
' '           Text
'0'           Literal.Number.Integer
'xff'         Name
'\n            ' Text
'crc'         Name
' '           Text
'<-'          Operator
' '           Text
'('           Operator
'crc'         Name
' '           Text
'>'           Operator
'>'           Operator
'>'           Operator
' '           Text
'8'           Literal.Number.Integer
')'           Operator
' '           Text
'^^'          Operator
'^'           Operator
' '           Text
'crc32_table' Name
'.'           Operator
'['           Operator
'b'           Name
']'           Operator
'\n        '  Text
'if'          Keyword
' '           Text
'hash'        Name
' '           Text
'<'           Operator
'>'           Operator
' '           Text
'null'        Keyword
' '           Text
'then'        Keyword
'\n            ' Text
'for'         Keyword
' '           Text
'list'        Keyword.Type
' '           Text
'in'          Keyword
' '           Text
'hash'        Name
' '           Text
'do'          Keyword
' '           Text
'list'        Keyword.Type
'.'           Operator
'Clear'       Name
'()'          Name.Builtin.Pseudo
'\n        '  Text
'else'        Keyword
'\n            ' Text
'Array'       Name.Namespace
'.'           Punctuation
'fill'        Name
' '           Text
'counts'      Name
' '           Text
'0'           Literal.Number.Integer
' '           Text
'counts'      Name
'.'           Operator
'Length'      Name
' '           Text
'0'           Literal.Number.Integer
'\n    \n    ' Text
'do'          Keyword
'\n        '  Text
'read'        Name
' '           Text
'0'           Literal.Number.Integer
' '           Text
'buflen'      Name
'\n    \n    ' Text
'let'         Keyword
' '           Text
'search'      Name.Variable
' '           Text
'('           Operator
'pos'         Name
':'           Operator
'int'         Name
')'           Operator
' '           Text
'='           Operator
'\n        '  Text
'let'         Keyword
' '           Text
'mutable'     Name.Variable
' '           Text
'maxp'        Name
' '           Text
'='           Operator
' '           Text
'-'           Operator
'1'           Literal.Number.Integer
'\n        '  Text
'let'         Keyword
' '           Text
'mutable'     Name.Variable
' '           Text
'maxl'        Name
' '           Text
'='           Operator
' '           Text
'2'           Literal.Number.Integer
'\n        '  Text
'let'         Keyword
' '           Text
'mlen'        Name.Variable
' '           Text
'='           Operator
' '           Text
'Math'        Name.Namespace
'.'           Punctuation
'Min'         Name
'('           Operator
'maxlen'      Name
','           Operator
' '           Text
'length'      Name
' '           Text
'-'           Operator
' '           Text
'pos'         Name
')'           Operator
'\n        '  Text
'let'         Keyword
' '           Text
'last'        Name.Variable
' '           Text
'='           Operator
' '           Text
'Math'        Name.Namespace
'.'           Punctuation
'Max'         Name
'('           Operator
'0'           Literal.Number.Integer
','           Operator
' '           Text
'pos'         Name
' '           Text
'-'           Operator
' '           Text
'maxbuf'      Name
')'           Operator
'\n        '  Text
'let'         Keyword
' '           Text
'h'           Name.Variable
' '           Text
'='           Operator
' '           Text
'getHash'     Name
' '           Text
'buf'         Name
' '           Text
'pos'         Name
'\n        '  Text
'if'          Keyword
' '           Text
'hash'        Name
' '           Text
'<'           Operator
'>'           Operator
' '           Text
'null'        Keyword
' '           Text
'then'        Keyword
'\n            ' Text
'let'         Keyword
' '           Text
'list'        Name.Variable
' '           Text
'='           Operator
' '           Text
'hash'        Name
'.'           Operator
'['           Operator
'h'           Name
']'           Operator
'\n            ' Text
'let'         Keyword
' '           Text
'mutable'     Name.Variable
' '           Text
'i'           Name
' '           Text
'='           Operator
' '           Text
'list'        Keyword.Type
'.'           Operator
'Count'       Name
' '           Text
'-'           Operator
' '           Text
'1'           Literal.Number.Integer
'\n            ' Text
'while'       Keyword
' '           Text
'i'           Name
' '           Text
'>'           Operator
'='           Operator
' '           Text
'0'           Literal.Number.Integer
' '           Text
'do'          Keyword
'\n                ' Text
'let'         Keyword
' '           Text
'p'           Name.Variable
' '           Text
'='           Operator
' '           Text
'list'        Keyword.Type
'.'           Operator
'['           Operator
'i'           Name
']'           Operator
'\n                ' Text
'if'          Keyword
' '           Text
'p'           Name
' '           Text
'<'           Operator
' '           Text
'last'        Name
' '           Text
'then'        Keyword
' '           Text
'i'           Name
' '           Text
'<-'          Operator
' '           Text
'0'           Literal.Number.Integer
' '           Text
'else'        Keyword
'\n                    ' Text
'let'         Keyword
' '           Text
'mutable'     Name.Variable
' '           Text
'len'         Name
' '           Text
'='           Operator
' '           Text
'0'           Literal.Number.Integer
'\n                    ' Text
'while'       Keyword
' '           Text
'len'         Name
' '           Text
'<'           Operator
' '           Text
'mlen'        Name
' '           Text
'&&'          Operator
' '           Text
'buf'         Name
'.'           Operator
'['           Operator
'p'           Name
' '           Text
'+'           Operator
' '           Text
'len'         Name
']'           Operator
' '           Text
'='           Operator
' '           Text
'buf'         Name
'.'           Operator
'['           Operator
'pos'         Name
' '           Text
'+'           Operator
' '           Text
'len'         Name
']'           Operator
' '           Text
'do'          Keyword
'\n                        ' Text
'len'         Name
' '           Text
'<-'          Operator
' '           Text
'len'         Name
' '           Text
'+'           Operator
' '           Text
'1'           Literal.Number.Integer
'\n                    ' Text
'if'          Keyword
' '           Text
'len'         Name
' '           Text
'>'           Operator
' '           Text
'maxl'        Name
' '           Text
'then'        Keyword
'\n                        ' Text
'maxp'        Name
' '           Text
'<-'          Operator
' '           Text
'p'           Name
'\n                        ' Text
'maxl'        Name
' '           Text
'<-'          Operator
' '           Text
'len'         Name
'\n                ' Text
'i'           Name
' '           Text
'<-'          Operator
' '           Text
'i'           Name
' '           Text
'-'           Operator
' '           Text
'1'           Literal.Number.Integer
'\n        '  Text
'else'        Keyword
'\n            ' Text
'let'         Keyword
' '           Text
'c'           Name.Variable
' '           Text
'='           Operator
' '           Text
'counts'      Name
'.'           Operator
'['           Operator
'h'           Name
']'           Operator
'\n            ' Text
'let'         Keyword
' '           Text
'p1'          Name.Variable
','           Operator
' '           Text
'p2'          Name
' '           Text
'='           Operator
' '           Text
'if'          Keyword
' '           Text
'c'           Name
' '           Text
'<'           Operator
' '           Text
'16'          Literal.Number.Integer
' '           Text
'then'        Keyword
' '           Text
'0'           Literal.Number.Integer
','           Operator
' '           Text
'c'           Name
' '           Text
'-'           Operator
' '           Text
'1'           Literal.Number.Integer
' '           Text
'else'        Keyword
' '           Text
'c'           Name
' '           Text
'+'           Operator
' '           Text
'1'           Literal.Number.Integer
','           Operator
' '           Text
'c'           Name
' '           Text
'+'           Operator
' '           Text
'16'          Literal.Number.Integer
'\n            ' Text
'let'         Keyword
' '           Text
'mutable'     Name.Variable
' '           Text
'i'           Name
' '           Text
'='           Operator
' '           Text
'p2'          Name
'\n            ' Text
'while'       Keyword
' '           Text
'i'           Name
' '           Text
'>'           Operator
'='           Operator
' '           Text
'p1'          Name
' '           Text
'do'          Keyword
'\n                ' Text
'let'         Keyword
' '           Text
'p'           Name.Variable
' '           Text
'='           Operator
' '           Text
'tables'      Name
'.'           Operator
'['           Operator
'h'           Name
','           Operator
' '           Text
'i'           Name
' '           Text
'&&'          Operator
'&'           Operator
' '           Text
'15'          Literal.Number.Integer
']'           Operator
'\n                ' Text
'if'          Keyword
' '           Text
'p'           Name
' '           Text
'<'           Operator
' '           Text
'last'        Name
' '           Text
'then'        Keyword
' '           Text
'i'           Name
' '           Text
'<-'          Operator
' '           Text
'0'           Literal.Number.Integer
' '           Text
'else'        Keyword
'\n                    ' Text
'let'         Keyword
' '           Text
'mutable'     Name.Variable
' '           Text
'len'         Name
' '           Text
'='           Operator
' '           Text
'0'           Literal.Number.Integer
'\n                    ' Text
'while'       Keyword
' '           Text
'len'         Name
' '           Text
'<'           Operator
' '           Text
'mlen'        Name
' '           Text
'&&'          Operator
' '           Text
'buf'         Name
'.'           Operator
'['           Operator
'p'           Name
' '           Text
'+'           Operator
' '           Text
'len'         Name
']'           Operator
' '           Text
'='           Operator
' '           Text
'buf'         Name
'.'           Operator
'['           Operator
'pos'         Name
' '           Text
'+'           Operator
' '           Text
'len'         Name
']'           Operator
' '           Text
'do'          Keyword
'\n                        ' Text
'len'         Name
' '           Text
'<-'          Operator
' '           Text
'len'         Name
' '           Text
'+'           Operator
' '           Text
'1'           Literal.Number.Integer
'\n                    ' Text
'if'          Keyword
' '           Text
'len'         Name
' '           Text
'>'           Operator
' '           Text
'maxl'        Name
' '           Text
'then'        Keyword
'\n                        ' Text
'maxp'        Name
' '           Text
'<-'          Operator
' '           Text
'p'           Name
'\n                        ' Text
'maxl'        Name
' '           Text
'<-'          Operator
' '           Text
'len'         Name
'\n                ' Text
'i'           Name
' '           Text
'<-'          Operator
' '           Text
'i'           Name
' '           Text
'-'           Operator
' '           Text
'1'           Literal.Number.Integer
'\n        '  Text
'maxp'        Name
','           Operator
' '           Text
'maxl'        Name
'\n    \n    ' Text
'member'      Keyword
' '           Text
'x'           Name
'.'           Punctuation
'Crc'         Name.Function
' '           Text
'='           Operator
' '           Text
'~'           Operator
'~'           Operator
'~'           Operator
'crc'         Name
'\n\n    '    Text
'member'      Keyword
' '           Text
'x'           Name
'.'           Punctuation
'Compress'    Name.Function
' '           Text
'('           Operator
'sout'        Name
':'           Operator
'Stream'      Name
')'           Operator
' '           Text
'='           Operator
'\n        '  Text
'use'         Keyword
' '           Text
'bw'          Name
' '           Text
'='           Operator
' '           Text
'new'         Keyword
' '           Text
'BitWriter'   Name
'('           Operator
'sout'        Name
')'           Operator
'\n        '  Text
'bw'          Name
'.'           Operator
'WriteBit'    Name
' '           Text
'1'           Literal.Number.Integer
'\n        '  Text
'bw'          Name
'.'           Operator
'WriteLE'     Name
' '           Text
'2'           Literal.Number.Integer
' '           Text
'1'           Literal.Number.Integer
'\n        '  Text
'let'         Keyword
' '           Text
'hw'          Name.Variable
' '           Text
'='           Operator
' '           Text
'new'         Keyword
' '           Text
'FixedHuffmanWriter' Name
'('           Operator
'bw'          Name
')'           Operator
'\n        '  Text
'let'         Keyword
' '           Text
'mutable'     Name.Variable
' '           Text
'p'           Name
' '           Text
'='           Operator
' '           Text
'0'           Literal.Number.Integer
'\n        '  Text
'match'       Keyword
' '           Text
't'           Name
' '           Text
'with'        Keyword
'\n        '  Text
'|'           Operator
' '           Text
'2'           Literal.Number.Integer
' '           Text
'->'          Operator
'\n            ' Text
'while'       Keyword
' '           Text
'p'           Name
' '           Text
'<'           Operator
' '           Text
'length'      Name
' '           Text
'do'          Keyword
'\n                ' Text
'let'         Keyword
' '           Text
'b'           Name.Variable
' '           Text
'='           Operator
' '           Text
'buf'         Name
'.'           Operator
'['           Operator
'p'           Name
']'           Operator
'\n                ' Text
'if'          Keyword
' '           Text
'p'           Name
' '           Text
'<'           Operator
' '           Text
'length'      Name
' '           Text
'-'           Operator
' '           Text
'4'           Literal.Number.Integer
' '           Text
'&&'          Operator
' '           Text
'b'           Name
' '           Text
'='           Operator
' '           Text
'buf'         Name
'.'           Operator
'['           Operator
'p'           Name
' '           Text
'+'           Operator
' '           Text
'1'           Literal.Number.Integer
']'           Operator
' '           Text
'&&'          Operator
' '           Text
'b'           Name
' '           Text
'='           Operator
' '           Text
'buf'         Name
'.'           Operator
'['           Operator
'p'           Name
' '           Text
'+'           Operator
' '           Text
'2'           Literal.Number.Integer
']'           Operator
' '           Text
'&&'          Operator
' '           Text
'b'           Name
' '           Text
'='           Operator
' '           Text
'buf'         Name
'.'           Operator
'['           Operator
'p'           Name
' '           Text
'+'           Operator
' '           Text
'3'           Literal.Number.Integer
']'           Operator
' '           Text
'then'        Keyword
'\n                    ' Text
'let'         Keyword
' '           Text
'mutable'     Name.Variable
' '           Text
'len'         Name
' '           Text
'='           Operator
' '           Text
'4'           Literal.Number.Integer
'\n                    ' Text
'let'         Keyword
' '           Text
'mlen'        Name.Variable
' '           Text
'='           Operator
' '           Text
'Math'        Name.Namespace
'.'           Punctuation
'Min'         Name
'('           Operator
'maxlen'      Name
' '           Text
'+'           Operator
' '           Text
'1'           Literal.Number.Integer
','           Operator
' '           Text
'length'      Name
' '           Text
'-'           Operator
' '           Text
'p'           Name
')'           Operator
'\n                    ' Text
'while'       Keyword
' '           Text
'len'         Name
' '           Text
'<'           Operator
' '           Text
'mlen'        Name
' '           Text
'&&'          Operator
' '           Text
'b'           Name
' '           Text
'='           Operator
' '           Text
'buf'         Name
'.'           Operator
'['           Operator
'p'           Name
' '           Text
'+'           Operator
' '           Text
'len'         Name
']'           Operator
' '           Text
'do'          Keyword
'\n                        ' Text
'len'         Name
' '           Text
'<-'          Operator
' '           Text
'len'         Name
' '           Text
'+'           Operator
' '           Text
'1'           Literal.Number.Integer
'\n                    ' Text
'hw'          Name
'.'           Operator
'Write'       Name
'('           Operator
'int'         Name
' '           Text
'b'           Name
')'           Operator
'\n                    ' Text
'hw'          Name
'.'           Operator
'WriteLen'    Name
'('           Operator
'len'         Name
' '           Text
'-'           Operator
' '           Text
'1'           Literal.Number.Integer
')'           Operator
'\n                    ' Text
'hw'          Name
'.'           Operator
'WriteDist'   Name
' '           Text
'1'           Literal.Number.Integer
'\n                    ' Text
'p'           Name
' '           Text
'<-'          Operator
' '           Text
'p'           Name
' '           Text
'+'           Operator
' '           Text
'len'         Name
'\n                ' Text
'else'        Keyword
'\n                    ' Text
'let'         Keyword
' '           Text
'maxp'        Name.Variable
','           Operator
' '           Text
'maxl'        Name
' '           Text
'='           Operator
' '           Text
'search'      Name
' '           Text
'p'           Name
'\n                    ' Text
'if'          Keyword
' '           Text
'maxp'        Name
' '           Text
'<'           Operator
' '           Text
'0'           Literal.Number.Integer
' '           Text
'then'        Keyword
'\n                        ' Text
'hw'          Name
'.'           Operator
'Write'       Name
'('           Operator
'int'         Name
' '           Text
'b'           Name
')'           Operator
'\n                        ' Text
'addHash2'    Name
' '           Text
'tables'      Name
' '           Text
'counts'      Name
' '           Text
'buf'         Name
' '           Text
'p'           Name
'\n                        ' Text
'p'           Name
' '           Text
'<-'          Operator
' '           Text
'p'           Name
' '           Text
'+'           Operator
' '           Text
'1'           Literal.Number.Integer
'\n                    ' Text
'else'        Keyword
'\n                        ' Text
'hw'          Name
'.'           Operator
'WriteLen'    Name
' '           Text
'maxl'        Name
'\n                        ' Text
'hw'          Name
'.'           Operator
'WriteDist'   Name
' '           Text
'('           Operator
'p'           Name
' '           Text
'-'           Operator
' '           Text
'maxp'        Name
')'           Operator
'\n                        ' Text
'for'         Keyword
' '           Text
'i'           Name
' '           Text
'='           Operator
' '           Text
'p'           Name
' '           Text
'to'          Keyword
' '           Text
'p'           Name
' '           Text
'+'           Operator
' '           Text
'maxl'        Name
' '           Text
'-'           Operator
' '           Text
'1'           Literal.Number.Integer
' '           Text
'do'          Keyword
'\n                            ' Text
'addHash2'    Name
' '           Text
'tables'      Name
' '           Text
'counts'      Name
' '           Text
'buf'         Name
' '           Text
'i'           Name
'\n                        ' Text
'p'           Name
' '           Text
'<-'          Operator
' '           Text
'p'           Name
' '           Text
'+'           Operator
' '           Text
'maxl'        Name
'\n                ' Text
'if'          Keyword
' '           Text
'p'           Name
' '           Text
'>'           Operator
' '           Text
'maxbuf2'     Name
' '           Text
'then'        Keyword
'\n                    ' Text
'Array'       Name.Namespace
'.'           Punctuation
'Copy'        Name
'('           Operator
'buf'         Name
','           Operator
' '           Text
'maxbuf'      Name
','           Operator
' '           Text
'buf'         Name
','           Operator
' '           Text
'0'           Literal.Number.Integer
','           Operator
' '           Text
'maxbuf'      Name
' '           Text
'+'           Operator
' '           Text
'maxlen'      Name
')'           Operator
'\n                    ' Text
'if'          Keyword
' '           Text
'length'      Name
' '           Text
'<'           Operator
' '           Text
'buflen'      Name
' '           Text
'then'        Keyword
' '           Text
'length'      Name
' '           Text
'<-'          Operator
' '           Text
'length'      Name
' '           Text
'-'           Operator
' '           Text
'maxbuf'      Name
' '           Text
'else'        Keyword
'\n                        ' Text
'read'        Name
' '           Text
'('           Operator
'maxbuf'      Name
' '           Text
'+'           Operator
' '           Text
'maxlen'      Name
')'           Operator
' '           Text
'maxbuf'      Name
'\n                    ' Text
'p'           Name
' '           Text
'<-'          Operator
' '           Text
'p'           Name
' '           Text
'-'           Operator
' '           Text
'maxbuf'      Name
'\n                    ' Text
'for'         Keyword
' '           Text
'i'           Name
' '           Text
'='           Operator
' '           Text
'0'           Literal.Number.Integer
' '           Text
'to'          Keyword
' '           Text
'p'           Name
' '           Text
'-'           Operator
' '           Text
'1'           Literal.Number.Integer
' '           Text
'do'          Keyword
'\n                        ' Text
'addHash2'    Name
' '           Text
'tables'      Name
' '           Text
'counts'      Name
' '           Text
'buf'         Name
' '           Text
'i'           Name
'\n        '  Text
'|'           Operator
' '           Text
'1'           Literal.Number.Integer
' '           Text
'->'          Operator
'\n            ' Text
'while'       Keyword
' '           Text
'p'           Name
' '           Text
'<'           Operator
' '           Text
'length'      Name
' '           Text
'do'          Keyword
'\n                ' Text
'let'         Keyword
' '           Text
'b'           Name.Variable
' '           Text
'='           Operator
' '           Text
'buf'         Name
'.'           Operator
'['           Operator
'p'           Name
']'           Operator
'\n                ' Text
'if'          Keyword
' '           Text
'p'           Name
' '           Text
'<'           Operator
' '           Text
'length'      Name
' '           Text
'-'           Operator
' '           Text
'4'           Literal.Number.Integer
' '           Text
'&&'          Operator
' '           Text
'b'           Name
' '           Text
'='           Operator
' '           Text
'buf'         Name
'.'           Operator
'['           Operator
'p'           Name
' '           Text
'+'           Operator
' '           Text
'1'           Literal.Number.Integer
']'           Operator
' '           Text
'&&'          Operator
' '           Text
'b'           Name
' '           Text
'='           Operator
' '           Text
'buf'         Name
'.'           Operator
'['           Operator
'p'           Name
' '           Text
'+'           Operator
' '           Text
'2'           Literal.Number.Integer
']'           Operator
' '           Text
'&&'          Operator
' '           Text
'b'           Name
' '           Text
'='           Operator
' '           Text
'buf'         Name
'.'           Operator
'['           Operator
'p'           Name
' '           Text
'+'           Operator
' '           Text
'3'           Literal.Number.Integer
']'           Operator
' '           Text
'then'        Keyword
'\n                    ' Text
'let'         Keyword
' '           Text
'mutable'     Name.Variable
' '           Text
'len'         Name
' '           Text
'='           Operator
' '           Text
'4'           Literal.Number.Integer
'\n                    ' Text
'let'         Keyword
' '           Text
'mlen'        Name.Variable
' '           Text
'='           Operator
' '           Text
'Math'        Name.Namespace
'.'           Punctuation
'Min'         Name
'('           Operator
'maxlen'      Name
' '           Text
'+'           Operator
' '           Text
'1'           Literal.Number.Integer
','           Operator
' '           Text
'length'      Name
' '           Text
'-'           Operator
' '           Text
'p'           Name
')'           Operator
'\n                    ' Text
'while'       Keyword
' '           Text
'len'         Name
' '           Text
'<'           Operator
' '           Text
'mlen'        Name
' '           Text
'&&'          Operator
' '           Text
'b'           Name
' '           Text
'='           Operator
' '           Text
'buf'         Name
'.'           Operator
'['           Operator
'p'           Name
' '           Text
'+'           Operator
' '           Text
'len'         Name
']'           Operator
' '           Text
'do'          Keyword
'\n                        ' Text
'len'         Name
' '           Text
'<-'          Operator
' '           Text
'len'         Name
' '           Text
'+'           Operator
' '           Text
'1'           Literal.Number.Integer
'\n                    ' Text
'hw'          Name
'.'           Operator
'Write'       Name
'('           Operator
'int'         Name
' '           Text
'b'           Name
')'           Operator
'\n                    ' Text
'hw'          Name
'.'           Operator
'WriteLen'    Name
'('           Operator
'len'         Name
' '           Text
'-'           Operator
' '           Text
'1'           Literal.Number.Integer
')'           Operator
'\n                    ' Text
'hw'          Name
'.'           Operator
'WriteDist'   Name
' '           Text
'1'           Literal.Number.Integer
'\n                    ' Text
'p'           Name
' '           Text
'<-'          Operator
' '           Text
'p'           Name
' '           Text
'+'           Operator
' '           Text
'len'         Name
'\n                ' Text
'else'        Keyword
'\n                    ' Text
'let'         Keyword
' '           Text
'maxp'        Name.Variable
','           Operator
' '           Text
'maxl'        Name
' '           Text
'='           Operator
' '           Text
'search'      Name
' '           Text
'p'           Name
'\n                    ' Text
'if'          Keyword
' '           Text
'maxp'        Name
' '           Text
'<'           Operator
' '           Text
'0'           Literal.Number.Integer
' '           Text
'then'        Keyword
'\n                        ' Text
'hw'          Name
'.'           Operator
'Write'       Name
'('           Operator
'int'         Name
' '           Text
'b'           Name
')'           Operator
'\n                        ' Text
'addHash'     Name
' '           Text
'hash'        Name
' '           Text
'buf'         Name
' '           Text
'p'           Name
'\n                        ' Text
'p'           Name
' '           Text
'<-'          Operator
' '           Text
'p'           Name
' '           Text
'+'           Operator
' '           Text
'1'           Literal.Number.Integer
'\n                    ' Text
'else'        Keyword
'\n                        ' Text
'hw'          Name
'.'           Operator
'WriteLen'    Name
' '           Text
'maxl'        Name
'\n                        ' Text
'hw'          Name
'.'           Operator
'WriteDist'   Name
' '           Text
'('           Operator
'p'           Name
' '           Text
'-'           Operator
' '           Text
'maxp'        Name
')'           Operator
'\n                        ' Text
'for'         Keyword
' '           Text
'i'           Name
' '           Text
'='           Operator
' '           Text
'p'           Name
' '           Text
'to'          Keyword
' '           Text
'p'           Name
' '           Text
'+'           Operator
' '           Text
'maxl'        Name
' '           Text
'-'           Operator
' '           Text
'1'           Literal.Number.Integer
' '           Text
'do'          Keyword
'\n                            ' Text
'addHash'     Name
' '           Text
'hash'        Name
' '           Text
'buf'         Name
' '           Text
'i'           Name
'\n                        ' Text
'p'           Name
' '           Text
'<-'          Operator
' '           Text
'p'           Name
' '           Text
'+'           Operator
' '           Text
'maxl'        Name
'\n                ' Text
'if'          Keyword
' '           Text
'p'           Name
' '           Text
'>'           Operator
' '           Text
'maxbuf2'     Name
' '           Text
'then'        Keyword
'\n                    ' Text
'Array'       Name.Namespace
'.'           Punctuation
'Copy'        Name
'('           Operator
'buf'         Name
','           Operator
' '           Text
'maxbuf'      Name
','           Operator
' '           Text
'buf'         Name
','           Operator
' '           Text
'0'           Literal.Number.Integer
','           Operator
' '           Text
'maxbuf'      Name
' '           Text
'+'           Operator
' '           Text
'maxlen'      Name
')'           Operator
'\n                    ' Text
'if'          Keyword
' '           Text
'length'      Name
' '           Text
'<'           Operator
' '           Text
'buflen'      Name
' '           Text
'then'        Keyword
' '           Text
'length'      Name
' '           Text
'<-'          Operator
' '           Text
'length'      Name
' '           Text
'-'           Operator
' '           Text
'maxbuf'      Name
' '           Text
'else'        Keyword
'\n                        ' Text
'read'        Name
' '           Text
'('           Operator
'maxbuf'      Name
' '           Text
'+'           Operator
' '           Text
'maxlen'      Name
')'           Operator
' '           Text
'maxbuf'      Name
'\n                    ' Text
'p'           Name
' '           Text
'<-'          Operator
' '           Text
'p'           Name
' '           Text
'-'           Operator
' '           Text
'maxbuf'      Name
'\n                    ' Text
'for'         Keyword
' '           Text
'i'           Name
' '           Text
'='           Operator
' '           Text
'0'           Literal.Number.Integer
' '           Text
'to'          Keyword
' '           Text
'p'           Name
' '           Text
'-'           Operator
' '           Text
'1'           Literal.Number.Integer
' '           Text
'do'          Keyword
'\n                        ' Text
'addHash'     Name
' '           Text
'hash'        Name
' '           Text
'buf'         Name
' '           Text
'i'           Name
'\n        '  Text
'|'           Operator
' '           Text
'_'           Operator
' '           Text
'->'          Operator
'\n            ' Text
'while'       Keyword
' '           Text
'p'           Name
' '           Text
'<'           Operator
' '           Text
'length'      Name
' '           Text
'do'          Keyword
'\n                ' Text
'let'         Keyword
' '           Text
'maxp'        Name.Variable
','           Operator
' '           Text
'maxl'        Name
' '           Text
'='           Operator
' '           Text
'search'      Name
' '           Text
'p'           Name
'\n                ' Text
'if'          Keyword
' '           Text
'maxp'        Name
' '           Text
'<'           Operator
' '           Text
'0'           Literal.Number.Integer
' '           Text
'then'        Keyword
'\n                    ' Text
'hw'          Name
'.'           Operator
'Write'       Name
'('           Operator
'int'         Name
' '           Text
'buf'         Name
'.'           Operator
'['           Operator
'p'           Name
']'           Operator
')'           Operator
'\n                    ' Text
'hash'        Name
'.'           Operator
'['           Operator
'getHash'     Name
' '           Text
'buf'         Name
' '           Text
'p'           Name
']'           Operator
'.'           Operator
'Add'         Name
' '           Text
'p'           Name
'\n                    ' Text
'p'           Name
' '           Text
'<-'          Operator
' '           Text
'p'           Name
' '           Text
'+'           Operator
' '           Text
'1'           Literal.Number.Integer
'\n                ' Text
'else'        Keyword
'\n                    ' Text
'hw'          Name
'.'           Operator
'WriteLen'    Name
' '           Text
'maxl'        Name
'\n                    ' Text
'hw'          Name
'.'           Operator
'WriteDist'   Name
' '           Text
'('           Operator
'p'           Name
' '           Text
'-'           Operator
' '           Text
'maxp'        Name
')'           Operator
'\n                    ' Text
'for'         Keyword
' '           Text
'i'           Name
' '           Text
'='           Operator
' '           Text
'p'           Name
' '           Text
'to'          Keyword
' '           Text
'p'           Name
' '           Text
'+'           Operator
' '           Text
'maxl'        Name
' '           Text
'-'           Operator
' '           Text
'1'           Literal.Number.Integer
' '           Text
'do'          Keyword
'\n                        ' Text
'hash'        Name
'.'           Operator
'['           Operator
'getHash'     Name
' '           Text
'buf'         Name
' '           Text
'i'           Name
']'           Operator
'.'           Operator
'Add'         Name
' '           Text
'i'           Name
'\n                    ' Text
'p'           Name
' '           Text
'<-'          Operator
' '           Text
'p'           Name
' '           Text
'+'           Operator
' '           Text
'maxl'        Name
'\n                ' Text
'if'          Keyword
' '           Text
'p'           Name
' '           Text
'>'           Operator
' '           Text
'maxbuf2'     Name
' '           Text
'then'        Keyword
'\n                    ' Text
'Array'       Name.Namespace
'.'           Punctuation
'Copy'        Name
'('           Operator
'buf'         Name
','           Operator
' '           Text
'maxbuf'      Name
','           Operator
' '           Text
'buf'         Name
','           Operator
' '           Text
'0'           Literal.Number.Integer
','           Operator
' '           Text
'maxbuf'      Name
' '           Text
'+'           Operator
' '           Text
'maxlen'      Name
')'           Operator
'\n                    ' Text
'if'          Keyword
' '           Text
'length'      Name
' '           Text
'<'           Operator
' '           Text
'buflen'      Name
' '           Text
'then'        Keyword
' '           Text
'length'      Name
' '           Text
'<-'          Operator
' '           Text
'length'      Name
' '           Text
'-'           Operator
' '           Text
'maxbuf'      Name
' '           Text
'else'        Keyword
'\n                        ' Text
'read'        Name
' '           Text
'('           Operator
'maxbuf'      Name
' '           Text
'+'           Operator
' '           Text
'maxlen'      Name
')'           Operator
' '           Text
'maxbuf'      Name
'\n                    ' Text
'p'           Name
' '           Text
'<-'          Operator
' '           Text
'p'           Name
' '           Text
'-'           Operator
' '           Text
'maxbuf'      Name
'\n                    ' Text
'for'         Keyword
' '           Text
'i'           Name
' '           Text
'='           Operator
' '           Text
'0'           Literal.Number.Integer
' '           Text
'to'          Keyword
' '           Text
'p'           Name
' '           Text
'-'           Operator
' '           Text
'1'           Literal.Number.Integer
' '           Text
'do'          Keyword
'\n                        ' Text
'hash'        Name
'.'           Operator
'['           Operator
'getHash'     Name
' '           Text
'buf'         Name
' '           Text
'i'           Name
']'           Operator
'.'           Operator
'Add'         Name
' '           Text
'i'           Name
'\n        '  Text
'hw'          Name
'.'           Operator
'Write'       Name
' '           Text
'256'         Literal.Number.Integer
'\n\n'        Text

'let'         Keyword
' '           Text
'GetCompressBytes' Name.Variable
' '           Text
'('           Operator
'sin'         Name
':'           Operator
'Stream'      Name
')'           Operator
' '           Text
'='           Operator
'\n    '      Text
'let'         Keyword
' '           Text
'now'         Name.Variable
' '           Text
'='           Operator
' '           Text
'DateTime'    Name.Namespace
'.'           Punctuation
'Now'         Name
'\n    '      Text
'let'         Keyword
' '           Text
'ms'          Name.Variable
' '           Text
'='           Operator
' '           Text
'new'         Keyword
' '           Text
'MemoryStream' Name
'()'          Name.Builtin.Pseudo
'\n    '      Text
'let'         Keyword
' '           Text
'w'           Name.Variable
' '           Text
'='           Operator
' '           Text
'new'         Keyword
' '           Text
'Writer'      Name
'('           Operator
'1'           Literal.Number.Integer
','           Operator
' '           Text
'sin'         Name
')'           Operator
'\n    '      Text
'w'           Name
'.'           Operator
'Compress'    Name
' '           Text
'ms'          Name
'\n    '      Text
'ms'          Name
'.'           Operator
'ToArray'     Name
'()'          Name.Builtin.Pseudo
','           Operator
' '           Text
'w'           Name
'.'           Operator
'Crc'         Name
'\n'          Text
