
    q&fv                     |   d dl Z d dlZd dlZd dlZd dlZd dlmZmZ ddl	m
Z
 ddlmZ ddlmZmZmZ  ej"                  d      ZeD  ci c]  }  e|       d| z   j)                  d	       c} ZeD  ci c]  } | d| z   
 c} Zed
edefd       Zed
edefd       Zd ZdAdedededefdZdAdededefdZdefdZdefdZdedefdZ defdZ!dBdedefdZ"dCdedefdZ#d edefd!Z$d edefd"Z%d#edefd$Z&d#edefd%Z' ejP                  d&       G d' d(             Z)d) Z*d* Z+d#edefd+Z, ejZ                  d,      Z.d#edefd-Z/d.edefd/Z0dDd.ed0edefd1Z1dedefd2Z2dedefd3Z3d4 Z4dedefd5Z5d6 a6	 dEd7ed8ed9ed:edef
d;Z7ddddddddddd<
Z8dedee   fd=Z9d>ee   fd?Z:defd@Z;yc c} w c c} w )F    N)Optionaloverload   )_)attr)encodingerrorpycompats   ()[]{}?*+-|^$\.&~# 	
   \latin1patreturnc                      y N r   s    </usr/lib/python3/dist-packages/mercurial/utils/stringutil.pyreescaper   &           c                      y r   r   r   s    r   r   r   +   r   r   c                     d}t        | t              rd}| j                  d      } | j                  t              } |r| S | j                  d      S )z"Drop-in replacement for re.escape.TFr   )
isinstancebytesdecode	translate_regexescapemapencode)r   wantunis     r   r   r   0   sK    
 G#ujj"
--
(C
::hr   Fbprefixindentlevelc                 >    dj                  t        | |||            S )zPretty print an object.r   r    r!   r"   )join	pprintgen)or    r!   r"   s       r   pprintr(   ?   s    88IauMNNr   c              #     K   t        | t              r$|rdt        |       z   ydt        |       z   yt        | t              rdt        t        |             z   yt        | t              r| sd yd |r|dz  }d d	||z  z   t        |       D ]D  \  }}t        ||||
      D ]  }|  |dz   t        |       k  s0|rd d	||z  z   Ad F |r|dz  }d d	||z  z   d yt        | t              r| sd yd |r|dz  }d d	||z  z   t        t        | j                                     D ]c  \  }\  }}t        ||||
      D ]  }|  d t        ||||
      D ]  }|  |dz   t        |       k  sO|rd d	||z  z   `d e |r|dz  }d d	||z  z   d yt        | t              r| sd yd |r|dz  }d d	||z  z   t        t        |             D ]D  \  }}t        ||||
      D ]  }|  |dz   t        |       k  s0|rd d	||z  z   Ad F |r|dz  }d d	||z  z   d yt        | t              r| sd yd |r|dz  }d d	||z  z   t        |       D ]D  \  }}t        ||||
      D ]  }|  |dz   t        |       k  s0|rd d	||z  z   Ad F |r|dz  }d d	||z  z   d yt        | t        j                        r	 t        |       }	d |r|dz  }d d	||z  z   d}
|
s@|	}	 t        |       }	t        ||||
      D ]  }|  |
s|rd d	||z  z   nd |
s@|r|dz  }d d	||z  z   d yt#        j$                  |        y# t         $ r d Y yw xY w# t         $ r d}
Y w xY ww)a  Pretty print an object to a generator of atoms.

    ``bprefix`` is a flag influencing whether bytestrings are preferred with
    a ``b''`` prefix.

    ``indent`` controls whether collections and nested data structures
    span multiple lines via the indentation amount in spaces. By default,
    no newlines are emitted.

    ``level`` specifies the initial indent level. Used if ``indent > 0``.
    s   b'%s's   '%s's   bytearray['%s']s   []N   [      
    r$   s   ,
s   ,    ]s   {}   {s   :    }s   set([])s   set([s   ])s   ()   (   )s   gen[]s   gen[FT)r   r   	escapestr	bytearraylist	enumerater&   lendictsorteditemssettupletypesGeneratorTypenextStopIterationr
   byterepr)r'   r    r!   r"   iachunkkvnextitemlastcurrents               r   r&   r&   D   s     !UYq\))IaL((	Ay	! !9U1X#666	At	K
QJEK%&.))aL 	 DAq"76  
 1us1v~ L%&.11K	  QJEK%&.))
	At	K
QJEK%&.))"6!'')#45 	 IAv1"76  
 K"76  
 1us1v~ L%&.11K%	 ( QJEK%&.))
	As	QJEK%&.))fQi( 	 DAq"76  
 1us1v~ L%&.11K	  QJEK%&.))	Au	K
QJEK%&.))aL 	 DAq"76  
 1us1v~ L%&.11K	  QJEK%&.))
	Au**	+	AwH
 QJEK%&.))G7 #u  
  L%&.11K% ( QJEK%&.))
""Q  	N	$ ! sp   C	O)CO)B$O)BO)AO)+O 6O)O !1O)2O)OO)OO)O&#O)%O&&O)c                 $   g }t        j                  |       }dx}}|t        |      k  rd}|j                  d|dz         }|dk  rt        |      }n6||dz   kD  r.|j	                  d|dz
        r|j                  d|dz   |dz
        }|dk  r|}n|dz  }|j                  dd|      |j                  dd|      z
  }|dk\  sJ |j                  |||| j                         f       ||}}|t        |      k  rdj                  d	 |D              S )
z9Pretty print a representation of a possibly-nested objectr      <r+      =r-      >r,   c              3   2   K   | ]  \  }}d |z  |z     yw)s     Nr   ).0lss      r   	<genexpr>zprettyrepr.<locals>.<genexpr>(  s     61eai!m6s   )
r
   rA   r7   find
startswithrfindcountappendrstripr%   )r'   linesrsp0p1q0q1rQ   s           r   
prettyreprr`     s!   E			1	BKB
s2w, WWT26"6RB "q&[R]]4a8 $QQ/B6B!GBHHT1b!BHHT1b$99AvvaBr))+,-RB- s2w,. ::6666r   c                     | yt        | t              r-| d   t        j                  t        j                  | dd       z  S t        | t
              r| S t        |       r |        S t        |       S )ar  Format an optional printable representation from unexpanded bits

    ========  =================================
    type(r)   example
    ========  =================================
    tuple     ('<not %r>', other)
    bytes     '<branch closed>'
    callable  lambda: '<branch %r>' % sorted(b)
    object    other
    ========  =================================
    Nr   r   r+   )r   r<   r
   rapplymaybebytestrr   callabler(   )rs    r   	buildreprrf   +  sc     	y	Au	thooh&;&;QqrUCCC	Au		!s
ayr   rR   c                 $    t        | xr d| v       S )z&return true if a string is binary data    )boolrR   s    r   binaryrk   C  s     eqj!!r   patternc                 j    | j                  d      rd| dd  fS | j                  d      rd| dd  fS d| fS )Ns   re:   re   s   literal:   literal   )rU   )rl   s    r   _splitpatternrr   H  sK    &!gabk!!			K	(712;&&wr   Tcasesensitivec                    t        |       \  }} |dk(  r:	 d}|st        j                  }t        j                  | |      }|| |j                  fS |dk(  r.|r| j                  }nt        j                  |       fd}|| |fS t	        j                  d|z        # t        j                  $ r/}t	        j
                  t        d      t        |      z        d}~ww xY w)a  
    accepts a string, possibly starting with 're:' or 'literal:' prefix.
    returns the matcher name, pattern, and matcher function.
    missing or unknown prefixes are treated as literal matches.

    helper for tests:
    >>> def test(pattern, *tests):
    ...     kind, pattern, matcher = stringmatcher(pattern)
    ...     return (kind, pattern, [bool(matcher(t)) for t in tests])
    >>> def itest(pattern, *tests):
    ...     kind, pattern, matcher = stringmatcher(pattern, casesensitive=False)
    ...     return (kind, pattern, [bool(matcher(t)) for t in tests])

    exact matching (no prefix):
    >>> test(b'abcdefg', b'abc', b'def', b'abcdefg')
    ('literal', 'abcdefg', [False, False, True])

    regex matching ('re:' prefix)
    >>> test(b're:a.+b', b'nomatch', b'fooadef', b'fooadefbar')
    ('re', 'a.+b', [False, False, True])

    force exact matches ('literal:' prefix)
    >>> test(b'literal:re:foobar', b'foobar', b're:foobar')
    ('literal', 're:foobar', [False, True])

    unknown prefixes are ignored and treated as literals
    >>> test(b'foo:bar', b'foo', b'bar', b'foo:bar')
    ('literal', 'foo:bar', [False, False, True])

    case insensitive regex matches
    >>> itest(b're:A.+b', b'nomatch', b'fooadef', b'fooadefBar')
    ('re', 'A.+b', [False, False, True])

    case insensitive literal matches
    >>> itest(b'ABCDEFG', b'abc', b'def', b'abcdefg')
    ('literal', 'ABCDEFG', [False, False, True])
    rn   r      invalid regular expression: %sNrp   c                 4    t        j                  |       k(  S r   )r   lower)rR   ipats    r   <lambda>zstringmatcher.<locals>.<lambda>  s    dhnnQ&77 r      unhandled pattern kind: %s)rr   remodIcompiler	   
ParseErrorr   forcebytestrsearch__eq__r   rw   ProgrammingError)rl   rs   kindflagsregexematchrx   s          @r   stringmatcherr   P  s    L "'*MD'u}	E MM'51E
 Well**		NNE>>'*D7EWe##

 
 !>!E
FF {{ 	""34|AF 	s   *B C-*CCr   c                 l   t        |       \  }} |dk(  r	 t        j                  | |      S |dk(  r)t        j                  t        j                  |       |      S t        j                  d|z        # t        j                  $ r/}t        j                  t        d      t        |      z        d}~ww xY w)a  Build a regexp object from a string pattern possibly starting with
    're:' or 'literal:' prefix.

    helper for tests:
    >>> def test(pattern, *tests):
    ...     regexp = substringregexp(pattern)
    ...     return [bool(regexp.search(t)) for t in tests]
    >>> def itest(pattern, *tests):
    ...     regexp = substringregexp(pattern, remod.I)
    ...     return [bool(regexp.search(t)) for t in tests]

    substring matching (no prefix):
    >>> test(b'bcde', b'abc', b'def', b'abcdefg')
    [False, False, True]

    substring pattern should be escaped:
    >>> substringregexp(b'.bc').pattern
    '\\.bc'
    >>> test(b'.bc', b'abc', b'def', b'abcdefg')
    [False, False, False]

    regex matching ('re:' prefix)
    >>> test(b're:a.+b', b'nomatch', b'fooadef', b'fooadefbar')
    [False, False, True]

    force substring matches ('literal:' prefix)
    >>> test(b'literal:re:foobar', b'foobar', b're:foobar')
    [False, True]

    case insensitive literal matches
    >>> itest(b'BCDE', b'abc', b'def', b'abcdefg')
    [False, False, True]

    case insensitive regex matches
    >>> itest(b're:A.+b', b'nomatch', b'fooadef', b'fooadefBar')
    [False, False, True]
    rn   ru   Nrp   rz   )	rr   r{   r}   r	   r~   r   r   escaper   )rl   r   r   r   s       r   substringregexpr     s    L "'*MD'u}	==%00
 
	}}U\\'2E::

 
 !>!E
FF {{ 	""34|AF 	s   A1 1B3*B..B3userc                     | j                  d      }|dk\  r| d| } | j                  d      }|dk\  r| |dz   d } | j                  d      }|dk\  r| d| } | j                  d      }|dk\  r| d| } | S )z>Return a short representation of a user name or email address.   @r   NrL   r+   r-      .rT   r   fs     r   	shortuserr     s    		$AAvBQx		$AAvAEG}		$AAvBQx		$AAvBQxKr   c                 x    | j                  d      }|dk\  r| d| } | j                  d      }|dk\  r| |dz   d } | S )z,Return the user portion of an email address.r   r   NrL   r+   r   r   s     r   	emailuserr     sI    		$AAvBQx		$AAvAEG}Kr   authorc                 `    | j                  d      }|dk(  rd}| | j                  d      dz   | S )zget email of author.rN   rK   NrL   r+   r   )r   re   s     r   emailr     s7    DABw&++d#a'!,,r   c                     d| vr| S | j                  d      }|dk7  r$| d| j                  d      j                  dd      S | j                  d      }| d| j                  dd	      S )
a  Returns the name before an email address,
    interpreting it as per RFC 5322

    >>> person(b'foo@bar')
    'foo'
    >>> person(b'Foo Bar <foo@bar>')
    'Foo Bar'
    >>> person(b'"Foo Bar" <foo@bar>')
    'Foo Bar'
    >>> person(b'"Foo "buz" Bar" <foo@bar>')
    'Foo "buz" Bar'
    >>> # The following are invalid, but do exist in real-life
    ...
    >>> person(b'Foo "buz" Bar <foo@bar>')
    'Foo "buz" Bar'
    >>> person(b'"Foo Bar <foo@bar>')
    'Foo Bar'
    r   rL   rK   Ns    "s   \"   "r   r-   )rT   stripreplace)r   r   s     r   personr     sq    & 6DABwbqz&..vt<<DA"1:dD))r   )hashc                   X    e Zd ZdZ ej
                         Z ej
                  d      Zy)mailmappingz>Represents a username/email key or value in
    a mailmap fileN)default)__name__
__module____qualname____doc__r   ibr   namer   r   r   r   r     s&     DGGIE4774 Dr   r   c                 2    | xs |  xr t        |      dk  S )au  Returns True if the parsed names and emails
    in a mailmap entry are invalid.

    >>> # No names or emails fails
    >>> names, emails = [], []
    >>> _ismailmaplineinvalid(names, emails)
    True
    >>> # Only one email fails
    >>> emails = [b'email@email.com']
    >>> _ismailmaplineinvalid(names, emails)
    True
    >>> # One email and one name passes
    >>> names = [b'Test Name']
    >>> _ismailmaplineinvalid(names, emails)
    False
    >>> # No names but two emails passes
    >>> names = []
    >>> emails = [b'proper@email.com', b'commit@email.com']
    >>> _ismailmaplineinvalid(names, emails)
    False
    r   )r7   )namesemailss     r   _ismailmaplineinvalidr   
  s     , :6U6s6{Q6r   c                 h   i }| |S | j                         D ]  }|j                         j                  d      r$g g }}g }|j                         D ]  }|j                  d      r n~|j                  d      rZ|j	                  d      rI|j                  |dd        |r"|j                  dj                  |             g }t        |      dkD  s n|j                  |        t        ||      rt        |d   t        |      dk(  r|d   nd	      }t        |d
   |r|d
   nd	      ||<    |S )ax  Parses data in the .mailmap format

    >>> mmdata = b"\n".join([
    ... b'# Comment',
    ... b'Name <commit1@email.xx>',
    ... b'<name@email.xx> <commit2@email.xx>',
    ... b'Name <proper@email.xx> <commit3@email.xx>',
    ... b'Name <proper@email.xx> Commit <commit4@email.xx>',
    ... ])
    >>> mm = parsemailmap(mmdata)
    >>> for key in sorted(mm.keys()):
    ...     print(key)
    mailmapping(email='commit1@email.xx', name=None)
    mailmapping(email='commit2@email.xx', name=None)
    mailmapping(email='commit3@email.xx', name=None)
    mailmapping(email='commit4@email.xx', name='Commit')
    >>> for val in sorted(mm.values()):
    ...     print(val)
    mailmapping(email='commit1@email.xx', name='Name')
    mailmapping(email='name@email.xx', name=None)
    mailmapping(email='proper@email.xx', name='Name')
    mailmapping(email='proper@email.xx', name='Name')
    N   #rL   rN   r+   rK   r-   r   )r   r   r   )

splitlineslstriprU   splitendswithrX   r%   r7   r   r   )mailmapcontentmailmapliner   r   namebuilderelement
mailmapkeys           r   parsemailmapr   #  sF   0 G))+ 1
 ;;=##D) Bvzz| 	,G!!$'##D)g.>.>t.D gam,LL;!78"$K v;? ""7++	,4 !/ *!%jAor4


 *)"q

]1
f Nr   c                    t        |      r| s|S t        t        |      t        |            }	 | |   }d|j                  r|j                  n|j                  |j                  r|j                  fz  S |j                  fz  S # t        $ r5 t        |j                        }| j                  |t        dd            }Y w xY w)a.  Returns the author field according to the mailmap cache, or
    the original author field.

    >>> mmdata = b"\n".join([
    ...     b'# Comment',
    ...     b'Name <commit1@email.xx>',
    ...     b'<name@email.xx> <commit2@email.xx>',
    ...     b'Name <proper@email.xx> <commit3@email.xx>',
    ...     b'Name <proper@email.xx> Commit <commit4@email.xx>',
    ... ])
    >>> m = parsemailmap(mmdata)
    >>> mapname(m, b'Commit <commit1@email.xx>')
    'Name <commit1@email.xx>'
    >>> mapname(m, b'Name <commit2@email.xx>')
    'Name <name@email.xx>'
    >>> mapname(m, b'Commit <commit3@email.xx>')
    'Name <proper@email.xx>'
    >>> mapname(m, b'Commit <commit4@email.xx>')
    'Name <proper@email.xx>'
    >>> mapname(m, b'Unknown Name <unknown@email.com>')
    'Unknown Name <unknown@email.com>'
    )r   r   )r   Ns   %s <%s>)isauthorwellformedr   r   r   KeyErrorgetr   )r   r   commitpropercommit2s        r   mapnamer   v  s    2 f%W fVnE&MBF? {{  *0,,    ? FLL1Wk$&=>	?s   B ;C Cs   ^[^<]+\s<[^<>]+@[^<>]+>$c                 0    t         j                  |       duS )a&  Return True if the author field is well formed
    (ie "Contributor Name <contrib@email.dom>")

    >>> isauthorwellformed(b'Good Author <good@author.com>')
    True
    >>> isauthorwellformed(b'Author <good@author.com>')
    True
    >>> isauthorwellformed(b'Bad Author')
    False
    >>> isauthorwellformed(b'Bad Author <author@author.com')
    False
    >>> isauthorwellformed(b'Bad Author author@author.com')
    False
    >>> isauthorwellformed(b'<author@author.com>')
    False
    >>> isauthorwellformed(b'Bad Author <author>')
    False
    N)_correctauthorformatr   )r   s    r   r   r     s    &  %%f-T99r   textc                 ~    | j                  d      }|dk7  r| d| } 	 | j                         d   S # t        $ r Y yw xY w)z"Return the first line of the inputr,   rK   Nr   r   )rT   r   
IndexError)r   rB   s     r   	firstliner     sM     			%ABwBQx ## s   0 	<<	maxlengthc                 2    t        j                  | |d      S )zCTrim string to at most maxlength (default: 400) columns in display.s   ...)ellipsis)r   trim)r   r   s     r   r   r     s    ==y6::r   c                 h    t        | t              rt        |       } t        j                  |       d   S Nr   )r   
memoryviewr   codecsescape_encoderj   s    r   r3   r3     s-    !Z !H "1%%r   c                 2    t        j                  |       d   S r   )r   escape_decoderj   s    r   unescapestrr     s    "1%%r   c                     	 t        j                  |       S # t        $ r4 t        j                  t        j                  t        |                   cY S w xY w)zLPortably format an arbitrary object (e.g. exception) into a byte
    string.)r
   bytestrUnicodeEncodeErrorr   
strtolocalstr)objs    r   r   r     sG    ?$$ ? 3 3CH =>>?s    :AAc                 r    t        j                  t        j                  |             j                  dd      S )Ns   \\r   )r
   rA   r   r   rj   s    r   uireprr     s+    X--a0199'5IIr   c                  H     G d dt         j                        }|a |di | S )Nc                   "    e Zd ZdZd Zd Zd Zy)_MBTextWrapper.<locals>.twa8  
        Extend TextWrapper for width-awareness.

        Neither number of 'bytes' in any encoding nor 'characters' is
        appropriate to calculate terminal columns for specified string.

        Original TextWrapper implementation uses built-in 'len()' directly,
        so overriding is needed to use width information of each characters.

        In addition, characters classified into 'ambiguous' width are
        treated as wide in East Asian area, but as narrow in other.

        This requires use decision to determine width of such characters.
        c                     d}t         j                  }t        t        |            D ]!  }| |||         z  }||k  s|d | ||d  fc S  |dfS )Nr   r   )r   	ucolwidthranger7   )selfucstr
space_leftrQ   colwidthrB   s         r   _cutdownz#_MBTextWrapper.<locals>.tw._cutdown  sg    A))H3u:& 2XeAh''>!"1IuQRy112 #:r   c                     t        ||z
  d      }| j                  r/| j                  |d   |      \  }}|j                  |       ||d<   y |s |j                  |j	                                y y )Nr+   rK   )maxbreak_long_wordsr   rX   pop)r   reversed_chunkscur_linecur_lenwidthr   cutress           r   _handle_long_wordz,_MBTextWrapper.<locals>.tw._handle_long_word  sg    UW_a0J$$==)<jIS$&)# 3 3 56 r   c                    t         j                  }g }| j                  dk  rt        d| j                  z        |j	                          |rg }d}|r| j
                  }n| j                  }| j                  t        |      z
  }| j                  r|d   j                         dk(  r|r|d= |r< ||d         }||z   |k  r%|j                  |j                                ||z  }nn|r<|r" ||d         |kD  r| j                  ||||       | j                  r|r|d   j                         dk(  r|d= |r#|j                  |dj                  |      z          |r|S )Nr   s   invalid width %r (must be > 0)rK    )r   r   r   
ValueErrorreversesubsequent_indentinitial_indentr7   drop_whitespacer   rX   r   r   r%   )	r   chunksr   rZ   r   r   r!   r   rQ   s	            r   _wrap_chunksz'_MBTextWrapper.<locals>.tw._wrap_chunks  sh   ))HEzzQ !BTZZ!OPP NN  !33F!00F 

S[0 ''F2J,<,<,>",Dr
 ,A {e+ 

51   hvbz2U:**68WeL ((  **,3  LL"''(*;!;<c f Lr   N)r   r   r   r   r   r   r   r   r   r   twr     s    			7>	r   r   r   )textwrapTextWrapper_MBTextWrapper)kwargsr   s     r   r   r     s*    dX!! dN N<<r   r   r   
initindent
hangindentc                    t        t        |      t        |            }||k  rt        d|dz         }| j                  t        j                  t
        j
                        t        j                  t
        j                              } |j                  t        j                  t
        j
                        t        j                  t
        j                              }|j                  t        j                  t
        j
                        t        j                  t
        j                              }t        |||      }|j                  |       j                  t        j                  t
        j
                              S )NN   r+   )r   r   r   )
r   r7   r   r
   sysstrr   encodingmoder   fillr   )r   r   r   r   	maxindentwrappers         r   wrapr  ]  s    C
OS_5I	B	A&;;))*--.D ""))*--.J ""))*--.J J*G <<$$X__X5F5F%GHHr   )
   1s   yess   trues   ons   always   0s   nos   falses   offs   neverc                 J    t         j                  | j                         d      S )zLParse s into a boolean.

    If s is not a valid boolean, returns None.
    N)	_booleansr   rw   rj   s    r   	parseboolr    s    
 ==D))r   valuec                     fdfdfd| (t        | t              r | j                  d            }n| }|xs g S )zparse a configuration value as a list of comma/space separated strings

    >>> parselist(b'this,is "a small" ,test')
    ['this', 'is', 'a small', 'test']
    c                    d}|t        |      k  rY|||dz    j                         s|||dz    dk(  r8d}|dz  }|t        |      k  r#|||dz    j                         r,|||dz    dk(  r8|t        |      k\  rd | |fS |r| j                  d       |||dz    dk(  r| d   s| |dz   fS |||dz    dk(  r'| d   dd  dk(  r| d   d d |||dz    z   | d<   | |dz   fS | dxx   |||dz    z  cc<   | |dz   fS )	NFr+      ,Tr   r   rK   r   )r7   isspacerX   )partsrR   offset
whitespace_parse_plain_parse_quotes       r   r  zparselist.<locals>._parse_plain  sV   
s1vofvz"**,&6A:0F$0NJaKF	 s1vofvz"**,&6A:0F$0N SV&&LLVfqj!T)%)
22v
#t+b	"#%0Gb	#26FQJ)??E"I
22b	Qv
++	UFQJ..r   c                    |t        |      k  r|||dz    dk(  r| j                  d       |dz  }|t        |      k  rW|||dz    j                         s|||dz    dk(  r6|dz  }|t        |      k  r#|||dz    j                         r*|||dz    dk(  r6| |fS |t        |      k  rz|||dz    dk7  ro|||dz    dk(  r2|dz   t        |      k  r!||dz   |dz    dk(  r|dz  }| dxx   dz  cc<   n| dxx   |||dz    z  cc<   |dz  }|t        |      k  r|||dz    dk7  ro|t        |      k\  r9 | d         }|sd| d<   n!d|d   z   |d<   | d d } | j                  |       d | |fS |dz  }|t        |      k  r(|||dz    d	v r|dz  }|t        |      k  r|||dz    d	v r|t        |      k  rA|dz   t        |      k(  r|||dz    dk(  r| dxx   dz  cc<   |dz  }n| j                  d       nd | |fS | |fS )
Nr+   r   r   r  r   r   rK   r   )r-   r  )r7   rX   r  extend)r  rR   r  
real_parts_configlistr  s       r   r  zparselist.<locals>._parse_quote  s   CF?q&1*5=LLaKF3q6/&6A:&..0Vfqj)T1!	 3q6/&6A:&..0Vfqj)T1  ..s1vo!FVaZ"8D"@&6A:&%/QJQ'fqj6A:.$6!b	T!	b	Qv
33	aKF s1vo!FVaZ"8D"@ SV$U2Y/J b	 $z!} 4
1cr
Z(&&!s1vo!FVaZ"8L"HaKF s1vo!FVaZ"8L"H CF?zSV#&6A:(>$(Fb	T!	!S!&&UF**r   c                 f    | j                  d      } | sg S dgd}}}|r ||| |      \  }}}|r|S )Ns    ,r   r   )rY   )rR   parserr  r  r  s       r   r  zparselist.<locals>._configlist  sI    HHUOI ,seQv$*5!V$<!FE6 r   s    ,
)r   r   r   )r  resultr  r  r  s     @@@r   	parselistr    sF    /&.+` Zu5U\\'23<Rr   c                 J    t        j                  | j                  d            S )z8Evaluate a string containing a Python literal expressionr   )astliteral_evalr   rj   s    r   evalpythonliteralr#    s     AHHX.//r   )Fr   r   )T)r   )i  )r   r   )<r!  r   rer{   r   r=   typingr   r   i18nr   
thirdpartyr   r   r   r	   r
   r   
_respecialordr   r   regexbytesescapemapr   r   r   ri   intr(   r&   r`   rf   rk   rr   r   r   r   r   r   r   rR   r   r   r   r   r}   r   r   r   r   r3   r   r   r   r   r  r  r  r  r#  )rB   s   0r   <module>r,     sC       
    X?@
AKLA3q6EAI--h77L/9:!q519}:  
% E  
 
# #  
 Ot OS OS O O
E#$ E# E# E#P7U 7>E 0"e " "
5 :G5 :G :Gz1GU 1G3 1GhE e "E e -% -E -*5 *U *8 T! ! !72Pf-U -u -` %u}}%AB :u : :,	E 	e 	;5 ;S ;5 ;
& &5 &&5 &U &?Je J JiZ KNI
II).IBGI
I4 
	* *8D> *WXe_ Wt0 0K M:s   	"F42F9