
    *pj*7                       % S SK Jr  S SKrS SKrS SKrS SKJr  S SKJr  S SK	J
r
  S SKJr  SSKJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJ r J!r!J"r"J#r#J$r$J%r%  S.S	 jr&S/S
 jr'S0S jr(\)" S \RT                  " 5        5       5      r+S\,S'   \+ V s/ s H  o S    PM	     sn r-S\,S'   S1S jr.S/S jr/S/S jr0S/S jr1S/S jr2S/S jr3S/S jr4S/S jr5S/S jr6S/S jr7S/S jr8S/S jr9S/S jr:S/S jr;S/S jr<S2S  jr=S/S! jr> S3     S4S" jjr?\
" SS#9S5S$ j5       r@S6S% jrAS7S& jrBS8S9S' jjrCS:S( jrDS;S) jrES*\R                  S+4       S<S, jjrG  S=                     S>S- jjrHgs  sn f )?    )annotationsN)bisect_right)IncrementalDecoder)	lru_cache)	Generator   )ENCODING_MARKSIANA_SUPPORTED_SIMILARRE_POSSIBLE_ENCODING_INDICATIONUNICODE_RANGES_COMBINED_SECONDARY_RANGE_NAMESCOMMON_CJK_CHARACTERS_LATIN_CJK_HANGUL	_KATAKANA	_HIRAGANA_HALFWIDTH_KATAKANA_THAI_ARABIC_ARABIC_ISOLATED_FORM	_LIGATURE_SUPERSCRIPT_SENTENCE_OPEN_PUNCTUATION_ACCENT_KEYWORDS_ACCENTUATED_KNOWN_MB_DECODERS_KNOWN_MB_CLASSES_IANA_NAMES_MULTIBYTE_SEARCH_RADIUSc                (    [         R                  " U 5      nSnSU;   a	  U[        -  nSU;   a	  U[        -  nSU;   a	  U[
        -  nSU;   a  U[        -  nSU;   a	  U[        -  nSU;   a	  U[        -  nSU;   a	  U[        -  nS	U;   a  U[        -  nS
U;   a	  U[        -  nSU;   d  UR                  S5      (       a	  U[        -  nSU;   a	  U[        -  nUS;   a	  U[        -  n[          H  nX1;   d  M
  U["        -  n  U$    U$ ! [         a     gf = f)zRCompute all name-based classification flags with a single unicodedata.name() call.r   LATINCJKHANGULKATAKANA	HALFWIDTHHIRAGANATHAIARABICzISOLATED FORMLIGATUREz	LETTER AESUPERSCRIPT>   INVERTED QUESTION MARKINVERTED EXCLAMATION MARK)unicodedataname
ValueErrorr   r   r   r   r   r   r   r   r   endswithr   r   r   r   r   )	characterdescflagskws       T/var/www/html/pdf-tiff/venv/lib/python3.13/site-packages/charset_normalizer/utils.py_character_flagsr7   '   s?   $$Y/ E$}4T$((ET~4d"**ETT]];77FF++:\!EL 
 LG  s   D 
DDc                8    [        [        U 5      [        -  5      $ N)boolr7   r   r2   s    r6   is_accentuatedr<   Q   s     +l:;;    c                    [         R                  " U 5      nU(       d  U $ UR                  S5      n[        [	        US   S5      5      $ )N r      )r.   decompositionsplitchrint)r2   
decomposedcodess      r6   remove_accentrG   U   sA    !//	:J!'',Es58R !!r=   c              #  X   #    U  H   u  pUR                   UR                  U4v   M"     g 7fr9   )startstop).0r/   	ord_ranges      r6   	<genexpr>rM   a   s(      <: __innd+:s   (*zlist[tuple[int, int, str]]_UNICODE_RANGES_SORTEDz	list[int]_UNICODE_RANGE_STARTSc                    [        U 5      nUS:  a  gUS:  a  g[        [        U5      S-
  nUS:  a  [        U   u  p4nX:  a  U$ g)zC
Retrieve the Unicode range official name from a single character.
    zControl character   zBasic Latinr   r   N)ordr   rO   rN   )r2   character_ordidxrI   rJ   r/   s         r6   unicode_rangerV   h   s[     YMr"s ,m
<q
@C
ax237TKr=   c                8    [        [        U 5      [        -  5      $ r9   )r:   r7   r   r;   s    r6   is_latinrX   }   s     +f455r=   c                d    [         R                  " U 5      nSU;   a  g[        U 5      nUc  gSU;   $ )NPTFPunctuationr.   categoryrV   r2   character_categorycharacter_ranges      r6   is_punctuationra      s=    )229=
  "/	":OO++r=   c                    [         R                  " U 5      nSU;   d  SU;   a  g[        U 5      nUc  gSU;   =(       a    US:g  $ )NSNTFFormsLor\   r^   s      r6   	is_symbolrg      sP    )229=
  C+=$="/	":Oo%D*<*DDr=   c                B    [        U 5      nUc  gSU;   =(       d    SU;   $ )NF	EmoticonsPictographs)rV   )r2   r`   s     r6   is_emoticonrk      s*    "/	":O/)M]o-MMr=   c                    U R                  5       (       d  U S;   a  g[        R                  " U 5      nSU;   =(       d    US;   $ )N>   +<>   ｜TZ>   PcPdPo)isspacer.   r]   )r2   r_   s     r6   is_separatorrv      sE    i+AA)229=$$P(:>P(PPr=   c                D    U R                  5       U R                  5       :g  $ r9   )islowerisupperr;   s    r6   is_case_variablerz      s    )"3"3"555r=   c                8    [        [        U 5      [        -  5      $ r9   )r:   r7   r   r;   s    r6   is_cjkr|      s     +d233r=   c                8    [        [        U 5      [        -  5      $ r9   )r:   r7   r   r;   s    r6   is_hiraganar~           +i788r=   c                8    [        [        U 5      [        -  5      $ r9   )r:   r7   r   r;   s    r6   is_katakanar      r   r=   c                8    [        [        U 5      [        -  5      $ r9   )r:   r7   r   r;   s    r6   	is_hangulr           +g566r=   c                8    [        [        U 5      [        -  5      $ r9   )r:   r7   r   r;   s    r6   is_thair      s     +e344r=   c                8    [        [        U 5      [        -  5      $ r9   )r:   r7   r   r;   s    r6   	is_arabicr      r   r=   c                8    [        [        U 5      [        -  5      $ r9   )r:   r7   r   r;   s    r6   is_arabic_isolated_formr      s     +.CCDDr=   c                    U [         ;  $ r9   )r   r;   s    r6   is_cjk_uncommonr      s    111r=   c                    U [         ;   $ r9   )r   )
range_names    r6   is_unicode_range_secondaryr      s    ///r=   c                    U R                  5       (       + =(       a-    U R                  5       (       + =(       a    U S:g  =(       a    U S:g  $ )Nu   ﻿)ru   isprintabler;   s    r6   is_unprintabler      sF     	"%%''	"	" !	r=   c                   [        U [        [        45      (       d  [        e[	        U 5      nU S[        X!5       nUR                  5       nSU;  a  SU;  a  gUR                  SSS9n[        R                  " U5       HO  nUR                  S5      R                  5       R                  SS	5      n[        R                  " U5      nUc  MM  Us  $    g)
zO
Extract using ASCII-only decoder any specified encoding in the first n-bytes.
Ns   codings   charsetasciiignoreerrorsr   -_)
isinstancebytes	bytearray	TypeErrorlenminlowerdecoder   finditergroupreplacer   get)	sequencesearch_zoneseq_lensearch_byteslowered_bytesdecoded_zonematchspecified_encodingencoding_ianas	            r6   any_specified_encodingr      s     h	 233x=G 7c'78L &&(M%*M*I$++GH+EL099,G"[[^113;;CE#(:;$  	 H r=   )maxsizec                    U [         ;   a  g[         H)  n [        R                  " U5      R	                  U 5          g   g! [
        [        [        4 a     MF  f = f)zI
Verify is a specific encoding is a multi byte one based on it IANA name
TF)r   r   	importlibimport_modulegetcodecImportErrorAttributeErrorLookupError)r/   providers     r6   is_multi_byte_encodingr      s_    
 !! &	##H-66t<  & 	 ^[9 		s   %A  AAc                    [          HJ  n[         U   n[        U[        5      (       a  U/nU H   nU R                  U5      (       d  M  X4s  s  $    ML     g)z1
Identify and extract SIG/BOM in given sequence.
)Nr=   )r	   r   r   
startswith)r   iana_encodingmarksmarks       r6   identify_sig_or_bomr     sU    
 (%3M%BeU##GED""4(($**  ( r=   c                    U S;  $ )N>   utf_16utf_32 )r   s    r6   should_strip_sig_or_bomr   (  s     444r=   c                    U R                  5       R                  SS5      n [        R                  " U 5      nUb  U$ U(       a  [	        SU  S35      eU $ )zIReturns the Python normalized encoding name (Not the IANA official name).r   r   zUnable to retrieve IANA for '')r   r   r   r   r0   )cp_namestrictr   s      r6   	iana_namer   ,  sQ    mmo%%c3/GOOG,M 8	CDDNr=   c                   [        U 5      (       d  [        U5      (       a  g[        R                  " SU  35      R                  n[        R                  " SU 35      R                  nU" SS9nU" SS9nSn[	        S5       H:  n[        U/5      nUR                  U5      UR                  U5      :X  d  M5  US-  nM<     US-  $ )Ng        z
encodings.r   r   r      r   )r   r   r   r   ranger   r   )	iana_name_aiana_name_b	decoder_a	decoder_bid_aid_bcharacter_match_countito_be_decodeds	            r6   cp_similarityr   :  s    k**.D[.Q.Q''*[M(BCVVI''*[M(BCVVI(9D(9D!"3Z$aSz;;}%])CC!Q&! 
 !3&&r=   c                :    U [         ;   =(       a    U[         U    ;   $ )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   s     r6   is_cp_similarr   N  s%     	-- 	?1+>>r=   charset_normalizerz)%(asctime)s | %(levelname)s | %(message)sc                    [         R                  " U 5      nUR                  U5        [         R                  " 5       nUR	                  [         R
                  " U5      5        UR                  U5        g r9   )logging	getLoggersetLevelStreamHandlersetFormatter	Formatter
addHandler)r/   levelformat_stringloggerhandlers        r6   set_logging_handlerr   Y  sU    
 t$F
OOE##%G**=9:
gr=   c
              #    #    U(       aP  UR                  S5      (       a:  [        U5      n
[        U 5      nU H  nX-  U-  nXX-    nU(       d    g Uv   M     g U(       a$  U(       d  U H  nXX-    nU(       d    g Uv   M     g U	(       a>  U(       d  U OU [        U5      S  nU H   nXX-    nU(       d    g [        UU5      v   M"     g U GH-  nX-   nU[        U 5      S-   :  a  M  XX-    nU(       a  U(       d  UU-   nUR                  UU(       a  SOSS9nU(       a  US:  a  [	        US5      nUS U nSnU(       aW  [        U5      n
X-  [        U 5      -  n[        SU[        -
  5      n[	        U
U[        -   5      nUR                  UUU5      S:  nU(       aV  U(       dO  UU;  aI  [        XS	-
  S
5       H6  nU UU nU(       a  U(       d  UU-   nUR                  USS9nUS U U;   d  M6    O   Uv   GM0     g 7f)Niso2022_   r   r   r   r   r@   F   )	r   r   strr   r   maxr    findr   )	sequencesr   offsets
chunk_sizebom_or_sig_availablestrip_sig_or_bomsig_payloadis_multi_byte_decoderdecoded_payloaddeferred_decodingdecoded_lengthsequence_lengthr   decoded_offsetchunk
base_bytescut_sequence	chunk_endchunk_partial_size_chkchunk_prefixfound_nearbyexpected_offsetsearch_start
search_endjs                            r6   cut_sequence_chunksr  f  s5     =33J??_-i.A/?BN#^5PQEK  
!6A#7EK	 
 
 .I9S=M=O3P 	 A%!.9LlM22	  AI3y>A--$8L#,<*\9 ''#8xh ( E %Q.1*b.A&$%<&<=$"%(%9N&'&8C	N&JO#&q/<T*T#UL!$&:R(R"J (,,\<T ! $($O;"1!eR0'09'=/8H+6+EL , 3 3M( 3 S !8"89_L! 1 Ke s   G+G?1G?)r2   r   returnrD   )r2   r   r  r:   )r2   r   r  r   )r2   r   r  
str | None)r   r   r  r:   )i    )r   bytes | bytearrayr   rD   r  r	  )r/   r   r  r:   )r   r
  r  ztuple[str | None, bytes])r   r   r  r:   )T)r   r   r   r:   r  r   )r   r   r   r   r  float)r   r   r   r   r  r:   )r/   r   r   rD   r   r   r  None)NF)r   r
  r   r   r   r   r   rD   r   r:   r   r:   r   r   r   r:   r   r	  r   r:   r  zGenerator[str, None, None])I
__future__r   r   r   r.   bisectr   codecsr   	functoolsr   typingr   constantr	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r7   r<   rG   sorteditemsrN   __annotations__rO   rV   rX   ra   rg   rk   rv   rz   r|   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   INFOr   r  )es   0r6   <module>r     s   "     %        8'T<" 6< <288:< 6 2  3I#I2HQaD2H#I y I*6,ENQ6499757E20 59.18 4 0$5'( %D



 
 
	
, #'#^ ^^ ^ 	^
 ^ ^ ^  ^  ^ ^  ^C $Js   E1