
    i/^                       d Z ddlmZ ddlZddlmZmZmZmZm	Z	m
Z
mZmZmZ ddlmZ ddlmZ ddlmZmZ d	Z G d
 d          Z G d de          Zer_ddlmZ ddlmZmZ  ed          Z G d de
          Z G d de
          Z  G d de
          Z! G d de
          Z" G d de
          Z# G d d          ZdS )a:  
The MIT License (MIT)

Copyright (c) 2015-present Rapptz

Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
    )annotationsN)	AnyDictListMappingOptionalProtocolTYPE_CHECKINGTypeVarUnion   )utils)Colour)AttachmentFlags
EmbedFlags)Embedc                  6    e Zd ZddZddZddZddZddZdS )
EmbedProxylayerDict[str, Any]c                :    | j                             |           d S N)__dict__update)selfr   s     U/home/ubuntu/.hermes/hermes-agent/venv/lib/python3.11/site-packages/discord/embeds.py__init__zEmbedProxy.__init__*   s    U#####    returnintc                *    t          | j                  S r   lenr   r   s    r   __len__zEmbedProxy.__len__-   s    4=!!!r   strc                l     d                      fdt                     D                       }d| dS )Nz, c              3  l   K   | ].}|                     d           | dt          |          V  /dS )_=N)
startswithgetattr).0kr   s     r   	<genexpr>z&EmbedProxy.__repr__.<locals>.<genexpr>1   sP      cc1QRQ]Q]^aQbQbca66'$"2"266ccccccr   zEmbedProxy())joindir)r   inners   ` r   __repr__zEmbedProxy.__repr__0   s@    		ccccD		cccdd%U%%%%r   attrNonec                    d S r    )r   r5   s     r   __getattr__zEmbedProxy.__getattr__4   s    tr   otherobjectboolc                L    t          |t                    o| j        |j        k    S r   )
isinstancer   r   r   r:   s     r   __eq__zEmbedProxy.__eq__7   s     %,,P%.1PPr   Nr   r   r   r    )r   r&   )r5   r&   r   r6   )r:   r;   r   r<   )__name__
__module____qualname__r   r%   r4   r9   r@   r8   r   r   r   r   )   s~        $ $ $ $" " " "& & & &   Q Q Q Q Q Qr   r   c                  @     e Zd Zd	 fdZd
dZedd            Z xZS )EmbedMediaProxyr   r   c                    t                                          |           | j                            dd          | _        d S )Nflagsr   )superr   r   pop_flags)r   r   	__class__s     r   r   zEmbedMediaProxy.__init__<   s8    m''33r   r   r<   c                2    t          | j                  dk    S )Nr   r"   r$   s    r   __bool__zEmbedMediaProxy.__bool__@   s     4=!!A%%r   r   c                8    t          j        | j        pd          S Nr   )r   _from_valuerL   r$   s    r   rI   zEmbedMediaProxy.flagsF   s    *4;+;!<<<r   rA   r   r<   )r   r   )rC   rD   rE   r   rO   propertyrI   __classcell__)rM   s   @r   rG   rG   ;   sq        4 4 4 4 4 4& & & & = = = X= = = = =r   rG   )Self)r   	EmbedTypeTc                  $    e Zd ZU ded<   ded<   dS )_EmbedFooterProxyOptional[str]texticon_urlNrC   rD   rE   __annotations__r8   r   r   rZ   rZ   R   s*         r   rZ   c                  .    e Zd ZU ded<   ded<   ded<   dS )_EmbedFieldProxyr[   namevaluer<   inlineNr^   r8   r   r   ra   ra   V   s1         r   ra   c                  B    e Zd ZU ded<   ded<   ded<   ded<   ded<   d	S )
_EmbedMediaProxyr[   url	proxy_urlzOptional[int]heightwidthr   rI   Nr^   r8   r   r   rf   rf   [   sN             r   rf   c                  $    e Zd ZU ded<   ded<   dS )_EmbedProviderProxyr[   rb   rg   Nr^   r8   r   r   rl   rl   b   s*         r   rl   c                  8    e Zd ZU ded<   ded<   ded<   ded<   dS )_EmbedAuthorProxyr[   rb   rg   r]   proxy_icon_urlNr^   r8   r   r   rn   rn   f   sB         %%%%%%r   rn   c                  "   e Zd ZdZdZdddddddddJdZedKd            ZdLdZdMdZ	dNdZ
dOdZedPd            ZedQd!            Zej        dRd$            ZeZedSd%            Zej        dTd&            ZedUd(            Zddd)dVd,ZdLd-ZedWd/            ZdXd0ZedWd1            ZdXd2ZedWd3            ZedYd5            ZedZd7            Zddd8d[d;ZdLd<Zed\d>            Zd?d@d]dBZd?d@d^dDZ dLdEZ!d_dFZ"d?d@d^dGZ#d`dIZ$dS )ar   a  Represents a Discord embed.

    .. container:: operations

        .. describe:: len(x)

            Returns the total size of the embed.
            Useful for checking if it's within the 6000 character limit.

        .. describe:: bool(b)

            Returns whether the embed has any data set.

            .. versionadded:: 2.0

        .. describe:: x == y

            Checks if two embeds are equal.

            .. versionadded:: 2.0

    For ease of use, all parameters that expect a :class:`str` are implicitly
    casted to :class:`str` for you.

    .. versionchanged:: 2.0
        ``Embed.Empty`` has been removed in favour of ``None``.

    Attributes
    -----------
    title: Optional[:class:`str`]
        The title of the embed.
        This can be set during initialisation.
        Can only be up to 256 characters.
    type: :class:`str`
        The type of embed. Usually "rich".
        This can be set during initialisation.
        Possible strings for embed types can be found on discord's
        :ddocs:`api docs <resources/message#embed-object-embed-types>`
    description: Optional[:class:`str`]
        The description of the embed.
        This can be set during initialisation.
        Can only be up to 4096 characters.
    url: Optional[:class:`str`]
        The URL of the embed.
        This can be set during initialisation.
    timestamp: Optional[:class:`datetime.datetime`]
        The timestamp of the embed content. This is an aware datetime.
        If a naive datetime is passed, it is converted to an aware
        datetime with the local timezone.
    colour: Optional[Union[:class:`Colour`, :class:`int`]]
        The colour code of the embed. Aliased to ``color`` as well.
        This can be set during initialisation.
    )titlerg   type
_timestamp_colour_footer_image
_thumbnail_video	_provider_author_fieldsdescriptionrL   Nrich)colourcolorrq   rr   rg   r|   	timestampr~   Optional[Union[int, Colour]]r   rq   Optional[Any]rr   rW   rg   r|   r   Optional[datetime.datetime]c               8   ||n|| _         || _        || _        || _        || _        d| _        | j        t          | j                  | _        | j        t          | j                  | _        | j        t          | j                  | _        |	|| _        d S d S rQ   )r~   rq   rr   rg   r|   rL   r&   r   )r   r~   r   rq   rr   rg   r|   r   s           r   r   zEmbed.__init__   s     !' 2ff$)
#	"%*5:!TZDJ'"4#344D848}}DH &DNNN ! r   dataMapping[str, Any]r   rV   c                   |                      |           }|                    dd          |_        |                    dd          |_        |                    dd          |_        |                    dd          |_        |                    dd          |_        |j        t          |j                  |_        |j        t          |j                  |_        |j        t          |j                  |_        	 t          |d         	          |_	        n# t          $ r Y nw xY w	 t          j        |d
                   |_        n# t          $ r Y nw xY wdD ]/}	 ||         }t          |d|z   |            # t          $ r Y ,w xY w|S )ar  Converts a :class:`dict` to a :class:`Embed` provided it is in the
        format that Discord expects it to be in.

        You can find out about this format in the :ddocs:`official Discord documentation <resources/message#embed-object>`.

        Parameters
        -----------
        data: :class:`dict`
            The dictionary to convert into an embed.
        rq   Nrr   r|   rg   rI   r   r   rc   r   )	thumbnailvideoproviderauthorfieldsimagefooterr)   )__new__getrq   rr   r|   rg   rL   r&   r   rt   KeyErrorr   
parse_timers   setattr)clsr   r   r5   rc   s        r   	from_dictzEmbed.from_dict   s    {{3 XXgt,,
HHVT**	88M48888E4((hhw**:!TZDJ'"4#344D848}}DH	!W666DLL 	 	 	D		#.tK/@AADOO 	 	 	D	 ^ 	1 	1D1T
 cDj%0000    
 s6   >D 
D'&D'+E 
EE E==
F
	F
c                Z    | j                             |                                           S )z$Returns a shallow copy of the embed.)rM   r   to_dictr$   s    r   copyz
Embed.copy	  s     ~''777r   r    c                   t          | j        pd          t          | j        pd          z   }t          | dg           D ]0}|t          |d                   t          |d                   z   z  }1	 | j        d         }|t          |          z  }n# t
          t          f$ r Y nw xY w	 | j        }|t          |d                   z  }n# t
          $ r Y nw xY w|S )N r{   rb   rc   r\   )r#   rq   r|   r,   ru   AttributeErrorr   rz   )r   totalfieldfooter_textr   s        r   r%   zEmbed.__len__  s   DJ$"%%D,<,B(C(CCT9b11 	> 	>ESv''#eGn*=*===EE	&,v.K S%%%EE ) 	 	 	D	
	)\F S(((EE  	 	 	D	
 s$   1B B%$B%)C	 	
CCr<   c                    t          | j        | j        | j        | j        | j        | j        | j        | j        | j	        | j
        | j        | j        f          S r   )anyrq   rg   r|   r~   r   r   r   r   r   r   r   r   r$   s    r   rO   zEmbed.__bool__"  sV    
 


 
 	
r   r:   c                   t          |t                    o| j        |j        k    o| j        |j        k    o| j        |j        k    o| j        |j        k    o| j        |j        k    o| j        |j        k    o| j        |j        k    oo| j	        |j	        k    o_| j
        |j
        k    oO| j        |j        k    o?| j        |j        k    o/| j        |j        k    o| j        |j        k    o| j        |j        k    S r   )r>   r   rr   rq   rg   r|   r~   r   r   r   r   r   r   r   r   rL   r?   s     r   r@   zEmbed.__eq__4  s   %'' 
I# ,
ek),EI%,  E$55, u|+	,
 u|+, %/1, u|+, %/1, u|+, 
ek), /, 
ek), u|+	
r   r   c                8    t          j        | j        pd          S )zU:class:`EmbedFlags`: The flags of this embed.

        .. versionadded:: 2.5
        r   )r   rR   rL   r$   s    r   rI   zEmbed.flagsF  s     %dk&6Q777r   Optional[Colour]c                $    t          | dd           S )Nrt   r,   r$   s    r   r~   zEmbed.colourN  s    tY---r   rc   r6   c                    |	d | _         d S t          |t                    r	|| _         d S t          |t                    rt          |          | _         d S t	          d|j        j         d          )Nr   z3Expected discord.Colour, int, or None but received z	 instead.)rt   r>   r   r    	TypeErrorrM   rC   r   rc   s     r   r~   zEmbed.colourR  sz    =DLLLv&& 	w DLLLs## 	w!...DLLLuRWRaRjuuuvvvr   c                $    t          | dd           S )Nrs   r   r$   s    r   r   zEmbed.timestamp_  s    t\4000r   c                    t          |t          j                  r$|j        |                                }|| _        d S |	d | _        d S t          d|j        j         d          )Nz,Expected datetime.datetime or None received z instead)r>   datetimetzinfo
astimezoners   r   rM   rC   r   s     r   r   zEmbed.timestampc  sk    eX.// 	o|#((**#DOOO]"DOOOm5?Kcmmmnnnr   rZ   c                >    t          t          | di                     S )zReturns an ``EmbedProxy`` denoting the footer contents.

        See :meth:`set_footer` for possible values you can access.

        If the attribute has no value then ``None`` is returned.
        ru   r   r,   r$   s    r   r   zEmbed.footern       '$	266777r   )r\   r]   r\   r]   c               x    i | _         |t          |          | j         d<   |t          |          | j         d<   | S )a  Sets the footer for the embed content.

        This function returns the class instance to allow for fluent-style
        chaining.

        Parameters
        -----------
        text: :class:`str`
            The footer text. Can only be up to 2048 characters.
        icon_url: :class:`str`
            The URL of the footer icon. Only HTTP(S) is supported.
            Inline attachment URLs are also supported, see :ref:`local_image`.
        Nr\   r]   )ru   r&   )r   r\   r]   s      r   
set_footerzEmbed.set_footery  s@     #&t99DL '*8}}DL$r   c                .    	 | ` n# t          $ r Y nw xY w| S )zClears embed's footer information.

        This function returns the class instance to allow for fluent-style
        chaining.

        .. versionadded:: 2.0
        )ru   r   r$   s    r   remove_footerzEmbed.remove_footer  5    	 	 	 	D	     
rf   c                >    t          t          | di                     S )a  Returns an ``EmbedProxy`` denoting the image contents.

        Possible attributes you can access are:

        - ``url`` for the image URL.
        - ``proxy_url`` for the proxied image URL.
        - ``width`` for the image width.
        - ``height`` for the image height.
        - ``flags`` for the image's attachment flags.

        If the attribute has no value then ``None`` is returned.
        rv   rG   r,   r$   s    r   r   zEmbed.image       wtXr::;;;r   c               ^    |	 | ` n&# t          $ r Y nw xY wdt          |          i| _         | S )a  Sets the image for the embed content.

        This function returns the class instance to allow for fluent-style
        chaining.

        Parameters
        -----------
        url: Optional[:class:`str`]
            The source URL for the image. Only HTTP(S) is supported.
            If ``None`` is passed, any existing image is removed.
            Inline attachment URLs are also supported, see :ref:`local_image`.
        Nrg   )rv   r   r&   r   rg   s     r   	set_imagezEmbed.set_image  sR     ;KK!    s3xxDK     
c                >    t          t          | di                     S )a  Returns an ``EmbedProxy`` denoting the thumbnail contents.

        Possible attributes you can access are:

        - ``url`` for the thumbnail URL.
        - ``proxy_url`` for the proxied thumbnail URL.
        - ``width`` for the thumbnail width.
        - ``height`` for the thumbnail height.
        - ``flags`` for the thumbnail's attachment flags.

        If the attribute has no value then ``None`` is returned.
        rw   r   r$   s    r   r   zEmbed.thumbnail  s     wt\2>>???r   c               ^    |	 | ` n&# t          $ r Y nw xY wdt          |          i| _         | S )a  Sets the thumbnail for the embed content.

        This function returns the class instance to allow for fluent-style
        chaining.

        Parameters
        -----------
        url: Optional[:class:`str`]
            The source URL for the thumbnail. Only HTTP(S) is supported.
            If ``None`` is passed, any existing thumbnail is removed.
            Inline attachment URLs are also supported, see :ref:`local_image`.
        Nrg   )rw   r   r&   r   s     r   set_thumbnailzEmbed.set_thumbnail  sR     ;OO!    s3xxDO r   c                >    t          t          | di                     S )a  Returns an ``EmbedProxy`` denoting the video contents.

        Possible attributes include:

        - ``url`` for the video URL.
        - ``proxy_url`` for the proxied video URL.
        - ``height`` for the video height.
        - ``width`` for the video width.
        - ``flags`` for the video's attachment flags.

        If the attribute has no value then ``None`` is returned.
        rx   r   r$   s    r   r   zEmbed.video  r   r   rl   c                >    t          t          | di                     S )zReturns an ``EmbedProxy`` denoting the provider contents.

        The only attributes that might be accessed are ``name`` and ``url``.

        If the attribute has no value then ``None`` is returned.
        ry   r   r$   s    r   r   zEmbed.provider  s     '$R88999r   rn   c                >    t          t          | di                     S )zReturns an ``EmbedProxy`` denoting the author contents.

        See :meth:`set_author` for possible values you can access.

        If the attribute has no value then ``None`` is returned.
        rz   r   r$   s    r   r   zEmbed.author  r   r   )rg   r]   rb   r   c                   dt          |          i| _        |t          |          | j        d<   |t          |          | j        d<   | S )a  Sets the author for the embed content.

        This function returns the class instance to allow for fluent-style
        chaining.

        Parameters
        -----------
        name: :class:`str`
            The name of the author. Can only be up to 256 characters.
        url: :class:`str`
            The URL for the author.
        icon_url: :class:`str`
            The URL of the author icon. Only HTTP(S) is supported.
            Inline attachment URLs are also supported, see :ref:`local_image`.
        rb   Nrg   r]   )r&   rz   )r   rb   rg   r]   s       r   
set_authorzEmbed.set_author  sN    $ CII
 ?"%c((DL'*8}}DL$r   c                .    	 | ` n# t          $ r Y nw xY w| S )zClears embed's author information.

        This function returns the class instance to allow for fluent-style
        chaining.

        .. versionadded:: 1.4
        )rz   r   r$   s    r   remove_authorzEmbed.remove_author:  r   r   List[_EmbedFieldProxy]c                8    d t          | dg           D             S )zList[``EmbedProxy``]: Returns a :class:`list` of ``EmbedProxy`` denoting the field contents.

        See :meth:`add_field` for possible values you can access.

        If the attribute has no value then ``None`` is returned.
        c                ,    g | ]}t          |          S r8   )r   )r-   ds     r   
<listcomp>z Embed.fields.<locals>.<listcomp>R  s    DDD!
1DDDr   r{   r   r$   s    r   r   zEmbed.fieldsI  s%     EDwtY'C'CDDDDr   T)rd   rd   c                   |t          |          t          |          d}	 | j                            |           n# t          $ r |g| _        Y nw xY w| S )a  Adds a field to the embed object.

        This function returns the class instance to allow for fluent-style
        chaining. Can only be up to 25 fields.

        Parameters
        -----------
        name: :class:`str`
            The name of the field. Can only be up to 256 characters.
        value: :class:`str`
            The value of the field. Can only be up to 1024 characters.
        inline: :class:`bool`
            Whether the field should be displayed inline.
        rd   rb   rc   )r&   r{   appendr   )r   rb   rc   rd   r   s        r   	add_fieldzEmbed.add_fieldT  sr    " IIZZ
 
	#L&&&& 	# 	# 	#!7DLLL	# s   = AAindexc                   |t          |          t          |          d}	 | j                            ||           n# t          $ r |g| _        Y nw xY w| S )al  Inserts a field before a specified index to the embed.

        This function returns the class instance to allow for fluent-style
        chaining. Can only be up to 25 fields.

        .. versionadded:: 1.2

        Parameters
        -----------
        index: :class:`int`
            The index of where to insert the field.
        name: :class:`str`
            The name of the field. Can only be up to 256 characters.
        value: :class:`str`
            The value of the field. Can only be up to 1024 characters.
        inline: :class:`bool`
            Whether the field should be displayed inline.
        r   )r&   r{   insertr   r   r   rb   rc   rd   r   s         r   insert_field_atzEmbed.insert_field_atq  st    * IIZZ
 
	#Lu---- 	# 	# 	#!7DLLL	# s   > AAc                j    	 | j                                          n# t          $ r
 g | _         Y nw xY w| S )zRemoves all fields from this embed.

        This function returns the class instance to allow for fluent-style
        chaining.

        .. versionchanged:: 2.0
            This function now returns the class instance.
        )r{   clearr   r$   s    r   clear_fieldszEmbed.clear_fields  sK    	L     	 	 	DLLL	 s    00c                H    	 | j         |= n# t          t          f$ r Y nw xY w| S )aS  Removes a field at a specified index.

        If the index is invalid or out of bounds then the error is
        silently swallowed.

        This function returns the class instance to allow for fluent-style
        chaining.

        .. note::

            When deleting a field by index, the index of the other fields
            shift to fill the gap just like a regular list.

        .. versionchanged:: 2.0
            This function now returns the class instance.

        Parameters
        -----------
        index: :class:`int`
            The index of the field to remove.
        )r{   r   
IndexError)r   r   s     r   remove_fieldzEmbed.remove_field  s@    ,	U##
+ 	 	 	D	 s    c                   	 | j         |         }n*# t          t          t          f$ r t          d          w xY wt	          |          |d<   t	          |          |d<   ||d<   | S )a  Modifies a field to the embed object.

        The index must point to a valid pre-existing field. Can only be up to 25 fields.

        This function returns the class instance to allow for fluent-style
        chaining.

        Parameters
        -----------
        index: :class:`int`
            The index of the field to modify.
        name: :class:`str`
            The name of the field. Can only be up to 256 characters.
        value: :class:`str`
            The value of the field. Can only be up to 1024 characters.
        inline: :class:`bool`
            Whether the field should be displayed inline.

        Raises
        -------
        IndexError
            An invalid index was provided.
        zfield index out of rangerb   rc   rd   )r{   r   r   r   r&   r   s         r   set_field_atzEmbed.set_field_at  st    2	9L'EE:~6 	9 	9 	97888	9 D		fUg hs    '7	EmbedDatac                p     fdt           j        D             }	 |                    d          }|r
|j        |d<   n# t          $ r Y nw xY w	 |                    d          }|r||j        r;|                    t          j        j	                  
                                |d<   nK|                    t          j        j	                  
                                |d<   n# t          $ r Y nw xY w j        r
 j        |d<    j        r
 j        |d<    j        r
 j        |d	<    j        r
 j        |d
<   |S )z'Converts this embed object into a dict.c                z    i | ]7}|d          dk    t          |          |dd         t          |          8S )r   r)   r   N)hasattrr,   )r-   keyr   s     r   
<dictcomp>z!Embed.to_dict.<locals>.<dictcomp>  sP     
 
 
1v}}s!3!3} GWT3''}}r   r~   r   r   )tz)r   rr   r|   rg   rq   )r   	__slots__rK   rc   r   r   r   r   timezoneutc	isoformatreplacerr   r|   rg   rq   )r   resultr~   r   s   `   r   r   zEmbed.to_dict  s   

 
 
 

 
 
	/ZZ))F  /"(,w	  	 	 	D			f

;//I  f# f*3*>*>(BSBW*>*X*X*b*b*d*dF;''*3*;*;8CTCX*;*Y*Y*c*c*e*eF;'  	 	 	D	 9 	'!YF6N 	5$($4F=!8 	% HF5M: 	)"jF7Os!   = 
A
	A
C" "
C/.C/)r~   r   r   r   rq   r   rr   rW   rg   r   r|   r   r   r   )r   r   r   rV   )r   rV   rB   rS   )r:   r   r   r<   )r   r   )r   r   )rc   r   r   r6   )r   r   )rc   r   r   r6   )r   rZ   )r\   r   r]   r   r   rV   )r   rf   )rg   r   r   rV   )r   rl   )r   rn   )rb   r   rg   r   r]   r   r   rV   )r   r   )rb   r   rc   r   rd   r<   r   rV   )
r   r    rb   r   rc   r   rd   r<   r   rV   )r   r    r   rV   )r   r   )%rC   rD   rE   __doc__r   r   classmethodr   r   r%   rO   r@   rT   rI   r~   setterr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r8   r   r   r   r   m   s       4 4lI( 04.2# !%)15' ' ' ' ' '< 3 3 3 [3j8 8 8 8   *
 
 
 
$
 
 
 
$ 8 8 8 X8 . . . X. ]w w w ]w E1 1 1 X1 o o o o 8 8 8 X8 37RV      0    < < < X<    4 @ @ @ X@    4 < < < X<  : : : X: 8 8 8 X8 =A\`      :    E E E XE BF      : TX      B       : QU ! ! ! ! ! !F. . . . . .r   r   )$r   
__future__r   r   typingr   r   r   r   r   r	   r
   r   r   r   r   r~   r   rI   r   r   __all__r   rG   typing_extensionsrV   types.embedr   r   rW   rX   rZ   ra   rf   rl   rn   r8   r   r   <module>r      sZ   0 # " " " " "  ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^             . . . . . . . .Q Q Q Q Q Q Q Q$= = = = =j = = =   &&&&&&&::::::::A         H          8   
    8       h   & & & & &H & & &c
 c
 c
 c
 c
 c
 c
 c
 c
 c
r   