úÎ!TøQp!      Safe01.df1: represents the hierarchical structure of logged messages.For example, consider a df1 log line as like the following: P1999-12-20T07:11:39.230553031Z /foo x=a y=b /bar /qux z=c z=d WARNING Something For that line, the  attribute of the & datatype will contain the following: [  ( "foo") ,  ( "x") ( "a") ,  ( "y") ( "b") ,  ( "bar") ,  ( "qux") ,  ( "z") ( "c") ,  ( "z") ( "d") ] :: !  Please notice that [] :: !  is a valid path insofar as df1 is concerned, and that  and % can be juxtapositioned in any order.df1An attribute value (see ).If you have the OverloadedStrings) GHC extension enabled, you can build a  using a string literal:  "foo" ::  Otherwise, you can use " or the  function. Notice that "" :: @ is acceptable, and will be correctly rendered and parsed back.df1An attribute key (see ).If you have the OverloadedStrings) GHC extension enabled, you can build a  using a string literal:  "foo" ::  Otherwise, you can use " or the  function. Notice that "" :: @ is acceptable, and will be correctly rendered and parsed back.df1A path segment.If you have the OverloadedStrings) GHC extension enabled, you can build a  using a string literal:  "foo" ::  Otherwise, you can use " or the  function. Notice that "" :: @ is acceptable, and will be correctly rendered and parsed back.df1!Importance of the logged message.ZThese levels, listed in increasing order of importance, correspond to the levels used by  "https://linux.die.net/man/3/syslog syslog(3).df1IMessage intended to be useful only when deliberately debugging a program.df1Informational message. df1LA condition that is not an error, but should possibly be handled specially. df1‰A warning condition, such as an exception being gracefully handled or some missing configuration setting being assigned a default value. df10Error condition, such as an unhandled exception. df1]Critical condition that could result in system failure, such as a disk running out of space. df1PA condition that should be corrected immediately, such as a corrupted database.df1System is unusable.df1A message text.If you have the OverloadedStrings) GHC extension enabled, you can build a  using a string literal:  "foo" ::  Otherwise, you can use " or the  function. Notice that "" :: @ is acceptable, and will be correctly rendered and parsed back.df11First known timestamp when the log was generated.We use # rather than > because it is cheaper to obtain and to render. You can use  to convert it if necessary.df1'Importance level of the logged message.df1+ where the logged message was created from. The leftmost + is the closest to the root. The rightmost 4 is the one closest to where the log was generated.An $ !7 is acceptable, conveying the idea of the root path .df1Human-readable message itself.%df1"Order of importance. For example,  is more important than :  >  == &  Safe]^J±df1Like , but without color.'df1' a b c p renders p using aI as the default color (for things like whitespace or attribute values), b# as the color for path names, and cP as the color for attribute keys. This adds a trailing whitespace if necessary.(df1Like ', but without color.)df1Escaping rules for :1A '%' anywhere is always percent-escaped ("%25")"A *) char anywhere is always percent-escaped.+df1Escaping rules for :A ,2 in the first character is always percent-escaped.A ,E anywhere else is always percent-escaped, unless it is '-' or '_'.A *) char anywhere is always percent-escaped.-df1Escaping rules for :A *) char anywhere is always percent-escaped.A ,2 in the first character is always percent-escaped.A ,E anywhere else is always percent-escaped, unless it is '-' or '_'..df1Escaping rules for :1A ' ' anywhere is always percent-escaped ("%20").1A '%' anywhere is always percent-escaped ("%25")"1A '=' anywhere is always percent-escaped ("%3d").A *) char anywhere is always percent-escaped./df1 Reset all0df1Default foreground1df1Reset background2df1green foreground3df1green foreground4df1Yellow foreground5df1Cyan foreground6df1Blue foreground7df1Black foreground8df1White foreground9df1Red background:df1Render % followed by the given ;& rendered as two hexadecimal nibbles.<df1Renders YYYY-MM-DDThh:mm:ss.sssssssssZ (nanosecond precision).DThe rendered string is a 30 characters long, and it's ASCII-encoded.,df1&( for all ASCII-7 punctuation characters.*df1& for ASCII-7 control characters.Safe]P) df1uIf sucessful, parsing will stop after the first CR or LF newline marker if any, otherwise it will consume all input.=df1Parse "%FF"8. Always consumes 3 bytes from the input, if successful.>df1Like ? but takes strict bytes.?df1 Decodes all =! occurences from the given input.+TODO: Make faster and more space efficient. SafePd!  !  @      !"#$%&'()*+,-./01)*23456789:;<=>?@ABCDEFGHIJ,KLMNOPQdf1-0.2-HBZ42A50Gph7B5zeQAkhyADf1 Df1.TypesTimeUTCTimeData.Time.Clock.SystemsystemToUTCTime Df1.Render Df1.ParsePathPushAttrValueKeySegmentLevelDebugInfoNoticeWarningErrorCriticalAlert EmergencyMessageLoglog_time log_levellog_path log_messagemessage unMessagesegment unSegmentkeyunKeyunValuevalue renderColorrenderparsecontainers-0.5.11.0Data.Sequence.InternalSeqbase Data.String fromString time-1.8.0.2#Data.Time.Clock.Internal.SystemTime SystemTimeempty $fOrdLevelghc-prim GHC.TypesTruerenderPathColor renderPath renderMessage isControl7 renderSegmentisPunctuation7 renderKey renderValuereset fgDefault bgDefaultfgGreenfgRedfgYellowfgCyanfgBluefgBlackfgWhitebgRedword8HexPercentGHC.WordWord8 renderIso8601 pNumPercentpDecodePercentspDecodePercentsL