úÎ!>44~       !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ˙sThis file is part of the package addy. It is subject to the license terms in the LICENSE file found in the top-level directory of this distribution and at: https://code.devalot.com/open/addy No part of this package, including this file, may be copied, modified, propagated, or distributed except according to the terms contained in the LICENSE file. BSD-2-ClauseNone"#$.145679;<@AHMPSX_`kp3/ addyIs a character in the UTF8-non-ascii class from RFC 6532?addyObsolete control characters. ˙;obs-NO-WS-CTL = %d1-8 / ; US-ASCII control %d11 / ; characters that do not %d12 / ; include the carriage %d14-31 / ; return, line feed, and %d127 ; white space charactersaddy Whitepace.addyRFC 5234: Visible character. PVCHAR = %x21-7E ; visible (printing) characters RFC 6532 §3.2 VCHAR =/ UTF8-non-asciiaddyRFC 5322 §3.2.3 ˙Matext = ALPHA / DIGIT / ; Printable US-ASCII "!" / "#" / ; characters not including "$" / "%" / ; specials. Used for atoms. "&" / "'" / "*" / "+" / "-" / "/" / "=" / "?" / "^" / "_" / "`" / "{" / "|" / "}" / "~" RFC 6532 §3.2 atext =/ UTF8-non-asciiaddy RFC 5322 dtext. édtext = %d33-90 / ; Printable US-ASCII %d94-126 / ; characters not including obs-dtext ; "[", "]", or "\" obs-dtext = obs-NO-WS-CTL / quoted-pair RFC 6532 §3.2 dtext =/ UTF8-non-asciiaddy RFC 5322 ctext. úctext = %d33-39 / ; Printable US-ASCII %d42-91 / ; characters not including %d93-126 / ; "(", ")", or "\" obs-ctext obs-ctext = obs-NO-WS-CTL RFC 6532 §3.2 ctext =/ UTF8-non-asciiaddy Obsolete ctext. obs-ctext = obs-NO-WS-CTLaddy.Characters that can appear in a quoted string.RFC 5322 §3.2.4: šqtext = %d33 / ; Printable US-ASCII %d35-91 / ; characters not including %d93-126 / ; "\" or the quote character obs-qtextRFC 6532 §3.2: qtext =/ UTF8-non-ascii addy Obsolete qtext. obs-qtext = obs-NO-WS-CTL addy'Characters that can follow a backslash. 0quoted-pair = ("\" (VCHAR / WSP)) / obs-qp addy9Obsolete characters that can be escaped with a backslash. 7obs-qp = "\" (%d0 / obs-NO-WS-CTL / LF / CR)   ˙sThis file is part of the package addy. It is subject to the license terms in the LICENSE file found in the top-level directory of this distribution and at: https://code.devalot.com/open/addy No part of this package, including this file, may be copied, modified, propagated, or distributed except according to the terms contained in the LICENSE file. BSD-2-ClauseNone"#$.145679;<@AHMPSX_`kp{( addyNewtype wrapper for deriving Ą7 instances that lie about the name of the constructor. addy"Text that can appear in a comment.addyHThe location where a comment was parsed or where it should be rendered.addyJust before the -.addyJust after the - but before the address.addy Before the * of the address.addy After the '.addyAfter the complete address.addyGA comment which may appear in an email address in a specific location.addy*A literal address that can be used with a  or .addyA tag that can be used with a .addy|Address literals can be used instead of a domain name to direct mail to a specific IP address or other tagged address type..Example email addresses with address literals: ^example@[127.0.0.1] example@[IPv6:1111:2222:3333:4444:5555:6666:7777] example@[Just-some-text]addy…A literal IP address as defined in RFC 5321 §4.1.3. The address can be in many formats so it is presented here in its parsed form.addyRFC 5321 also defines a general address literal where a standardized tag\ precedes the address itself. The only information provided about the standardized tag is: TStandardized-tag MUST be specified in a Standards-Track RFC and registered with IANA addyRFC 5322 defines a domain-literal˘ as (roughly) a span of characters that are allowed in a domain name. The interpretation of those characters is left to "separate documents" such as RFC 5321.\If an address literal cannot be parsed in one of the proceeding formats it is encoded as a  value.!addy0The name of one host component of a domain name.$addycA fully-qualified domain name which is made up of a list of host names (labels) separated by dots.'addyA fully-qualified domain name or an address literal.RMost email addresses use a domain name. However, it's perfectly legal to use an  instead.*addy*The name of the mailbox on the associated '.-addymOptional display name. Usually this is the name of the person who receives email at the associated address. "Display Name <example@example.com>0addy/The representation of a complete email address.¸The parser preserves optional components such as the display name and comments. The rendering code can optionally include these optional elements when turning the address back into ˘.6addyPotential validation errors.7addyMA component of an email address may not start with the recorded prefix text.8addyKA component of an email address may not end with the recorded suffix text.9addy<A component of an email address contains invalid characters.:addypA component of an email address does not meet the set length requirements. The values in this constructor are min, max, and actual.;addyhThe input to the address decoder was not a valid email address and produced the recorded error message.<addy)Optional display name. Addresses in the  name-addr— format from RFC 5322 allow descriptive text to precede the address. This is commonly used in email messages to list the name of the address' owner.=addyThe *H of an email address usually references the destination mailbox on the '' server. However, the content of the ** can only be understood by the receiving '.>addyThe 'Q refers to the fully-qualified domain name that accepts mail for the associated *". See the documentation for the ' type for more details.?addyAddresses in both the  name-addr and  addr-spec formats support comments.@addy$Prism for working with domain names.Aaddy'Prism for working with domain literals.BaddyAIso for converting between domain names and a list of host names.@"gmail.uk.co" ^. _DomainName._HostNames & map (review _HostName)["gmail","uk","co"]Caddy+Prism for working with IP address literals.Daddy/Prism for working with tagged address literals.Eaddy(Prism for working with address literals.FaddyPrism for working with a .Gaddy(Lens for working with comment locations.Haddy'Lens for working with comment contents.=  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH=6789:;012345<=>?-./*+,'()@A$%&!"#B CDEFGH ˙sThis file is part of the package addy. It is subject to the license terms in the LICENSE file found in the top-level directory of this distribution and at: https://code.devalot.com/open/addy No part of this package, including this file, may be copied, modified, propagated, or distributed except according to the terms contained in the LICENSE file. BSD-2-ClauseNone"#$.145679;<@AHMPSX_`kpp iaddy Render mode.jaddySRender the entire email address, including the optional display name and comments.kaddy?Only render the simplest form of the email address. Only the * and ' are rendered in this mode.laddyRender an email address.maddyRender an email address in  addr-spec format.naddyRender a display name.oaddy$Render comments that have the given O. The comment location is also used to decide where to introduce white space.paddy!Render the given address as text.ŁaddyWrap and quote some text.¤addyĽ$ if the give text, when used as the  local-part9 of an email address must be wrapped in quotation marks.ijklmnopijklpmno˙sThis file is part of the package addy. It is subject to the license terms in the LICENSE file found in the top-level directory of this distribution and at: https://code.devalot.com/open/addy No part of this package, including this file, may be copied, modified, propagated, or distributed except according to the terms contained in the LICENSE file. BSD-2-ClauseNone"#$.145679;<@AHMPSX_`kpżą raddyQValidate a single host name. Each host name in a domain name (referred to as a label#) must validate with this function.ôRFC 2181 §11 clearly states that there are no restrictions placed on which characters may appear in a label. However, due to legacy issues we enforce the rule from RFC 952 §1 that disallows hyphens as the first or last character of a label.XRFC 5322 §3.4.1 restricts the characters that may appear in the domain component of an  email address’. Even though a DNS label does not impose such restrictions, in order to be a valid email address the label must only be composed of so-called atext characters or UTF8-non-ascii characters.˙UFinally, RFC 2181 §11 restricts the length of a label to 63 bytes and the fully-qualified domain name to 255 bytes. RFC 6532 which extends the email syntax to allow UTF-8 encoded Unicode characters briefly states in §3.4 to continue using bytes, and not characters. It also states that Unicode text should be normalized (which we do).saddyValidate a domain name.TThe domain name is split into host names (labels) and each label is validated with r.taddy/Validate and normalize the text content of the * of an email address.ÓRFC 3696 §3 restricts the length of the local part to a maximum of 64 bytes. RFC 6532 extends the character set to include Unicode characters but maintains the length measurement as bytes and not characters.uaddyValidate the content of a -.There does not appear to be a limit on the length of the display name. For consistency and efficiency we limit it to 64 bytes, the same as the local part.vaddy Validate the  content of a domain literal.ˆThere does not appear to be a limit on the length of an address literal but for consistency with DNS labels we limit them to 63 bytes.waddyValidate the content of an . Uses the same rules as v.xaddy"Validate the content of a comment.•There does not appear to be a limit on the length of a comment. For consistency and efficiency we limit it to 64 bytes, the same as the local part.yaddyValidate an entire 0g. This is used by the parser to validate rules that are not encoded in the various component parsers.ŚaddyBValidate that the given text does not begin with the given prefix.§addy@Validate that the given text does not end with the given suffix.¨addy[Validate that the text only contains characters for which the given function returns true.Šaddy>Validate the length of the given text falls within the given min and max values.rstuvwxyrstuvwxy˙sThis file is part of the package addy. It is subject to the license terms in the LICENSE file found in the top-level directory of this distribution and at: https://code.devalot.com/open/addy No part of this package, including this file, may be copied, modified, propagated, or distributed except according to the terms contained in the LICENSE file. BSD-2-ClauseNone"#$.145679;<@AHMPSX_`kpőĽzaddy RFC 5322 atom.|addy Parsing mode.}addy%Only support non-obsoleted addresses.~addy'Include support for obsolete addresses.Şaddy%FIXME: Write description for atomJoinaddyAn email address parser.€addy7Run the parser and then validate the resulting address.addyParse email addresses in the  name-addr format.‚addyParse email addresses in the  addr-spec format.ƒaddy Parse the  local-part of an email address.RFC 5322 §3.4.1 6local-part = dot-atom / quoted-string / obs-local-part„addyDomain name parser.…addyParse a display name.†addyAn atom or quoted string. word = atom / quoted-string‡addyParse an unquoted atom. )atom = [CFWS] 1*atext [CFWS]Ťaddy:Parse an unquoted atom that is allowed to contain periods.ˆaddy RFC 5322 dot-atom.‰addyStrict  dot-atom-lh from RFC 5322 errata. (dot-atom-lh = [CFWS] dot-atom-text [FWS]ŠaddyStrict  dot-atom-rh from RFC 5322 errata. (dot-atom-rh = [FWS] dot-atom-text [CFWS]Źaddy"Is a character allowed in an atom?RFC 5322 §3.2.3‹addyA quoted string.RFC5322 §3.2.4 ˙Ÿqtext = %d33 / ; Printable US-ASCII %d35-91 / ; characters not including %d93-126 / ; "\" or the quote character obs-qtext qcontent = qtext / quoted-pair quoted-string = [CFWS] DQUOTE *([FWS] qcontent) [FWS] DQUOTE [CFWS] obs-qtext = obs-NO-WS-CTL  RFC 6532 §3.2 qtext =/ UTF8-non-asciiRFC 5322 errata item 3135 )https://www.rfc-editor.org/errata/eid3135 zquoted-string = [CFWS] DQUOTE ((1*([FWS] qcontent) [FWS]) / FWS) DQUOTE [CFWS]GThis is the rule we use since it's consistent with the text of the RFC.­addy%General-purpose quoted-string parser.ŒaddyStrict quoted-string-lh from RFC 5322 errata.ŽaddyParse backslash escapes:addy!Comments and folding white space. ˙—ctext = %d33-39 / ; Printable US-ASCII %d42-91 / ; characters not including %d93-126 / ; "(", ")", or "\" obs-ctext obs-ctext = obs-NO-WS-CTL ccontent = ctext / quoted-pair / comment comment = "(" *([FWS] ccontent) [FWS] ")" CFWS = (1*([FWS] comment) [FWS]) / FWSŻaddyFolding white space. ˜FWS = ([*WSP CRLF] 1*WSP) / obs-FWS ; Folding white space obs-FWS = 1*WSP *(CRLF 1*WSP)°addyParse a domain/address literal. édtext = %d33-90 / ; Printable US-ASCII %d94-126 / ; characters not including obs-dtext ; "[", "]", or "\" obs-dtext = obs-NO-WS-CTL / quoted-pairz{|}~€‚ƒ„…†‡ˆ‰Š‹Œ|}~z{€‚ƒ„…†‡ˆ‰Š‹Œ˙sThis file is part of the package addy. It is subject to the license terms in the LICENSE file found in the top-level directory of this distribution and at: https://code.devalot.com/open/addy No part of this package, including this file, may be copied, modified, propagated, or distributed except according to the terms contained in the LICENSE file. BSD-2-ClauseNone"#$.145679;<@AHMPSX_`kp2ş “addyDecode an email address.”addy{Decode an email address, allowing obsolete characters. The obsolete characters are parsed but not included in the output.nThis is useful for exacting email addresses from mail messages but should not be used to validate user input.0Addy.decode "my . email . addy@(WTF)example.com"\Left (ParserFailedError "local part > quoted content > '\"': Failed reading: satisfy" :| [])7Addy.decodeLenient "my . email . addy@(WTF)example.com"3Right (EmailAddr "my.email.addy@example.com (WTF)")•addyqEncode an email address as text. This function produces the short form of an email address. That is, just the * and the ' separated by @.–addy_Encode a complete email address to text, including the optional display name and any comments.—addy Build an 0 from a * and $.˜addy Build an 0 from a * and an .™addy%Prism for working with display names. "import Control.Lens ((^?), review)To convert text into a - with content validation:"Some Text" ^? _DisplayNameJust (DisplayName "Some Text")"Some\nText" ^? _DisplayNameNothing -- Validation failed. To access the text content of a -:#review _DisplayName someDisplayName "Some Text"Uses u to perform validation.šaddy:Prism for working with the local part of an email address. "import Control.Lens ((^?), review)To convert text to a * with content validation:"cockroach+mouse" ^? _LocalPart"Just (LocalPart "cockroach+mouse") "cockroach\nmouse" ^? _LocalPartNothing -- Validation failed. To access the text content of a *:review _LocalPart someLocalPart "cockamouse"Uses t to perform validation.›addy$Prism for working with domain names. "import Control.Lens ((^?), review)To convert text to a $ with validation:"gmail.com" ^? _DomainNameJust (DomainName "gmail.com")"too.many.dots." ^? _DomainNameNothing To access the text content of a $:!review _DomainName someDomainName "gmail.com"Uses s to perform validation.œaddy/Prism for working with host names (DNS labels). "import Control.Lens ((^?), review)/To convert text to a host name with validation:"com" ^? _HostNameJust (HostName "com")"com." ^? _HostNameNothing -- Validation failed. To access the text content of a !:review _HostName someHostName"com"Uses r to perform validation.addyPrism for working with the  for an . "import Control.Lens ((^?), review)2To convert text to an address tag with validation:"IPv6" ^? _AddressTagJust (AddressTag "IPv6")"[IPv6]" ^? _AddressTagNothing -- Validation failed.!To access the text content of an :review _AddressTag someTag"tag"Uses w to perform validation.žaddy>Prism for working with the literal text of an address literal. "import Control.Lens ((^?), review)6To convert text to an address literal with validation:"127.0.0.1" ^? _LiteralJust (Literal "127.0.0.1")"[]" ^? _LiteralNothing -- Validation failed. To access the text content of a :review _Literal someLiteral "127.0.0.1"Uses v to perform validation.Ÿaddy5Prism for working with the text content of a comment. "import Control.Lens ((^?), review)-To convert text to a comment with validation:$"best email ever" ^? _CommentContent'Just (CommentContent "best email ever")"\n" ^? _CommentContentNothing*To access the text content of the comment:"review _CommentContent someComment"super"Uses x to perform validation.8  !$'()*-0<=>?@ABCDEFGHrstuvwx“”•–—˜™š›œžŸ8“”•–0—˜<=>?-™u*št'()@A$›s!Bœr CDEwžvFGH Ÿxą      !"#$%#&'()*+,,-./01234456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}}l~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ Ą˘Ł¤ĽŚ§¨ŠŞŤŹ­ŽŻ°ą˛ł´ľśˇ¸#addy-0.1.0.0-EQj9bpaG9NuIDZSGnLQxEKAddy.Internal.CharAddy.Internal.TypesAddy.Internal.RenderAddy.Internal.ValidationAddy.Internal.ParserAddy utf8NonAscii obsNoWsCtlwspvcharatextdtextctextctextObsqtextqtextObs quotedPair quotedPairObsCommentContentCCcommentContentText CommentLocBeforeDisplayNameAfterDisplayNameBeforeLocalPart AfterDomain AfterAddressCommentLiteralLit literalText AddressTagATaddressTagTextAddressLiteralIpAddressLiteralTaggedAddressLiteralHostNameHN hostNameText DomainNameDNdomainNameTextDomain DomainLiteral LocalPartLP localPartText DisplayNameDPdisplayNameText EmailAddr _displayName _localPart_domain _commentsErrorInvalidPrefixErrorInvalidSuffixErrorInvalidCharactersErrorInvalidLengthErrorParserFailedError displayName localPartdomaincomments_Domain_DomainLiteral _HostNames_IpAddressLiteral_TaggedAddressLiteral_AddressLiteral_Comment commentLoccommentContent$fShowRenamedShow $fShowError $fEqError$fShowCommentLoc$fEqCommentLoc$fEqCommentContent$fSemigroupCommentContent$fShowCommentContent $fShowComment $fEqComment $fEqLiteral$fSemigroupLiteral $fShowLiteral$fEqAddressTag$fSemigroupAddressTag$fShowAddressTag$fShowAddressLiteral$fEqAddressLiteral $fEqHostName$fSemigroupHostName$fShowHostName$fEqDomainName$fSemigroupDomainName$fShowDomainName $fShowDomain $fEqDomain $fEqLocalPart$fSemigroupLocalPart$fShowLocalPart$fEqDisplayName$fSemigroupDisplayName$fShowDisplayNameModeFullShortrenderrenderAddrSpecrenderDisplayNamerenderComments renderToText$fShowEmailAddrvalidateHostNamevalidateDomainNamevalidateLocalPartvalidateDisplayNamevalidateLiteralvalidateAddressTagvalidateCommentContentvalidateEmailAddrAtomStrictLenientparse parseWithModenameAddraddrSpec localPartPdomainP displayNamePwordatomdotAtom dotAtomLh dotAtomRhquotedquotedLhcfws $fMonoidAtom$fSemigroupAtom$fEqMode $fShowMode $fShowAtomdecode decodeLenientencode encodeFull emailAddr emailAddrLit _DisplayName _LocalPart _DomainName _HostName _AddressTag_Literal_CommentContent RenamedShowbaseGHC.ShowShow text-1.2.3.1Data.Text.InternalTextwrapmustQuoteLocalPartghc-prim GHC.TypesTruevalidateNotPrefixvalidateNotSuffixvalidateAllowedCharsvalidateLengthatomJoindotAtom'atextPquoted' quotedPairPfwsaddressLiteral