Ë
    ðmxi·N  ã                  óî  — U d Z ddlmZ ddlZddlZddlZddlZddlmZ ddlmZ ddlm	Z	 ddlm
Z
 ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlZddlmZ ddlmZ ddlmZ ddlm Z  ejB                  ses%ddl"m#Z# ddl"m$Z$ ddl"m%Z% dd l"m&Z& dd!l"m'Z' dd"l"m(Z( n$ddl)m%Z% dd l)m&Z& ddl)m#Z# ddl*m$Z$ dd!l*m'Z' dd"l*m(Z(  ed#e¬$«      Z+ ed%e¬$«      Z, ed&e¬$«      Z- ed'd(¬)«      Z. e/«       Z0d*e1d+<    e/dg«      Z2d*e1d,<   dXd-„Z3dYd.„Z4 e#«       Z5d/e1d0<    G d1„ d2e&e,e-f   «      Z6 ed3e¬$«      Z7 ed4e¬$«      Z8 G d5„ d6ee+   «      Z9 G d7„ d8e9e+   «      Z: G d9„ d:e%e9e+   «      Z;dZd;„Z<e=Z>e<Z? G d<„ d=ee+   «      Z@ G d>„ d?e$«      ZA G d@„ dAee,e-f   «      ZB G dB„ dCee,e-f   «      ZCeDZEe=ZFe'ZG G dD„ dEee+   «      ZHd[dF„ZIdZd\dG„ZJd]dH„ZKdI„ ZLd^dJ„ZM	 dZ	 	 	 	 	 	 	 d_dK„ZNd`dL„ZO G dM„ dNej                   e,e-f   «      ZQ G dO„ dPe e.   «      ZR G dQ„ dRe «      ZS G dS„ dTee+   «      ZT G dU„ dVeTe+   «      ZUdW„ ZVy)azCollection classes and helpers.é    )ÚannotationsN)ÚAny)ÚCallable)Úcast)Ú	Container)ÚDict)Ú	FrozenSet)ÚGeneric)ÚIterable)ÚIterator)ÚList)ÚMapping)ÚNoReturn)ÚOptional)Úoverload)ÚSequence)ÚSet)ÚTuple)ÚTypeVar)ÚUnion)Ú
ValuesViewé   )ÚHAS_CYEXTENSION)Úis_non_string_iterable)ÚLiteral)ÚProtocol)Úimmutabledict)ÚIdentitySet)ÚReadOnlyContainer)ÚImmutableDictBase)Ú
OrderedSet)Úunique_listÚ_T)ÚboundÚ_KTÚ_VTÚ_T_coT)Ú	covariantzFrozenSet[Any]Ú	EMPTY_SETÚNONE_SETc                óø   — t        | «      j                  |«      }g }t        | «      t        |«      }}	 |D ].  }||v r|j                  |«       ||}} n'|j	                  |«       Œ0 |j                  |«       	 |S ŒH)af  merge two lists, maintaining ordering as much as possible.

    this is to reconcile vars(cls) with cls.__annotations__.

    Example::

        >>> a = ["__tablename__", "id", "x", "created_at"]
        >>> b = ["id", "name", "data", "y", "created_at"]
        >>> merge_lists_w_ordering(a, b)
        ['__tablename__', 'id', 'name', 'data', 'y', 'x', 'created_at']

    This is not necessarily the ordering that things had on the class,
    in this case the class is::

        class User(Base):
            __tablename__ = "users"

            id: Mapped[int] = mapped_column(primary_key=True)
            name: Mapped[str]
            data: Mapped[Optional[str]]
            x = Column(Integer)
            y: Mapped[int]
            created_at: Mapped[datetime.datetime] = mapped_column()

    But things are *mostly* ordered.

    The algorithm could also be done by creating a partial ordering for
    all items in both lists and then using topological_sort(), but that
    is too much overhead.

    Background on how I came up with this is at:
    https://gist.github.com/zzzeek/89de958cf0803d148e74861bd682ebae

    )ÚsetÚintersectionÚiterÚdiscardÚappendÚextend)ÚaÚbÚoverlapÚresultÚcurrentÚotherÚelements          úS/home/htdocs/ttos/venv/lib/python3.12/site-packages/sqlalchemy/util/_collections.pyÚmerge_lists_w_orderingr:   L   sˆ   € ôF �!‹f×!Ñ! !Ó$€Gà€Fä˜!“Wœd 1›gˆU€Gà
Øò 		ˆGØ˜'Ñ!Ø—‘ Ô(Ø!(¨%�w�Ùà�M‰M˜'Õ"ð		ð �M‰M˜%Ô Øà€Mð ó    c                óL   — | st         S t        | t        «      r| S t        | «      S ©N)Ú
EMPTY_DICTÚ
isinstancer   )Úds    r9   Úcoerce_to_immutabledictrA   „   s%   € ÙÜÐÜ	�A”}Ô	%Øˆä˜QÓÐr;   zimmutabledict[Any, Any]r>   c                  ó8   — e Zd ZdZdd„Zd	d„Zd
d„Zdd„Zdd„Zy)Ú
FacadeDictz*A dictionary that is not publicly mutable.c                ó0   — t        j                  | «      }|S r=   )r    Ú__new__)ÚclsÚargsÚnews      r9   rE   zFacadeDict.__new__“   s   € Ü×'Ñ'¨Ó,ˆØˆ
r;   c                ó   — t        d«      ‚)Nz\an immutabledict shouldn't need to be copied.  use dict(d) if you need a mutable dictionary.)ÚNotImplementedError©Úselfs    r9   ÚcopyzFacadeDict.copy—   s   € Ü!ð0ó
ð 	
r;   c                ó&   — t         t        | «      ffS r=   )rC   ÚdictrK   s    r9   Ú
__reduce__zFacadeDict.__reduce__�   s   € ÜœD ›J˜=Ð(Ð(r;   c                ó2   — t         j                  | ||«       y)z,insert an item into the dictionary directly.N)rO   Ú__setitem__©rL   ÚkeyÚvalues      r9   Ú_insert_itemzFacadeDict._insert_item    s   € ä×Ñ˜˜s EÕ*r;   c                ó2   — dt         j                  | «      z  S )NzFacadeDict(%s))rO   Ú__repr__rK   s    r9   rX   zFacadeDict.__repr__¤   s   € Ø¤$§-¡-°Ó"5Ñ5Ð5r;   N)rG   r   ÚreturnzFacadeDict[Any, Any])rY   r   ©rY   r   ©rT   r%   rU   r&   rY   ÚNone)rY   Ústr)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__rE   rM   rP   rV   rX   © r;   r9   rC   rC   �   s   „ Ù4óó
ó)ó+ô6r;   rC   Ú_DTÚ_Fc                  ó  ‡ — e Zd ZU dZdZded<   dd„Zdd„Zdd„Zdˆ fd„Z	d d	„Z
d!d
„Zd"d„Zd#d„Zd!d„Zd$d„Zd%d„Zd"d„Zd&d„Zd'd„Zd(d„Zed)d„«       Zed*d„«       Z	 d+	 	 	 	 	 d,d„Zdd„Zd-d„Zd.d„Zd&d„Zd/d„Zˆ xZS )0Ú
Propertiesz8Provide a __getattr__/__setattr__ interface over a dict.©Ú_dataúDict[str, _T]rh   c                ó2   — t         j                  | d|«       y ©Nrh   ©ÚobjectÚ__setattr__)rL   Údatas     r9   Ú__init__zProperties.__init__´   s   € Ü×Ñ˜4 ¨$Õ/r;   c                ó,   — t        | j                  «      S r=   ©Úlenrh   rK   s    r9   Ú__len__zProperties.__len__·   ó   € Ü�4—:‘:‹Ðr;   c                óZ   — t        t        | j                  j                  «       «      «      S r=   )r.   Úlistrh   ÚvaluesrK   s    r9   Ú__iter__zProperties.__iter__º   s   € Ü”D˜Ÿ™×*Ñ*Ó,Ó-Ó.Ð.r;   c                ó˜   •— t        t        «       «      | j                  j                  «       D �cg c]  }t	        |«      ‘Œ c}z   S c c}w r=   )ÚdirÚsuperrh   Úkeysr]   )rL   ÚkÚ	__class__s     €r9   Ú__dir__zProperties.__dir__½   s1   ø€ Ü”5“7‹|¨t¯z©z¯©Ó/@ÖA¨!œs 1�vÒAÑAÐAùÒAs   °Ac                ó0   — t        | «      t        |«      z   S r=   )rw   )rL   r7   s     r9   Ú__add__zProperties.__add__À   s   € Ü�D‹zœD ›KÑ'Ð'r;   c                ó"   — || j                   |<   y r=   rg   ©rL   rT   Úobjs      r9   rR   zProperties.__setitem__Ã   ó   € Øˆ�
‰
�3Šr;   c                ó    — | j                   |   S r=   rg   ©rL   rT   s     r9   Ú__getitem__zProperties.__getitem__Æ   s   € Ø�z‰z˜#‰Ðr;   c                ó   — | j                   |= y r=   rg   rˆ   s     r9   Ú__delitem__zProperties.__delitem__É   ó   € Ø�J‰J�s‰Or;   c                ó"   — || j                   |<   y r=   rg   r„   s      r9   rn   zProperties.__setattr__Ì   r†   r;   c                ó   — d| j                   iS rk   rg   rK   s    r9   Ú__getstate__zProperties.__getstate__Ï   s   € Ø˜Ÿ™Ð$Ð$r;   c                ó8   — t         j                  | d|d   «       y rk   rl   )rL   Ústates     r9   Ú__setstate__zProperties.__setstate__Ò   s   € Ü×Ñ˜4 ¨%°©.Õ9r;   c                óR   — 	 | j                   |   S # t        $ r t        |«      ‚w xY wr=   )rh   ÚKeyErrorÚAttributeErrorrˆ   s     r9   Ú__getattr__zProperties.__getattr__Õ   s/   € ð	&Ø—:‘:˜c‘?Ð"øÜò 	&Ü  Ó%Ð%ð	&ús   ‚ ‘&c                ó   — || j                   v S r=   rg   rˆ   s     r9   Ú__contains__zProperties.__contains__Û   ó   € Ø�d—j‘jÐ Ð r;   c                ó,   — t        | j                  «      S )z8Return an immutable proxy for this :class:`.Properties`.)ÚReadOnlyPropertiesrh   rK   s    r9   Úas_readonlyzProperties.as_readonlyÞ   s   € ô " $§*¡*Ó-Ð-r;   c                ó:   — | j                   j                  |«       y r=   )rh   Úupdate)rL   rU   s     r9   rž   zProperties.updateã   s   € Ø�
‰
×Ñ˜%Õ r;   c                 ó   — y r=   rb   rˆ   s     r9   ÚgetzProperties.getæ   s   € Ø-0r;   c                 ó   — y r=   rb   ©rL   rT   Údefaults      r9   r    zProperties.geté   ó   € ØHKr;   c                ó   — || v r| |   S |S r=   rb   r¢   s      r9   r    zProperties.getì   s   € ð �$‰;Ø˜‘9ÐàˆNr;   c                ó,   — t        | j                  «      S r=   )rw   rh   rK   s    r9   r}   zProperties.keysô   ó   € Ü�D—J‘JÓÐr;   c                óH   — t        | j                  j                  «       «      S r=   )rw   rh   rx   rK   s    r9   rx   zProperties.values÷   s   € Ü�D—J‘J×%Ñ%Ó'Ó(Ð(r;   c                óH   — t        | j                  j                  «       «      S r=   )rw   rh   ÚitemsrK   s    r9   rª   zProperties.itemsú   s   € Ü�D—J‘J×$Ñ$Ó&Ó'Ð'r;   c                ó   — || j                   v S r=   rg   rˆ   s     r9   Úhas_keyzProperties.has_keyý   r™   r;   c                ó8   — | j                   j                  «        y r=   )rh   ÚclearrK   s    r9   r®   zProperties.clear   s   € Ø�
‰
×ÑÕr;   )ro   ri   ©rY   Úint©rY   úIterator[_T])rY   z	List[str])r7   zProperties[_F]rY   zList[Union[_T, _F]])rT   r]   r…   r#   rY   r\   )rT   r]   rY   r#   )rT   r]   rY   r\   )rY   úDict[str, Any])r‘   r³   rY   r\   )rT   r]   rY   Úbool)rY   zReadOnlyProperties[_T])rU   ri   rY   r\   )rT   r]   rY   zOptional[_T])rT   r]   r£   úUnion[_DT, _T]rY   rµ   r=   )rT   r]   r£   zOptional[Union[_DT, _T]]rY   zOptional[Union[_T, _DT]])rY   úList[_T])rY   zList[Tuple[str, _T]]©rY   r\   )r^   r_   r`   ra   Ú	__slots__Ú__annotations__rp   rt   ry   r€   r‚   rR   r‰   r‹   rn   r�   r’   r–   r˜   rœ   rž   r   r    r}   rx   rª   r¬   r®   Ú__classcell__)r   s   @r9   rf   rf   ­   s·   ø… ÙBà€IàÓó0óó/õBó(óóóóó%ó:ó&ó!ó.ó
!ð Ú0ó Ø0àÚKó ØKð =AðØðØ!9ðà	!óó ó)ó(ó!÷r;   rf   c                  ó   — e Zd ZdZdZd„ Zy)ÚOrderedPropertieszUProvide a __getattr__/__setattr__ interface with an OrderedDict
    as backing store.rb   c                ó@   — t         j                  | t        «       «       y r=   )rf   rp   ÚOrderedDictrK   s    r9   rp   zOrderedProperties.__init__
  s   € Ü×Ñ˜D¤+£-Õ0r;   N)r^   r_   r`   ra   r¸   rp   rb   r;   r9   r¼   r¼     s   „ ñð €Ió1r;   r¼   c                  ó   — e Zd ZdZdZy)r›   zDProvide immutable dict/object attribute to an underlying dictionary.rb   N)r^   r_   r`   ra   r¸   rb   r;   r9   r›   r›     s
   „ ÙNà�Ir;   r›   c                óŽ   — t        | |¬«      D �cg c]	  }|| |   f‘Œ }}| j                  «        | j                  |«       yc c}w )zSort an OrderedDict in-place.)rT   N)Úsortedr®   rž   )r@   rT   r~   rª   s       r9   Ú_ordered_dictionary_sortrÂ     s?   € ô !' q¨cÔ 2Ö3˜1ˆa��1‘ŠYÐ3€EÐ3à‡G�G„Ià‡H�HˆU…Oùò	 4s   �Ac                  ó.   — e Zd Zddd„Zd„ Zd„ Zd„ Zd„ Zy)	ÚWeakSequencec                óž   — t        j                  | «      fd„}|| _        |D �cg c]  }t        j                  ||«      ‘Œ c}| _        y c c}w )Nc                óN   —  |«       }|�|j                   j                  | «       y y r=   )Ú_storageÚremove)ÚitemÚselfrefrL   s      r9   Ú_removez&WeakSequence.__init__.<locals>._remove&  s&   € Ù“9ˆDØÐØ—‘×$Ñ$ TÕ*ð  r;   )ÚweakrefÚrefrË   rÇ   )rL   Ú_WeakSequence__elementsrË   r8   s       r9   rp   zWeakSequence.__init__#  sE   € ô #*§+¡+¨dÓ"3ó 	+ð
 ˆŒà9Cö
Ø.5ŒG�K‰K˜ Õ)ò
ˆ�ùò 
s   ¤A
c                óv   — | j                   j                  t        j                  || j                  «      «       y r=   )rÇ   r0   rÌ   rÍ   rË   )rL   rÉ   s     r9   r0   zWeakSequence.append0  s#   € Ø�‰×ÑœWŸ[™[¨¨t¯|©|Ó<Õ=r;   c                ó,   — t        | j                  «      S r=   )rs   rÇ   rK   s    r9   rt   zWeakSequence.__len__3  s   € Ü�4—=‘=Ó!Ð!r;   c                ó6   — d„ d„ | j                   D «       D «       S )Nc              3  ó&   K  — | ]	  }|€Œ|–— Œ y ­wr=   rb   )Ú.0r…   s     r9   ú	<genexpr>z(WeakSequence.__iter__.<locals>.<genexpr>7  s   è ø€ ò 
Ø¸s¹ŒCñ
ùs   ‚Šc              3  ó*   K  — | ]  } |«       –— Œ y ­wr=   rb   )rÓ   rÍ   s     r9   rÔ   z(WeakSequence.__iter__.<locals>.<genexpr>8  s   è ø€ Ò; c™CŸEÑ;ùs   ‚)rÇ   rK   s    r9   ry   zWeakSequence.__iter__6  s   € ñ
Ù;¨T¯]©]Ô;ô
ð 	
r;   c                óf   — 	 | j                   |   } |«       S # t        $ r t        d|z  «      ‚w xY w)NzIndex %s out of range)rÇ   r”   Ú
IndexError)rL   Úindexr…   s      r9   r‰   zWeakSequence.__getitem__;  s@   € ð	Ø—-‘- Ñ&ˆCñ “5ˆLøô ò 	>ÜÐ4°uÑ<Ó=Ð=ð	>ús   ‚ ˜0N)rb   )rÎ   zSequence[_T])r^   r_   r`   rp   r0   rt   ry   r‰   rb   r;   r9   rÄ   rÄ   "  s   „ ô
ò>ò"ò
ó
r;   rÄ   c                  ó   — e Zd Zddd„Zy)ÚOrderedIdentitySetNc                ó‚   — t        j                  | «       t        «       | _        |r|D ]  }| j	                  |«       Œ y y r=   )r   rp   r¾   Ú_membersÚadd)rL   ÚiterableÚos      r9   rp   zOrderedIdentitySet.__init__E  s;   € Ü×Ñ˜TÔ"Ü#›ˆŒÙØò �Ø—‘˜•ñð r;   r=   )rÞ   zOptional[Iterable[Any]])r^   r_   r`   rp   rb   r;   r9   rÚ   rÚ   D  s   „ õr;   rÚ   c                  ó    — e Zd ZdZdd„Zdd„Zy)ÚPopulateDictz•A dict which populates missing values via a creation function.

    Note the creation function takes a key, unlike
    collections.defaultdict.

    c                ó   — || _         y r=   ©Úcreator)rL   rä   s     r9   rp   zPopulateDict.__init__U  s	   € Øˆ�r;   c                ó2   — | j                  |«      x| |<   }|S r=   rã   ©rL   rT   Úvals      r9   Ú__missing__zPopulateDict.__missing__X  s   € ØŸ,™, sÓ+Ð+ˆˆS‰	�CØˆ
r;   N)rä   zCallable[[_KT], _VT]©rT   r   rY   r   ©r^   r_   r`   ra   rp   rè   rb   r;   r9   rá   rá   M  s   „ ñóôr;   rá   c                  ó    — e Zd ZdZdd„Zdd„Zy)ÚWeakPopulateDictzaLike PopulateDict, but assumes a self + a method and does not create
    a reference cycle.

    c                ór   — |j                   | _        |j                  }t        j                  |«      | _        y r=   )Ú__func__rä   Ú__self__rÌ   rÍ   Úweakself)rL   Úcreator_methodrð   s      r9   rp   zWeakPopulateDict.__init__c  s*   € Ø%×.Ñ.ˆŒØ!×*Ñ*ˆÜŸ™ HÓ-ˆ�r;   c                óP   — | j                  | j                  «       |«      x| |<   }|S r=   )rä   rð   ræ   s      r9   rè   zWeakPopulateDict.__missing__h  s&   € ØŸ,™, t§}¡}£¸Ó<Ð<ˆˆS‰	�CØˆ
r;   N)rñ   ztypes.MethodTyperé   rê   rb   r;   r9   rì   rì   ]  s   „ ñó
.ô
r;   rì   c                  óV   — e Zd ZU dZdZded<   ded<   ded<   	 d	 	 	 dd
„Zdd„Zdd„Zy	)ÚUniqueAppenderz½Appends items to a collection ensuring uniqueness.

    Additional appends() of the same object are ignored.  Membership is
    determined by identity (``is a``) not equality (``==``).
    )ro   Ú_data_appenderÚ_uniqueú&Union[Iterable[_T], Set[_T], List[_T]]ro   zCallable[[_T], None]rõ   zDict[int, Literal[True]]rö   Nc                óè   — || _         i | _        |rt        ||«      | _        y t	        |d«      rt        d|«      j                  | _        y t	        |d«      rt        d|«      j                  | _        y y )Nr0   r¶   rÝ   zSet[_T])ro   rö   Úgetattrrõ   Úhasattrr   r0   rÝ   )rL   ro   Úvias      r9   rp   zUniqueAppender.__init__ƒ  sg   € ð
 ˆŒ	ØˆŒÙÜ")¨$°Ó"4ˆDÕÜ�T˜8Ô$Ü"& z°4Ó"8×"?Ñ"?ˆDÕÜ�T˜5Ô!Ü"& y°$Ó"7×";Ñ";ˆDÕð "r;   c                óx   — t        |«      }|| j                  vr!| j                  |«       d| j                  |<   y y )NT)Úidrö   rõ   )rL   rÉ   Úid_s      r9   r0   zUniqueAppender.append‘  s8   € Ü�‹hˆØ�d—l‘lÑ"Ø×Ñ Ô%Ø $ˆD�L‰L˜Òð #r;   c                ó,   — t        | j                  «      S r=   )r.   ro   rK   s    r9   ry   zUniqueAppender.__iter__—  s   € Ü�D—I‘I‹Ðr;   r=   )ro   r÷   rû   zOptional[str])rÉ   r#   rY   r\   r±   )	r^   r_   r`   ra   r¸   r¹   rp   r0   ry   rb   r;   r9   rô   rô   v  sF   … ñð 4€Ià
0Ó0Ø(Ó(Ø%Ó%ð
 "ð<à4ð<ð ó<ó%ôr;   rô   c                óŒ   — t        | «      dk(  r+t        | d   t        j                  «      rt	        | d   «      S t        d| «      S )Nr   r   ú	List[Any])rs   r?   ÚtypesÚGeneratorTyperw   r   )Úargs    r9   Úcoerce_generator_argr  ›  s;   € Ü
ˆ3ƒx�1‚}œ C¨¡F¬E×,?Ñ,?Ô@Ü�C˜‘F‹|Ðä�K Ó%Ð%r;   c                ó`   — | €|S t        | «      s| gS t        | t        «      r| S t        | «      S r=   )r   r?   rw   )Úxr£   s     r9   Úto_listr  ¢  s3   € Ø€yØˆÜ! !Ô$Øˆsˆ
Ü	�A”tÔ	Øˆä�A‹wˆr;   c                ó,   ‡ — t        ˆ fd„|D «       «      S )z²return True if any items of set\_ are present in iterable.

    Goes through special effort to ensure __hash__ is not called
    on items in iterable that don't support it.

    c              3  ó@   •K  — | ]  }|j                   sŒ|‰v –— Œ y ­wr=   )Ú__hash__)rÓ   ÚiÚset_s     €r9   rÔ   z#has_intersection.<locals>.<genexpr>´  s   øè ø€ Ò9˜Q¨a¯j«jˆq�DŒyÑ9ùs   ƒ•	)Úany)r  rÞ   s   ` r9   Úhas_intersectionr  ­  s   ø€ ô Ó9 (Ô9Ó9Ð9r;   c                óf   — | €
t        «       S t        | t         «      st        t        | «      «      S | S r=   )r,   r?   r  ©r  s    r9   Úto_setr  ·  s+   € Ø€yÜ‹uˆÜ�aœÔÜ”7˜1“:‹Ðàˆr;   c                óf   — | €
t        «       S t        | t         «      st        t        | «      «      S | S r=   )Ú
column_setr?   r  r  s    r9   Úto_column_setr  À  s-   € Ø€yÜ‹|ÐÜ�aœÔ$Üœ' !›*Ó%Ð%àˆr;   c                óp   — | j                  «       } |r| j                  |«        | j                  di |¤Ž | S )z5Copy the given dict and update with the given values.rb   )rM   rž   )r@   Ú_newÚkws      r9   Úupdate_copyr  É  s1   € ð
 	
�‰‹€AÙØ	�‰�ŒØ€A‡H�H�Nˆr‚NØ€Hr;   c              #  ó†   K  — | D ]6  }t        |t        «      s t        |d«      rt        |«      E d{  –—†  Œ3|–— Œ8 y7 Œ­w)z�Given an iterator of which further sub-elements may also be
    iterators, flatten the sub-elements into a single iterator.

    ry   N)r?   r]   rú   Úflatten_iterator)r  Úelems     r9   r  r  Õ  s@   è ø€ ð ò ˆÜ˜$¤Ô$¬°°zÔ)BÜ'¨Ó-×-Ñ-à‹Jñ	à-ús   ‚0A²?³Ac                  óØ   — e Zd ZU dZdZded<   ded<   ded<   	 	 	 d	 	 	 	 	 dd
„Zd„ Zedd„«       Z	edd„«       Z		 d	 	 	 	 	 dd„Z	dd„Z
dd„Zdd„Zd d„Zd!d„Zd"d„Zed#d„«       Zd$d„Zy	)%ÚLRUCachezóDictionary with 'squishy' removal of least
    recently used items.

    Note that either get() or [] should be used here, but
    generally its not safe to do an "in" check first as the dictionary
    can change subsequent to that call.

    )ÚcapacityÚ	thresholdÚ
size_alertrh   Ú_counterÚ_mutexr°   r  Úfloatr   z.Optional[Callable[[LRUCache[_KT, _VT]], None]]r!  Nc                ó|   — || _         || _        || _        d| _        t	        j
                  «       | _        i | _        y )Nr   )r  r   r!  r"  Ú	threadingÚLockr#  rh   )rL   r  r   r!  s       r9   rp   zLRUCache.__init__ù  s5   € ð !ˆŒØ"ˆŒØ$ˆŒØˆŒÜ—n‘nÓ&ˆŒØ<>ˆ�
r;   c                óD   — | xj                   dz  c_         | j                   S ©Nr   )r"  rK   s    r9   Ú_inc_counterzLRUCache._inc_counter  s   € Ø�Š˜Ñ�Ø�}‰}Ðr;   c                 ó   — y r=   rb   rˆ   s     r9   r    zLRUCache.get
  s   € Ø.1r;   c                 ó   — y r=   rb   r¢   s      r9   r    zLRUCache.get  r¤   r;   c                óv   — | j                   j                  |«      }|�| j                  «       |d   d<   |d   S |S ©Né   r   r   )rh   r    r*  )rL   rT   r£   rÉ   s       r9   r    zLRUCache.get  s@   € ð �z‰z�~‰~˜cÓ"ˆØÐØ×*Ñ*Ó,ˆD�‰G�A‰JØ˜‘7ˆNàˆNr;   c                óV   — | j                   |   }| j                  «       |d   d<   |d   S r.  )rh   r*  )rL   rT   rÉ   s      r9   r‰   zLRUCache.__getitem__  s.   € Ø�z‰z˜#‰ˆØ×&Ñ&Ó(ˆˆQ‰�‰
Ø�A‰wˆr;   c                ó,   — t        | j                  «      S r=   )r.   rh   rK   s    r9   ry   zLRUCache.__iter__  r§   r;   c                ó,   — t        | j                  «      S r=   rr   rK   s    r9   rt   zLRUCache.__len__"  ru   r;   c           	     ó–   — t        j                  | j                  j                  «       D ��ci c]  \  }}||d   “Œ c}}«      S c c}}w r)  )Útypingr   rh   rª   )rL   r~   r  s      r9   rx   zLRUCache.values%  s:   € Ü× Ñ °d·j±j×6FÑ6FÓ6H×!I©d¨a° ! Q q¡T¡'Ó!IÓJÐJùÓ!Is   ­A
c                óf   — ||| j                  «       gf| j                  |<   | j                  «        y r=   )r*  rh   Ú_manage_sizerS   s      r9   rR   zLRUCache.__setitem__(  s.   € Ø ¨×(9Ñ(9Ó(;Ð'<Ð=ˆ�
‰
�3‰Ø×ÑÕr;   c                ó   — | j                   |= y r=   rg   )rL   Ú_LRUCache__vs     r9   r‹   zLRUCache.__delitem__,  rŒ   r;   c                óN   — | j                   | j                   | j                  z  z   S r=   )r  r   rK   s    r9   Úsize_thresholdzLRUCache.size_threshold/  s   € à�}‰}˜tŸ}™}¨t¯~©~Ñ=Ñ=Ð=r;   c                ó¨  — | j                   j                  d«      sy 	 t        | j                  «      }t	        | «      | j
                  | j
                  | j                  z  z   kD  r¦|rd}| j                  | «       t        | j                  j                  «       t        j                  d«      d¬«      }|| j
                  d  D ]  }	 | j                  |d   = Œ t	        | «      | j
                  | j
                  | j                  z  z   kD  rŒ¦| j                   j                  «        y # t        $ r Y Œow xY w# | j                   j                  «        w xY w)NFr/  T)rT   Úreverser   )r#  Úacquirer´   r!  rs   r  r   rÁ   rh   rx   ÚoperatorÚ
itemgetterr”   Úrelease)rL   r!  Ú
by_counterrÉ   s       r9   r6  zLRUCache._manage_size3  s  € Ø�{‰{×"Ñ" 5Ô)Øð	"Ü˜dŸo™oÓ.ˆJÜ�d“)˜dŸm™m¨d¯m©m¸d¿n¹nÑ.LÑLÒLÙØ!&�JØ—O‘O DÔ)Ü#Ø—J‘J×%Ñ%Ó'Ü ×+Ñ+¨AÓ.Ø ô�
ð
 ' t§}¡} Ð7ò !�Dð!Ø ŸJ™J t¨A¡wÑ/ð!ô �d“)˜dŸm™m¨d¯m©m¸d¿n¹nÑ.LÑLÓLð  �K‰K×ÑÕ!øô	 $ò !á ð!ûð �K‰K×ÑÕ!ús0   žB'D5 ÃD&Ã4D5 Ä&	D2Ä/D5 Ä1D2Ä2D5 Ä5E)éd   g      à?N)r  r°   r   r$  r!  zOptional[Callable[..., None]])rT   r%   rY   zOptional[_VT])rT   r%   r£   úUnion[_VT, _T]rY   rC  r=   )rT   r%   r£   úOptional[Union[_VT, _T]]rY   rD  )rT   r%   rY   r&   )rY   zIterator[_KT]r¯   )rY   zValuesView[_VT]r[   )r8  r%   rY   r\   )rY   r$  r·   )r^   r_   r`   ra   r¸   r¹   rp   r*  r   r    r‰   ry   rt   rx   rR   r‹   Úpropertyr:  r6  rb   r;   r9   r  r  â  sË   … ñð€Ið ƒMØÓØ>Ó>ð ØØ48ð	?àð?ð ð?ð 2ó	?òð Ú1ó Ø1àÚKó ØKð =AðØðØ!9ðà	!óóó
 óóKóóð ò>ó ð>ô"r;   r  c                  ó   — e Zd Zdd„Zy)Ú_CreateFuncTypec                 ó   — y r=   rb   rK   s    r9   Ú__call__z_CreateFuncType.__call__L  ó   � r;   N)rY   r'   ©r^   r_   r`   rI  rb   r;   r9   rG  rG  K  s   „ Ü$r;   rG  c                  ó   — e Zd Zdd„Zy)Ú_ScopeFuncTypec                 ó   — y r=   rb   rK   s    r9   rI  z_ScopeFuncType.__call__P  rJ  r;   NrZ   rK  rb   r;   r9   rM  rM  O  s   „ Ü"r;   rM  c                  ód   — e Zd ZU dZdZded<   ded<   ded<   	 	 	 	 dd	„Zdd
„Zdd„Zdd„Z	dd„Z
y)ÚScopedRegistryaÆ  A Registry that can store one or multiple instances of a single
    class on the basis of a "scope" function.

    The object implements ``__call__`` as the "getter", so by
    calling ``myregistry()`` the contained object is returned
    for the current scope.

    :param createfunc:
      a callable that returns a new object to be placed in the registry

    :param scopefunc:
      a callable that will return a key to store/retrieve an object.
    ©Ú
createfuncÚ	scopefuncÚregistryz_CreateFuncType[_T]rR  rM  rS  r   rT  c                ó.   — || _         || _        i | _        y)aV  Construct a new :class:`.ScopedRegistry`.

        :param createfunc:  A creation function that will generate
          a new value for the current scope, if none is present.

        :param scopefunc:  A function that returns a hashable
          token representing the current scope (such as, current
          thread identifier).

        NrQ  )rL   rR  rS  s      r9   rp   zScopedRegistry.__init__h  s   € ð %ˆŒØ"ˆŒØˆ�r;   c                ó´   — | j                  «       }	 | j                  |   S # t        $ r- | j                  j                  || j	                  «       «      cY S w xY wr=   )rS  rT  r”   Ú
setdefaultrR  rˆ   s     r9   rI  zScopedRegistry.__call__y  sR   € Ø�n‰nÓˆð	DØ—=‘= Ñ%Ð%øÜò 	DØ—=‘=×+Ñ+¨C°·±Ó1BÓCÒCð	Dús   ’! ¡3AÁAc                ó:   — | j                  «       | j                  v S )z9Return True if an object is present in the current scope.)rS  rT  rK   s    r9   ÚhaszScopedRegistry.has€  s   € ð �~‰~Ó 4§=¡=Ð0Ð0r;   c                ó>   — || j                   | j                  «       <   y)z$Set the value for the current scope.N)rT  rS  ©rL   r…   s     r9   r,   zScopedRegistry.set…  s   € ð +.ˆ�‰�d—n‘nÓ&Ò'r;   c                óZ   — 	 | j                   | j                  «       = y# t        $ r Y yw xY w)z Clear the current scope, if any.N)rT  rS  r”   rK   s    r9   r®   zScopedRegistry.clearŠ  s,   € ð	Ø—‘˜dŸn™nÓ.Ñ/øÜò 	Ùð	ús   ‚ ž	*©*N)rR  úCallable[[], _T]rS  zCallable[[], Any]©rY   r#   ©rY   r´   ©r…   r#   rY   r\   r·   )r^   r_   r`   ra   r¸   r¹   rp   rI  rY  r,   r®   rb   r;   r9   rP  rP  S  sI   … ñð 6€Ià#Ó#ØÓØƒMðØ*ðØ7Hóó"Dó1ó
.ô
r;   rP  c                  ó8   — e Zd ZdZdd„Zd	d„Zd
d„Zdd„Zdd„Zy)ÚThreadLocalRegistryz\A :class:`.ScopedRegistry` that uses a ``threading.local()``
    variable for storage.

    c                óD   — || _         t        j                  «       | _        y r=   )rR  r&  ÚlocalrT  )rL   rR  s     r9   rp   zThreadLocalRegistry.__init__™  s   € Ø$ˆŒÜ!Ÿ™Ó)ˆ�r;   c                ó”   — 	 | j                   j                  S # t        $ r& | j                  «       x}| j                   _        |cY S w xY wr=   )rT  rU   r•   rR  )rL   rç   s     r9   rI  zThreadLocalRegistry.__call__�  sC   € ð	Ø—=‘=×&Ñ&Ð&øÜò 	Ø(,¯©Ó(9Ð9ˆC�$—-‘-Ô%ØŠJð	ús   ‚ ˜,AÁAc                ó.   — t        | j                  d«      S )NrU   )rú   rT  rK   s    r9   rY  zThreadLocalRegistry.has¤  s   € Ü�t—}‘} gÓ.Ð.r;   c                ó&   — || j                   _        y r=   )rT  rU   r[  s     r9   r,   zThreadLocalRegistry.set§  s   € Ø!ˆ�‰Õr;   c                ó<   — 	 | j                   `y # t        $ r Y y w xY wr=   )rT  rU   r•   rK   s    r9   r®   zThreadLocalRegistry.clearª  s#   € ð	Ø—‘Ñ#øÜò 	Ùð	ús   ‚ �	šN)rR  r]  r^  r_  r`  r·   )	r^   r_   r`   ra   rp   rI  rY  r,   r®   rb   r;   r9   rb  rb  “  s    „ ñó
*óó/ó"ôr;   rb  c                ó8   — d}| D ]  }||u sŒ|dz  }|dkD  sŒ y y)zrGiven a sequence and search object, return True if there's more
    than one, False if zero or one of them.


    r   r   TFrb   )ÚsequenceÚtargetÚcrÉ   s       r9   Ú	has_dupesrm  ±  s7   € ð 	
€AØò ˆØ�6Š>Ø�‰FˆAØ�1‹uÙð	ð
 r;   )r2   r  r3   r  rY   r  )r@   zMapping[_KT, _VT]rY   zimmutabledict[_KT, _VT]r=   )r  r   rY   r  )r  r   r£   zOptional[List[Any]]rY   r  )r  zContainer[Any]rÞ   zIterable[Any]rY   r´   )r  r   rY   zSet[Any])r@   úDict[Any, Any]r  zOptional[Dict[Any, Any]]r  r   rY   rn  )r  zIterable[_T]rY   r²   )Wra   Ú
__future__r   r>  r&  r  r4  r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   rÌ   Ú_has_cyr   r   r   r   ÚTYPE_CHECKINGÚ_py_collectionsr   r   r   r    r!   r"   Ú$sqlalchemy.cyextension.immutabledictÚ"sqlalchemy.cyextension.collectionsr#   r%   r&   r'   Ú	frozensetr)   r¹   r*   r:   rA   r>   rC   rc   rd   rf   r¼   r›   rÂ   rO   r¾   Úsort_dictionaryrÄ   rÚ   rá   rì   r,   r  Úcolumn_dictÚordered_column_setrô   r  r  r  r  r  r  r  ÚMutableMappingr  rG  rM  rP  rb  rm  rb   r;   r9   ú<module>rz     s�  ðò &Ý "ã Û Û Û Ý Ý Ý Ý Ý Ý Ý Ý Ý Ý Ý Ý Ý Ý Ý Ý Ý Ý Ý Ý Û å $Ý *Ý Ý à	×Ò™Ý?Ý;ÝGÝGÝ9Þ;õõõõ NÝKõñ
 ˆT˜Ô€Ùˆe˜3Ô€Ùˆe˜3Ô€Ù� 4Ô(€á%›K€	ˆ>Ó 'Ù$ d VÓ,€ˆ.Ó ,ó5óp ñ '4£o€
Ð#Ó 5ô6Ð" 3¨ 8Ñ,ô 6ñ0 ˆe˜3Ô€áˆT˜Ô€ôT�˜‘ô Tôn1˜
 2™ô 1ôÐ*¨J°r©Nô óð €Ø*€ô�8˜B‘<ô ôD˜ô ô�4˜˜S˜‘>ô ô �t˜C ˜H‘~ô ð( €
Ø€ØÐ ô"�W˜R‘[ô "óJ&ôó:òóð 9=ð	Øð	Ø5ð	ØDGð	àó	ó
ôf"ˆv×$Ñ$ S¨# XÑ.ô f"ôR%�h˜u‘oô %ô#�Xô #ô=�W˜R‘[ô =ô@˜.¨Ñ,ô ó<r;   