U Z@sddlZddlmZmZmZedZddedDZdZ dZ e d Z e e Z eed Z e e Zed ZGd d d ZGdddZzddlmZmZWnek reZeZYnXdS)N) ascii_lettersascii_lowercasedigitsasciicCsh|]}d|dqS)%{:02X}r)formatencode).0ir /quoting.py sr z:/?#[]@z!$'()*,+&=;z-._~s[A-Z0-9][A-Z0-9]c@s&eZdZddddddZddZdS) _PyQuoterF)safe protectedqscCs||_||_||_dS)N)_safe _protected_qs)selfrrrr r r __init__sz_PyQuoter.__init__c CsP|dkr dSt|tstd|s&dS|jddd}t}d}|j}|t7}|jsZ|d7}||j7}|d}d }|t |krF||}|d 7}|r|t kr|d }| |t |d krt |}|d d}t |s|d d}|d8}qrz"tt|d dddd} Wn0tk rF|d d}|d8}YqrYnX| |jkr`||n$| |krz| t| n ||d}qrt |dkrr|t |krr|d d}|d 8}qrn6|tdkrt}| ||t |krr|d qr|jr|tdkr| tdqr||kr.| |qr|d|dqr|dS)NArgument should be strrutf8ignore)errorsrrr s%25base% +r) isinstancestr TypeErrorr bytearrayrALLOWEDrrlenBASCII_LOWERCASEappendbytes_IS_HEXmatchextendchrintdecode ValueErrorordr) rvalretpctrZbsafeidxchZbufunquotedr r r __call__s       "            z_PyQuoter.__call__N__name__ __module__ __qualname__rr@r r r r rsrc@s$eZdZdddddZddZdS) _PyUnquoterrF)unsafercCs$||_||_t|_tdd|_dS)NT)r)_unsafer_Quoter_quoter _qs_quoter)rrFrr r r rhsz_PyUnquoter.__init__c Cs.|dkr dSt|tstd|s&dSd}d}t}g}|D]b}|r~||7}t|dkr<|t|dddd|}d}q<|rz|d}Wntk rYnRX|j r|dkr|| |n&||j kr|| |n |||dd=|d kr|}q<|r||d}|d krP|j r8||j krD|d q<|d q<||j kr|d t t|d d}|D]}||qq<||q<|r$z|d}Wn tk r||YnNX|j r|dkr|| |n(||j kr|| |n ||d|S) Nrrr!rr#r$rz+=&;r&r(r'r")r)r*r+r,r.r0r6r7UnicodeDecodeErrorrrJrGrIhexr9upperjoin) rr:r<Zlast_pctZpctsr;r>r?hr r r r@nst                z_PyUnquoter.__call__NrAr r r r rEgsrEr)rH _Unquoter)restringrrrrr/rangeZ BPCT_ALLOWEDZ GEN_DELIMSZSUB_DELIMS_WITHOUT_QSZ SUB_DELIMSZRESERVEDZ UNRESERVEDr-compiler2rrEZ_quotingrHrP ImportErrorr r r r s"   VO