HEX
Server: Apache
System: Linux pdx1-shared-a1-38 6.6.104-grsec-jammy+ #3 SMP Tue Sep 16 00:28:11 UTC 2025 x86_64
User: mmickelson (3396398)
PHP: 8.1.31
Disabled: NONE
Upload Files
File: //usr/lib/python3/dist-packages/sphinx/ext/autodoc/__pycache__/__init__.cpython-310.pyc
o

o�a���@s�dZddlZddlZddlmZmZddlmZddlm	Z	m
Z
mZmZm
Z
mZmZmZmZmZmZmZmZddlmZddlZddlmZddlmZmZdd	lmZm Z dd
l!m"Z"ddl#m$Z$m%Z%m&Z&m'Z'ddl(m)Z)m*Z*m+Z+dd
l,m-Z-m.Z.ddl/m0Z0m1Z1ddl2mZm3Z3ddl4m5Z5m6Z6ddl7m8Z8m9Z9m:Z:m;Z;m<Z<ddl=m>Z>m?Z?m@Z@ddl=mAZBe	r�ddlCmDZDe3�EeF�ZGeHeHjI�ZJe�KdejL�ZMe�Kd�ZNde
de
fdd�ZOGdd�d�ZPGdd�d�ZQeP�ZReQ�ZSeT�ZUeT�ZVeT�ZWde
deeTeeXffd d!�ZYde
deeTeeXffd"d#�ZZde
deeTeeXffd$d%�Z[de
deeTeeXffd&d'�Z\de
deeXfd(d)�Z]de
deeXfd*d+�Z^eT�Z_de
de
fd,d-�Z`de
deafd.d/�Zbd0eddfd1d2�Zcd0eddfd3d4�Zdd�d5eed6eed7eXdefd8d9�Zf	:	:d�d;eXd7eeXd<ead=eadef
d>d?�ZgGd@dA�dAeh�ZiGdBdC�dCej�ZkeeekeeeXe
ffZlGdDdE�dE�ZmGdFdG�dGem�ZnGdHdI�dIem�ZoGdJdK�dKem�ZpGdLdM�dM�ZqGdNdO�dOeq�ZrGdPdQ�dQeqeo�ZsGdRdS�dSes�ZtdTgZudUgZvGdVdW�dWeqeo�ZwGdXdY�dYew�ZxGdZd[�d[�ZyGd\d]�d]ey�ZzGd^d_�d_ey�Z{Gd`da�daey�Z|Gdbdc�dcey�Z}Gddde�deeze{e|e}eo�Z~Gdfdg�dge~�ZGdhdi�dieqep�Z�Gdjdk�dkey�Z�Gdldm�dmey�Z�Gdndo�doey�Z�Gdpdq�dqey�Z�Gdrds�dseze{e�e|e�e�e�erep�Z�Gdtdu�duerep�Z�Gdvdw�dwe��Z�dxedeeXeemffdydz�Z�dxed{e
d|eXd}e
de
f
d~d�Z�dxed�eddfd�d��Z�dd�l�m�Z�dd�l�m�Z�dd�l�m�Z�dd�l�m�Z�dd�l�m�Z�dd�l�m�Z�dd�l�m�Z�dxedeeXe
ffd�d��Z�dS)�ap
    sphinx.ext.autodoc
    ~~~~~~~~~~~~~~~~~~

    Automatically insert docstrings for functions, classes or whole modules into
    the doctree, thus avoiding duplication between docstrings and documentation
    for those who like elaborate docstrings.

    :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
    :license: BSD, see LICENSE for details.
�N)�	Parameter�	Signature)�
ModuleType)
�
TYPE_CHECKING�Any�Callable�Dict�Iterator�List�Optional�Sequence�Set�Tuple�Type�TypeVar�Union)�
StringList)�Sphinx)�ENUM�Config)�RemovedInSphinx50Warning�RemovedInSphinx60Warning)�BuildEnvironment)�get_class_members�get_object_members�
import_module�
import_object)�ismock�mock�
undecorate)�_�__)�ModuleAnalyzer�PycodeError)�inspect�logging)�prepare_docstring�separate_metadata)�evaluate_signature�getdoc�object_description�safe_getattr�stringify_signature)�
OptionSpec�get_type_hints�restify)�	stringify)�DocumenterBridgeaQ^ ([\w.]+::)?            # explicit module name
          ([\w.]+\.)?            # module and/or class name(s)
          (\w+)  \s*             # thing name
          (?: \((.*)\)           # optional: arguments
           (?:\s* -> \s* (.*))?  #           return annotation
          )? $                   # and nothing more
          z	^__\S+__$�x�returncCs|S�N�)r2r5r5�=/usr/lib/python3/dist-packages/sphinx/ext/autodoc/__init__.py�identity?�r7c@s4eZdZdZdedefdd�Zdeddfdd�ZdS)	�_Allz;A special value for :*-members: that matches to any member.�itemr3cC�dS�NTr5��selfr:r5r5r6�__contains__Fr8z_All.__contains__NcC�dSr4r5r=r5r5r6�appendIr8z_All.append)�__name__�
__module__�__qualname__�__doc__r�boolr?rAr5r5r5r6r9Csr9c@s"eZdZdZdedefdd�ZdS)�_EmptyzGA special value for :exclude-members: that never matches to any member.r:r3cCr;�NFr5r=r5r5r6r?Pr8z_Empty.__contains__N)rBrCrDrErrFr?r5r5r5r6rGMsrG�argcCs,|dvrtS|durdSdd�|�d�D�S)�8Used to convert the :members: option to auto directives.r<FNcSsg|]
}|��r|���qSr5��strip��.0r2r5r5r6�
<listcomp>b�z"members_option.<locals>.<listcomp>�,)�ALL�split�rIr5r5r6�members_option[s
rUcCs0tjdtdd�|durtSdd�|�d�D�S)rJz#members_set_option() is deprecated.���
stacklevelNcS�h|]
}|��r|���qSr5rKrMr5r5r6�	<setcomp>krPz%members_set_option.<locals>.<setcomp>rQ)�warnings�warnrrRrSrTr5r5r6�members_set_optiones�r]cCs |dvrtSdd�|�d�D�S)z-Used to convert the :exclude-members: option.r<cSrYr5rKrMr5r5r6rZrrPz)exclude_members_option.<locals>.<setcomp>rQ)�EMPTYrSrTr5r5r6�exclude_members_optionnsr_cCs|dvrdS|S)rJr<�objectr5rTr5r5r6�inherited_members_optionusracCs(|dvrdS|dvr|Sttd�|��)rJr<N)�alphabetical�bysource�	groupwisez)invalid value for member-order option: %s��
ValueErrorr!rTr5r5r6�member_order_option}s
rgcCs|dvr|Sttd�|��)zDUsed to convert the :class-doc-from: option to autoclass directives.)�both�class�initz+invalid value for class-doc-from option: %srerTr5r5r6�class_doc_from_option�srkcCs|dvrtS|S)Nr<)�SUPPRESSrTr5r5r6�annotation_option�srmcCr;)znUsed to convert flag options to auto directives.  (Instead of
    directives.flag(), which returns None).
    Tr5rTr5r5r6�bool_option��rn�optionscCs�tjdtdd�d|vr>|dtur@|�d�turdS|�d�r6|dD]}||dvr3|d�|�q$dS|d|d<dSdSdS)z3Merge :special-members: option to :members: option.z-merge_special_members_option() is deprecated.rVrW�special-members�membersN)r[r\rrR�getrA)rp�memberr5r5r6�merge_special_members_option�s�
���rucCsd|�d�tur	dS|�dg�}dD]}||vr/||tdfvr/||D]}||vr.|�|�q#qdS)z1Merge :*-members: option to the :members: option.rrN>�private-membersrq)rsrR�
setdefaultrA)rprr�keyrtr5r5r6�merge_members_option�s
��ry�pre�post�whatcs6dtdtdtdtdtdttddf���fd	d
�}|S)a�Return a listener that removes the first *pre* and last *post*
    lines of every docstring.  If *what* is a sequence of strings,
    only docstrings of a type in *what* will be processed.

    Use like this (e.g. in the ``setup()`` function of :file:`conf.py`)::

       from sphinx.ext.autodoc import cut_lines
       app.connect('autodoc-process-docstring', cut_lines(4, what=['module']))

    This can (and should) be used in place of :confval:`automodule_skip_lines`.
    �app�what_�name�objrp�linesr3Ncsb�r|�vrdS|d��=�r |r|ds|�d�|�d�=|r-|dr/|�d�dSdSdS)N����)�poprA)r}r~rr�rpr��r{rzr|r5r6�process�s

�zcut_lines.<locals>.process)r�strrr
)rzr{r|r�r5r�r6�	cut_lines�s�
r�F�marker�	keepempty�excludecsBt�|��dtdtdtdtdtdttddf����fd	d
�}|S)anReturn a listener that either keeps, or if *exclude* is True excludes,
    lines between lines that match the *marker* regular expression.  If no line
    matches, the resulting docstring would be empty, so no change will be made
    unless *keepempty* is true.

    If *what* is a sequence of strings, only docstrings of a type in *what* will
    be processed.
    r}r~rr�rpr�r3Ncs��r|�vrdSd}�}|dd�}t|�D]&\}	}
|r(|�|	|�|d7}��|
�r=|}|r=|�|	|�|d7}q|sH�sH||dd�<|rU|drW|�d�dSdSdS)Nr�r�r�)�	enumerater��matchrA)r}r~rr�rpr��deleted�delete�
orig_lines�i�line�r�r��	marker_rer|r5r6r��s(
��zbetween.<locals>.process)�re�compilerr�rr
)r�r|r�r�r�r5r�r6�between�s


�r�cs4eZdZdZd�fdd�Zdedefdd�Z�ZS)	�Optionsz>A dict/attribute hybrid that returns None on nonexisting keys.r3cstt����Sr4)r��super�copy�r>��	__class__r5r6r�szOptions.copyrcCs(z	||�dd�WStyYdSw)Nr �-)�replace�KeyError)r>rr5r5r6�__getattr__s
�zOptions.__getattr__)r3r�)	rBrCrDrEr�r�rr��
__classcell__r5r5r�r6r�sr�c
s^eZdZdZdedededef�fdd�Z			ddeded
eedededdfd
d�Z	�Z
S)�ObjectMembera}A member of object.

    This is used for the result of `Documenter.get_object_members()` to
    represent each member of the object.

    .. Note::

       An instance of this class behaves as a tuple of (name, object)
       for compatibility to old Sphinx.  The behavior will be dropped
       in the future.  Therefore extensions should not use the tuple
       interface.
    rr��kwargsr3cst��|||f�Sr4)r��__new__)�clsrr�r�r�r5r6r�szObjectMember.__new__NF�	docstring�class_�skippedcCs"||_||_||_||_||_dSr4)rBr`r�r�r�)r>rr�r�r�r�r5r5r6�__init__s

zObjectMember.__init__)NNF)rBrCrDrEr�rr�rrFr�r�r5r5r�r6r�s
����r�c
@s�eZdZUdZdZdZdZdZdZde	iZ
eed<de
d	ed
e
de
fdd
�Zede
dedede
def
dd��ZdZddd	ededdfdd�Zedeeedffdd��Zdedededdfd d!�Zd"ed#e
d$ed%e
deeeeff
d&d'�Zdefd(d)�Zd[d*edefd+d,�Zdefd-d.�Zdefd/d0�Z d1e
defd2d3�Z!defd4d5�Z"d1e
defd6d7�Z#d1e
defd8d9�Z$d:eddfd;d<�Z%d\d=ede&eeefd>d?�Z'd@eeede(efdAdB�Z)defdCdD�Z*d[dEe&e+dFeddfdGdH�Z,dIedeee-ffdJdK�Z.dLe-dIedeeee
effdMdN�Z/d[dOeddfdPdQ�Z0dReedefdSedeedeffdTdU�Z1		d]dEe&e+dVedWedOeddf
dXdY�Z2dS)^�
Documenterae
    A Documenter knows how to autodocument a single object type.  When
    registered with the AutoDirective, it will be used to document objects
    of that type when needed by autodoc.

    Its *objtype* attribute selects what auto directive it is assigned to
    (the directive name is 'auto' + objtype), and what directive it generates
    by default, though that can be overridden by an attribute called
    *directivetype*.

    A Documenter has an *option_spec* that works like a docutils directive's;
    in fact, it will be used to parse an auto directive's options that matches
    the Documenter.
    r`�   rF�noindex�option_specr�r�defargsr3cGst|jj||g|�R�S)z5getattr() override for types such as Zope interfaces.)�autodoc_attrgetter�envr})r>r�rr�r5r5r6�get_attrJszDocumenter.get_attrrt�
membername�isattr�parentcC�td��)z?Called to see if a member can be documented by this Documenter.�!must be implemented in subclasses��NotImplementedError�r�rtr�r�r�r5r5r6�can_document_memberNszDocumenter.can_document_memberr��	directiver1�indentNcCsl||_|jj|_|j|_|j|_||_||_d|_d|_d|_	d|_
d|_d|_d|_
d|_d|_d|_dSr4)r�r��config�genoptrprr��modname�module�objpath�fullname�args�retannr`�object_namer��analyzer)r>r�rr�r5r5r6r�Ts 

zDocumenter.__init__cCs|jjjjS)�%Returns registered Documenter classes)r�r}�registry�documentersr�r5r5r6r�mszDocumenter.documentersr��source�linenocGsF|��r|jjj|j||g|�R�dS|jjjd|g|�R�dS)z0Append one line of generated reST to the output.r�N)rLr��resultrAr�)r>r�r�r�r5r5r6�add_liners"zDocumenter.add_liner��parents�path�basecCr�)a@Resolve the module and name of the object to document given by the
        arguments and the current module/class.

        Must return a pair of the module name and a chain of attributes; for
        example, it would return ``('zipfile', ['ZipFile', 'open'])`` for the
        ``zipfile.ZipFile.open`` method.
        r�r��r>r�r�r�r�r5r5r6�resolve_nameys	zDocumenter.resolve_namec	Cszt�|j�}|��\}}}}}Wnty*tjtd�|j|jfdd�YdSw|durB|dd�}|r?|�	d��
d�ng}nd}g}t|jj
��|�||||�\|_|_Wd�n1scwY|jsmdS||_||_|jpwd|jr�dd�|j�nd|_d	S)
z�Determine what module to import and what attribute to document.

        Returns True and sets *self.modname*, *self.objpath*, *self.fullname*,
        *self.args* and *self.retann* if parsing and resolving was successful.
        z!invalid signature for auto%s (%r)�autodoc��typeFN����.r�T)�
py_ext_sig_rer�r�groups�AttributeError�logger�warningr!�objtype�rstriprSrr��autodoc_mock_importsr�r�r�r�r��joinr�)	r>�matched�explicit_modnamer�r�r�r�r�r�r5r5r6�
parse_name�s2	����zDocumenter.parse_name�
raiseerrorcCs�t|jj��[z-t|j|j|j|j|jjd�}|\|_	|_
|_|_t
|j�r,t|j�|_WWd�dSty`}z |r?�tj|jdddd�|j��WYd}~Wd�dSd}~ww1sdwYdS)	z�Import the object given by *self.modname* and *self.objpath* and set
        it as *self.object*.

        Returns True if successful, False if an error occurred.
        ��
attrgetter�warningiserrorNTrr�r�r��subtypeF)rr�r�rr�r�r�r��autodoc_warningiserrorr�r�r�r`rr�ImportErrorr�r�r�r��note_reread�r>r��ret�excr5r5r6r�s*�
�	

��	�zDocumenter.import_objectcCs|�|jdd�p
|jS)z�Get the real module name of an object to document.

        It can differ from the name of the module through which the object was
        imported.
        rCN)r�r`r�r�r5r5r6�get_real_modname�szDocumenter.get_real_modnamecCs<|jjrdSt�|j�}|�|dd�}|r||jkrdSdS)z`Check if *self.object* is really defined in the module given by
        *self.modname*.
        TrCNF)rp�imported_membersr$�	unpartialr`r�r�)r>�subjectr�r5r5r6�check_module�szDocumenter.check_moduler�cKr;)z}Format the argument signature of *self.object*.

        Should return None if the object does not have a signature.
        Nr5�r>r�r5r5r6�format_args�szDocumenter.format_argscCsd�|j�p|jS)z�Format the name of *self.object*.

        This normally should be something that can be parsed by the generated
        directive, but doesn't need to be (Sphinx will display it unparsed
        then).
        r�)r�r�r�r�r5r5r6�format_name�s	zDocumenter.format_namecKs8|rz	|jdi|��WStyY|��Sw|��S�Nr5)r��	TypeErrorr�r5r5r6�_call_format_args�s�zDocumenter._call_format_argsc
Ks�|jdurd|j}|j}nAz d}|jdi|��}|r-t�d|�}|r-|�d�}|�d�}Wn tyN}ztjt	d�|j
|dd�d}WYd}~nd}~ww|jj�
d	|j|j
|j|j||�}|rf|\}}|duru||rrd
|SdSdS)
z�Format the signature (arguments and return annotation) of the object.

        Let the user process it via the ``autodoc-process-signature`` event.
        Nz(%s)z^(\(.*\))\s+->\s+(.*)$r�rVz+error while formatting arguments for %s: %sr�r��autodoc-process-signaturez -> %sr�r5)r�r�r�r�r��group�	Exceptionr�r�r!r�r��events�emit_firstresultr�r`rp)r>r�r�r�r�r�r�r5r5r6�format_signature�s8



�
���
�zDocumenter.format_signature�sigc	Cs�t|dd�}t|d|j�}|��}|��}d||f}t|�d��D]\}}|�d|||f|�|dkr;dt|�}q"|jj	rF|�d	|�|j
rT|�d
|j|�dSdS)z>Add the directive header and options to the generated content.�domain�py�
directivetypez.. %s:%s:: �
z%s%s%sr� z   :noindex:z   :module: %sN)�getattrr�r��get_sourcenamer�rSr��lenrpr�r�r�)	r>rrr�r�
sourcename�prefixr��sig_liner5r5r6�add_directive_headers"���zDocumenter.add_directive_header�ignorecCs`|durtjd|jjtdd�t|j|j|jj	|j
|j�}|r.|jj
jjj}t|||�gSgS)z�Decode and return lines of the docstring(s) for the object.

        When it returns None, autodoc-process-docstring will not be called for this
        object.
        N�<The 'ignore' argument to autodoc.%s.get_doc() is deprecated.rVrW)r[r\r�rBrr)r`r�r��autodoc_inherit_docstringsr�r�r��state�document�settings�	tab_widthr&�r>rr�rr5r5r6�get_doc+s���zDocumenter.get_doc�
docstringsc	cs\�|D](}|jjr&|jj�d|j|j|j|j|�|r&|ddkr&|�d�|EdHqdS)z7Let the user process the docstrings before adding them.�autodoc-process-docstringr�r�N)r�r}�emitr�r�r`rprA)r>r�docstringlinesr5r5r6�process_doc<s�
�
�zDocumenter.process_doccCsZt�|jdd�rt�|jdd�rd|jj|jjf}n|j}|jr)d|jj|fSd|S)NrCrDz%s.%sz%s:docstring of %szdocstring of %s)r$r+r`rCrDr�r��srcname)r>r�r5r5r6r
Ks�zDocumenter.get_sourcename�more_content�no_docstringc
Cs|rtjd|jjtdd�|��}|jrL|j��}|jrLd�	|jdd��|jdf}||vrLd}t
||�g}t|�|��D]\}}|�
|||�q@|sq|��}|durWn|s^|�g�t|�|��D]\}}|�
|||�qe|r�t|j|j�D]\}}	|�
||	d|	d	�qzdSdS)
z>Add content from docstrings, attribute documentation and user.z>The 'no_docstring' argument to %s.add_content() is deprecated.rVrWr�Nr�Trr�)r[r\r�rBrr
r��find_attr_docsr�r��listr�rr�rrA�zip�data�items)
r>rr r�	attr_docsrxrr�r��srcr5r5r6�add_contentYs:��

�zDocumenter.add_content�want_allcCs�t�dt�t|j|j|j|j�}|sE|jj	sdgfSg}|jj	D]}||vr2|�
|||jf�q!tj
td�||jfdd�q!d|fS|jjrTddd�|��D�fSddd�|��D�fS)	a+Return `(members_check_module, members)` where `members` is a
        list of `(membername, member)` pairs of the members of *self.object*.

        If *want_all* is True, return all members.  Else, only return those
        members given by *self.options.members* (which may also be None).
        zVThe implementation of Documenter.get_object_members() will be removed from Sphinx-6.0.F�!missing attribute %s in object %sr�r�cSsg|]}|j|jf�qSr5)r�value�rN�mr5r5r6rO��z1Documenter.get_object_members.<locals>.<listcomp>cSsg|]}|jr|j|jf�qSr5)�directly_definedrr+r,r5r5r6rO�s�)r[r\rrr`r�r�r�rprrrAr+r�r�r!r��inherited_members�values�r>r)rr�selectedrr5r5r6r�s(�
��zDocumenter.get_object_membersrrcsdtdtdtf�fdd�}g}d��j�}�jr�j��}ni}|D�]Z}|\}}	|	tur0d}
n||f|vr9d}
nd}
t|	�j	�j
j�j|�}t
|t�sNd	}��	|	d
d	�}|rd��	|dd	�}
|
|krdd	}t
|t�ro|jro|j}t|�\}}t|�}d|vr�d}nd
|vr�d}n|�d�}d}t|	�r�n��jjr�|�jjvr�d}n�|r�t�|�rʈjjr�|�jjvr�|dkr�d}no|||�r�d}ng|pňjj}n`d}n]||f|vr�|r�|r�jjd	ur�d}nJ|�jjv}nCd}n@|�r|�r|s�jj�r
�jjd	ur�d}n*|||��rd}n!|�jjv}nd}n�jjtu�r |||��r d}n|�p&�jj}t
|t��r3|j�r3d}�jj�rrz�jj�d�j ||	|�j�}|d	u�rP|}Wn t!�yq}zt"j#t$d�|	|dd�d}WYd	}~nd	}~ww|�r}|�%||	|
f�q"|S)a�Filter the given member list.

        Members are skipped if

        - they are private (except if given explicitly or the private-members
          option is set)
        - they are special methods (except if given explicitly or the
          special-members option is set)
        - they are undocumented (except if the undoc-members option is set)

        The user can override the skipping decision by connecting to the
        ``autodoc-skip-member`` event.
        rr�r3cs~t��j�r=�jjD]2}|j�jjkr|�jkrdS||jvr#dS|��|di�vr/dSt	|t
�r<|j|ur<dSq
dS)NTF�__annotations__)r$�isclassr`�__mro__rBrpr0�__dict__r��
isinstancer�r�)rr�r�r�r5r6�is_filtered_inherited_member�s
�z?Documenter.filter_members.<locals>.is_filtered_inherited_memberr�TFNr�rE�private�publicr �autodoc-skip-memberzXautodoc: failed to determine %r to be documented, the following exception was raised:
%sr�r�)&r�rrFr�r�r�r!�INSTANCEATTRr)r�r�rr`r8r�r�r'�
startswithrrp�exclude_members�special_member_rer��special_members�
undoc_members�private_membersrrrRr�r�r}rr�r�r�r�r!rA)r>rrr)r9r��	namespacer&r�r�rtr��docr��cls_doc�metadata�has_doc�	isprivate�keep�	skip_userr�r5r�r6�filter_members�s�
�


�

�
�
����zDocumenter.filter_members�all_membersc
s8�j�jjd<�jr�jd�jjd<|p�jjp�jjtu}��|�\}}g}��	||�D]>\�������fdd��j
��D�}|sEq.|jdd�d��jd	d
�
�j�g�}|d�j|�j�}|�|�f�q.�jjpt�jj}	��||	�}|D]\}�|jd�j|o��d
�q}d�jjd<d�jjd<dS)z�Generate reST for member documentation.

        If *all_members* is True, document all members, else those given by
        *self.options.members*.
        �autodoc:moduler�
autodoc:classcs g|]}|������r|�qSr5)r��rNr��r�rt�mnamer>r5r6rOKs
�z/Documenter.document_members.<locals>.<listcomp>cSs|jSr4��priority)r�r5r5r6�<lambda>Qsz-Documenter.document_members.<locals>.<lambda>�rx�::r�r�T)rM�real_modnamer�N)r�r��	temp_datar�rpr0rrrRrrLr�r1�sortr�r�r�rA�member_orderr��autodoc_member_order�sort_members�generaterX)
r>rMr)�members_check_modulerr�memberdocumenters�classes�
full_mname�
documenterr[r5rQr6�document_members7s6�
��zDocumenter.document_membersr��ordercsz|dkr|jdd�d�|S|dkr3|jr0|jj�dtttfdtf�fdd	�}|j|d�|S	|S|jd
d�d�|S)zSort the given member list.rdcSs|dj|djfS�Nr)r[r��er5r5r6rUi�z)Documenter.sort_members.<locals>.<lambda>rVrc�entryr3cs$|dj�d�d}��|t���S�NrrWr�)rrSrsr)rjr���tagorderr5r6�keyfuncosz(Documenter.sort_members.<locals>.keyfunccS�
|djSrf�rrgr5r5r6rUy�
)rZr�rmrr�rF�int�r>r�rernr5rlr6r]ds�	��zDocumenter.sort_membersrXr�c
Cs�|��stjtd�|jdd�dS|��sdS|��}|p||_zt�	|j�|_
|j
��Wn.ty]}z"t�
d|�d|_
t|jd�rS|jjrS|jj�|jj�WYd}~nd}~ww|jj�|j
j�|j|kr�zt�	|�}|jj�|j�Wn	ty�Ynwt|��p�gg�}t|j�r�|s�tjtd�|jdd�|r�|��s�dS|��}	|�d|	�z|��}
Wnty�}ztjtd	�|j|dd�WYd}~dSd}~ww|�|
�|�d|	�|j |j!7_ |�"|�|�#|�dS)
a�Generate reST for the object given by *self.name*, and possibly for
        its members.

        If *more_content* is given, include that content. If *real_modname* is
        given, use that module name to find attribute docs. If *check_module* is
        True, only generate if the object is defined in the module name it is
        imported from. If *all_members* is True, document all members.
        z�don't know which module to import for autodocumenting %r (try placing a "module" or "currentmodule" directive in the document, or giving an explicit module name)r�r�Nz$[autodoc] module analyzer failed: %s�__file__zA mocked object is detected: %rr�z+error while formatting signature for %s: %s)$r�r�r�r!rrr�rXr"�
for_moduler�r!r#�debug�hasattrr�rtr��record_dependencies�addr�sumrrr`r�r
r�rr�r�rr��content_indentr(rd)r>rrXr�rM�
guess_modnamer�r�rrrr5r5r6r^}sl
��
��

�
�
���

zDocumenter.generate)r��Fr4�NNFF)3rBrCrDrEr�r{rTr[�titles_allowedrnr�r-r4rr�r��classmethodrFr�r��propertyrrr�rrr�rr
r�r�rr�r�r�r�r�rrrrr	rr
rr(�
ObjectMembersrrLrdr]r^r5r5r5r6r�+sp
��
�%
# 
�+

�-�
�����r�csLeZdZUdZdZdZdZeeee	ee
e
eeeeeeed�Z
eed<dedd	f�fd
d�Zeded
edededef
dd��Zdededededeeeeff
dd�Zdef�fdd�Zd+dedef�fdd�
Zdedd	fdd �Zdeeeffd!d"�Zd#edeeeffd$d%�Z d&eed'efd(edeed'eff�fd)d*�Z!�Z"S),�ModuleDocumenterz6
    Specialized Documenter subclass for modules.
    r�r�T)rr�
undoc-membersr��inherited-members�show-inheritance�synopsis�platform�
deprecated�member-order�exclude-membersrvrqzimported-memberszignore-module-allr�r�r3Ncs t�j|�t|j�d|_dSr4)r�r�ryrp�__all__�r>r�r�r5r6r��s

zModuleDocumenter.__init__rtr�r�r�cCr;rHr5r�r5r5r6r��roz$ModuleDocumenter.can_document_memberr�r�r�r�cCs*|dur
tjtd�dd�|pd|gfS)Nz*"::" in automodule name doesn't make senser�r�r�)r�r�r!r�r5r5r6r��s

�zModuleDocumenter.resolve_namecs2t���}|js|jrtjtd�|jdd�|S)Nz@signature arguments or return annotation given for automodule %sr�r�)r�r�r�r�r�r�r!r�)r>r�r�r5r6r��s

��zModuleDocumenter.parse_nameFr�c
sxt��|�}z|jjst�|j�|_W|SW|Sty;}zt	j
td�|jd|j
fdd�WYd}~|Sd}~ww)NzN__all__ should be a list of strings, not %r (in module %s) -- ignoring __all__rr�r�)r�rrp�ignore_module_allr$�getallr`r�rfr�r�r!r�r�r�r�r5r6rs ��
����zModuleDocumenter.import_objectrcCsht�||�|��}|jjr|�d|jj|�|jjr&|�d|jj|�|jjr2|�d|�dSdS)Nz   :synopsis: z   :platform: z   :deprecated:)r�rr
rpr�r�r�r��r>rrr5r5r6rs�z%ModuleDocumenter.add_directive_headerc	Cs�|jr|jj}ni}i}t|j�D]0}z%t|j|d�}t|�r#t|�}|�d|fg�}t||d�	|�d�||<Wqt
yAYqwt�|j�D]}||vrb|�d|fg�}t|t
d�	|�d�||<qH|S)zGet members of target module.Nr�r)r�)r�r&�dirr`r+rrrsr�r�r�r$�getannotationsr=)r>r&rrrr+r�r5r5r6�get_module_members"s,
�
��z#ModuleDocumenter.get_module_membersr)cCs�|��}|r+|jdurdt|���fS|��D]}|j|jvr"d|_qdt|���fS|jjp0g}g}|D] }||vrC|�||�q5t	j
td�t|j
dd�|fdd�q5d|fS)NTFzHmissing attribute mentioned in :members: option: module %s, attribute %srBz???r�r�)r�r�r"r1rBr�rprrrAr�r�r!r+r`)r>r)rrrt�
memberlistr�rr5r5r6r=s(
�
��z#ModuleDocumenter.get_object_membersr�r�recsZ|dkr&�jr&|jdd�d�dtttfdtf�fdd�}|j|d�|St��||�S)	NrccSrorfrprgr5r5r6rU[rqz/ModuleDocumenter.sort_members.<locals>.<lambda>rVrjr3cs:|dj�d�d}�jr|�jvr�j�|�St�j�Srk)rrSr��indexr)rjrr�r5r6rn^s
z.ModuleDocumenter.sort_members.<locals>.keyfunc)r�rZrr�rFrrr�r]rsr�r�r6r]WszModuleDocumenter.sort_membersr})#rBrCrDrEr�r{rrUrnrar7rgr_r�r-r4rr�r�r�rFr�rr
r�r�rrrr�r�r�rr]r�r5r5r�r6r��s>
�
�
�
��r�c
@�:eZdZdZdededededeeeeff
dd�Zd	S)
�ModuleLevelDocumenterzo
    Specialized Documenter subclass for objects on module level (functions,
    classes, data/constants).
    r�r�r�r�r3cCsF|dur|r|�d�}n|jj�d�}|s|jj�d�}|||gfS)Nr�rN�	py:module)r�r�rYrs�ref_contextr�r5r5r6r�psz"ModuleLevelDocumenter.resolve_nameN�	rBrCrDrEr�rrr
r�r5r5r5r6r�k�
�r�c
@r�)
�ClassLevelDocumenterz_
    Specialized Documenter subclass for objects on class level (methods,
    attributes).
    r�r�r�r�r3cCs�|durE|r|�d�}nd}|jj�d�}|dur |jj�d�}|dur(dgfS|�d�\}}}|g}|s<|jj�d�}|sE|jj�d�}|||gfS)Nr�rOzpy:classrNr�)r�r�rYrsr��
rpartition)r>r�r�r�r��mod_cls�sepr�r5r5r6r��s z!ClassLevelDocumenter.resolve_nameNr�r5r5r5r6r��r�r�cs�eZdZUdZdZeeeed<dZeeed<de	eeffdd�Z
ddedeeef�fd	d
�
Zde
def�fdd
�Z�ZS)�DocstringSignatureMixinz�
    Mixin for FunctionDocumenter and MethodDocumenter to provide the
    feature of reading the signature from the docstring.
    N�_new_docstrings�_signaturesr3cCsJ|jdg}t|t�r"|�d�t|jd�r"|�dd�|jjD��|��}|dur,dS|dd�|_	g|_
d}t|�D]f\}}t|�D]X\}}|sLnQ|�d�rX|�
d��
�}t�|�}|san<|��\}	}
}}}
||vrpn-|jjjjj}td�||d	d��|d
�|j	|<|dur�||
f}qD|j
�d||
f�qD|r�|Sq<|S)Nr�r�r6css�|]}|jVqdSr4)rBrPr5r5r6�	<genexpr>�s�z:DocstringSignatureMixin._find_signature.<locals>.<genexpr>)NN�\rr���tabsizez
(%s) -> %s)r�r8�ClassDocumenterrArwr`�extendr6rr�r�r��endswithr�r�r�r�r�rrrrr&r�)r>�valid_namesrr�r��doclines�jr�r��exmodr�r�r�r�rr5r5r6�_find_signature�sF



�
�z'DocstringSignatureMixin._find_signaturercs|jdur|jSt��|�Sr4)r�r�r�r>rr�r5r6r�s
zDocstringSignatureMixin.get_docr�cs\|jdur|jjr|��}|dur|\|_|_t�jdi|��}|jr,d�|g|j�S|S)Nrr5)	r�r��autodoc_docstring_signaturer�r�r�rr�r�)r>r�r�rr�r5r6r�sz(DocstringSignatureMixin.format_signaturer4)rBrCrDrEr�r
r�r4r�rr�rrrrrr�r5r5r�r6r��s
 3r�cs*eZdZdZdedef�fdd�Z�ZS)�DocstringStripSignatureMixinzz
    Mixin for AttributeDocumenter to provide the
    feature of stripping any function signature from the docstring.
    r�r3cs>|jdur|jjr|��}|dur|\}|_t�jdi|��Sr�)r�r�r�r�r�r�r)r>r�r��_argsr�r5r6r�s

z-DocstringStripSignatureMixin.format_signature)rBrCrDrErr�rr�r5r5r�r6r��sr�cs�eZdZdZdZdZededede	dede	f
d	d
��Z
dedefdd
�Zd de	ddfdd�Zdeddf�fdd�Z
dedef�fdd�Zdededefdd�Zdededeefdd�Z�ZS)!�FunctionDocumenterz8
    Specialized Documenter subclass for functions.
    �function�rtr�r�r�r3cCs(t�|�pt�|�pt�|�ot|t�Sr4)r$�
isfunction�	isbuiltin�	isroutiner8r�r�r5r5r6r�s�z&FunctionDocumenter.can_document_memberr�c
Ks�|jjdvr|�dd�z|jj�d|jd�tj|j|jj	d�}t
|fi|��}Wn'tyG}zt�
td�|j|�WYd}~dSd}~wtyQd}Ynw|jjr\|�dd	�}|S)
N��none�description�show_annotationF� autodoc-before-process-signature��type_aliases�-Failed to get a function signature for %s: %sr�r��\\)r��autodoc_typehintsrwr�r}rr`r$�	signature�autodoc_type_aliasesr,r�r�r�r!r�rf�strip_signature_backslashr�)r>r�rr�r�r5r5r6r�s$
���zFunctionDocumenter.format_argsFrMNcCr@r4r5�r>rMr5r5r6rd#r8z#FunctionDocumenter.document_membersrcs@|��}t��|�t�|j�st�|j�r|�d|�dSdS)N�
   :async:)r
r�rr$�iscoroutinefunctionr`�isasyncgenfunctionr�r�r�r5r6r&s
�z'FunctionDocumenter.add_directive_headercs6g}|jrd�|j�|jjvr|jjdkrd}nd}t�jd	i|��}|�|�t	�
|j�rZ|jj�
�D]%\}}|tur=q4|�||�}|rYt|jd�}||_dg|_|�|���q4|r�t	j|j|jjd�}	t|jdi�}
|jj�d�|j��D]}|�|	|�}t||
|jj�}t|fi|��}|�|�qxd�|�S)
Nr�r�TFr�r��__globals__rr5)r�r�r��	overloadsr�r�r�rrAr$�is_singledispatch_functionr`r�r%�annotate_to_first_argumentr�r�r�r�r+rs�merge_default_valuer(r,)r>r��sigs�
overloadedr�typ�func�dispatchfuncrc�actualr��overloadr�r5r6r-s@
���
z#FunctionDocumenter.format_signaturer�r�cC�Zt|j���}t|�D]\}}|j�|j�}|r&|jdkr&|j|jd�||<q|j|d�S�zGMerge default values of actual implementation to the overload variants.z...)�default��
parameters�r"r�r1r�rsrr�r��r>r�r�r�r��param�actual_paramr5r5r6r�S��z&FunctionDocumenter.merge_default_valuer�r�c
C��ztj||jjd�}Wn&ty(}zt�td�|j|�WYd}~dSd}~wt	y1YdSwt
|j�dkr;dSdd�}t|j�
��}|djtjuro|dj|d�|d<z
|j|d�|_|WSttfynYdSwdS)	�?Annotate type hint to the first argument of function if needed.r�r�NrcSr@r4r5r5r5r5r6�dummykr8z<FunctionDocumenter.annotate_to_first_argument.<locals>.dummy��
annotationr��r$r�r�r�r�r�r�r!r�rfrr�r"r1r�r�emptyr��
__signature__r��r>r�r�rr�r��paramsr5r5r6r�]�0
����z-FunctionDocumenter.annotate_to_first_argumentr})rBrCrDrEr�r[r�rr�rFr�r�rdrrrr�rrrr�r�r5r5r�r6r�s�&"
r�cs2eZdZdZdZdZdedef�fdd�Z�ZS)�DecoratorDocumenterzB
    Specialized Documenter subclass for decorator functions.
    �	decoratorr�r�r3cs"t�jdi|��}d|vr|SdS)NrQr5)r�r�)r>r�r�r�r5r6r��szDecoratorDocumenter.format_args)	rBrCrDrEr�rTrr�r�r5r5r�r6r�{s
r�zenum.EnumMeta.__call__ztyping.Generic.__new__cs�eZdZUdZdZdZeeeeee	e
eeed�
Ze
ed<dZeed<dZeed<d	ed
df�fdd�Zed
edededed
ef
dd��Zd8ded
ef�fdd�
Zd
eeeeeeeffdd�Zded
efdd�Zded
ef�fdd�Zd
eefdd�Zd
eefd d!�Z d"ed
df�fd#d$�Z!d%ed
eee"ffd&d'�Z#d9d(e$d
eeeefd)d*�Z%d
eeefd+d,�Z&d8d-ee'd.ed
df�fd/d0�
Z(d8d1ed
df�fd2d3�
Z)		d:d-ee'd4ed5ed1ed
df
�fd6d7�
Z*�Z+S);r�z6
    Specialized Documenter subclass for classes.
    ri�)
rrr�r�r�r�r�r�rvrq�class-doc-fromr�N�_signature_class�_signature_method_namer�r3csjt�j|�|jjdkr.|j��|_|jjdur ddg|jd<n|jj�d�|jj�d�t|j�dS)N�	separatedr�r�rq)	r�r�r��autodoc_class_signaturerpr�rArAryr�r�r5r6r��szClassDocumenter.__init__rtr�r�r�cCs
t|t�Sr4)r8r�r�r5r5r6r��s
z#ClassDocumenter.can_document_memberFr�cs>t��|�}|rt|jd�r|jd|jjk|_|Sd|_|S)NrBr�T)r�rrwr`r�rB�doc_as_attr�r>r�r�r�r5r6r�s�zClassDocumenter.import_objectcs�dtdtdtf�fdd�}t�jd�r!t�jjt�r!dd�jjfS|t�j�d�}|dur6d�|�t	vr6d}|dur`�j
j�d	|d
�zt
j|d
�jjd�}t�j�d|fWSty_Ynw|�jd�}|dursd�|�tvrsd}|dur��j
j�d	|d
�zt
j|d
�jjd�}�jd|fWSty�Ynw|�jd
�}|durɈj
j�d	|d
�zt
j|d
�jjd�}�jd
|fWSty�Ynw�j
j�d	�jd�zt
j�jd�jjd�}dd|fWSty�YdSw)Nr��attrr3cs:t�||�rdS��||d�}t�|�st�|�sdS|S)zF Get the `attr` function or method from `obj`, if it is user-defined. N)r$�is_builtin_class_methodr��ismethodr�)r�r�r�r5r6�#get_user_defined_function_or_method�szKClassDocumenter._get_signature.<locals>.get_user_defined_function_or_methodr��__call__z{0.__module__}.{0.__qualname__}r�T��bound_methodr�r�r�F)NNN)rr�rwr`r8r�rr��format�_METACLASS_CALL_BLACKLISTr�r}rr$r�r�r�rf�_CLASS_NEW_BLACKLIST)r>r��callr�newrjr5r�r6�_get_signature�sl
�������
��zClassDocumenter._get_signaturer�c
Ks�|jjdvr|�dd�z|��\|_|_}Wnty4}zt�t	d�|j
|�WYd}~dSd}~ww|dur;dSt|fddi|��S)Nr�r�Fz0Failed to get a constructor signature for %s: %s�show_return_annotation)r�r�rwrr�r�r�r�r�r!r�r,)r>r�rr�r5r5r6r�s
���zClassDocumenter.format_argsc	s�|jrdS|jjdkr
dSt���}g}|��}|r\|jjdkr\t|j|j	d�}t|di�}|D]*}t
|||jj�}t|j
���}|j|dd�tjd�}t|fi|��}|�|�q0n|�|�d�|�S)Nr�r�r�r�r�)r��return_annotationr)r�r�r�r�r�get_overloaded_signaturesr�r+r�r�r(r�r"r�r1r�rr�r,rAr�)	r>r�rr�r��methodr�r�r�r�r5r6r*s.
���


z ClassDocumenter.format_signaturec	Cs�|jrC|jrC|jjD]8}z-t�|j�}|��d�|j|jg�}||j	vr.|j	�
|�WS||jvr8gWSWq
tyBYq
wgS)Nr�)
r�r�r6r"rurC�analyzer�rDr�rsrmr#)r>r�r��qualnamer5r5r6rGs


��z)ClassDocumenter.get_overloaded_signaturescCs^t|jd|j�}t|jdd�}|durt|jdd�}|r"d|vr"d}|r-|r-d�||g�SdS)NrCrDrBz<locals>r�)r+r`r�r�)r>�__modname__rDr5r5r6�get_canonical_fullnameXsz&ClassDocumenter.get_canonical_fullnamercs,|��}|jr
d|_t��|�|jr#d�|j�|jjvr#|�	d|�|�
�}|js9|r9|j|kr9|�	d||�|js�|jj
r�t�|j�rMt|jj�}nt|jd�r`t|jj�r`t|jj�}ng}|jj�d|j|j|j|�dd�|D�}|��}|�	d	|�|�	d
td�d�|�|�dSdSdS)
N�	attributer��
   :final:z   :canonical: %s�	__bases__�autodoc-process-basescSsg|]}t|��qSr5)r/rPr5r5r6rO�riz8ClassDocumenter.add_directive_header.<locals>.<listcomp>r�r�z	Bases: %s�, )r
r�rr�rr�r�r��finalsr�r	r�rp�show_inheritancer$�getorigbasesr`r"�__orig_bases__rwrrr�rrr )r>rr�canonical_fullname�bases�base_classesr�r5r6rfs.
�"�z$ClassDocumenter.add_directive_headerr)cs�t�j�j�j�}|s:�jjsdgfSg}�jjD]}||vr'|�||�qtjt	d�|�j
fdd�qd|fS�jjrFdt|�
��fSd�fdd�|�
�D�fS)NFr*r�r�csg|]
}|j�jkr|�qSr5)r�r`r,r�r5r6rO�rPz6ClassDocumenter.get_object_members.<locals>.<listcomp>)rr`r�r�rprrrAr�r�r!r�r0r"r1r2r5r�r6r�s"
��z"ClassDocumenter.get_object_membersrc
sP|jr
|��}|rgSdSt|dd�}|dur|S|j�d|jj�}g}t|j|j	�}|r2|�
|�|dvr�|�	|jdd�}t||j	|jj|jd�}|dur^|tjj
ks\|��tjj
kr^d}|s�|�	|jdd�}	t|	|j	|jj|jd�}|dur�|tjj
ks�|��tjj
kr�d}|r�|dkr�|g}n|�
|�|jjjjj���fdd�|D�S)	Nr�r�)rhrjr�r�rjcsg|]}t|����qSr5)r&)rNr��rrr5r6rO�r.z+ClassDocumenter.get_doc.<locals>.<listcomp>)r��get_variable_commentr	rprsr��autoclass_contentr)r`r�rArr�rErLr�r�rrrr)
r>r�commentr��
classdoc_fromr�
attrdocstringr��
initdocstringr�r5rr6r�sN
��
zClassDocumenter.get_doccCsRzdd�|j�f}t�|���}|��t|jj�	|g��WSt
y(YdSw)Nr�r�)r�r�r"rur�rr"r�r&rsr#)r>rxr�r5r5r6r�s�z$ClassDocumenter.get_variable_commentrr csR|jr!|��s!zttd�t|j�gdd�}Wn	ty Ynwt��|�dS)N�alias of %sr�)r�)	r�rrr r/r`r�r�r(�r>rr r�r5r6r(�s �zClassDocumenter.add_contentrMcs|jrdSt��|�dSr4)r�r�rdr�r�r5r6rd�sz ClassDocumenter.document_membersrXr�cst�j|||d�S)N)rr�rM)r�r^)r>rrXr�rMr�r5r6r^�s�zClassDocumenter.generater}r4r~),rBrCrDrEr�r[rUrnrargr_rkr�r-r4r�rr�r�r�r�rFr�rrrrrr�rr
rr	rr�rrrrrrr(rdr^r�r5r5r�r6r��sR
�	�$N" 4	�
����r�c@s>eZdZdZdZdZdZedede	de
dede
f
d	d
��ZdS)�ExceptionDocumenterz>
    Specialized ClassDocumenter subclass for exceptions.
    �	exception�
rtr�r�r�r3cCst|t�o	t|t�Sr4)r8r��
issubclass�
BaseExceptionr�r5r5r6r��sz'ExceptionDocumenter.can_document_memberN)rBrCrDrEr�r[rTr�rr�rFr�r5r5r5r6r�s�rc@s�eZdZUdZeed<dZeed<dZe	ed<dZ
eed<dZeed<dZ
ee	ed<defd	d
�Zdefdd�Zd
eddfdd�ZdS)�DataDocumenterMixinBaseNr�r�r�r�r`r�r3cCr;)z,Check directive header should be suppressed.Fr5r�r5r5r6� should_suppress_directive_header�z8DataDocumenterMixinBase.should_suppress_directive_headercCr;)z*Check :value: header should be suppressed.Fr5r�r5r5r6�should_suppress_value_headerr&z4DataDocumenterMixinBase.should_suppress_value_headerrcCr;)z(Update docstring for the NewType object.Nr5�r>rr5r5r6�update_contentr&z&DataDocumenterMixinBase.update_content)rBrCrDr�rr4r�rr�r�r�rr`r�r
rFr%r'rr)r5r5r5r6r$s
r$c�<eZdZdZdef�fdd�Zdeddf�fdd�Z�ZS)	�GenericAliasMixinzt
    Mixin for DataDocumenter and AttributeDocumenter to provide the feature for
    supporting GenericAliases.
    r3c�t�|j�p
t���Sr4)r$�isgenericaliasr`r�r%r�r�r5r6r%��z2GenericAliasMixin.should_suppress_directive_headerrNcsBt�|j�r|�td�t|j�d�|�dd�t��|�dS�Nrr�)r$r-r`rAr r/r�r)r(r�r5r6r)#sz GenericAliasMixin.update_content�	rBrCrDrErFr%rr)r�r5r5r�r6r+�r+cr*)	�NewTypeMixinzn
    Mixin for DataDocumenter and AttributeDocumenter to provide the feature for
    supporting NewTypes.
    r3cr,r4)r$�	isNewTyper`r�r%r�r�r5r6r%1r.z-NewTypeMixin.should_suppress_directive_headerrNcsHt�|j�rt|jj�}|�td�|d�|�dd�t��|�dSr/)	r$r3r`r/�
__supertype__rAr r�r))r>r�	supertyper�r5r6r)5s
zNewTypeMixin.update_contentr0r5r5r�r6r2+r1r2cs`eZdZdZdef�fdd�Zddedeeee	f�fdd�
Z
d	eddf�fd
d�Z�Z
S)
�TypeVarMixinzn
    Mixin for DataDocumenter and AttributeDocumenter to provide the feature for
    supporting TypeVars.
    r3cst|jt�p
t���Sr4)r8r`rr�r%r�r�r5r6r%Dr.z-TypeVarMixin.should_suppress_directive_headerNrcsR|durtjd|jjtdd�t|jt�r$|jjtjkr"t	��
�SgSt	��
�S)NrrVrW)r[r\r�rBrr8r`rrEr�rr�r�r5r6rHs��

zTypeVarMixin.get_docrcs�t|jt�rOt|jj�g}|jjD]	}|�t|��q|jjr*|�dt	|jj��|jj
r3|�d�|jjr<|�d�|�td�d�
|�d�|�dd�t��|�dS)Nzbound=\ zcovariant=Truezcontravariant=Truezalias of TypeVar(%s)rr�)r8r`r�reprrB�__constraints__rA�stringify_typehint�	__bound__r/�
__covariant__�__contravariant__r r�r�r))r>r�attrs�
constraintr�r5r6r)Vs

zTypeVarMixin.update_contentr4)rBrCrDrErFr%rrrr
r�rrr)r�r5r5r�r6r6>s
$r6c�beZdZdZd
dedef�fdd�
Zdef�fdd�Zdd
edee	e	e
f�fdd�
Z�ZS)� UninitializedGlobalVariableMixinz�
    Mixin for DataDocumenter to provide the feature for supporting uninitialized
    (type annotation only) global variables.
    Fr�r3cs�zt�jdd�WSty|}zhzDt|jj��4t|j|jj�}t	|d|jj
�}|jd|vrDt|_
||_	Wd�WWYd}~dSWd�n1sNwYWn	ty]Ynw|ra�tj|jdddd�|j��WYd}~dSd}~ww)	NT�r�r�rr�rr�F)r�rr�rr�r�rr�r�r.r�r��UNINITIALIZED_ATTRr`r�r�r�r�r�r�)r>r�r�r��annotationsr�r5r6rns6�����
��z.UninitializedGlobalVariableMixin.import_objectc�|jtup	t���Sr4�r`rBr�r'r�r�r5r6r'��
�z=UninitializedGlobalVariableMixin.should_suppress_value_headerNrcs|jturgSt��|�Sr4�r`rBr�rr�r�r5r6r��
z(UninitializedGlobalVariableMixin.get_docr}r4�
rBrCrDrErFrr'rrrr
r�rr�r5r5r�r6r@hs
,r@cs8eZdZUdZdZdZdZeej	�Z	e
ed<ee	d<e
e	d<eded	ed
ededef
d
d��Zdeddfdd�Zd*dedef�fdd�
Zdef�fdd�Zdeddf�fdd�Zd*deddfdd�Zdefdd�Zd edeeefd!d"�Zd+d#edeeeef�fd$d%�
Zd*d&eed'eddf�fd(d)�
Z�Z S),�DataDocumenterz9
    Specialized Documenter subclass for data items.
    r$�(i����r�r��no-valuertr�r�r�r3cCst|t�o|Sr4)r8r�r�r5r5r6r���z"DataDocumenter.can_document_memberNcCsttt�|��}||_z%t�|j�}|��|j�	�D]\\}}}|dkr,||vr,|||<qWdSt
y9YdSw)�9Update __annotations__ to support type_comment and so on.r�N)�dictr$r�r4r"rur�rrCr%r#)r>r�rCr��	classname�attrnamer�r5r5r6�update_annotations�s���z!DataDocumenter.update_annotationsFr�cs"t��|�}|jr|�|j�|Sr4)r�rr�rRr�r�r5r6r�szDataDocumenter.import_objectcs>t���rdS|��}td�t|g���\}}d|vrdSdS�NTrz
hide-valueF�r�r'rr'r�rz�r>rEr�rGr�r5r6r'�s
z+DataDocumenter.should_suppress_value_headerrc��t��|�|��}|jjtus|��rdS|jjr&|�d|jj|�dS|jj	dkrNt
|jd|jj�}|j
d|vrNt|�|j
d��}|�d||�z|jjsW|��rZWdSt|j�}|�d||�WdStysYdSw�Nz   :annotation: %sr�r��
   :type: z   :value: �r�rr
rpr�rlr%r�r�r�r.r�r�r�r9rs�no_valuer'r*r`rf�r>rrrC�objreprr�r5r6r�s.��
�z#DataDocumenter.add_directive_headerrMcCr@r4r5r�r5r5r6rd�r8zDataDocumenter.document_memberscC� |�|jp|jdd�}|p|jS�NrC�r�r�r`r��r>rXr5r5r6r���
zDataDocumenter.get_real_modnamerQcCsRzt�|j�}|��d|f}||jvrt|j|�WSWdSty(YdSw)Nr�)r"rur�rr&r"r#)r>rQr�rxr5r5r6�get_module_comment�s
���z!DataDocumenter.get_module_commentrcs&|�|jd�}|r
|gSt��|�S)Nr�)rbr�r�r)r>rrr�r5r6r�szDataDocumenter.get_docrr cs.d|_|st�}|�|�t�j||d�dS)N)r �r�rr)r�r(rr�r5r6r(�s

zDataDocumenter.add_contentr}r4)!rBrCrDrEr�r[rTrOr�r�r-r4rmrnr�rr�rFr�rRrr'rrdr�rr
rbrrrrr(r�r5r5r�r6rJ�s.
�$�rJc@�DeZdZdZdZdZejdZede	de
dede	d	ef
d
d��ZdS)
�NewTypeDataDocumenterz�
    Specialized Documenter subclass for NewTypes.

    Note: This must be invoked before FunctionDocumenter because NewType is a kind of
    function object.
    �newtypedatar$r�rtr�r�r�r3cCst�|�o|Sr4)r$r3r�r5r5r6r�rMz)NewTypeDataDocumenter.can_document_memberN)
rBrCrDrEr�rr�rTr�rr�rFr�r5r5r5r6re�
�recseZdZdZdZdZdZdZede	de
dede	d	ef
d
d��Zd'd
ed	ef�fdd�
Z
de	d	e
fdd�Zde
d	df�fdd�Zd'ded	dfdd�Zde	d	e
f�fdd�Zdeded	efdd�Zd ed!ed	eefd"d#�Zd(d$ed	eeee
f�fd%d&�
Z�ZS))�MethodDocumenterzQ
    Specialized Documenter subclass for methods (normal, static and class).
    r�2r�rtr�r�r�r3cCst�|�o
t|t�Sr4)r$r�r8r�r�r5r5r6r��z$MethodDocumenter.can_document_memberFr�cs`t��|�}|s
|S|jj�|j�}|dur|j}t�|�s(tj	||j|jd�r.|j
d|_
|S)N�r�rr�)r�rr�r7rsr�r`r$�
isclassmethod�isstaticmethodr[)r>r�r�r�r�r5r6r$s
�zMethodDocumenter.import_objectr�c
Ks|jjdvr|�dd�zN|jtjkr|jtkrd}n>tj|j|j|jd�r<|j	j
�d|jd�tj|jd|jj
d�}n|j	j
�d|jd�tj|jd|jj
d�}t|fi|��}Wn'tyw}zt�td	�|j|�WYd}~dSd}~wty�d
}Ynw|jjr�|�dd�}|S)
Nr�r�Fz()rkr�r�T�+Failed to get a method signature for %s: %sr�r�r�)r�r�rwr`r�r�r$rmr�r�r}rr�r�r,r�r�r�r!r�rfr�r�)r>r�r�rr�r5r5r6r�5s8
�
��
���zMethodDocumenter.format_argsrNcs�t��|�|��}|jj�|j|j�}t�	|�r|�
d|�t�|�s)t�|�r/|�
d|�t�
|�r:|�
d|�tj||j|jd�rJ|�
d|�|jr_d�|j�|jjvra|�
d|�dSdSdS)N�   :abstractmethod:r��   :classmethod:rkz   :staticmethod:r�r)r�rr
r�r7rsr�r`r$�isabstractmethodr�r�r�rlrmr�r�r�r)r>rrr�r�r5r6rVs

�z%MethodDocumenter.add_directive_headerrMcCr@r4r5r�r5r5r6rdfr8z!MethodDocumenter.document_memberscs�g}|jrd�|j�|jjvr|jjdkrd}nd}t�jd
i|��}|�|�|j	j
�|jd�}t�
|�rg|jj��D])\}}|turFq=|�||�}|rft|jd�}	|j	|	_	||	_dg|	_|�|	���q=|r�tj|j|j	|jd�r�tj|jd|jjd�}
ntj|jd|jjd�}
t|jd	i�}|jj�d�|j��D]9}|�|
|�}t|||jj�}tj|j|j	|jd�s�t|j���}
|j|
d
d�d�}t |fi|��}|�|�q�d�|�S)Nr�r�TFr�r�rkr�r�r�r�rr5)!r�r�r�r�r�r�r�rrAr�r7rsr$�is_singledispatch_method�
dispatcherr�r%r`r�rhr�rmr�r�r�r+r�r(r"r�r1r�r,)r>r�r�r�r�methr�r��dispatchmethrcr�r�r�r�r�r5r6risV

�
�
���
z!MethodDocumenter.format_signaturer�r�cCr�r�r�r�r5r5r6r��r�z$MethodDocumenter.merge_default_valuer�r�c
Cr�)	r�r�rnNr�cSr@r4r5r5r5r5r6r��r8z:MethodDocumenter.annotate_to_first_argument.<locals>.dummyr�r�r�r�r5r5r6r��r�z+MethodDocumenter.annotate_to_first_argumentrcs|jdur|jS|jddkrCt|j|j|jj|j|j�}|dur1|tj	j
ks/|��tj	j
kr1d}|rA|jj
jjj}t||d�gSgS|jddkr~t|j|j|jj|j|j�}|durl|tjj
ksj|��tjj
krld}|r||jj
jjj}t||d�gSgSt���S)Nr�r�r�r�)r�r�r)r`r�r�rr�r�r�rErLr�rrrrr&r�r�rrr�r5r6r�s:

�
�
zMethodDocumenter.get_docr}r4)rBrCrDrEr�rr[rTr�rr�rFr�rr�rrdrrr�rrrr�rrr
rr�r5r5r�r6rhs$�!1
,rhcr?)�NonDataDescriptorMixina
    Mixin for AttributeDocumenter to provide the feature for supporting non
    data-descriptors.

    .. note:: This mix-in must be inherited after other mix-ins.  Otherwise, docstring
              and :value: header will be suppressed unexpectedly.
    Fr�r3cs0t��|�}|rt�|j�sd|_|Sd|_|S�NTF)r�rr$�isattributedescriptorr`�non_data_descriptorr�r�r5r6r�s�z$NonDataDescriptorMixin.import_objectcst|dd�pt���S�NryF)r	r�r%r�r�r5r6r'�s�z3NonDataDescriptorMixin.should_suppress_value_headerNrcst|dd�rdSt��|�Srz)r	r�rr�r�r5r6r�szNonDataDescriptorMixin.get_docr}r4rIr5r5r�r6rv�s
	,rvcs�eZdZdZdefdd�Zddedef�fdd�
Zdef�fd	d
�Zddede	e
e
ef�fd
d�
Ze
defdd��Z�ZS)�
SlotsMixinzX
    Mixin for AttributeDocumenter to provide the feature for supporting __slots__.
    r3c	CsDzt�|j�}|r|jd|vrWdSWdSttfy!YdSw)z/Check the subject is an attribute in __slots__.r�TF)r$�getslotsr�r�rfr�)r>�	__slots__r5r5r6�isslotsattribute
	s�zSlotsMixin.isslotsattributeFr�cst��|�}|��r
t|_|Sr4)r�rr~�	SLOTSATTRr`r�r�r5r6r	szSlotsMixin.import_objectcs|jturdSt���Sr<)r`rr�r'r�r�r5r6r'	s

z'SlotsMixin.should_suppress_value_headerNrc
s�|jturHz t�|j�}|r#|�|jd�r#t||jd�}|gWSgWStyG}zt	j
td�|jj|fdd�gWYd}~Sd}~wwt
��|�S)Nr�z'Invalid __slots__ found on %s. Ignored.r�r�)r`rr$r|r�rsr�r&rfr�r�r!rDr�r)r>rr}r�r�r�r5r6r"	s

���zSlotsMixin.get_doccCst�dt�|jtur
dSdS)Nz4AttributeDocumenter._datadescriptor() is deprecated.TF)r[r\rr`rr�r5r5r6�_datadescriptor2	s�
zSlotsMixin._datadescriptorr}r4)rBrCrDrErFr~rr'rrrr
r�rr�r�r�r5r5r�r6r{	s$r{cs�eZdZdZe�Zdedefdd�Zdedefdd�Z	dd	edef�fd
d�
Z
def�fdd
�Zddede
eeef�fdd�
Z�ZS)�RuntimeInstanceAttributeMixina1
    Mixin for AttributeDocumenter to provide the feature for supporting runtime
    instance attributes (that are defined in __init__() methods with doc-comments).

    Example:

        class Foo:
            def __init__(self):
                self.attr = None  #: This is a target of this mix-in.
    r�r3cCs(|�||jd�rdS|�|�rdSdS)z8Check the subject is an attribute defined in __init__().r�TF)�get_attribute_commentr��+is_runtime_instance_attribute_not_commented)r>r�r5r5r6�is_runtime_instance_attributeJ	s

z;RuntimeInstanceAttributeMixin.is_runtime_instance_attributec
Cs�t�|�D]:}z-t|d�}t|d�}t�|�}|��|r3|jr3d�||jdg�}||jvr3WdSWqt	t
fy?YqwdS)zHCheck the subject is an attribute defined in __init__() without comment.rCrDr�r�TN)r$�getmror+r"rurr�r�rmr�r#)r>r�r�r�rr�rxr5r5r6r�T	s




��zIRuntimeInstanceAttributeMixin.is_runtime_instance_attribute_not_commentedFr�cszt�jdd�WSty�}zmzIt|jj��9t|j|jdd�d|j|jj	d�}|d}|�
|�rI|j|_||_
	Wd�WWYd}~dSWd�n1sSwYWn	tybYnw|rf�tj|jdd	d
d�|j��WYd}~dSd}~ww)
z`Check the existence of runtime instance attribute after failing to import the
        attribute.TrANr�rir��rr�rr�F)r�rr�rr�r�r�r�r�r�r��RUNTIME_INSTANCE_ATTRIBUTEr`r�r�r�r�r�r��r>r�r�r�r�r�r5r6rf	s8�
���	�
��z+RuntimeInstanceAttributeMixin.import_objectcs|j|jup
t���Sr4)r`r�r�r'r�r�r5r6r'�	r.z:RuntimeInstanceAttributeMixin.should_suppress_value_headerNrcs(|j|jur|�|j�rdSt��|�Sr4)r`r�r�r�r�rr�r�r5r6r�	s

�z%RuntimeInstanceAttributeMixin.get_docr}r4)rBrCrDrEr`r�rrFr�r�rr'rrrr
r�rr�r5r5r�r6r�<	s
,r�csteZdZdZdedefdd�Zddedef�fdd	�
Zdef�fd
d�Zdd
e	de
eeef�fdd�
Z
�ZS)�#UninitializedInstanceAttributeMixinz�
    Mixin for AttributeDocumenter to provide the feature for supporting uninitialized
    instance attributes (PEP-526 styled, annotation only attributes).

    Example:

        class Foo:
            attr: int  #: This is a target of this mix-in.
    r�r3cCs&t|d|jj�}|jd|vrdSdS)z2Check the subject is an annotation only attribute.Nr�TF)r.r�r�r�)r>r�rCr5r5r6�#is_uninitialized_instance_attribute�	szGUninitializedInstanceAttributeMixin.is_uninitialized_instance_attributeFr�cs�zt�jdd�WStyc}zOz+t|j|jdd�d|j|jjd�}|d}|�|�r:t	|_
||_WWYd}~dSWn	tyDYnw|rH�tj
|jdd	d
d�|j��WYd}~dSd}~ww)
�eCheck the exisitence of uninitialized instance attribute when failed to import
        the attribute.TrANr�rir�r�rr�rr�F)r�rr�r�r�r�r�r�r�rBr`r�r�r�r�r�r�r�r�r5r6r�	s0�
��
��z1UninitializedInstanceAttributeMixin.import_objectcrDr4rEr�r�r5r6r'�	rFz@UninitializedInstanceAttributeMixin.should_suppress_value_headerNrcs|jturdSt��|�Sr4rGr�r�r5r6r�	rHz+UninitializedInstanceAttributeMixin.get_docr}r4)rBrCrDrErrFr�rr'rrrr
r�rr�r5r5r�r6r��	s
,r�cs`eZdZUdZdZdZeej�Ze	e
d<eed<eed<dZ
eded	efd
d��Zeded
ededed	ef
dd��Zd/ded	dfdd�Zd	efdd�Zded	dfdd�Zd/ded	ef�fdd�
Zd	efdd�Zd	ef�fd d!�Zd"ed	df�fd#d$�Zded%ed	eeefd&d'�Zd0d(ed	eeeef�fd)d*�
Z d/d+ee!d,ed	df�fd-d.�
Z"�Z#S)1�AttributeDocumenterz9
    Specialized Documenter subclass for attributes.
    r
�<r�r�rLr!r�r3cCst�|�pt�|�pt�|�Sr4)r$r�r�r�)r�r5r5r6�is_function_or_method�	sz)AttributeDocumenter.is_function_or_methodrtr�r�r�cCs4t�|�rdSt|t�st�|�st|t�sdSdSrw)r$rxr8r�r�r�r�r5r5r6r��	s

��z'AttributeDocumenter.can_document_memberFrMNcCr@r4r5r�r5r5r6rd�	r8z$AttributeDocumenter.document_membersc	Cs�t�dt�t|jj��Pz5t|j|jdd�d|j	|jj
d�}|d|_t|jd|jj
�}|jd|vrAt|_WWd�dSWn	tyKYn	wWd�dSWd�dS1s_wYdS)	z+Check the subject is an instance attribute.z8AttributeDocumenter.isinstanceattribute() is deprecated.Nr�rir�r�TF)r[r\rrr�r�rr�r�r�r�r�r.r�rBr`r�)r>r�rCr5r5r6�isinstanceattribute�	s:��
����
��
��z'AttributeDocumenter.isinstanceattributec

Cs�zMtt�|��}||_t�|�D]:}z-t|d�}t|d�}t�|�}|��|j	�
�D]\\}}}	||kr=||vr=|	||<q+WqttfyJYqwWdStt
fyYYdSw)rNrCrDN)rOr$r�r4r�r+r"rurrCr%r�r#r�)
r>r�rCr�r�rr�rPrQr�r5r5r6rR�	s*


�����z&AttributeDocumenter.update_annotationsr�cs8t��|�}t�|j�r|jj|_|jr|�|j�|Sr4)r�rr$�isenumattributer`r+r�rRr�r�r5r6r
s
z!AttributeDocumenter.import_objectcCr]r^r_r`r5r5r6r�
raz$AttributeDocumenter.get_real_modnamecsBt���rdS|��}|rtd�t|g���\}}d|vrdSdSrSrTrUr�r5r6r'
s
z0AttributeDocumenter.should_suppress_value_headerrcrVrWrYr[r�r5r6r+
s*�
�z(AttributeDocumenter.add_directive_headerrQc
Cs�t�|�D]:}z-t|d�}t|d�}t�|�}|��|r3|jr3||f}||jvr3t|j|�WSWqt	t
fy?YqwdS)NrCrD)r$r�r+r"rurr�r&r"r�r#)r>r�rQr�r�rr�rxr5r5r6r�D
s




��z)AttributeDocumenter.get_attribute_commentrcsP|�|j|jd�}|r|gSz|jj}d|j_t��|�W||j_S||j_w)Nr�F)r�r�r�r�rr�r)r>rr�origr�r5r6rU
szAttributeDocumenter.get_docrr cs0d|_|dur
t�}|�|�t��||�dSr4rcrr�r5r6r(e
s

zAttributeDocumenter.add_contentr}r4)$rBrCrDrEr�r[rOr�r�r-r4rmrnrT�staticmethodrrFr�r�r�r�rdr�rRrr�r'rrr
r�rrrrr(r�r5r5r�r6r��	s4
�	$�r�cs�eZdZdZdZdZejdZede	de
dede	d	ef
d
d��Zdd
ed	ef�fdd�
Z
dded	dfdd�Zd	e
fdd�Zde
d	df�fdd�Z�ZS)�PropertyDocumenterz9
    Specialized Documenter subclass for properties.
    r�r�r�rtr�r�r�r3cCsJt|t�r#t�|�rdSt|jdi�}|�|�}t|t�o"t�|j�SdS)NTr7F)	r8r�r$�
ispropertyr+r`rsr��__func__)r�rtr�r�r�r7r�r5r5r6r�{
s


z&PropertyDocumenter.can_document_memberFr�cspt��|�}|r3t�|j�s3t|jdi�}|�|jd�}t	|t
�r1t�|j�r1|j|_d|_dSdSd|_|S)r�r7r�TF)
r�rr$r�r`r+r�rsr�r8r�r�rl)r>r�r�r7r�r�r5r6r�
sz PropertyDocumenter.import_objectrMNcCr@r4r5r�r5r5r6rd�
r8z#PropertyDocumenter.document_memberscCr]r^r_r`r5r5r6r��
raz#PropertyDocumenter.get_real_modnamerc
st��|�|��}t�|j�r|�d|�|jr|�d|�t|jdd�r+|jj	}nt|jdd�r7|jj
}nd}|r�|jjdkr�z"tj
||jjd�}|jtjurat|j�}|�d||�WdSWdSty�}zt�td�|j|�WYd}~dSd}~wty�YdSwdSdS)	Nrorp�fgetr�r�r�rXr�)r�rr
r$rqr`r�rlr+r�r�r�r�r�r�rrr�r9r�r�r�r!r�rf)r>rrr�r�r\r�r�r5r6r�
s<

�
�
����z'PropertyDocumenter.add_directive_headerr})rBrCrDrEr�r[r�rTr�rr�rFr�rrdr�rr�r5r5r�r6r�q
s
�r�c@rd)
�NewTypeAttributeDocumenterz�
    Specialized Documenter subclass for NewTypes.

    Note: This must be invoked before MethodDocumenter because NewType is a kind of
    function object.
    �newvarattributer
r�rtr�r�r�r3cCst|t�o
t�|�Sr4)r8r�r$r3r�r5r5r6r��
rjz.NewTypeAttributeDocumenter.can_document_memberN)
rBrCrDrEr�rrhrTr�rr�rFr�r5r5r5r6r��
rgr�r}cCstjdtdd�|jjS)r�z get_documenters() is deprecated.rVrW)r[r\rr�r��r}r5r5r6�get_documenters�
sr�r�rr�cGsH|jj��D]\}}t||�r|||g|�R�Sqt||g|�R�S)zAlternative getattr() for types)r��autodoc_attrgettrsr%r8r+)r}r�rr�r�r�r5r5r6r��
s

�r�r�cCs&|jdkrt�td��d|_dSdS)N�
alphabeticzdautodoc_member_order now accepts "alphabetical" instead of "alphabetic". Please update your setting.rb)r\r�r�r!)r}r�r5r5r6�migrate_autodoc_member_order�
s

�r�)�DataDeclarationDocumenter)�GenericAliasDocumenter)�InstanceAttributeDocumenter)� SingledispatchFunctionDocumenter)�SingledispatchMethodDocumenter)�SlotsAttributeDocumenter)�TypeVarDocumenterc
Cs�|�t�|�t�|�t�|�t�|�t�|�t�|�t�|�t�|�t	�|�t
�|�t�|�dddt
ddd��|�dddt
ddd	d
��|�dddt
dd
��|�did�|�ddd�|�dgd�|�dddt
dddd��|�dddt
dd��|�did�|�ddd�|�ddd�|�d�|�d�|�d�|�d�|�d�|jd td!d"�|�d#�|�d$�|�d%�tjdd&�S)'NrriTrhrjr\rbr�rcrdr��mixedr��autodoc_default_optionsr�r�r�r�r�r��$autodoc_typehints_description_target�all�
documentedr�r�rr�rr�r<r
z
config-initedi rSz$sphinx.ext.autodoc.preserve_defaultszsphinx.ext.autodoc.type_commentzsphinx.ext.autodoc.typehints)�version�parallel_read_safe)�add_autodocumenterr�r�rrJrer�r�rhr�r�r��add_config_valuer�	add_event�connectr��setup_extension�sphinx�__display_version__r�r5r5r6�setup�
sL











�
�
�







r�)rN)NFF)�rEr�r[r$rr�typesr�typingrrrrr	r
rrr
rrrr�docutils.statemachinerr��sphinx.applicationr�
sphinx.configrr�sphinx.deprecationrr�sphinx.environmentr�sphinx.ext.autodoc.importerrrrr�sphinx.ext.autodoc.mockrrr�
sphinx.localer r!�
sphinx.pycoder"r#�sphinx.utilr%�sphinx.util.docstringsr&r'�sphinx.util.inspectr(r)r*r+r,�sphinx.util.typingr-r.r/r0r9�sphinx.ext.autodoc.directiver1�	getLoggerrBr�r��__subclasses__�MethodDescriptorTyper��VERBOSEr�r@r7r9rGrRr^r`rBr=rr�rUr]r_rargrkrlrmrFrnruryrrr�r�rOr��tupler�r�r�r�r�r�r�r�r�r�r�r�r�rr$r+r2r6r@rJrerhrvr{r�r�r�r�r�r�r�r��sphinx.ext.autodoc.deprecatedr�r�r�r�r�r�r�r�r5r5r5r6�<module>s�<

�


	
��
�&5!Nz��[*)�sQ7P7�/M