a ‚oe0ã@slddlZddlZddlZddlmZddlmZddlmZddl m Z ddl m Z m Z mZmZmZmZddlmZdd lmZmZmZmZmZmZeed �eed œd d „ƒZeed �eed œdd„ƒZeed �eeed œdd„ƒZeed �eed œdd„ƒZ eed �eed œdd„ƒZ!eed �eed œdd„ƒZ"eed �eed œdd„ƒZ#eed �eed œdd„ƒZ$eed �eed œdd„ƒZ%eed �eed œdd„ƒZ&eed �eed œd d!„ƒZ'eed �eed œd"d#„ƒZ(eed �eed œd$d%„ƒZ)eed �eed œd&d'„ƒZ*eed �eed œd(d)„ƒZ+eed �eed œd*d+„ƒZ,ee-eƒd �eed,œd-d.„ƒZ.eed �eed œd/d0„ƒZ/dSe0e1eed2œd3d4„Z2ed5d �eed6œd7d8„ƒZ3e0eeee0fd9œd:d;„Z4eed<œd=d>„Z5dTeeed@œdAdB„Z6ee edCœdDdE„Z7eee8dFœdGdH„Z9eeedFœdIdJ„Z:dKej;dLfee1eddMœdNdO„ZdS)VéN)ÚIncrementalDecoder)Úaliases)Ú lru_cache)Úfindall)Ú GeneratorÚListÚOptionalÚSetÚTupleÚUnion)ÚMultibyteIncrementalDecoderé)ÚENCODING_MARKSÚIANA_SUPPORTED_SIMILARÚRE_POSSIBLE_ENCODING_INDICATIONÚUNICODE_RANGES_COMBINEDÚUNICODE_SECONDARY_RANGE_KEYWORDÚUTF8_MAXIMAL_ALLOCATION)Úmaxsize)Ú characterÚreturncCsdzt |¡}Wnty"YdS0d|vpbd|vpbd|vpbd|vpbd|vpbd|vpbd|vpbd |vS) NFz WITH GRAVEz WITH ACUTEz WITH CEDILLAzWITH DIAERESISzWITH CIRCUMFLEXz WITH TILDEz WITH MACRONzWITH RING ABOVE©Ú unicodedataÚnameÚ ValueError©rÚ description©rú9C:\Program Files\Certbot\pkgs\charset_normalizer\utils.pyÚis_accentuateds& ÿþýüûúørcCs.t |¡}|s|S| d¡}tt|ddƒƒS)Nú ré)rZ decompositionÚsplitÚchrÚint)rZ decomposedZcodesrrrÚ remove_accent(s   r%cCs.t|ƒ}t ¡D]\}}||vr|SqdS)zK Retrieve the Unicode range official name from a single character. N)ÚordrÚitems)rZ character_ordÚ range_nameZ ord_rangerrrÚ unicode_range3s  r)cCs,zt |¡}Wnty"YdS0d|vS)NFZLATINrrrrrÚis_latinAs  r*cCs2t |¡}d|vrdSt|ƒ}|dur*dSd|vS)NÚPTFZ Punctuation©rÚcategoryr)©rÚcharacter_categoryÚcharacter_rangerrrÚis_punctuationJs r1cCsBt |¡}d|vsd|vrdSt|ƒ}|dur2dSd|vo@|dkS)NÚSÚNTFZFormsZLor,r.rrrÚ is_symbolYs r4cCs$t|ƒ}|durdSd|vp"d|vS)NFZ EmoticonsZ Pictographs)r))rr0rrrÚ is_emoticonhsr5cCs.| ¡s|dvrdSt |¡}d|vp,|dvS)N>ú+úTÚZ>ZPdZPoZPc)Úisspacerr-)rr/rrrÚ is_separatorrs r;cCs| ¡| ¡kS©N)ÚislowerÚisupper©rrrrÚis_case_variable|sr@cCs,zt |¡}Wnty"YdS0d|vS)NFZCJKr©rZcharacter_namerrrÚis_cjk�s  rBcCs,zt |¡}Wnty"YdS0d|vS)NFZHIRAGANArrArrrÚ is_hiragana‹s  rCcCs,zt |¡}Wnty"YdS0d|vS)NFZKATAKANArrArrrÚ is_katakana•s  rDcCs,zt |¡}Wnty"YdS0d|vS)NFZHANGULrrArrrÚ is_hangulŸs  rEcCs,zt |¡}Wnty"YdS0d|vS)NFZTHAIrrArrrÚis_thai©s  rFcCs,zt |¡}Wnty"YdS0d|vS)NFÚARABICrrArrrÚ is_arabic³s  rHcCs4zt |¡}Wnty"YdS0d|vo2d|vS)NFrGz ISOLATED FORMrrArrrÚis_arabic_isolated_form½s  rI)r(rcst‡fdd„tDƒƒS)Nc3s|]}|ˆvVqdSr<r)Ú.0Úkeyword©r(rrÚ Éóz-is_unicode_range_secondary..)ÚanyrrLrrLrÚis_unicode_range_secondaryÇsrPcCs(| ¡duo&| ¡duo&|dko&|dkS)NFúu)r:Ú isprintabler?rrrÚis_unprintableÌs  ÿþürSé )ÚsequenceÚ search_zonercCs t|tƒst‚t|ƒ}tt|dt||ƒ…jddd�ƒ}t|ƒdkrHdS|D]N}| ¡  dd¡}t   ¡D]0\}}||kr„|S||krh|SqhqLdS)zW Extract using ASCII-only decoder any specified encoding in the first n-bytes. NÚasciiÚignore©Úerrorsrú-Ú_) Ú isinstanceÚbytesÚ TypeErrorÚlenrrÚminÚdecodeÚlowerÚreplacerr')rUrVZseq_lenÚresultsZspecified_encodingÚencoding_aliasÚ encoding_ianarrrÚany_specified_encoding×s" þ  rhé€)rrcCs |dvptt d |¡¡jtƒS)zQ Verify is a specific encoding is a multi byte one based on it IANA name > Ú utf_32_beÚutf_8Ú utf_32_leZ utf_8_sigÚutf_16Úutf_32Ú utf_16_beÚ utf_16_leÚutf_7ú encodings.{})Ú issubclassÚ importlibÚ import_moduleÚformatrr )rrrrÚis_multi_byte_encoding÷s  þörw)rUrcCsJtD]@}t|}t|tƒr |g}|D]}| |¡r$||fSq$qdS)z9 Identify and extract SIG/BOM in given sequence. )NrN)rr]r^Ú startswith)rUÚ iana_encodingZmarksZmarkrrrÚidentify_sig_or_bom s  rz)ryrcCs|dvS)N>rmrnr)ryrrrÚshould_strip_sig_or_bomsr{T)Úcp_nameÚstrictrcCsL| ¡ dd¡}t ¡D]\}}|||fvr|Sq|rHtd |¡ƒ‚|S)Nr[r\z Unable to retrieve IANA for '{}')rcrdrr'rrv)r|r}rfrgrrrÚ iana_name"s  r~)Údecoded_sequencercCs4tƒ}|D] }t|ƒ}|dur q | |¡q t|ƒSr<)Úsetr)ÚaddÚlist)rZrangesrr0rrrÚ range_scan2s rƒ)Ú iana_name_aÚ iana_name_brc CsŒt|ƒst|ƒrdSt d |¡¡j}t d |¡¡j}|dd�}|dd�}d}tdƒD]*}t|gƒ}| |¡| |¡krX|d7}qX|dS) NgrrrXrYréÿr éþ)rwrtrurvrÚranger^rb) r„r…Z decoder_aZ decoder_bZid_aZid_bZcharacter_match_countÚiZ to_be_decodedrrrÚ cp_similarity@s ÿÿ     rŠcCs|tvo|t|vS)zŽ Determine if two code page are at least 80% similar. IANA_SUPPORTED_SIMILAR dict was generated using the function cp_similarity. )r)r„r…rrrÚ is_cp_similarXs þr‹Zcharset_normalizerz)%(asctime)s | %(levelname)s | %(message)s)rÚlevelÚ format_stringrcCs:t |¡}| |¡t ¡}| t |¡¡| |¡dSr<)ÚloggingZ getLoggerZsetLevelZ StreamHandlerZ setFormatterZ FormatterZ addHandler)rrŒr�ÚloggerZhandlerrrrÚset_logging_handlercs   r�) Ú sequencesrgÚoffsetsÚ chunk_sizeÚbom_or_sig_availableÚstrip_sig_or_bomÚ sig_payloadÚis_multi_byte_decoderÚdecoded_payloadrc cs*|r6|dur6|D]"} || | |…} | s,q4| Vqnð|D]ê} | |} | t|ƒdkrXq:|| | |…} |r||dur||| } | j||rŠdndd�} |�r| dk�rt|dƒ} |�r| d| …|v�rt| | dd ƒD]H}||| …} |rø|durø|| } | j|dd�} | d| …|vrÔ�qqÔ| Vq:dS) NFérXr}rYrr!ééÿÿÿÿ)r`rbrarˆ)r‘rgr’r“r”r•r–r—r˜r‰ÚchunkZ chunk_endZ cut_sequenceZchunk_partial_size_chkÚjrrrÚcut_sequence_chunksps>    þ ÿþ  rž)rT)T)N)?rtrŽrÚcodecsrZencodings.aliasesrÚ functoolsrÚrerÚtypingrrrr r r Z_multibytecodecr ZconstantrrrrrrÚstrÚboolrr%r)r*r1r4r5r;r@rBrCrDrErFrHrIr`rPrSr^r$rhrwrzr{r~rƒÚfloatrŠr‹ÚINFOr�rˆržrrrrÚs˜                     ýü ÷ ö