
    0h             
       v	   S r SSKrSSKrSSKrSSKJrJrJr  SSKJrJ	r	J
r
  SSKJr  SSKJrJrJr  SrSrSrS	rS
rSrSrSr\\\\/rSrSr\\/rSrSr\\/rSr Sr!Sr"Sr#Sr$Sr%Sr&Sr'Sr(Sr)\ \!\"\#\$\%\&\'\(\)/
r*\\-   \-   \*-   r+Sr,Sr-Sr.Sr/S r0Sr1S!r2S"r3S#r4S$r5S%r6S&r7S'r8S(r9S)r:S*r;S+r<S,r=S-r>S.r?S/r@S0rAS1rBS2rCS3rDS4rES5rFS6rGS7rHS8rIS9rJS:rKS;rLS<rMSrNSrOS=rPSrQSrR/ \.P\BP\CP\DP\/P\0P\1P\2P\3P\5P\6P\7P\8P\9P\:P\<P\=P\>P\?P\@P\AP\EP\FP\GP\HP\IP\JP\KP\LP\MP\NP\OP\PP\QP\RPrSS>rTS?rU\T\U/rV\S\V-   rW\/\1/rX\W V s/ s H  o \X;  d  M
  U PM     sn rYS@rZSAr[SBr\\Z\[\\/r]SCr^SDr_\^\_/r`S1raS2rb\a\b/rcSErdSFreSGrfSHrg\d\e\f\g/rhSIriSJrjSKrkSLrl\i\j\k\l/rm\R                  " SM\R                  5      rp\R                  " SN\R                  \R                  -  5      rr\R                  " SO\R                  \R                  -  5      rs\R                  " SP\R                  \R                  -  5      rt\R                  " SQ\R                  \R                  -  5      ru\R                  " SR\R                  \R                  -  5      rv\R                  " SS\R                  \R                  -  5      rw\R                  " ST\R                  \R                  -  5      rx\R                  " SU\R                  \R                  -  5      ry\R                  " SV\R                  \R                  -  5      rz\R                  " SW\R                  \R                  -  5      r{\R                  " SX\R                  \R                  -  5      r|\R                  " SY\R                  \R                  -  5      r}SZR                  \+5      R                  S[S\5      r\R                  " S]\-   S^-   \R                  \R                  -  \GR                  -  5      r\R                  " S_\R                  \R                  -  5      r\R                  " S`\R                  \R                  -  \GR                  -  5      r " Sa Sb\5      r " Sc Sd\5      r " Se Sf\5      r " Sg Sh\5      r " Si Sj\5      r\" Sk/ SlQ5      r\" Sm/ SnQ5      r " So Sp\5      r " Sq Sr\5      rgs  sn f )suz  
GTK-Doc comment block format
----------------------------

A GTK-Doc comment block is built out of multiple parts. Each part can be further
divided into fields which are separated by a colon ("``:``") delimiter.

Known parts and the fields they are constructed from look like the following
(optional fields are enclosed in square brackets)::

    ┌───────────────────────────────────────────────────────────┐
    │ /**                                                       │ ─▷ start token
    ├────────────────────┬──────────────────────────────────────┤
    │  * identifier_name │ [: annotations]                      │ ─▷ identifier part
    ├────────────────────┼─────────────────┬────────────────────┤
    │  * @parameter_name │ [: annotations] │ : description      │ ─▷ parameter part
    ├────────────────────┴─────────────────┴────────────────────┤
    │  *                                                        │ ─▷ comment block description
    │  * comment_block_description                              │
    ├─────────────┬─────────────────┬───────────┬───────────────┤
    │  * tag_name │ [: annotations] │ [: value] │ : description │ ─▷ tag part
    ├─────────────┴─────────────────┴───────────┴───────────────┤
    │  */                                                       │ ─▷ end token
    └───────────────────────────────────────────────────────────┘

There are two conditions that must be met before a comment block is recognized
as a GTK-Doc comment block:

#. The comment block is opened with a GTK-Doc start token ("``/**``")
#. The first line following the start token contains a valid identifier part

Once a GTK-Doc comment block has been identified as such and has been stripped
from its start and end tokens the remaining parts have to be written in a
specific order:

#. There must be exactly 1 `identifier` part on the first line of the
   comment block which consists of:

   * a required `identifier_name` field
   * an optional `annotations` field, optionally spanning multiple lines

#. Zero or more `parameter` parts, each consisting of:

   * a required `parameter_name` field
   * an optional `annotations` field, optionally spanning multiple lines
   * a required `description` field (can be the empty string)

#. One optional `comment block description` part which must begin with at
   least 1 empty line signaling the start of this part.

#. Zero or more `tag` parts, each consisting of:

   * a required `tag_name` field
   * an optional `annotations` field, optionally spanning multiple lines
   * an optional `value` field
   * a required `description` field (can be the empty string)

Additionally, the following restrictions are in effect:

#. Separating parts with an empty line:

   * `identifier` and `parameter` parts cannot be separated from each other by
     an empty line as this would signal the start of the
     `comment block description` part (see above).
   * it is required to separate the `comment block description` part from the
     `identifier` or `parameter` parts with an empty line (see above)
   * `comment block description` and `tag` parts can optionally be separated
     by an empty line

#. Parts and fields cannot span multiple lines, except for:

   * the `comment_block_description` part
   * `parameter description` and `tag description` fields
   * `identifier`, `parameter` and `tag` part `annotations` fields

#. Taking the above restrictions into account, spanning multiple paragraphs is
   limited to the `comment block description` part and `tag description` fields.
    N)
namedtupleCounterOrderedDict)negtlt)Tuple   )Positionwarnerror      
deprecatedreturnssince	stabilitydescriptionzreturn valuereturnzreturns value
attributeszget value funczref funcz	rename tozset value functransfertypez
unref funcvaluevirtual()z
allow-nonearrayz
async-funcclosureconstructorz	copy-funczdefault-valuedestroyzelement-typeemitterzfinish-funcforeignz	free-funczget-propertyzget-value-funcgetterininoutmethodnullableoptionalnotoutzref-funcz	rename-toscopezset-propertyzset-value-funcsetterskipz	sync-funcz
unref-func	attributezin-outz
fixed-sizelengthzzero-terminatedzcallee-allocateszcaller-allocatesasynccallnotifiedforever	containerfloatingfullnonez
\r\n|\r|\naV  
    ^                                                    # start
    (?P<code>.*?)                                        # whitespace, code, ...
    \s*                                                  # 0 or more whitespace characters
    (?P<token>/\*{2}(?![\*/]))                           # 1 forward slash character followed
                                                         #   by exactly 2 asterisk characters
                                                         #   and not followed by a slash character
    \s*                                                  # 0 or more whitespace characters
    (?P<comment>.*?)                                     # GTK-Doc comment text
    \s*                                                  # 0 or more whitespace characters
    $                                                    # end
    a  
    ^                                                    # start
    \s*                                                  # 0 or more whitespace characters
    (?P<comment>.*?)                                     # GTK-Doc comment text
    \s*                                                  # 0 or more whitespace characters
    (?P<token>\*+/)                                      # 1 or more asterisk characters followed
                                                         #   by exactly 1 forward slash character
    (?P<code>.*?)                                        # whitespace, code, ...
    \s*                                                  # 0 or more whitespace characters
    $                                                    # end
    a
  
    ^                                                    # start
    \s*                                                  # 0 or more whitespace characters
    (?P<comment>.*?)                                     # invalid comment text
    \s*                                                  # 0 or more whitespace characters
    \*                                                   # 1 asterisk character
    \s?                                                  # 0 or 1 whitespace characters
                                                         #   WARNING: removing more than 1
                                                         #   whitespace character breaks
                                                         #   embedded example program indentation
    zs
    ^
    (?P<indentation>\s*)                                 # 0 or more whitespace characters
    .*
    $
    z
    ^                                                    # start
    \s*                                                  # 0 or more whitespace characters
    $                                                    # end
    a0  
    ^                                                    # start
    \s*                                                  # 0 or more whitespace characters
    SECTION                                              # SECTION
    \s*                                                  # 0 or more whitespace characters
    (?P<delimiter>:?)                                    # delimiter
    \s*                                                  # 0 or more whitespace characters
    (?P<section_name>\w\S+?)                             # section name
    \s*                                                  # 0 or more whitespace characters
    :?                                                   # invalid delimiter
    \s*                                                  # 0 or more whitespace characters
    $
    az  
    ^                                                    # start
    \s*                                                  # 0 or more whitespace characters
    (?P<symbol_name>[\w-]*\w)                            # symbol name
    \s*                                                  # 0 or more whitespace characters
    (?P<delimiter>:?)                                    # delimiter
    \s*                                                  # 0 or more whitespace characters
    (?P<fields>.*?)                                      # annotations + description
    \s*                                                  # 0 or more whitespace characters
    :?                                                   # invalid delimiter
    \s*                                                  # 0 or more whitespace characters
    $                                                    # end
    a  
    ^                                                    # start
    \s*                                                  # 0 or more whitespace characters
    (?P<class_name>[\w]+)                                # class name
    \s*                                                  # 0 or more whitespace characters
    :{1}                                                 # 1 required colon
    \s*                                                  # 0 or more whitespace characters
    (?P<property_name>[\w-]*\w)                          # property name
    \s*                                                  # 0 or more whitespace characters
    (?P<delimiter>:?)                                    # delimiter
    \s*                                                  # 0 or more whitespace characters
    (?P<fields>.*?)                                      # annotations + description
    \s*                                                  # 0 or more whitespace characters
    :?                                                   # invalid delimiter
    \s*                                                  # 0 or more whitespace characters
    $                                                    # end
    a  
    ^                                                    # start
    \s*                                                  # 0 or more whitespace characters
    (?P<class_name>[\w]+)                                # class name
    \s*                                                  # 0 or more whitespace characters
    :{2}                                                 # 2 required colons
    \s*                                                  # 0 or more whitespace characters
    (?P<signal_name>[\w-]*\w)                            # signal name
    \s*                                                  # 0 or more whitespace characters
    (?P<delimiter>:?)                                    # delimiter
    \s*                                                  # 0 or more whitespace characters
    (?P<fields>.*?)                                      # annotations + description
    \s*                                                  # 0 or more whitespace characters
    :?                                                   # invalid delimiter
    \s*                                                  # 0 or more whitespace characters
    $                                                    # end
    a  
    ^                                                    # start
    \s*                                                  # 0 or more whitespace characters
    (?P<class_name>[\w]+)                                # class name
    \s*                                                  # 0 or more whitespace characters
    \|{1}                                                # 1 required vertical bar
    \s*                                                  # 0 or more whitespace characters
    (?P<action_name>[\w-]+\.[\w-]+)                      # action name
    \s*                                                  # 0 or more whitespace characters
    (?P<delimiter>:?)                                    # delimiter
    \s*                                                  # 0 or more whitespace characters
    (?P<fields>.*?)                                      # annotations + description
    \s*                                                  # 0 or more whitespace characters
    :?                                                   # invalid delimiter
    \s*                                                  # 0 or more whitespace characters
    $                                                    # end
    a  
    ^                                                    # start
    \s*                                                  # 0 or more whitespace characters
    (?P<class_name>[\w]+)                                # class name
    \s*                                                  # 0 or more whitespace characters
    \.{1}                                                # 1 required dot
    \s*                                                  # 0 or more whitespace characters
    (?P<field_name>[\w-]*\w)                             # field name
    \s*                                                  # 0 or more whitespace characters
    (?P<delimiter>:?)                                    # delimiter
    \s*                                                  # 0 or more whitespace characters
    (?P<fields>.*?)                                      # annotations + description
    \s*                                                  # 0 or more whitespace characters
    :?                                                   # invalid delimiter
    \s*                                                  # 0 or more whitespace characters
    $                                                    # end
    a'  
    ^                                                    # start
    \s*                                                  # 0 or more whitespace characters
    @                                                    # @ character
    (?P<parameter_name>[\w-]*\w|.*?\.\.\.)               # parameter name
    \s*                                                  # 0 or more whitespace characters
    :{1}                                                 # 1 required delimiter
    \s*                                                  # 0 or more whitespace characters
    (?P<fields>.*?)                                      # annotations + description
    \s*                                                  # 0 or more whitespace characters
    $                                                    # end
    | z\sz
    ^                                                    # start
    \s*                                                  # 0 or more whitespace characters
    (?P<tag_name>a  )                 # tag name
    \s*                                                  # 0 or more whitespace characters
    :{1}                                                 # 1 required delimiter
    \s*                                                  # 0 or more whitespace characters
    (?P<fields>.*?)                                      # annotations + value + description
    \s*                                                  # 0 or more whitespace characters
    $                                                    # end
    a  
    ^                                                    # start
    \s*                                                  # 0 or more whitespace characters
    (?P<value>([0-9\.])*)                                # value
    \s*                                                  # 0 or more whitespace characters
    (?P<delimiter>:?)                                    # delimiter
    \s*                                                  # 0 or more whitespace characters
    (?P<description>.*?)                                 # description
    \s*                                                  # 0 or more whitespace characters
    $                                                    # end
    a  
    ^                                                    # start
    \s*                                                  # 0 or more whitespace characters
    (?P<value>(stable|unstable|private|internal)?)       # value
    \s*                                                  # 0 or more whitespace characters
    (?P<delimiter>:?)                                    # delimiter
    \s*                                                  # 0 or more whitespace characters
    (?P<description>.*?)                                 # description
    \s*                                                  # 0 or more whitespace characters
    $                                                    # end
    c                   (    \ rS rSrSrSrS rS rSrg)GtkDocAnnotationsi7  z
An ordered dictionary mapping annotation names to annotation options (if any). Annotation
options can be either a :class:`list`, a :class:`giscanner.collections.OrderedDict`
(depending on the annotation name)or :const:`None`.
positionc                 f    UR                  SS 5      U l        [        R                  " U /UQ70 UD6  g )Nr<   )popr<   r   __init__)selfargskwargss      8/lib/gobject-introspection/giscanner/annotationparser.pyr?   GtkDocAnnotations.__init__@  s.     

:t4T3D3F3    c                 (    [        X R                  S9$ )Nr<   )r;   r<   r@   s    rC   __copy__GtkDocAnnotations.__copy__G  s     >>rE   rG   N)	__name__
__module____qualname____firstlineno____doc__	__slots__r?   rI   __static_attributes__ rE   rC   r;   r;   7  s     I4?rE   r;   c                   (   \ rS rSrSrSrSrS1S jrS rS r	S	 r
  S2S
 jrS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS r S  r!S! r"S" r#S# r$S$ r%S% r&S& r'S' r(S( r)S) r*S* r+S+ r,S, r-S- r.S. r/S/ r0S0r1g)3GtkDocAnnotatableiK  zC
Base class for GTK-Doc comment block parts that can be annotated.
)r<   annotationsrR   Nc                 .    Xl         [        5       U l        g N)r<   r;   rU   )r@   r<   s     rC   r?   GtkDocAnnotatable.__init__W  s     ! -.rE   c                 $    SU R                   < S3$ )Nz<GtkDocAnnotatable 'z'>)rU   rH   s    rC   __repr__GtkDocAnnotatable.__repr__`  s    -1-=-=@@rE   c           	      (   U R                   (       Ga  U R                   R                  nU R                   R                  5        GHJ  u  p#X R                  ;   a)  [	        U SUR                  SS5      -   5      nU" XU5        O+U[        ;   a  [        SU< 3U5        O[        SU< 3U5        U[        :X  a  [        U;   av  [        U R                   ;   a'  [        S[        S-   [        -   < S[        < S	3U5        [        U R                   ;   a'  [        S[        S-   [        -   < S[        < S	3U5        U[        :X  d  M  [        U;   d  GM  [        U R                   ;   d  GM#  [        S[        S-   [        -   < S[        < S	3U5        GMM     g
g
)zQ
Validate annotations stored by the :class:`GtkDocAnnotatable` instance, if any.
_do_validate_-_zunexpected annotation: zunknown annotation: zcannot have both "r9   z" and "z	" presentN)rU   r<   itemsvalid_annotationsgetattrreplaceALL_ANNOTATIONSr   ANN_NOTOPT_NOT_NULLABLEANN_NULLABLEANN_ALLOW_NONEOPT_NOT_OPTIONALANN_OPTIONAL)r@   r<   ann_nameoptionsvalidates        rC   rm   GtkDocAnnotatable.validatec  sN   
 ''00H%)%5%5%;%;%=!555&t_x?O?OPSUX?Y-YZHX90 CXN X@(K w&+;w+F#t'7'77%m.>>N%' &)9)99%m.>>P%'
 w&+;w+F#t'7'77%m.>>N%'9 &> rE   c                     US:X  a  SnOSU4-  nUS:X  a  SnOUS:X  a  SnOSU4-  nU" X45      (       a  [        SU< S	U< S
U< SU< S3	U5        gg)a  
Validate the number of options held by an annotation according to the test
``operator(n_options, expected_n_options)``.

:param position: :class:`giscanner.message.Position` of the line in the source file
                 containing the annotation to be validated
:param ann_name: name of the annotation holding the options to validate
:param n_options: number of options held by the annotation
:param expected_n_options: number of expected options
:param operator: an operator function from python's :mod:`operator` module, for example
                 :func:`operator.ne` or :func:`operator.lt`
:param message: warning message used when the test
                ``operator(n_options, expected_n_options)`` fails.
r   r7   z%dz
no optionsr
   z
one optionz
%d options"z" annotation r9   z, z givenN)r   )	r@   r<   rk   	n_optionsexpected_n_optionsoperatormessagetss	            rC   _validate_options#GtkDocAnnotatable._validate_options  sh    " >A	}$A"A1$A 255AI22hANPXY 3rE   c                    [        U5      nUb  U R                  UX(U[        S5        Ub  U R                  UX(U[        S5        Ub  U R                  UX(U[        S5        U(       a%  Ub!  US   n	X;  a  [        SU< SU	< S3U5        gggg)	a  
Validate an annotation.

:param position: :class:`giscanner.message.Position` of the line in the source file
                 containing the annotation to be validated
:param ann_name: name of the annotation holding the options to validate
:param options: annotation options to be validated
:param choices: an iterable of allowed option names or :const:`None` to skip this test
:param exact_n_options: exact number of expected options or :const:`None` to skip this test
:param min_n_options: minimum number of expected options or :const:`None` to skip this test
:param max_n_options: maximum number of expected options or :const:`None` to skip this test
Nneedsztakes at leastztakes at mostr   	invalid "" annotation option: "rp   )lenrw   r   r   r   r   )
r@   r<   rk   rl   choicesexact_n_optionsmin_n_optionsmax_n_optionsrq   options
             rC   _validate_annotation&GtkDocAnnotatable._validate_annotation  s     L	&""8#+WV $""8#+rK[] $""8#+r?\ w*QZF$xPRZ[ % +7rE   c                 &    U R                  XUSS9  g)a=  
Validate the ``(allow-none)`` annotation.

:param position: :class:`giscanner.message.Position` of the line in the source file
                 containing the annotation to be validated
:param ann_name: name of the annotation holding the options to validate
:param options: annotation options held by the annotation
r   r   Nr   r@   r<   rk   rl   s       rC   _do_validate_allow_none)GtkDocAnnotatable._do_validate_allow_none       	!!(gq!QrE   c                    [        U5      S:X  a  gUR                  5        H  u  pEU[        :X  a   [        U5        M  U[        :X  a(  Ub#  US	;  a  [        SU< SU< SU< S
3U5        MK  MM  MO  U[        :X  a  Uc  [        SU< S3U5        Mo  Mq  [        SU< SU< S3U5        M     g! [        [
        4 a8    Uc  [        SU< SU< S3U5         M  [        SU< SU< SU< S3U5         M  f = f)a8  
Validate the ``(array)`` annotation.

:param position: :class:`giscanner.message.Position` of the line in the source file
                 containing the annotation to be validated
:param ann_name: name of the annotation holding the options to validate
:param options: annotation options held by the annotation
r   Nrp   z" annotation option "z" needs a valuer{   z	" value "z", must be an integer)01z", must be 0 or 1z*" annotation option "length" needs a valuer|   )	r}   r`   OPT_ARRAY_FIXED_SIZEint	TypeError
ValueErrorr   OPT_ARRAY_ZERO_TERMINATEDOPT_ARRAY_LENGTH)r@   r<   rk   rl   r   r   s         rC   _do_validate_array$GtkDocAnnotatable._do_validate_array  s     w<1$]]_MF--	'J 44$j)@"FE3!# *A$ ++=HW!# ! xP- - ":. '}HV\]%' &7%''s   B,,(C4C43C4c                 &    U R                  XUSS9  g)a2  
Validate the ``(async-func)`` annotation.

:param position: :class:`giscanner.message.Position` of the line in the source file
                 containing the annotation to be validated
:param ann_name: name of the annotation holding the options to validate
:param options: annotation options to validate
r
   r   Nr   r   s       rC   _do_validate_async_func)GtkDocAnnotatable._do_validate_async_func  r   rE   c                     g)a2  
Validate the ``(attributes)`` annotation.

:param position: :class:`giscanner.message.Position` of the line in the source file
                 containing the annotation to be validated
:param ann_name: name of the annotation holding the options to validate
:param options: annotation options to validate
NrR   r   s       rC   _do_validate_attributes)GtkDocAnnotatable._do_validate_attributes       	rE   c                 &    U R                  XUSS9  g)a/  
Validate the ``(closure)`` annotation.

:param position: :class:`giscanner.message.Position` of the line in the source file
                 containing the annotation to be validated
:param ann_name: name of the annotation holding the options to validate
:param options: annotation options to validate
r
   )r   Nr   r   s       rC   _do_validate_closure&GtkDocAnnotatable._do_validate_closure  s     	!!(gQ!OrE   c                 &    U R                  XUSS9  g)a3  
Validate the ``(constructor)`` annotation.

:param position: :class:`giscanner.message.Position` of the line in the source file
                 containing the annotation to be validated
:param ann_name: name of the annotation holding the options to validate
:param options: annotation options to validate
r   r   Nr   r   s       rC   _do_validate_constructor*GtkDocAnnotatable._do_validate_constructor$  r   rE   c                 &    U R                  XUSS9  g)a1  
Validate the ``(copy-func)`` annotation.

:param position: :class:`giscanner.message.Position` of the line in the source file
                 containing the annotation to be validated
:param ann_name: name of the annotation holding the options to validate
:param options: annotation options to validate
r
   r   Nr   r   s       rC   _do_validate_copy_func(GtkDocAnnotatable._do_validate_copy_func0  r   rE   c                     g)a5  
Validate the ``(default-value)`` annotation.

:param position: :class:`giscanner.message.Position` of the line in the source file
                 containing the annotation to be validated
:param ann_name: name of the annotation holding the options to validate
:param options: annotation options to validate
NrR   r   s       rC   _do_validate_default_value,GtkDocAnnotatable._do_validate_default_value<  r   rE   c                 &    U R                  XUSS9  g)a/  
Validate the ``(destroy)`` annotation.

:param position: :class:`giscanner.message.Position` of the line in the source file
                 containing the annotation to be validated
:param ann_name: name of the annotation holding the options to validate
:param options: annotation options to validate
r
   r   Nr   r   s       rC   _do_validate_destroy&GtkDocAnnotatable._do_validate_destroyI  r   rE   c                 (    U R                  XUSSS9  g)a/  
Validate the ``(element)`` annotation.

:param position: :class:`giscanner.message.Position` of the line in the source file
                 containing the annotation to be validated
:param ann_name: name of the annotation holding the options to validate
:param options: annotation options to validate
r
   r   )r   r   Nr   r   s       rC   _do_validate_element_type+GtkDocAnnotatable._do_validate_element_typeU  s     	!!(gQ^_!`rE   c                 &    U R                  XUSS9  g)a/  
Validate the ``(emitter)`` annotation.

:param position: :class:`giscanner.message.Position` of the line in the source file
                 containing the annotation to be validated
:param ann_name: name of the annotation holding the options to validate
:param options: annotation options to validate
r
   r   Nr   r   s       rC   _do_validate_emitter&GtkDocAnnotatable._do_validate_emittera  r   rE   c                 &    U R                  XUSS9  g)a3  
Validate the ``(finish-func)`` annotation.

:param position: :class:`giscanner.message.Position` of the line in the source file
                 containing the annotation to be validated
:param ann_name: name of the annotation holding the options to validate
:param options: annotation options to validate
r
   r   Nr   r   s       rC   _do_validate_finish_func*GtkDocAnnotatable._do_validate_finish_funcm  r   rE   c                 &    U R                  XUSS9  g)a/  
Validate the ``(foreign)`` annotation.

:param position: :class:`giscanner.message.Position` of the line in the source file
                 containing the annotation to be validated
:param ann_name: name of the annotation holding the options to validate
:param options: annotation options to validate
r   r   Nr   r   s       rC   _do_validate_foreign&GtkDocAnnotatable._do_validate_foreigny  r   rE   c                 &    U R                  XUSS9  g)a1  
Validate the ``(free-func)`` annotation.

:param position: :class:`giscanner.message.Position` of the line in the source file
                 containing the annotation to be validated
:param ann_name: name of the annotation holding the options to validate
:param options: annotation options to validate
r
   r   Nr   r   s       rC   _do_validate_free_func(GtkDocAnnotatable._do_validate_free_func  r   rE   c                 &    U R                  XUSS9  g)a4  
Validate the ``(get-property)`` annotation.

:param position: :class:`giscanner.message.Position` of the line in the source file
                 containing the annotation to be validated
:param ann_name: name of the annotation holding the options to validate
:param options: annotation options to validate
r
   r   Nr   r   s       rC   _do_validate_get_property+GtkDocAnnotatable._do_validate_get_property  r   rE   c                 &    U R                  XUSS9  ga2  
Validate the ``(value-func)`` annotation.

:param position: :class:`giscanner.message.Position` of the line in the source file
                 containing the annotation to be validated
:param ann_name: name of the annotation holding the options to validate
:param options: annotation options to validate
r
   r   Nr   r   s       rC   _do_validate_get_value_func-GtkDocAnnotatable._do_validate_get_value_func  r   rE   c                 &    U R                  XUSS9  g)a.  
Validate the ``(getter)`` annotation.

:param position: :class:`giscanner.message.Position` of the line in the source file
                 containing the annotation to be validated
:param ann_name: name of the annotation holding the options to validate
:param options: annotation options to validate
r
   r   Nr   r   s       rC   _do_validate_getter%GtkDocAnnotatable._do_validate_getter  r   rE   c                 &    U R                  XUSS9  g)a*  
Validate the ``(in)`` annotation.

:param position: :class:`giscanner.message.Position` of the line in the source file
                 containing the annotation to be validated
:param ann_name: name of the annotation holding the options to validate
:param options: annotation options to validate
r   r   Nr   r   s       rC   _do_validate_in!GtkDocAnnotatable._do_validate_in  r   rE   c                 &    U R                  XUSS9  g)a.  
Validate the ``(in-out)`` annotation.

:param position: :class:`giscanner.message.Position` of the line in the source file
                 containing the annotation to be validated
:param ann_name: name of the annotation holding the options to validate
:param options: annotation options to validate
r   r   Nr   r   s       rC   _do_validate_inout$GtkDocAnnotatable._do_validate_inout  r   rE   c                 &    U R                  XUSS9  g)a.  
Validate the ``(method)`` annotation.

:param position: :class:`giscanner.message.Position` of the line in the source file
                 containing the annotation to be validated
:param ann_name: name of the annotation holding the options to validate
:param options: annotation options to validate
r   r   Nr   r   s       rC   _do_validate_method%GtkDocAnnotatable._do_validate_method  r   rE   c                 &    U R                  XUSS9  g)a;  
Validate the ``(nullable)`` annotation.

:param position: :class:`giscanner.message.Position` of the line in the source file
                 containing the annotation to be validated
:param ann_name: name of the annotation holding the options to validate
:param options: annotation options held by the annotation
r   r   Nr   r   s       rC   _do_validate_nullable'GtkDocAnnotatable._do_validate_nullable  r   rE   c                 &    U R                  XUSS9  g)a;  
Validate the ``(optional)`` annotation.

:param position: :class:`giscanner.message.Position` of the line in the source file
                 containing the annotation to be validated
:param ann_name: name of the annotation holding the options to validate
:param options: annotation options held by the annotation
r   r   Nr   r   s       rC   _do_validate_optional'GtkDocAnnotatable._do_validate_optional  r   rE   c                 0    U R                  XUS[        S9  g)a6  
Validate the ``(not)`` annotation.

:param position: :class:`giscanner.message.Position` of the line in the source file
                 containing the annotation to be validated
:param ann_name: name of the annotation holding the options to validate
:param options: annotation options held by the annotation
r
   r   r~   N)r   NOT_OPTIONSr   s       rC   _do_validate_not"GtkDocAnnotatable._do_validate_not  s      	!!(gq*5 	" 	7rE   c                 0    U R                  XUS[        S9  g)a+  
Validate the ``(out)`` annotation.

:param position: :class:`giscanner.message.Position` of the line in the source file
                 containing the annotation to be validated
:param ann_name: name of the annotation holding the options to validate
:param options: annotation options to validate
r
   )r   r~   N)r   OUT_OPTIONSr   s       rC   _do_validate_out"GtkDocAnnotatable._do_validate_out  s      	!!(gQ*5 	" 	7rE   c                 &    U R                  XUSS9  g)a0  
Validate the ``(ref-func)`` annotation.

:param position: :class:`giscanner.message.Position` of the line in the source file
                 containing the annotation to be validated
:param ann_name: name of the annotation holding the options to validate
:param options: annotation options to validate
r
   r   Nr   r   s       rC   _do_validate_ref_func'GtkDocAnnotatable._do_validate_ref_func  r   rE   c                 &    U R                  XUSS9  g)a1  
Validate the ``(rename-to)`` annotation.

:param position: :class:`giscanner.message.Position` of the line in the source file
                 containing the annotation to be validated
:param ann_name: name of the annotation holding the options to validate
:param options: annotation options to validate
r
   r   Nr   r   s       rC   _do_validate_rename_to(GtkDocAnnotatable._do_validate_rename_to  r   rE   c                 0    U R                  XUS[        S9  g)a-  
Validate the ``(scope)`` annotation.

:param position: :class:`giscanner.message.Position` of the line in the source file
                 containing the annotation to be validated
:param ann_name: name of the annotation holding the options to validate
:param options: annotation options to validate
r
   r   N)r   SCOPE_OPTIONSr   s       rC   _do_validate_scope$GtkDocAnnotatable._do_validate_scope#  s      	!!(gq*7 	" 	9rE   c                 &    U R                  XUSS9  g)a4  
Validate the ``(set-property)`` annotation.

:param position: :class:`giscanner.message.Position` of the line in the source file
                 containing the annotation to be validated
:param ann_name: name of the annotation holding the options to validate
:param options: annotation options to validate
r
   r   Nr   r   s       rC   _do_validate_set_property+GtkDocAnnotatable._do_validate_set_property0  r   rE   c                 &    U R                  XUSS9  gr   r   r   s       rC   _do_validate_set_value_func-GtkDocAnnotatable._do_validate_set_value_func<  r   rE   c                 &    U R                  XUSS9  g)a.  
Validate the ``(setter)`` annotation.

:param position: :class:`giscanner.message.Position` of the line in the source file
                 containing the annotation to be validated
:param ann_name: name of the annotation holding the options to validate
:param options: annotation options to validate
r
   r   Nr   r   s       rC   _do_validate_setter%GtkDocAnnotatable._do_validate_setterH  r   rE   c                 &    U R                  XUSS9  g)a,  
Validate the ``(skip)`` annotation.

:param position: :class:`giscanner.message.Position` of the line in the source file
                 containing the annotation to be validated
:param ann_name: name of the annotation holding the options to validate
:param options: annotation options to validate
r   r   Nr   r   s       rC   _do_validate_skip#GtkDocAnnotatable._do_validate_skipT  r   rE   c                 &    U R                  XUSS9  g)a1  
Validate the ``(sync-func)`` annotation.

:param position: :class:`giscanner.message.Position` of the line in the source file
                 containing the annotation to be validated
:param ann_name: name of the annotation holding the options to validate
:param options: annotation options to validate
r
   r   Nr   r   s       rC   _do_validate_sync_func(GtkDocAnnotatable._do_validate_sync_func`  r   rE   c                 0    U R                  XUS[        S9  g)a0  
Validate the ``(transfer)`` annotation.

:param position: :class:`giscanner.message.Position` of the line in the source file
                 containing the annotation to be validated
:param ann_name: name of the annotation holding the options to validate
:param options: annotation options to validate
r
   r   N)r   TRANSFER_OPTIONSr   s       rC   _do_validate_transfer'GtkDocAnnotatable._do_validate_transferl  s      	!!(gq*: 	" 	<rE   c                 &    U R                  XUSS9  g)a,  
Validate the ``(type)`` annotation.

:param position: :class:`giscanner.message.Position` of the line in the source file
                 containing the annotation to be validated
:param ann_name: name of the annotation holding the options to validate
:param options: annotation options to validate
r
   r   Nr   r   s       rC   _do_validate_type#GtkDocAnnotatable._do_validate_typey  r   rE   c                 &    U R                  XUSS9  g)a2  
Validate the ``(unref-func)`` annotation.

:param position: :class:`giscanner.message.Position` of the line in the source file
                 containing the annotation to be validated
:param ann_name: name of the annotation holding the options to validate
:param options: annotation options to validate
r
   r   Nr   r   s       rC   _do_validate_unref_func)GtkDocAnnotatable._do_validate_unref_func  r   rE   c                 &    U R                  XUSS9  g)a-  
Validate the ``(value)`` annotation.

:param position: :class:`giscanner.message.Position` of the line in the source file
                 containing the annotation to be validated
:param ann_name: name of the annotation holding the options to validate
:param options: annotation options to validate
r
   r   Nr   r   s       rC   _do_validate_value$GtkDocAnnotatable._do_validate_value  r   rE   c                 &    U R                  XUSS9  g)a/  
Validate the ``(virtual)`` annotation.

:param position: :class:`giscanner.message.Position` of the line in the source file
                 containing the annotation to be validated
:param ann_name: name of the annotation holding the options to validate
:param options: annotation options to validate
r
   r   Nr   r   s       rC   _do_validate_virtual&GtkDocAnnotatable._do_validate_virtual  r   rE   )rU   r<   rW   )NNNN)2rK   rL   rM   rN   rO   rP   ra   r?   rZ   rm   rw   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  rQ   rR   rE   rC   rT   rT   K  s    ,I
 /A&'PZ@ IMUY \D
R$L
R
P
R
R
R
a
R
R
R
R
R
R
R
R
R
R
R
R77
R
R9
R
R
R
R
R<
R
R
R
RrE   rT   c                   P    \ rS rSrSrSr\\\\	\
\\\\\\\\\\\4rSS jrS rSrg)	GtkDocParameteri  z&
Represents a GTK-Doc parameter part.
)namer   Nc                 H    [         R                  X5        Xl        S U l        g rW   )rT   r?   r	  r   r@   r	  r<   s      rC   r?   GtkDocParameter.__init__  s!    ""42 	  rE   c                 @    SU R                   < SU R                  < S3$ )Nz<GtkDocParameter '' >r	  rU   rH   s    rC   rZ   GtkDocParameter.__repr__  s    .2ii9I9IJJrE   )r   r	  rW   )rK   rL   rM   rN   rO   rP   rh   	ANN_ARRAYANN_ATTRIBUTESANN_CLOSUREANN_DESTROYANN_ELEMENT_TYPEANN_IN	ANN_INOUTANN_OUT	ANN_SCOPEANN_SKIPANN_TRANSFERANN_TYPErj   rg   re   ra   r?   rZ   rQ   rR   rE   rC   r  r    sS     (I 	!& KrE   r  c            
       D    \ rS rSrSrSr\\\\	\
\\\\\4
rSS jrS rSrg)		GtkDocTagi  z 
Represents a GTK-Doc tag part.
)r	  r   r   Nc                 V    [         R                  X5        Xl        S U l        S U l        g rW   )rT   r?   r	  r   r   r  s      rC   r?   GtkDocTag.__init__  s*    ""42 	 
  rE   c                 @    SU R                   < SU R                  < S3$ )Nz<GtkDocTag 'r  r  r  rH   s    rC   rZ   GtkDocTag.__repr__  s    (,		43C3CDDrE   )r   r	  r   rW   )rK   rL   rM   rN   rO   rP   rh   r  r  r  r  r  r  rg   rj   re   ra   r?   rZ   rQ   rR   rE   rC   r  r    sA     1I 	
 ErE   r  c                       \ rS rSrSrSr\\\\	\
\\\\\\\\\\\\\\\\\\\\4rSS jr S r!S r"S r#S	 r$S
 r%S r&S r'S r(S r)S r*Sr+g)GtkDocCommentBlocki  z%
Represents a GTK-Doc comment block.
)code_before
code_afterindentationr	  paramsr   tagsNc                     [         R                  X5        S U l        S U l        / U l        Xl        [        5       U l        S U l        [        5       U l	        g rW   )
rT   r?   r&  r'  r(  r	  r   r)  r   r*  r  s      rC   r?   GtkDocCommentBlock.__init__  sT    ""42     	 "m    M	rE   c                 <    U" U R                   UR                   5      $ rW   )r	  )r@   otherops      rC   _compareGtkDocCommentBlock._compare5  s     $))UZZ((rE   c                 B    U R                  U[        R                  5      $ rW   )r0  rs   r   r@   r.  s     rC   __lt__GtkDocCommentBlock.__lt__;      }}UHKK00rE   c                 B    U R                  U[        R                  5      $ rW   )r0  rs   r   r3  s     rC   __gt__GtkDocCommentBlock.__gt__>  r6  rE   c                 B    U R                  U[        R                  5      $ rW   )r0  rs   ger3  s     rC   __ge__GtkDocCommentBlock.__ge__A  r6  rE   c                 B    U R                  U[        R                  5      $ rW   )r0  rs   ler3  s     rC   __le__GtkDocCommentBlock.__le__D  r6  rE   c                 B    U R                  U[        R                  5      $ rW   )r0  rs   eqr3  s     rC   __eq__GtkDocCommentBlock.__eq__G  r6  rE   c                 B    U R                  U[        R                  5      $ rW   )r0  rs   r   r3  s     rC   __ne__GtkDocCommentBlock.__ne__J  r6  rE   c                 ,    [        U R                  5      $ rW   )hashr	  rH   s    rC   __hash__GtkDocCommentBlock.__hash__M  s    DIIrE   c                 @    SU R                   < SU R                  < S3$ )Nz<GtkDocCommentBlock 'r  r  r  rH   s    rC   rZ   GtkDocCommentBlock.__repr__P  s    15D<L<LMMrE   c                     [         R                  U 5        U R                  R                  5        H  nUR                  5         M     U R                  R                  5        H  nUR                  5         M     g)zb
Validate annotations applied to the :class:`GtkDocCommentBlock` identifier, parameters
and tags.
N)rT   rm   r)  valuesr*  )r@   paramtags      rC   rm   GtkDocCommentBlock.validateS  sU    
 	""4([['')ENN * 99##%CLLN &rE   )r'  r&  r   r(  r	  r)  r*  rW   ),rK   rL   rM   rN   rO   rP   r  ANN_ASYNC_FUNCANN_CONSTRUCTORANN_COPY_FUNCANN_DEFAULT_VALUEANN_EMITTERANN_FINISH_FUNCANN_FOREIGNANN_FREE_FUNCANN_GET_PROPERTYANN_GET_VALUE_FUNC
ANN_GETTER
ANN_METHODANN_REF_FUNCANN_RENAME_TOANN_SET_PROPERTYANN_SET_VALUE_FUNC
ANN_SETTERr  ANN_SYNC_FUNCr  r  ANN_UNREF_FUNC	ANN_VALUE	ANN_VFUNCra   r?   r0  r4  r8  r<  r@  rD  rG  rK  rZ   rm   rQ   rR   rE   rC   r%  r%    s    :I
 	38"6)111111NrE   r%  _ParseAnnotationsResult)successrU   annotations_changed	start_posend_pos_ParseFieldsResult)rj  rU   rk  r   c                   \    \ rS rSrSrS rS rS rS rS r	S r
S	 r SS jr  SS jrSrg
)GtkDocCommentBlockParserin  a  
Parse GTK-Doc comment blocks into a parse tree built out of :class:`GtkDocCommentBlock`,
:class:`GtkDocParameter`, :class:`GtkDocTag` and :class:`GtkDocAnnotations`
objects. This parser tries to accept malformed input whenever possible and does
not cause the process to exit on syntax errors. It does however emit:

    * warning messages at the slightest indication of recoverable malformed input and
    * error messages for unrecoverable malformed input

whenever possible. Recoverable, in this context, means that we can serialize the
:class:`GtkDocCommentBlock` instance using a :class:`GtkDocCommentBlockWriter` without
information being lost. It is usually a good idea to heed these warning and error messages
as malformed input can result in both:

    * invalid GTK-Doc output (HTML, pdf, ...) when the comment blocks are parsed
      with GTK-Doc's gtkdoc-mkdb
    * unexpected introspection behavior, for example missing parameters in the
      generated .gir and .typelib files

.. NOTE:: :class:`GtkDocCommentBlockParser` functionality is based on gtkdoc-mkdb's
    `ScanSourceFile()`_ function.

.. _ScanSourceFile():
       http://git.gnome.org/browse/gtk-doc/tree/gtkdoc-mkdb.in#n3722
c           	         0 nU H  u  p4n U R                  X4U5      nUc  M  UR
                  U;   a  X&R
                     n[        R                  R                  UR                  R                  5      n	[        SUR
                  < SUR                  R                  U	5      < S3UR                  5        XbUR
                  '   M     U$ ! [         a,  n[        S[        U5      -  [	        XE5      5         SnAM  SnAff = f)z
Parse multiple GTK-Doc comment blocks.

:param comments: an iterable of ``(comment, filename, lineno)`` tuples
:returns: a dictionary mapping identifier names to :class:`GtkDocCommentBlock` objects
zunrecoverable parse error, please file a GObject-Introspection bugreport including the complete comment block at the indicated location. %sNz%multiple comment blocks documenting 'z:' identifier (already seen at z).)parse_comment_block	Exceptionr   strr   r	  ospathdirnamer<   filenamer   format)
r@   commentscomment_blockscommentrx  linenocomment_blocke	firstseenrv  s
             rC   parse_comment_blocks-GtkDocCommentBlockParser.parse_comment_blocks  s     +3'W $ 8 8F S (
 !%%7 ./A/A BI77??9+=+=+F+FGD',,i.@.@.G.G.MO '//1
 6C}112/ ,42 -   b!f x02 s   C


D !C;;D c           
          SnSn[        X#5      n[        R                  " [        SU5      R	                  S5      n[        U5      n[        R                  US   5      n	U	(       a  US:X  a-  [        X#5      n
[        SU
SU	R                  S5      US   5        gU	R                  S5      nU	R                  S5      nU(       a,  [        X#5      n
[        S	U
SU	R                  S5      US   5        U(       a1  [        X#5      n
[        S
U
SU	R                  S5      US   5        XS'   OUS	 Og[        R                  US   5      n	U	(       a  U	R                  S5      nU	R                  S5      nU(       a2  [        X#U-   S-
  5      n
[        SU
SU	R                  S5      US   5        U(       a7  [        X#U-   S-
  5      n
[        SU
SU	R                  S5      US   5        XS'   OUS	 OgSnSn/ nSnSnSnSnSnU GHY  nUS-  n[        X#5      n
UnSn[        R                  U5      n	UR                  U	R                  S5      5        [         R                  U5      n	U	(       a[  U	R                  S5      nU(       a  [        SU
SU	R                  S5      U5        U	R                  S5      nUU	R                  S5      S n[        R                  U5      n	[        U	R                  S5      R#                  SS5      5      nUGcD  [$        R                  U5      n	U	(       a  SU	R                  S5      < 3nSnSnSnGO[&        R                  U5      n	U	(       a\  U	R                  S5      < SU	R                  S5      < 3nU	R                  S5      nU	R                  S5      nU	R                  S5      nGO[(        R                  U5      n	U	(       a\  U	R                  S5      < SU	R                  S5      < 3nU	R                  S5      nU	R                  S5      nU	R                  S5      nGO$[*        R                  U5      n	U	(       a/  SU	R                  S5      < SU	R                  S5      < 3nSnSnSnO[,        R                  U5      n	U	(       a[  U	R                  S5      < SU	R                  S5      < 3nU	R                  S5      nU	R                  S5      nU	R                  S5      nOb[.        R                  U5      n	U	(       aF  U	R                  S 5      < nU	R                  S5      nU	R                  S5      nU	R                  S5      nU	(       a  [0        nUn[3        WU5      nXKl        X[l        W(       a  U R9                  U
UW-   UU5      nUR:                  (       a  UUR<                  S R?                  5       (       a	  Sn	SnSnSnOTUR@                  Ul         W(       d<  UR@                  (       a+  UU	R                  S5      -   n[        S!US-   < S3U
SUU5        U	(       d  U(       d  S"n[        S#U
SUU5        GMK  [B        R                  U5      n	U	(       Ga  UnU	R                  S$5      nURE                  5       nU	R                  S5      nU	R                  S5      nU	R                  S$5      U-   nU[0        [F        4;  a  [        S%U< S&3U
SUU5        [F        nU[H        :X  a  [H        nU(       d  S"nO[        S'URJ                  < S(3U
5        [M        [H        U
5      n U(       aJ  U RO                  U
UU-   UU5      n	U	R:                  (       a"  U	R@                  U l         U	RP                  U l(        U URR                  [H        '   U nGM  US):X  d  URU                  S*5      (       a  US*:w  a  [        S%U< S+3U
SUU5        S*nUURV                  RY                  5       ;   a"  [        S,U< S-URJ                  < S.3U
SUU5        [[        UU
5      n!U(       aJ  U RO                  U
UU-   UU5      n	U	R:                  (       a"  U	R@                  U!l         U	RP                  U!l(        U!URV                  U'   U!nGM  [\        R                  U5      (       a  U[0        [F        4;   a  [^        nUnGM  [`        R                  U5      n	U	(       Ga  X::  Ga  UnU	R                  S/5      n"U"RE                  5       n#U	R                  S5      n$U	R                  S5      n%U	R                  S/5      U-   nU#[b        ;   Ga  [        S0U"< S13U
SUU5        U#R#                  S2S35      n&U#[d        :X  Ga6  Sn'U RO                  U
U	R                  S/5      U-   UU$R?                  5       SSS5      n	U	R:                  (       a  U	R@                   Hb  n(U Rg                  U
UUU(5      n)[        U)5      n*U*S:X  a  U'< S2U)S   < 3n'M6  U*S4:X  a  U'< S2U)S   < S5U)S   < 3n'MQ  [        S6U
SUU5        Sn'Md     U'(       ar  U&< S2U'R?                  5       < 3n'U Ri                  U
UU%-   UU'5      u  n&n+UR@                  Rk                  S75      n,U,(       a  [        S8U
SUU5        O@U+UR@                  U&'   O0U Ri                  U
UU%-   UU&< S2U$< 35      u  n&n-U-UR@                  U&'   GM  U#[l        :X  aF  [        S9U
SUU5        [^        nURP                  c  U$Ul(        OU=RP                  SU$< 3-  sl(        G	M(  U[^        :X  dG  U[F        :X  a  URP                  (       a,  U[0        :X  a(  URV                  (       d  URP                  (       d  [n        nU[n        :w  a  [n        n[        S:U"< S;3U
SUU5        U#[p        [H        [r        [t        4;   a  U(       d  S"nO[        S<URJ                  < S(3U
5        [M        [H        U
5      n U$(       aJ  U RO                  U
UU%-   UU$5      n	U	R:                  (       a"  U	R@                  U l         U	RP                  U l(        U URR                  [H        '   U nG
M[  U#URR                  RY                  5       ;   a"  [        S=U"< S>URJ                  < S.3U
SUU5        [M        U#U
5      n U$(       Ga	  U RO                  U
UU%-   UU$5      n	U	R:                  (       a  U	R@                  (       a  [        S?U"< S@3U
5        U#[v        [x        4;   aL  [z        R                  U	RP                  5      n	U	R                  SA5      U l>        U	R                  SB5      U l(        OcU#[~        :X  aY  [        R                  U	RP                  5      n	U	R                  SA5      R                  5       U l>        U	R                  SB5      U l(        U URR                  U#'   U nGM  [\        R                  U5      c  UR                  5       nU[0        [^        4;   a  URP                  (       d_  U[0        :X  aU  U R9                  U
UUUUR@                  5      n.U.R:                  (       a%  U.R                  (       a  U.R@                  Ul         GMr  URP                  c  UUl(        OU=RP                  SU-   -  sl(        GM  U[F        [n        4;   d  GM  URP                  (       df  U RO                  U
UUUUR@                  5      n.U.R:                  (       a6  U.R                  (       a%  U.R@                  Ul         U.RP                  Ul(        GM,  URP                  c  UUl(        OU=RP                  SU-   -  sl(        GM\     U(       a  URP                  (       a  URP                  R?                  5       Ul(        URR                  R                  5        H  n U R                  U 5        M     URV                  R                  5        H  n/U R                  U/5        M     XlF        UR                  5         U$ g)Ca  
Parse a single GTK-Doc comment block.

:param comment: string representing the GTK-Doc comment block including it's
                start ("``/**``") and end ("``*/``") tokens.
:param filename: source file name where the comment block originated from
:param lineno: line number in the source file where the comment block starts
:returns: a :class:`GtkDocCommentBlock` object or ``None``
 
r   r
   z'Skipping invalid GTK-Doc comment block:Ncoder|  zGGTK-Doc comment block start token "/**" should not be preceded by code:zOGTK-Doc comment block start token "/**" should not be followed by comment text:zDGTK-Doc comment block end token "*/" should not be followed by code:zLGTK-Doc comment block end token "*/" should not be preceded by comment text:Fr(  zinvalid comment text:	z  zSECTION:section_name
class_name:property_name	delimiterfieldsz::signal_namezACTION:action_name.
field_namesymbol_namemissing ":" at column Tz'identifier not found on the first line:parameter_namez"@z(" parameter unexpected at this location:z7encountered multiple "Returns" parameters or tags for "z".Varargsz...z5" parameter is deprecated, please use "@..." instead:zmultiple "@z" parameters for identifier "z":tag_namez,GObject-Introspection specific GTK-Doc tag "zH" has been deprecated, please use annotations on the identifier instead:r9   r^   r   =z,malformed "Attributes:" tag will be ignored:r   z3Duplicate "Attributes:" annotation will be ignored:z/GTK-Doc tag "Description:" has been deprecated:rp   z#:" tag unexpected at this location:z:encountered multiple return value parameters or tags for "
multiple "z:" tags for identifier "z#annotations not supported for tag "z:".r   r   )Hr   resubLINE_BREAK_REsplitr}   COMMENT_BLOCK_START_REmatchr   endgroupr   startCOMMENT_BLOCK_END_REINDENTATION_REappendCOMMENT_ASTERISK_RErc   
SECTION_REPROPERTY_RE	SIGNAL_RE	ACTION_REFIELD_RE	SYMBOL_REPART_IDENTIFIERr%  r&  r'  _parse_annotationsrj  rm  striprU   PARAMETER_RElowerPART_PARAMETERSTAG_RETURNSr	  r  _parse_fieldsr   r*  endswithr)  keysr  EMPTY_LINE_REPART_DESCRIPTIONTAG_REDEPRECATED_GI_ANN_TAGSTAG_ATTRIBUTES_parse_annotation_options_list_parse_annotationgetTAG_DESCRIPTION	PART_TAGS
TAG_RETURNTAG_RETURN_VALUETAG_RETURNS_VALUETAG_DEPRECATED	TAG_SINCETAG_VALUE_VERSION_REr   TAG_STABILITYTAG_VALUE_STABILITY_RE
capitalizerstriprk  rP  _clean_description_fieldr(  rm   )0r@   r|  rx  r}  r&  r'  comment_block_poscomment_linescomment_lines_lenresultr<   r~  identifier_warnedblock_indentline_indentpart_indentin_partcurrent_partreturns_seenlineoriginal_linecolumn_offsetidentifier_nameidentifier_delimiteridentifier_fieldsidentifier_fields_startres
marker_pos
param_nameparam_name_lowerparam_fieldsparam_fields_startrR  	parameterr  tag_name_lower
tag_fieldstag_fields_startrk   transformed
annotationann_optionsrq   docannotationstored_annotationrl   rrQ  s0                                                   rC   rr  ,GtkDocCommentBlockParser.parse_comment_block  s    
$X6}dG<BB4H. (--mA.>? A%#H5?tVZZ%7q9IK ,,v.Kll9-G#H5^tVZZ%7q9IK #H5 8tV\\)%<mA>NP $+a !!$  &++M",=>f-Jll9-G#H7H.H1.LM 0tVZZ%7r9JL #H7H.H1.LM 8tVZZ	%:M"<MO %,b!!"%  !!DaKF1H !MM $))$/F] ;< )..t4F ,,y11"D&,,y*A=R !'

1FJJqMN+ $))$/Ffll=9AA$MNK
 $#))$/6<ll>6R&UO+/((,%.2+(..t4F5;\\,5O5;\\/5R+T/5||K/H,,2LL,B)28,,x2H/!*!6!:@,,|:T:@,,}:U/WO39<<3L006X0F-6<ll86L3%.__T%:F%DJLLQ]D^HNUbHc3e7; 448 1:> 7)1)=#)AGlA[BH,,|B\7^O;A<<;T$88>X8N$5>Dll8>T$;-6__T-BF'-BH,,}B]?E||K?X(<<BLL<R(9BH,,xBX(?-G"-K$6HY$ZM0;-/9,("55h6CF]6]6C6GI
 ;;0>DDFF)-*..204<?OO 9';1>kAZ1ZJ$(
UV)Y)14]%T ,,0)G&m]L
 "''-F)#\\*:;
#-#3#3#5 %||H5%+\\(%;"#\\*:;mK
?O"DD:X!4]D *#{2!,J''+,115&( $K:C#!%!3!3H4ADV4V4A4@"B ">>.4.@.@CO.4.@.@CO69M&&{3#&L I-''..:3F$(!4]D "'J!5!5!:!:!<<%}'9'9;"D*mE ,JA	!//0=@R0R0=0<>F ~~060B0B	-060B0B	-3<$$Z0( ##D))g/?9[.[*)
 \\$'F+4)!<<
3!)!1#\\(3
#)<<#9 #\\*5E
!%;; '/3 "4]D  .55c3?H%7&(!%!3!3H4:LL4L}4\484>4D4D4F484949"; ">>.4.@.@
.2.Q.QRZR\RVR\/^ -0,<	#,>=H+VW.2[K%.!^@K[YZ^@KA3PK %**X*2D*m%U26K /A"  +9A;CTCTCV.W:>:P:P$,$14D$D$1$/	;1 7-
 5B4M4M4Q4QR^4_ 1#4$) +8*2D*m%U KXM$=$=h$G,0,B,B8?LO_?_?CJRT^?_-a)' ?F11(;#6J!4]D /G$0084>1%11z5LL1 //.}7P7P.}7K7K))'Gi''GXP!4]D "j+&68I&K K''+,115&( $K:C!!%!3!3H4ADT4T4A4>"@ ">>.4.@.@CO.4.@.@CO69M&&{3#&L%););)@)@)BB'););=&j-I $NH=C!!%!3!3H4ADT4T4A4>"@ ">>%11 %T\&_&.!0  ..)1LL)=)C)CFDVDV)W,2LL,A	28,,}2M!/=!@)?)E)EfFXFX)Y,2LL,A,L,L,N	28,,}2M9<M&&~6#&L ""4(0{{}?,<==$00/1 33Hm]\`4A4M4MO 99)>)>89M5$ ,,404M-!--<-_i88#//**8]MSW+7+C+CEAyyQ%:%:34==034==0 ++3/3L, ,,t;,S "\  ((,9,E,E,K,K,M)$))002--c2 3 '--446--e4 7 )5%""$  rE   c                 `   UR                   (       a  UR                   R                  5       S:X  a  SUl         g[        R                  UR                   R	                  SS5      S   5      (       a   UR                   R                  5       Ul         gUR                   R                  5       Ul         gg)z
Remove extraneous leading and trailing whitespace from description fields.

:param part: a GTK-Doc comment block part having a description field
r  Nr  r
   r   )r   r  r  r  r  r  )r@   parts     rC   r  1GtkDocCommentBlockParser._clean_description_field  s     %%'2-#'  &&t'7'7'='=dA'Fq'IJJ'+'7'7'>'>'@D$'+'7'7'='='?D$ rE   c                     / nU(       aM  UR                  S5      nUS:  a%  [        SUSX&-   U5        U R                  XX45      nU$ UR                  S5      nU$ )uC  
Parse annotation options into a list. For example::

    ┌──────────────────────────────────────────────────────────────┐
    │ 'option1 option2 option3'                                    │ ─▷ source
    ├──────────────────────────────────────────────────────────────┤
    │ ['option1', 'option2', 'option3']                            │ ◁─ parsed options
    └──────────────────────────────────────────────────────────────┘

:param position: :class:`giscanner.message.Position` of `line` in the source file
:param column: start column of the `options` in the source file
:param line: complete source line
:param options: annotation options to parse
:returns: a list of annotation options
r  r   zMinvalid annotation options: expected a "list" but received "key=value pairs":Nr9   )findr   !_parse_annotation_options_unknownr  )r@   r<   columnr  rl   parsedr  s          rC   r  7GtkDocCommentBlockParser._parse_annotation_options_list  sj    " \\#&F{ 3tV_d< ??RV`  !s+rE   c                     [        5       nU(       aI  UR                  S5       H4  nUR                  SS5      nUS   n[        U5      S:X  a  US   OSn	XU'   M6     U$ )uR  
Parse annotation options into a dict. For example::

    ┌──────────────────────────────────────────────────────────────┐
    │ 'option1=value1 option2 option3=value2'                      │ ─▷ source
    ├──────────────────────────────────────────────────────────────┤
    │ {'option1': 'value1', 'option2': None, 'option3': 'value2'}  │ ◁─ parsed options
    └──────────────────────────────────────────────────────────────┘

:param position: :class:`giscanner.message.Position` of `line` in the source file
:param column: start column of the `options` in the source file
:param line: complete source line
:param options: annotation options to parse
:returns: an ordered dictionary of annotation options
r9   r  r
   r   r   N)r   r  r}   )
r@   r<   r  r  rl   r  ppartskeyr   s
             rC   _parse_annotation_options_dict7GtkDocCommentBlockParser._parse_annotation_options_dict  s\    " ]]3'QAh$'J!Oa#s	 ( rE   c                 4    U(       a  UR                  5       /$ g)u  
Parse annotation options into a list holding a single item. This is used when the
annotation options to parse in not known to be a list nor dict. For example::

    ┌──────────────────────────────────────────────────────────────┐
    │ '   option1 option2   option3=value1   '                     │ ─▷ source
    ├──────────────────────────────────────────────────────────────┤
    │ ['option1 option2   option3=value1']                         │ ◁─ parsed options
    └──────────────────────────────────────────────────────────────┘

:param position: :class:`giscanner.message.Position` of `line` in the source file
:param column: start column of the `options` in the source file
:param line: complete source line
:param options: annotation options to parse
:returns: a list of annotation options
N)r  )r@   r<   r  r  rl   s        rC   r  :GtkDocCommentBlockParser._parse_annotation_options_unknown  s    $ MMO$$ rE   c                    UR                  S[        5      R                  S[        5      nUR                  SS5      nUS   R	                  5       n[        U5      S:X  a  US   OSnU[        :X  a&  [        S[        < S	[        < S
3USX#5        [        nO}U[        :X  as  [        S[        < S	[        < S
3USX#5        [        nU R                  XX75      n[        U5      nUS:X  a  US   nO%US:X  a  US   < SUS   < 3nO[        SUSX#5        gU[        U5      S-   -  nU[        ;   a  U R                  XX75      nXg4$ U[        ;   a  U R                  XX75      nXg4$ U R!                  XUU5      nXg4$ )u
  
Parse an annotation into the annotation name and a list or dict (depending on the
name of the annotation) holding the options. For example::

    ┌──────────────────────────────────────────────────────────────┐
    │ 'name opt1=value1 opt2=value2 opt3'                          │ ─▷ source
    ├──────────────────────────────────────────────────────────────┤
    │ 'name', {'opt1': 'value1', 'opt2':'value2', 'opt3':None}     │ ◁─ parsed annotation
    └──────────────────────────────────────────────────────────────┘

    ┌──────────────────────────────────────────────────────────────┐
    │ 'name   opt1 opt2'                                           │ ─▷ source
    ├──────────────────────────────────────────────────────────────┤
    │ 'name', ['opt1', 'opt2']                                     │ ◁─ parsed annotation
    └──────────────────────────────────────────────────────────────┘

    ┌──────────────────────────────────────────────────────────────┐
    │ 'unkownname   unknown list of options'                       │ ─▷ source
    ├──────────────────────────────────────────────────────────────┤
    │ 'unkownname', ['unknown list of options']                    │ ◁─ parsed annotation
    └──────────────────────────────────────────────────────────────┘

:param position: :class:`giscanner.message.Position` of `line` in the source file
:param column: start column of the `annotation` in the source file
:param line: complete source line
:param annotation: annotation to parse
:returns: a tuple containing the annotation name and options
<r  r9   r
   r   r   Nrp   z." annotation has been deprecated, please use "z
" instead:r  z3malformed "(attribute)" annotation will be ignored:)NN)rc   ANN_LPARANN_RPARr  r  r}   ANN_INOUT_ALTr   r  ANN_ATTRIBUTEr  r  r   LIST_ANNOTATIONSDICT_ANNOTATIONSr  r  )	r@   r<   r  r  r  r  rk   r  rq   s	            rC   r  *GtkDocCommentBlockParser._parse_annotation  s   >  ''X6>>sHM
  a(8>>#"%e*/eAht}$,4/ !H&14/ &H==hPTbKK(IA~)!na)4QQHKf4!#h-!##''==hPTbK $$ ))==hPTbK
 $$ @@SWALNK $$rE   Nc           	      v   U(       a  Uc
  [        US9nOUR                  5       nO/ nSnSn	Sn
Sn/ nSnSn[        U5       GH  u  pUR                  5       nU[        :X  aR  U
S-  n
U
S:X  a  U	nU[        :X  a"  [        SUSX)-   U5        [        SSSSS5      s  $ U
S:  a  UR                  U5        GONU[        :X  Ga  U
S-  n
U[        :X  a"  [        SUSX)-   U5        [        SSSSS5      s  $ U
S:  a"  [        SUSX)-   U5        [        SSSSS5      s  $ U
S:X  a  U	S-   nUS	L a]  U R                  UX--   USR                  U5      R                  5       5      u  nnUb#  UU;   a  [        S
U< S3USX)-   U5        UUU'   S	nO0UR                  SR                  U5      R                  5       5        S	n/ nOJUR                  U5        O8U(       a  U
S:  a  UR                  U5        OU
S:X  a    OUR                  U5        UnGM     U
S:  a   [        SUSX)-   U5        [        SSSSS5      $ [        S	XxX5      $ )a  
Parse annotations into a :class:`GtkDocAnnotations` object.

:param position: :class:`giscanner.message.Position` of `line` in the source file
:param column: start column of the `annotations` in the source file
:param line: complete source line
:param fields: string containing the fields to parse
:param annotations: a :class:`GtkDocAnnotations` object
:param parse_options: whether options will be parsed into a :class:`GtkDocAnnotations`
                      object or into a :class:`list`
:returns: if `parse_options` evaluates to True a :class:`GtkDocAnnotations` object,
          a :class:`list` otherwise. If `line` does not contain any annotations,
          :const:`None`
NrG   Fr   r  r
   z4unexpected parentheses, annotations will be ignored:z4unbalanced parentheses, annotations will be ignored:Tr  z" annotations:)r;   copy	enumerateisspacer  r   ri  r  r  r  joinr  )r@   r<   r  r  r  rU   parse_optionsparsed_annotationsparsed_annotations_changediparens_level	prev_charchar_bufferrl  rm  cur_charcur_char_is_spacer	  rl   s                      rC   r  +GtkDocCommentBlockParser._parse_annotationsI  s   " "%6%I"%0%5%5%7"!#%*"		$V,KA ( 0 0 28#!1$ !I(P"D&*d<25$dDQQ!A%&&x0X%!(P"D&*d<25$dDQQ!A%P"D&*d<25$dDQQ!Q&!eG$,(,(>(>x?E?Q?C?Aww{?S?Y?Y?[)]g  +#'99 %d&M&.fj$!H7>.t49=6*11"''+2F2L2L2NO592"$K&&x0"!#&&x01$&&x0 Iq -t !HD&*d4*5$dDII*41C+4? ?rE   c                    SnU R                  XX4XV5      n	U	R                  (       az  XIR                  S R                  5       nU(       aW  U(       aP  UR	                  S5      (       a  USS nO4U	R                  S:  a$  X)R                  -   n
[        SU
S-   < S3USX5        [        U	R                  U	R                  U	R                  U5      $ )u  
Parse annotations out of field data. For example::

    ┌──────────────────────────────────────────────────────────────┐
    │ '(skip): description of some parameter'                      │ ─▷ source
    ├──────────────────────────────────────────────────────────────┤
    │ ({'skip': []}, 'description of some parameter')              │ ◁─ annotations and
    └──────────────────────────────────────────────────────────────┘    remaining fields

:param position: :class:`giscanner.message.Position` of `line` in the source file
:param column: start column of `fields` in the source file
:param line: complete source line
:param fields: string containing the fields to parse
:param parse_options: whether options will be parsed into a :class:`GtkDocAnnotations`
                      object or into a :class:`list`
:param validate_description_field: :const:`True` to validate the description field
:returns: if `parse_options` evaluates to True a :class:`GtkDocAnnotations` object,
          a :class:`list` otherwise. If `line` does not contain any annotations,
          :const:`None` and a string holding the remaining fields
r  Nr  r
   r   r  )	r  rj  rm  r  
startswithr   rn  rU   rk  )r@   r<   r  r  r  rU   r  validate_description_fielddescription_fieldr  r  s              rC   r  &GtkDocCommentBlockParser._parse_fields  s    , ((4)4E>> &~~ 7 = = ? %?$//44(9!"(=%~~)%+nn%<
JNM%tZ? "&..&2D2DfF`F`"35 	5rE   rR   )NT)NTT)rK   rL   rM   rN   rO   r  rr  r  r  r  r  r  r  r  rQ   rR   rE   rC   rp  rp  n  sL    4#Jqf@ >8%*F%R <@b?H IMEI&5rE   rp  c                   :    \ rS rSrSrS
S jrS rS rS rS r	Sr
g	)GtkDocCommentBlockWriteri  zM
Serialized :class:`GtkDocCommentBlock` objects into GTK-Doc comment blocks.
c                     Xl         g rW   indent)r@   r!  s     rC   r?   !GtkDocCommentBlockWriter.__init__  s	     rE   c                    / nUR                  5        H  u  p4U(       a  [        U[        5      (       a  SR                  U5      nOHSnUR                  5        H"  u  pgU(       a  XV< SU< S3-  nM  XV< S3-  nM$     UR	                  5       nUR                  SU< SU< S35        M  UR                  SU< S35        M     SR                  U5      $ )u	  
Serialize an annotation field. For example::

    ┌──────────────────────────────────────────────────────────────┐
    │ {'name': {'opt1': 'value1', 'opt2':'value2', 'opt3':None}    │ ◁─ GtkDocAnnotations
    ├──────────────────────────────────────────────────────────────┤
    │ '(name opt1=value1 opt2=value2 opt3)'                        │ ─▷ serialized
    └──────────────────────────────────────────────────────────────┘

    ┌──────────────────────────────────────────────────────────────┐
    │ {'name': ['opt1', 'opt2']}                                   │ ◁─ GtkDocAnnotations
    ├──────────────────────────────────────────────────────────────┤
    │ '(name opt1 opt2)'                                           │ ─▷ serialized
    └──────────────────────────────────────────────────────────────┘

    ┌──────────────────────────────────────────────────────────────┐
    │ {'unkownname': ['unknown list of options']}                  │ ◁─ GtkDocAnnotations
    ├──────────────────────────────────────────────────────────────┤
    │ '(unkownname unknown list of options)'                       │ ─▷ serialized
    └──────────────────────────────────────────────────────────────┘

:param annotations: :class:`GtkDocAnnotations` to be serialized
:returns: a string
r9   r  r  r   r   )r`   
isinstancelistr  r  r  )r@   rU   
serializedrk   rl   serialize_optionsr  r   s           rC   _serialize_annotations/GtkDocCommentBlockWriter._serialize_annotations  s    4 
!,!2!2!4Hgt,,(+(9%(*%&-mmo
 -S%1HH--#@-	 '6 ):(?(?(A%!!x9J"KL!!H"78# "5& xx
##rE   c                 `   SUR                   < 3nUR                  (       a!  USU R                  UR                  5      -   -  nUR                  (       aF  UR                  R	                  S5      (       a  USUR                  -   -  nOUSUR                  -   -  nOUS-  nUR                  S5      $ )zh
Serialize a parameter.

:param parameter: :class:`GtkDocParameter` to be serialized
:returns: a string
@: r  r  )r	  rU   r(  r   r  r  )r@   r  r&  s      rC   _serialize_parameter-GtkDocCommentBlockWriter._serialize_parameter	  s     (nn/
   $!<!<Y=R=R!SSSJ   $$//55cI$9$999
dY%:%:::
#J%%rE   c                    UR                   R                  5       nUR                  (       a!  USU R                  UR                  5      -   -  nUR                  (       a  USUR                  -   -  nUR
                  (       aE  UR
                  R                  S5      (       a  USUR
                  -   -  nOUSUR
                  -   -  nUR                  (       d  UR
                  (       d  US-  nUR                  S5      $ )zV
Serialize a tag.

:param tag: :class:`GtkDocTag` to be serialized
:returns: a string
r,  r  r  )r	  r  rU   r(  r   r   r  r  )r@   rR  r&  s      rC   _serialize_tag'GtkDocCommentBlockWriter._serialize_tag+	  s     XX((*
 ??$!<!<S__!MMMJ 99$**J ??))$//cCOO33
dS__44
yy#J%%rE   c                 8   Uc  g/ nUR                   R                  S5      (       d   UR                   R                  S5      (       a  UR                  UR                   5        OnUR                  (       a>  U R	                  UR                  5      nUR                  UR                   < SU< 35        OUR                  UR                   < S35        UR
                  R                  5        H#  nUR                  U R                  U5      5        M%     UR                  (       aD  UR                  S5        UR                  R                  S5       H  nUR                  U5        M     UR                  (       aR  UR                  S5        UR                  R                  5        H#  nUR                  U R                  U5      5        M%     U R                  (       aY  [        UR                  5      R!                  S5      S	   S	   =(       d    S
nUR#                  S5      (       a  UnUS
-   n	OUSS nUn	OSnS
n	S	n
U
[%        U5      :  a6  X*   nU(       a  U	< SU< S3X*'   OU	< S3X*'   U
S-  n
U
[%        U5      :  a  M6  UR'                  S	U< S35        UR                  U	< S35        UR(                  (       a   UR'                  S	UR(                  < S35        UR*                  (       a  UR                  UR*                  < S35        SR-                  U5      $ )z
Serialize a :class:`GtkDocCommentBlock` object.

:param block: :class:`GtkDocCommentBlock` to be serialized
:returns: a string
Nr  SECTIONACTIONr,  r  r  r
   r   r9   r  r  z* z*
z/**
z*/
)r	  r  r  rU   r(  r)  rP  extendr-  r   r  r*  r0  r!  r   r(  most_commonr  r}   insertr&  r'  r  )r@   blocklinesrU   rQ  lrR  r!  start_indentr  r  r  s               rC   writeGtkDocCommentBlockWriter.writeJ	  sg    =E zz$$Y//5::3H3H3R3RUZZ($$"&"="=e>O>O"PKLLUZZ!EF LL%**!78 ,,.T66u=> /   R **006ALLO 7 zz R  ::,,.CLL!4!4S!9: / {{ !2!23??B1EaHOC??4((#)L"(3,K#)#2;L"(K!!Ac%j.x-8$?EH*58EHQ c%j. LL89LL[34   Q%*;*; >?u'7'7:;775>!rE   r   N)T)rK   rL   rM   rN   rO   r?   r(  r-  r0  r<  rQ   rR   rE   rC   r  r    s"    
/$b&4&>L"rE   r  )rO   ru  r  rs   collectionsr   r   r   r   r   r   typingr	   rt   r   r   r   r  r  r  r  r  r  r  r  GTKDOC_TAGSr  r  DEPRECATED_GTKDOC_TAGSr  r  DEPRECATED_GI_TAGSr  TAG_GET_VALUE_FUNCTAG_REF_FUNCTAG_RENAME_TOTAG_SET_VALUE_FUNCTAG_TRANSFERTAG_TYPETAG_UNREF_FUNC	TAG_VALUE	TAG_VFUNCr  ALL_TAGSr  r  rh   r  rT  r  r  rU  rV  rW  r  r  rX  rY  rZ  r[  r\  r]  r^  r  r  r_  rg   rj   re   r  r`  ra  r  rb  rc  rd  r  re  r  r  rf  rh  rg  GI_ANNSr  r  DEPRECATED_GI_ANNSrd   r  r  r   r   r   ARRAY_OPTIONSOPT_OUT_CALLEE_ALLOCATESOPT_OUT_CALLER_ALLOCATESr   rf   ri   r   OPT_SCOPE_ASYNCOPT_SCOPE_CALLOPT_SCOPE_NOTIFIEDOPT_SCOPE_FOREVERr   OPT_TRANSFER_CONTAINEROPT_TRANSFER_FLOATINGOPT_TRANSFER_FULLOPT_TRANSFER_NONEr   compileUNICODEr  VERBOSEr  r  r  r  r  r  r  r  r  r  r  r  r  rc   	_all_tags
IGNORECASEr  r  r  r;   objectrT   r  r  r%  ri  rn  rp  r  )anns   0rC   <module>ra     s  2M^ 
 	  8 8    * *  	
 	  ! )*, 
 
#  ')  % % 		(,&',&"(##	%  //2DDG]] 
 	# ! ! % 
		


	! % 
		"> """ " 	"
 " " " " " " " " " " "  !"" #"$ %"& '"( )"* +", -". /"0 1"2 3"4 5"6 7"8 9": ;"< ="> ?"@ A"B C"D E"J ##%  ..~. #2R?CAQ6QC?R  $  - %!*,
 . - '')   !12    #"$ % "   *)%%'  

="**5  JJ   zz
 JJ   jj
 JJ    JJ 


 JJ ZZ JJ
" JJ JJ	" jj" JJ%* JJ" JJ%	* JJ" JJ%	* ::" JJ%* zz JJ  HHX&&sE2		 !!$
 JJbmm+
- zz
 JJ  
 JJbmm+- ? ?(\	R \	R~$K' $KN!E! !EHi* iZ %    e5v e5P@"v @"S> Ss   /	R6<R6