JFIFxxC      C  " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3RbrJFIFxxC      C  " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbro h!P@sdZddlZddlZddlmZdgZedZedZedZ edZ ed Z ed Z ed Z ed Zed ZedZedejZedejZedejZed ZedZGdddejZdS)zA parser for HTML and XHTML.N)unescape HTMLParserz[&<]z &[a-zA-Z#]z%&([a-zA-Z][-.a-zA-Z0-9]*)[^a-zA-Z0-9]z)&#(?:[0-9]+|[xX][0-9a-fA-F]+)[^0-9a-fA-F]z <[a-zA-Z]z z--!?>z-?>z0([a-zA-Z][^\t\n\r\f />]*)(?:[\t\n\r\f ]|/(?!>))*a{ ( (?<=['"\t\n\r\f /])[^\t\n\r\f />][^\t\n\r\f /=>]* # attribute name ) ([\t\n\r\f ]*=[\t\n\r\f ]* # value indicator ('[^']*' # LITA-enclosed value |"[^"]*" # LIT-enclosed value |(?!['"])[^>\t\n\r\f ]* # bare value ) )? (?:[\t\n\r\f ]|/(?!>))* # possibly followed by a space a [a-zA-Z][^\t\n\r\f />]* # tag name [\t\n\r\f /]* # optional whitespace before attribute name (?:(?<=['"\t\n\r\f /])[^\t\n\r\f />][^\t\n\r\f /=>]* # attribute name (?:[\t\n\r\f ]*=[\t\n\r\f ]* # value indicator (?:'[^']*' # LITA-enclosed value |"[^"]*" # LIT-enclosed value |(?!['"])[^>\t\n\r\f ]* # bare value ) )? [\t\n\r\f /]* # possibly followed by a space )* >? aF <[a-zA-Z][^\t\n\r\f />\x00]* # tag name (?:[\s/]* # optional whitespace before attribute name (?:(?<=['"\s/])[^\s/>][^\s/=>]* # attribute name (?:\s*=+\s* # value indicator (?:'[^']*' # LITA-enclosed value |"[^"]*" # LIT-enclosed value |(?!['"])[^>\s]* # bare value ) \s* # possibly followed by a space )?(?:\s|/(?!>))* )* )? \s* # trailing whitespace z#c@seZdZdZdZdZddddZdd Zd d Zd d Z dZ ddZ ddddZ ddZ d>ddZddZddZd>ddZd?d d!Zd"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd,d-Zd.d/Zd0d1Zd2d3Zd4d5Zd6d7Zd8d9Zd:d;Zd'.)_HTMLParser__starttag_textrr r r get_starttag_textszHTMLParser.get_starttag_textF escapablecCsZ||_||_|r|jstd|jtjtjB|_dStd|jtjtjB|_dS)Nz&|])z])) lowerrrrrecompile IGNORECASEASCIIr)relemr r r r set_cdata_modes       zHTMLParser.set_cdata_modecCst|_d|_d|_dS)NT)rrrrrr r r clear_cdata_modes zHTMLParser.clear_cdata_modecCs ||_dS)aEnable or disable support of the CDATA sections. If enabled, "<[CDATA[" starts a CDATA section which ends with "]]>". If disabled, "<[CDATA[" starts a bogus comments which ends with ">". This method is not called by default. Its purpose is to be called in custom handle_starttag() and handle_endtag() methods, with value that depends on the adjusted current node. See https://html.spec.whatwg.org/multipage/parsing.html#markup-declaration-open-state for details. N)r)rflagr r r _set_support_cdatas zHTMLParser._set_support_cdatac Cs|j}d}t|}||krY|jr;|js;|d|}|dkr:|dt||d}|dkr8td ||s8n!|}n|j ||}|rI| }n|jrNn |}||kro|jrf|j rf| t|||n | ||||||}||kr{n|j}|d|rt||r||} n@|d|r||} n5|d|r||} n*|d|r||} n|d |r||} n|d |ks|r| d|d } nn| dkr|sِnt||rn|d|r|d |kr| dnt||rn|||d dn|d|r0|}d D]} || |d r"|t| 8}nq|||d |nW|d|rF|jrF|||ddnA|||ddkr_|||d dn(|d |rq|||d dn|d|r|||d dnt d|} ||| }n|d|rt!||}|r|"d d} |#| |$} |d| d s| d } ||| }q d||dvr| |||d |||d }ny|d|rQt%||}|r|"d } |&| |$} |d| d s | d } ||| }q t'||}|r;|r:|"||dkr:|$} | |kr2|} |||d }n|d |krP| d|||d }nnJd||ks|r||kr|jru|j ru| t|||n | ||||||}||d|_dS)Nr<&"z [\t\n\r\f ;]rr9r6r8rrz riTr)rcheck_for_whole_start_tagr tagfind_tolerantrDrTrRr!rattrfind_tolerantrappendstripZgetposcountr;r=rArLhandle_startendtaghandle_starttagCDATA_CONTENT_ELEMENTSr'RCDATA_CONTENT_ELEMENTS)rrXendposr attrsrDr[tagmattrnamerestZ attrvaluerTlinenooffsetr r r rEs^   &(         zHTMLParser.parse_starttagcCs>|j}t||d}|sJ|}||ddkrdS|S)Nrrr9)r locatetagendrDrTrfr r r rksz$HTMLParser.check_for_whole_start_tagcCs|j}|||ddksJd|d|ddkrdSt||s8||d|ddkr3|dS||St||d}|sDJ|}||ddkrRdSt||d}|s^J|d }| || |S) Nr2r.zunexpected call to parse_endtagrrr9r6r) r r<rJrDr_r}rTrlrRr! handle_endtagr()rrXr rDrZrwr r r rFs&   zHTMLParser.parse_endtagcCs|||||dSN)rrr~rrwrvr r r rqs zHTMLParser.handle_startendtagcCdSrr rr r r rrzHTMLParser.handle_starttagcCrrr )rrwr r r r~rzHTMLParser.handle_endtagcCrrr rr]r r r rSrzHTMLParser.handle_charrefcCrrr rr r r rVrzHTMLParser.handle_entityrefcCrrr rr r r rArzHTMLParser.handle_datacCrrr rr r r rKrzHTMLParser.handle_commentcCrrr )rZdeclr r r rN rzHTMLParser.handle_declcCrrr rr r r rO rzHTMLParser.handle_picCrrr rr r r rMrzHTMLParser.unknown_decl)T)r)!__name__ __module__ __qualname____doc__rsrtr rrrrrr'r(r*rrIrGr_rHrErkrFrqrrr~rSrVrArKrNrOrMr r r r rZs@     "   7  )rr"rZhtmlr__all__r#rrWrUrQrCrJrerarbrlVERBOSErmr}Zlocatestarttagend_tolerantZ endendtagZ endtagfindrrr r r r s6