!g=      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~     SafeSafeWhttp2 Bit stream. http2Data type for Bit.!http2Zero"http2One#http2From  of length 8 to $.fromBits [T,F,T,F,T,F,T,F]170fromBits [F,T,F,T,F,T,F,T]85 "!#None%http2&let bs = BS.pack [0x12,0x34,0xf3,0xab]unpack4bits bs[1,2,3,4,15,3,10,11]unpack4bits $ BS.tail bs[3,4,15,3,10,11]%&Safe' Safe() Safe*http2Type for Huffman decoding.+http2 Creating *.,http2Marking the EOS path*-./01+2None'Whttp2(Internal representation for header keys.http2Index for value tablehttp2should be indexed in HPACKhttp2is this a pseudo header key?http2Case insensitive header keyhttp2!Extracting an index from a token.http26Extracting a case insensitive header key from a token.http2,Extracting a folded header key from a token.=http2 Not defined in the static table.>http2 Not defined in the static table.?http2CA place holder to hold header keys not defined in the static table.@http2Minimum token index.Ahttp20Maximun token index defined in the static table.Bhttp2Maximum token index.Chttp2Token index for .Dhttp2Is this token ix for Cookie?Ehttp20Is this token ix to be held in the place holder?Fhttp2>Is this token ix for a header not defined in the static table?Ghttp2;Is this token for a header not defined in the static table?Hhttp2!Making a token from a header key.&toToken ":authority" == tokenAuthorityTrue toToken "foo"KToken {ix = 54, shouldBeIndexed = True, isPseudo = False, tokenKey = "foo"}toToken ":bar"KToken {ix = 54, shouldBeIndexed = True, isPseudo = True, tokenKey = ":bar"}I  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIH@ABCEDFG  !"#$%&'()*+,-./0123456789:;<=>? None29RLhttp2The buffer size is not enoughMhttp2The size of buffer.Nhttp2 Buffer type.Ohttp2Errors for decoder.Phttp2Index is out of rangeQhttp2+Eos appears in the middle of huffman stringRhttp2,Non-eos appears in the end of huffman stringShttp2)Eos of huffman string is more than 7 bitsThttp2Encoded string has no lengthUhttp2.A peer set the dynamic table size less than 32Vhttp2<A peer tried to change the dynamic table size over the limitWhttp2&Table size update at the non-beginningZhttp2Strategy for HPACK encoding.\http2$Which compression algorithm is used.]http23Whether or not to use Huffman encoding for strings.^http2*Compression algorithms for HPACK encoding._http2No compression`http2&Using indices in the static table onlyahttp2 Using indicesbhttp2Index for table.3http2To be a h or g.ehttp2 Header list.fhttp2Header.ghttp2 Header value.hhttp2 Header name.ihttp2Default Z.defaultEncodeStrategy=EncodeStrategy {compressionAlgo = Linear, useHuffman = False}#KLMNOPQRSTUVWXYZ[\]^`_a456bcd3efghi None?1 7http2>Type for table entry. Size includes the 32 bytes magic number.jhttp2Size in bytes.8http2From f to 7.9http2Getting the size of 7.:http2Getting d.;http2Getting .<http2Getting h.=http2Getting g.>http2Dummy 7 to initialize a dynamic table.?http22How many entries can be stored in a dynamic table?bfgh7@j8A9:;<=>? NoneFgBhttp2The size of static table.Chttp2Get 7 from the static table.toStaticEntry 1^Entry 42 (Token {ix = 0, shouldBeIndexed = True, isPseudo = True, tokenKey = ":authority"}) ""toStaticEntry 8^Entry 42 (Token {ix = 4, shouldBeIndexed = True, isPseudo = True, tokenKey = ":status"}) "200"toStaticEntry 50[Entry 37 (Token {ix = 40, shouldBeIndexed = True, isPseudo = False, tokenKey = "Range"}) ""Dhttp2Pre-defined static table.BCENone"#FFGHIJKLNone"#GEMNMNOPQRSTUVWXYZ[\]^_`abcNone"#Hdhttp2Huffman encoding.ehttp2Huffman encoding.defNoneIghttp2Huffman decoding.hhttp2Huffman decoding.ghiNoneJdefghiNone"#>P\khttp2Type for dynamic table.jhttp2An arraykhttp2 Start pointlhttp2The current number of entriesmhttp2The size of the arraynhttp21The current dynamic table size (defined in HPACK)ohttp2-The max dynamic table size (defined in HPACK)phttp2 Printing k.lhttp2eWhen SETTINGS_HEADER_TABLE_SIZE is received from a peer, its value should be set by this function.mhttp2 Creating k for encoding.nhttp2 Creating k for decoding.qhttp2 Renewing k with necessary entries copied.rhttp2Is the size of k really changed?ohttp2 Creating k< for encoding, performing the action and clearing the k.phttp2 Creating k< for decoding, performing the action and clearing the k.qhttp2 Clearing kE. Currently, this frees the temporary buffer for Huffman decoding.shttp2 Inserting 7 to k . New k, the largest new b and a set of dropped OLD b are returned.mhttp2The dynamic table sizenhttp2The dynamic table sizehttp21The size of temporary buffer for Huffman decodingohttp2The dynamic table sizephttp2The dynamic table sizehttp2(The size of temporary buffer for Huffman"tuvwkxkmyjlnoz{|}~plmnqopqsNoneP\-bfgh7@j8A9:;<=>?FGHIJKLtuvwk}~plmnqopqsNoneaXhttp24Integer decoding. The first argument is N of prefix.decodeInteger 5 10 $ BS.empty10%decodeInteger 5 31 $ BS.pack [154,10]1337decodeInteger 8 42 $ BS.empty42http24Integer decoding. The first argument is N of prefix.None"#qrhttp2 Converting ea to the HPACK format. This function has overhead of allocating/freeing a temporary buffer. K5 will be thrown if the temporary buffer is too small.http2 Converting e to the HPACK format. K5 will be thrown if the temporary buffer is too small.shttp2 Converting c, to the HPACK format directly in the buffer._4th argument is relating to dynamic table size update. When calling this function for a new c, it must be . If  and set by lT, dynamic table size update is generated at the beginning of the HPACK format.'The return value is a pair of leftover c and how many bytes are filled in the buffer. If the leftover is empty, the encoding is finished. Otherwise, this function should be called with it again. 4th argument must be .rhttp2The size of a temporary buffer.http2An HPACK formathttp2The size of a temporary buffer.http2An HPACK formatshttp2 at the first time,  when continued.http2Leftover, filled lengthrsNone"#thttp2 An array for g.uhttp2 Accessing g with .vhttp2Converting the HPACK format to e.Headers are decoded as is.O/ would be thrown if the HPACK format is broken.KJ will be thrown if the temporary buffer for Huffman decoding is too small.whttp2Converting the HPACK format to c and t.,Multiple values of Cookie: are concatenated.0If a pseudo header appears multiple times, Y is thrown.'If unknown pseudo headers appear, Y is thrown.7If pseudo headers are found after normal headers, Y is thrown./If a header key contains capital letters, Y is thrown.O/ would be thrown if the HPACK format is broken.KJ will be thrown if the temporary buffer for Huffman decoding is too small.xhttp27Converting a header list of the http-types style to c and t.vhttp2An HPACK formatwhttp2An HPACK formattuvwxNoneLrstuvwxNoneyhttp2RDefault dynamic table size. The value is 4,096 bytes: an array has 128 entries.defaultDynamicTableSize4096/KLMNOPQRSTUVWXYZ[\]^`_abcdefghijklmnopqrstuvwxy/rvswkymnqopl^`_aZ[\]iOPQRSTUVWXYKLefhgcdtuxjbNMSafe"#.zhttp2xInternal representation of priority in priority queues. The precedence of a dequeued entry should be specified to " when the entry is enqueued again.http2 For test onlyzSafe zSafe28{http2(The data type for HTTP/2 frame payloads.http2'The data type for HTTP/2 frame headers.http2 The data type for HTTP/2 frames.http2!The type for padding in payloads.http26The type for fragments of a header encoded with HPACK.http2The type for stream identifierhttp2The type for flags.http2The type for frame type.http2The type for raw frame type.http2Type for stream priorityhttp2>The type for weight in priority. Its values are from 1 to 256.http2The type for window size.http2NCooked version of settings. This is suitable to be stored in a HTTP/2 context.http2Association list of SETTINGS.http2 The type for raw SETTINGS value.http2The type for SETTINGS key.http2)The connection error or the stream error.http2The type for error code. See  -https://tools.ietf.org/html/rfc7540#section-7.http2The type for raw error code.http2"The length of HTTP/2 frame header.frameHeaderLength9http2 Converting  to .fromErrorCodeId NoError0"fromErrorCodeId InadequateSecurity12http2 Converting  to .toErrorCodeId 0NoErrortoErrorCodeId 0xcInadequateSecuritytoErrorCodeId 0xeUnknownErrorCode 14http2 Obtaining  from .http2 Converting  to raw value.)fromSettingsKeyId SettingsHeaderTableSize1,fromSettingsKeyId SettingsMaxHeaderBlockSize6http2Converting raw value to .toSettingsKeyId 0NothingtoSettingsKeyId 1Just SettingsHeaderTableSizetoSettingsKeyId 6Just SettingsMaxHeaderBlockSizetoSettingsKeyId 7Nothinghttp2 Checking  and reporting an error if any.*checkSettingsList [(SettingsEnablePush,2)]AJust (ConnectionError ProtocolError "enable push must be 0 or 1")http2The default settings.defaultSettingsSettings {headerTableSize = 4096, enablePush = True, maxConcurrentStreams = Nothing, initialWindowSize = 65535, maxFrameSize = 16384, maxHeaderBlockSize = Nothing}http2Updating settings.XupdateSettings defaultSettings [(SettingsEnablePush,0),(SettingsMaxHeaderBlockSize,200)]Settings {headerTableSize = 4096, enablePush = False, maxConcurrentStreams = Nothing, initialWindowSize = 65535, maxFrameSize = 16384, maxHeaderBlockSize = Just 200}http2 The default initial window size.defaultInitialWindowSize65535http2The maximum window size. maxWindowSize 2147483647http2:Checking if a window size exceeds the maximum window size.isWindowOverflow 10FalseisWindowOverflow maxWindowSizeFalse$isWindowOverflow (maxWindowSize + 1)Truehttp2Default concurrency.recommendedConcurrency100http2+Default priority which depends on stream 0.defaultPriority?Priority {exclusive = False, streamDependency = 0, weight = 16}http2+Highest priority which depends on stream 0.highestPriority@Priority {exclusive = False, streamDependency = 0, weight = 256}http2 Converting  to .fromFrameTypeId FrameData0!fromFrameTypeId FrameContinuation9!fromFrameTypeId (FrameUnknown 10)10http2 Converting  to .toFrameTypeId 0 FrameDatatoFrameTypeId 9FrameContinuationtoFrameTypeId 10FrameUnknown 10http2%The maximum length of HTTP/2 payload.maxPayloadLength16384http2-The initial value of flags. No flags are set. defaultFlags0http2DChecking if the END_STREAM flag is set. >>> testEndStream 0x1 Truehttp27Checking if the ACK flag is set. >>> testAck 0x1 Truehttp2(Checking if the END_HEADERS flag is set.testEndHeader 0x4Truehttp2#Checking if the PADDED flag is set.testPadded 0x8Truehttp2%Checking if the PRIORITY flag is set.testPriority 0x20Truehttp2Setting the END_STREAM flag.setEndStream 01http2Setting the ACK flag.setAck 01http2Setting the END_HEADERS flag.setEndHeader 04http2Setting the PADDED flag. setPadded 08http2Setting the PRIORITY flag. setPriority 032http2.Checking if the stream identifier for control. isControl 0True isControl 1Falsehttp2.Checking if the stream identifier for request. isRequest 0False isRequest 1Truehttp2/Checking if the stream identifier for response. isResponse 0False isResponse 2Truehttp2&Checking if the exclusive flag is set.http2Setting the exclusive flag.http2Clearing the exclusive flag.http2Getting  from {.,framePayloadToFrameTypeId (DataFrame "body") FrameDatahttp22Checking if padding is defined in this frame type.isPaddingDefined $ DataFrame ""TrueisPaddingDefined $ PingFrame ""Falsey{|}~Safe http2&Abstract data type for priority trees.http2Default precedence.http2 Converting  to zR. When an entry is enqueued at the first time, this function should be used.http2Creating a new priority tree.http2XBringing up the structure of the priority tree. This must be used for Priority frame.http2OEnqueuing an entry to the priority tree. This must be used for Header frame.http2'Checking if the priority tree is empty.http2'Checking if the priority tree is empty.http2*Dequeuing an entry from the priority tree.http2*Dequeuing an entry from the priority tree.http2$Deleting the entry corresponding to .  and 5 are used to change the priority of a live stream. z zNone"#U http2)Auxiliary information for frame encoding.http2!Flags to be set in a frame headerhttp2%Stream id to be set in a frame headerhttp2Padding if any. In the case where this value is set but the priority flag is not set, this value gets preference over the priority flag. So, if this value is set, the priority flag is also set.http2A smart builder of .encodeInfo setAck 0IEncodeInfo {encodeFlags = 1, encodeStreamId = 0, encodePadding = Nothing}http2Encoding an HTTP/2 frame to f. This function is not efficient enough for high performace program because of the concatenation of .0encodeFrame (encodeInfo id 1) (DataFrame "body")*"\NUL\NUL\EOT\NUL\NUL\NUL\NUL\NUL\SOHbody"http2Encoding an HTTP/2 frame to [$]. This is suitable for sendMany.http2GEncoding an HTTP/2 frame header. The frame header must be completed.http2zWriting an encoded HTTP/2 frame header to the buffer. The length of the buffer must be larger than or equal to 9 bytes.http2`Encoding an HTTP/2 frame payload. This returns a complete frame header and chunks of payload.http2stream identifierhttp2Payload length. None"#Phttp2#The type for frame payload decoder. http2Decoding an HTTP/2 frame to . The second argument must be include the entire of frame. So, this function is not useful for real applications but useful for testing. http28Decoding an HTTP/2 frame header. Must supply 9 bytes. http26Checking a frame header and reporting an error if any.BcheckFrameHeader defaultSettings (FrameData,(FrameHeader 100 0 0))DLeft (ConnectionError ProtocolError "cannot used in control stream") http2Decoding an HTTP/2 frame payload. This function is considered to return a frame payload decoder according to a frame type. http2%Frame payload decoder for DATA frame.http2(Frame payload decoder for HEADERS frame.http2)Frame payload decoder for PRIORITY frame.http2+Frame payload decoder for RST_STREAM frame.http2)Frame payload decoder for SETTINGS frame.http2-Frame payload decoder for PUSH_PROMISE frame.http2%Frame payload decoder for PING frame.http2'Frame payload decoder for GOAWAY frame.http2.Frame payload decoder for WINDOW_UPDATE frame.http2-Frame payload decoder for CONTINUATION frame.http2Helper function to pull off the padding if its there, and will eat up the trailing padding automatically. Calls the decoder func passed in with the length of the unpadded portion between the padding octet and the actual padding http2HTTP/2 settingshttp2Input byte-streamhttp2 Decoded frame     Nonehttp2The preface of HTTP/2.connectionPreface""PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n"http2Length of the preface.connectionPrefaceLength24{|}~     {|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefg h h i j k l m n o p q r s t u v v w x y z { | } ~            !"#$%&'()*+,-.//0123456789:;<=> ? @ A B C D E F G H I J K L M N O P Q R S T U V N W X Y Z [\]^_`abcddefghijklmnopqrstuvwxyz{|}~g}z1"http2-1.6.4-7o84ZZpBzqFCIKVV71t3PiNetwork.HPACK.Token Network.HPACKNetwork.HTTP2.Priority Network.HTTP2Network.HPACK.BuilderNetwork.HPACK.Huffman.Bit Network.HPACK.Huffman.ByteStringNetwork.HPACK.Huffman.ParamsNetwork.HPACK.Huffman.TableNetwork.HPACK.Huffman.TreeNetwork.HPACK.TypesNetwork.HPACK.Table.EntryNetwork.HPACK.Table.StaticNetwork.HPACK.Table.RevIndexNetwork.HPACK.BufferNetwork.HPACK.Huffman.EncodeNetwork.HPACK.Huffman.DecodeNetwork.HPACK.HuffmanNetwork.HPACK.Table.DynamicNetwork.HPACK.Table!Network.HPACK.HeaderBlock.Integer Network.HPACK.HeaderBlock.Encode Network.HPACK.HeaderBlock.DecodeNetwork.HPACK.HeaderBlockNetwork.HTTP2.Priority.PSQNetwork.HTTP2.Priority.QueueNetwork.HTTP2.TypesNetwork.HTTP2.EncodeNetwork.HTTP2.DecodeTokenixshouldBeIndexedisPseudotokenKeytokenIx tokenCIKeytokenFoldedKeytokenAuthority tokenMethod tokenPath tokenScheme tokenStatustokenAcceptCharsettokenAcceptEncodingtokenAcceptLanguagetokenAcceptRanges tokenAccepttokenAccessControlAllowOrigintokenAge tokenAllowtokenAuthorizationtokenCacheControltokenContentDispositiontokenContentEncodingtokenContentLanguagetokenContentLengthtokenContentLocationtokenContentRangetokenContentType tokenCookie tokenDate tokenEtag tokenExpect tokenExpires tokenFrom tokenHost tokenIfMatchtokenIfModifiedSincetokenIfNoneMatch tokenIfRangetokenIfUnmodifiedSincetokenLastModified tokenLink tokenLocationtokenMaxForwardstokenProxyAuthenticatetokenProxyAuthorization tokenRange tokenReferer tokenRefreshtokenRetryAfter tokenServertokenSetCookietokenStrictTransportSecuritytokenTransferEncodingtokenUserAgent tokenVarytokenViatokenWwwAuthenticatetokenConnectiontokenTEtokenMax minTokenIxmaxStaticTokenIx maxTokenIx cookieTokenIxisCookieTokenIx isMaxTokenIxisStaticTokenIx isStaticTokentoToken $fEqToken $fShowToken BufferOverrun BufferSizeBuffer DecodeError IndexOverrunEosInTheMiddle IllegalEos TooLongEosEmptyEncodedStringTooSmallTableSizeTooLargeTableSizeIllegalTableSizeUpdateHeaderBlockTruncatedIllegalHeaderNameEncodeStrategycompressionAlgo useHuffmanCompressionAlgoNaiveStaticLinearIndexTokenHeaderList TokenHeader HeaderListHeader HeaderValue HeaderNamedefaultEncodeStrategySize DynamicTablesetLimitForEncodingnewDynamicTableForEncodingnewDynamicTableForDecodingwithDynamicTableForEncodingwithDynamicTableForDecodingclearDynamicTable encodeHeaderencodeTokenHeader ValueTablegetHeaderValue decodeHeaderdecodeTokenHeader toHeaderTabledefaultDynamicTableSize Precedence FramePayload DataFrame HeadersFrame PriorityFrameRSTStreamFrame SettingsFramePushPromiseFrame PingFrame GoAwayFrameWindowUpdateFrameContinuationFrame UnknownFrame FrameHeader payloadLengthflagsstreamIdFrame frameHeader framePayloadPaddingHeaderBlockFragmentStreamId FrameFlags FrameTypeId FrameData FrameHeaders FramePriorityFrameRSTStream FrameSettingsFramePushPromise FramePing FrameGoAwayFrameWindowUpdateFrameContinuation FrameUnknown FrameTypePriority exclusivestreamDependencyweightWeight WindowSizeSettingsheaderTableSize enablePushmaxConcurrentStreamsinitialWindowSize maxFrameSizemaxHeaderBlockSize SettingsList SettingsValue SettingsKeyIdSettingsHeaderTableSizeSettingsEnablePushSettingsMaxConcurrentStreamsSettingsInitialWindowSizeSettingsMaxFrameSizeSettingsMaxHeaderBlockSize HTTP2ErrorConnectionError StreamError ErrorCodeIdNoError ProtocolError InternalErrorFlowControlErrorSettingsTimeout StreamClosedFrameSizeError RefusedStreamCancelCompressionError ConnectErrorEnhanceYourCalmInadequateSecurityHTTP11RequiredUnknownErrorCode ErrorCodeframeHeaderLengthfromErrorCodeId toErrorCodeId errorCodeIdfromSettingsKeyIdtoSettingsKeyIdcheckSettingsListdefaultSettingsupdateSettingsdefaultInitialWindowSize maxWindowSizeisWindowOverflowrecommendedConcurrencydefaultPriorityhighestPriorityfromFrameTypeId toFrameTypeIdmaxPayloadLength defaultFlags testEndStreamtestAck testEndHeader testPadded testPriority setEndStreamsetAck setEndHeader setPadded setPriority isControl isRequest isResponse testExclusive setExclusiveclearExclusiveframePayloadToFrameTypeIdisPaddingDefined PriorityTreedefaultPrecedence toPrecedencenewPriorityTreeprepareenqueueisEmpty isEmptySTMdequeue dequeueSTMdelete EncodeInfo encodeFlagsencodeStreamId encodePadding encodeInfo encodeFrameencodeFrameChunksencodeFrameHeaderencodeFrameHeaderBufencodeFramePayloadFramePayloadDecoder decodeFramedecodeFrameHeadercheckFrameHeaderdecodeFramePayloaddecodeDataFramedecodeHeadersFramedecodePriorityFramedecoderstStreamFramedecodeSettingsFramedecodePushPromiseFramedecodePingFramedecodeGoAwayFramedecodeWindowUpdateFramedecodeContinuationFrameconnectionPrefaceconnectionPrefaceLengthBuilder<<empty singletonrunBitsBFTfromBitsbaseGHC.WordWord8 unpack4bitscopyidxEos huffmanTable huffmanTable'HTreetoHTreemarkBinTipeosInfoshowTree printTreeflatten HeaderStuffHIndexSIndexDIndexEntrytoEntry entrySizeentryTokenHeader entryTokenentryHeaderNameentryHeaderValue dummyEntry maxNumbers toEntryTokenstaticTableSize toStaticEntry staticTablestaticTableListRevIndex newRevIndex renewRevIndexlookupRevIndexlookupRevIndex'insertRevIndexdeleteRevIndexList ReadBuffer WorkingBufferstartlimitoffsetnewWorkingBufferwind readWord8 writeWord8 shiftLastNcopyByteString toByteString returnLengthwithTemporaryBuffer currentOffsetwithReadBuffer hasOneByte hasMoreBytes rewindOneBytegetBytegetByte'extractByteStringHuffmanEncodingencode encodeHuffmanHuffmanDecodingdecode decodeHuffman circularTable numOfEntriesmaxNumOfEntriesdynamicTableSizemaxDynamicTableSizeprintDynamicTablerenewDynamicTable shouldRenew insertEntryTableSizeActionKeepChangeIgnorecodeInfoCodeInfo DecodeInfotoIndexedEntryfromHIndexToIndexhuffmanDecoderisDynamicTableEmptyisSuitableSizeneedChangeTableSizeresetLimitForEncodingtoDynamicEntry getRevIndex decodeInteger encodeInteger encodeHeader'ghc-prim GHC.TypesTrueFalse newPrecedence PriorityQueue baseDeficitqueue dependencydeficitKeyTPriorityQueuenew minFrameType maxFrameTypebytestring-0.10.8.2Data.ByteString.Internal ByteString buildPaddingdecodeWithPadding