a
    [gnN                     @  sH  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j!shesd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( nHd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d$Z+ed%ed$Z,ed&ed$Z-ed'd(d)Z.e/ Z0d*e1d+< e/dgZ2d*e1d,< d-d-d-d.d/d0Z3d1d2d3d4d5Z4e# Z5d6e1d7< G d8d9 d9e&e,e-f Z6ed:ed$Z7ed;ed$Z8G d<d= d=ee+ Z9G d>d? d?e9e+ Z:G d@dA dAe%e9e+ Z;dtdBdCZ<e=Z>e<Z?G dDdE dEee+ Z@G dFdG dGe$ZAG dHdI dIee,e-f ZBG dJdK dKee,e-f ZCeDZEe=ZFe'ZGG dLdM dMee+ ZHdNd-dOdPdQZIdudNdRd-dSdTdUZJdVdWdXdYdZd[ZKd\d] ZLdNd^d_d`daZMdvdbdcZNddded_dfdgZOG dhdi diejPe,e-f ZQG djdk dke e. ZRG dldm dme ZSG dndo doee+ ZTG dpdq dqeTe+ ZUdrds ZVdS )wz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_SET	List[Any])abreturnc                 C  sj   t | |}g }t| t| }}|D ].}||v rL|| || }} q$|| q(|| qfq$|S )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)r+   r,   overlapresultcurrentotherelement r9   j/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/sqlalchemy/util/_collections.pymerge_lists_w_orderingL   s    #


r;   zMapping[_KT, _VT]zimmutabledict[_KT, _VT])dr-   c                 C  s"   | st S t| tr| S t| S d S N)
EMPTY_DICT
isinstancer   r<   r9   r9   r:   coerce_to_immutabledict   s
    
rA   zimmutabledict[Any, Any]r>   c                   @  s\   e Zd ZdZdddddZddd	d
ZddddZddddddZddddZdS )
FacadeDictz*A dictionary that is not publicly mutable.r   zFacadeDict[Any, Any])argsr-   c                 G  s   t | }|S r=   )r   __new__)clsrC   newr9   r9   r:   rD      s    
zFacadeDict.__new__r   r-   c                 C  s   t dd S )Nz\an immutabledict shouldn't need to be copied.  use dict(d) if you need a mutable dictionary.)NotImplementedErrorselfr9   r9   r:   copy   s    zFacadeDict.copyc                 C  s   t t| ffS r=   )rB   dictrI   r9   r9   r:   
__reduce__   s    zFacadeDict.__reduce__r$   r%   Nonekeyvaluer-   c                 C  s   t | || dS )z,insert an item into the dictionary directly.N)rL   __setitem__rJ   rP   rQ   r9   r9   r:   _insert_item   s    zFacadeDict._insert_itemstrc                 C  s   dt |  S )NzFacadeDict(%s))rL   __repr__rI   r9   r9   r:   rV      s    zFacadeDict.__repr__N)	__name__
__module____qualname____doc__rD   rK   rM   rT   rV   r9   r9   r9   r:   rB      s   rB   _DT_Fc                      s  e Zd ZU dZdZded< ddddZdd	d
dZdd	ddZdd	 fddZ	dddddZ
ddddddZdddddZdddd d!Zddddd"d#Zd$d	d%d&Zd$dd'd(d)Zdddd*d+Zdd,dd-d.Zd/d	d0d1Zddd2d3d4Zedd5dd6d7Zedd8d8d9d:d7ZdKdd<d=d9d>d7Zdd	d?d@ZdAd	dBdCZdDd	dEdFZdd,ddGdHZdd	dIdJZ  ZS )L
Propertiesz8Provide a __getattr__/__setattr__ interface over a dict._datazDict[str, _T]r_   )datac                 C  s   t | d| d S Nr_   object__setattr__)rJ   r`   r9   r9   r:   __init__   s    zProperties.__init__intrG   c                 C  s
   t | jS r=   lenr_   rI   r9   r9   r:   __len__   s    zProperties.__len__Iterator[_T]c                 C  s   t t| j S r=   )r0   listr_   valuesrI   r9   r9   r:   __iter__   s    zProperties.__iter__z	List[str]c                   s   t t dd | j D  S )Nc                 S  s   g | ]}t |qS r9   )rU   .0kr9   r9   r:   
<listcomp>       z&Properties.__dir__.<locals>.<listcomp>)dirsuperr_   keysrI   	__class__r9   r:   __dir__   s    zProperties.__dir__zProperties[_F]zList[Union[_T, _F]])r7   r-   c                 C  s   t | t | S r=   )rk   )rJ   r7   r9   r9   r:   __add__   s    zProperties.__add__rU   r"   rN   )rP   objr-   c                 C  s   || j |< d S r=   r^   rJ   rP   rz   r9   r9   r:   rR      s    zProperties.__setitem__rP   r-   c                 C  s
   | j | S r=   r^   rJ   rP   r9   r9   r:   __getitem__   s    zProperties.__getitem__c                 C  s   | j |= d S r=   r^   r}   r9   r9   r:   __delitem__   s    zProperties.__delitem__c                 C  s   || j |< d S r=   r^   r{   r9   r9   r:   rd      s    zProperties.__setattr__zDict[str, Any]c                 C  s
   d| j iS ra   r^   rI   r9   r9   r:   __getstate__   s    zProperties.__getstate__)stater-   c                 C  s   t | d|d  d S ra   rb   )rJ   r   r9   r9   r:   __setstate__   s    zProperties.__setstate__c                 C  s,   z| j | W S  ty&   t|Y n0 d S r=   )r_   KeyErrorAttributeErrorr}   r9   r9   r:   __getattr__   s    zProperties.__getattr__boolc                 C  s
   || j v S r=   r^   r}   r9   r9   r:   __contains__   s    zProperties.__contains__zReadOnlyProperties[_T]c                 C  s
   t | jS )z8Return an immutable proxy for this :class:`.Properties`.)ReadOnlyPropertiesr_   rI   r9   r9   r:   as_readonly   s    zProperties.as_readonly)rQ   r-   c                 C  s   | j | d S r=   )r_   update)rJ   rQ   r9   r9   r:   r      s    zProperties.updatezOptional[_T]c                 C  s   d S r=   r9   r}   r9   r9   r:   get   s    zProperties.getzUnion[_DT, _T]rP   defaultr-   c                 C  s   d S r=   r9   rJ   rP   r   r9   r9   r:   r      s    NzOptional[Union[_DT, _T]]zOptional[Union[_T, _DT]]c                 C  s   || v r| | S |S d S r=   r9   r   r9   r9   r:   r      s    c                 C  s
   t | jS r=   )rk   r_   rI   r9   r9   r:   ru      s    zProperties.keysList[_T]c                 C  s   t | j S r=   )rk   r_   rl   rI   r9   r9   r:   rl      s    zProperties.valueszList[Tuple[str, _T]]c                 C  s   t | j S r=   )rk   r_   itemsrI   r9   r9   r:   r      s    zProperties.itemsc                 C  s
   || j v S r=   r^   r}   r9   r9   r:   has_key   s    zProperties.has_keyc                 C  s   | j   d S r=   )r_   clearrI   r9   r9   r:   r      s    zProperties.clear)N)rW   rX   rY   rZ   	__slots____annotations__re   ri   rm   rx   ry   rR   r~   r   rd   r   r   r   r   r   r   r   r   ru   rl   r   r   r   __classcell__r9   r9   rv   r:   r]      s:   
 r]   c                   @  s   e Zd ZdZdZdd ZdS )OrderedPropertieszUProvide a __getattr__/__setattr__ interface with an OrderedDict
    as backing store.r9   c                 C  s   t | t  d S r=   )r]   re   OrderedDictrI   r9   r9   r:   re   
  s    zOrderedProperties.__init__N)rW   rX   rY   rZ   r   re   r9   r9   r9   r:   r     s   r   c                   @  s   e Zd ZdZdZdS )r   zDProvide immutable dict/object attribute to an underlying dictionary.r9   N)rW   rX   rY   rZ   r   r9   r9   r9   r:   r     s   r   c                   s0    fddt  |dD }    | dS )zSort an OrderedDict in-place.c                   s   g | ]}| | fqS r9   r9   rn   r@   r9   r:   rq     rr   z,_ordered_dictionary_sort.<locals>.<listcomp>)rP   N)sortedr   r   )r<   rP   r   r9   r@   r:   _ordered_dictionary_sort  s    r   c                   @  s<   e Zd ZdddddZdd Zdd	 Zd
d Zdd ZdS )WeakSequencer9   zSequence[_T])_WeakSequence__elementsc                   s0   t | fdd  | _ fdd|D | _d S )Nc                 S  s   | }|d ur|j |  d S r=   )_storageremove)itemselfrefrJ   r9   r9   r:   _remove&  s    z&WeakSequence.__init__.<locals>._removec                   s   g | ]}t | qS r9   )weakrefref)ro   r8   r   r9   r:   rq   ,  s   z)WeakSequence.__init__.<locals>.<listcomp>)r   r   r   r   )rJ   r   r9   r   r:   re   #  s
    
zWeakSequence.__init__c                 C  s   | j t|| j d S r=   )r   r2   r   r   r   )rJ   r   r9   r9   r:   r2   0  s    zWeakSequence.appendc                 C  s
   t | jS r=   )rh   r   rI   r9   r9   r:   ri   3  s    zWeakSequence.__len__c                 C  s   dd dd | j D D S )Nc                 s  s   | ]}|d ur|V  qd S r=   r9   )ro   rz   r9   r9   r:   	<genexpr>7  s   z(WeakSequence.__iter__.<locals>.<genexpr>c                 s  s   | ]}| V  qd S r=   r9   )ro   r   r9   r9   r:   r   8  rr   )r   rI   r9   r9   r:   rm   6  s    zWeakSequence.__iter__c                 C  s8   z| j | }W n ty,   td| Y n0 | S d S )NzIndex %s out of range)r   r   
IndexError)rJ   indexrz   r9   r9   r:   r~   ;  s
    zWeakSequence.__getitem__N)r9   )rW   rX   rY   re   r2   ri   rm   r~   r9   r9   r9   r:   r   "  s
   r   c                   @  s   e Zd ZdddddZdS )OrderedIdentitySetNzOptional[Iterable[Any]])iterablec                 C  s.   t |  t | _|r*|D ]}| | qd S r=   )r   re   r   Z_membersadd)rJ   r   or9   r9   r:   re   E  s
    
zOrderedIdentitySet.__init__)N)rW   rX   rY   re   r9   r9   r9   r:   r   D  s   r   c                   @  s.   e Zd ZdZddddZddddd	Zd
S )PopulateDictzA dict which populates missing values via a creation function.

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

    zCallable[[_KT], _VT]creatorc                 C  s
   || _ d S r=   r   )rJ   r   r9   r9   r:   re   U  s    zPopulateDict.__init__r   r|   c                 C  s   |  | | |< }|S r=   r   rJ   rP   valr9   r9   r:   __missing__X  s    zPopulateDict.__missing__NrW   rX   rY   rZ   re   r   r9   r9   r9   r:   r   M  s   r   c                   @  s.   e Zd ZdZddddZddddd	Zd
S )WeakPopulateDictzaLike PopulateDict, but assumes a self + a method and does not create
    a reference cycle.

    ztypes.MethodType)creator_methodc                 C  s   |j | _|j}t|| _d S r=   )__func__r   __self__r   r   weakself)rJ   r   r   r9   r9   r:   re   c  s    zWeakPopulateDict.__init__r   r|   c                 C  s   |  |  | | |< }|S r=   )r   r   r   r9   r9   r:   r   h  s    zWeakPopulateDict.__missing__Nr   r9   r9   r9   r:   r   ]  s   r   c                   @  s^   e Zd ZU dZdZded< ded< ded< ddd
dddZdddddZddddZd	S )UniqueAppenderzAppends items to a collection ensuring uniqueness.

    Additional appends() of the same object are ignored.  Membership is
    determined by identity (``is a``) not equality (``==``).
    )r`   _data_appender_uniquez&Union[Iterable[_T], Set[_T], List[_T]]r`   zCallable[[_T], None]r   zDict[int, Literal[True]]r   NzOptional[str])r`   viac                 C  sT   || _ i | _|rt||| _n2t|dr8td|j| _nt|drPtd|j| _d S )Nr2   r   r   zSet[_T])r`   r   getattrr   hasattrr   r2   r   )rJ   r`   r   r9   r9   r:   re     s    

zUniqueAppender.__init__r"   rN   )r   r-   c                 C  s*   t |}|| jvr&| | d| j|< d S )NT)idr   r   )rJ   r   Zid_r9   r9   r:   r2     s    

zUniqueAppender.appendrj   rG   c                 C  s
   t | jS r=   )r0   r`   rI   r9   r9   r:   rm     s    zUniqueAppender.__iter__)N)	rW   rX   rY   rZ   r   r   re   r2   rm   r9   r9   r9   r:   r   v  s   
 r   r   )argr-   c                 C  s6   t | dkr(t| d tjr(t| d S td| S d S )Nr   r   r*   )rh   r?   typesGeneratorTyperk   r   )r   r9   r9   r:   coerce_generator_arg  s    r   zOptional[List[Any]])xr   r-   c                 C  s4   | d u r|S t | s| gS t| tr(| S t| S d S r=   )r   r?   rk   )r   r   r9   r9   r:   to_list  s    
r   zContainer[Any]zIterable[Any]r   )set_r   r-   c                   s   t  fdd|D S )zreturn 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  s   | ]}|j r| v V  qd S r=   )__hash__)ro   ir   r9   r:   r     rr   z#has_intersection.<locals>.<genexpr>)any)r   r   r9   r   r:   has_intersection  s    r   c                 C  s,   | d u rt  S t| t s$t t| S | S d S r=   )r.   r?   r   r   r9   r9   r:   to_set  s
    
r   zSet[Any])r   r-   c                 C  s,   | d u rt  S t| t s$t t| S | S d S r=   )
column_setr?   r   r   r9   r9   r:   to_column_set  s
    
r   c                 K  s*   |   } |r| | | jf i | | S )z5Copy the given dict and update with the given values.)rK   r   )r<   _newkwr9   r9   r:   update_copy  s
    
r   zIterable[_T]rj   c                 c  s8   | D ].}t |ts,t|dr,t|E dH  q|V  qdS )zGiven an iterator of which further sub-elements may also be
    iterators, flatten the sub-elements into a single iterator.

    rm   N)r?   rU   r   flatten_iterator)r   elemr9   r9   r:   r     s    r   c                   @  s  e Zd ZU dZdZded< ded< ded< d3ddddddZdd ZedddddZ	eddddddZ	d4ddddddZ	dddddZ
dd d!d"Zdd d#d$Zd%d d&d'Zddd(d)d*d+Zdd(d,d-d.Zedd d/d0Zd(d d1d2ZdS )5LRUCachezDictionary 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_alertr_   _counter_mutexrf   r   floatr   z.Optional[Callable[[LRUCache[_KT, _VT]], None]]r   d         ?NzOptional[Callable[..., None]])r   r   r   c                 C  s,   || _ || _|| _d| _t | _i | _d S )Nr   )r   r   r   r   	threadingLockr   r_   )rJ   r   r   r   r9   r9   r:   re     s    
zLRUCache.__init__c                 C  s   |  j d7  _ | j S )Nr   )r   rI   r9   r9   r:   _inc_counter  s    zLRUCache._inc_counterr$   zOptional[_VT]r|   c                 C  s   d S r=   r9   r}   r9   r9   r:   r     s    zLRUCache.getzUnion[_VT, _T]r   c                 C  s   d S r=   r9   r   r9   r9   r:   r     s    zOptional[Union[_VT, _T]]c                 C  s4   | j |}|d ur,|  |d d< |d S |S d S N   r   r   )r_   r   r   )rJ   rP   r   r   r9   r9   r:   r     s
    r%   c                 C  s"   | j | }|  |d d< |d S r   )r_   r   )rJ   rP   r   r9   r9   r:   r~     s    
zLRUCache.__getitem__zIterator[_KT]rG   c                 C  s
   t | jS r=   )r0   r_   rI   r9   r9   r:   rm     s    zLRUCache.__iter__c                 C  s
   t | jS r=   rg   rI   r9   r9   r:   ri      s    zLRUCache.__len__zValuesView[_VT]c                 C  s   t dd | j D S )Nc                 S  s   i | ]\}}||d  qS )r   r9   )ro   rp   r   r9   r9   r:   
<dictcomp>$  rr   z#LRUCache.values.<locals>.<dictcomp>)typingr   r_   r   rI   r9   r9   r:   rl   #  s    zLRUCache.valuesrN   rO   c                 C  s"   |||   gf| j|< |   d S r=   )r   r_   _manage_sizerS   r9   r9   r:   rR   &  s    zLRUCache.__setitem__)_LRUCache__vr-   c                 C  s   | j |= d S r=   r^   )rJ   r   r9   r9   r:   r   *  s    zLRUCache.__delitem__c                 C  s   | j | j | j  S r=   )r   r   rI   r9   r9   r:   size_threshold-  s    zLRUCache.size_thresholdc              	   C  s   | j dsd S zt| j}t| | j| j| j  kr|rHd}| |  t| j	 t
ddd}|| jd  D ],}z| j|d = W qp ty   Y qpY qp0 qpqW | j   n| j   0 d S )NFr   T)rP   reverser   )r   acquirer   r   rh   r   r   r   r_   rl   operator
itemgetterr   release)rJ   r   Z
by_counterr   r9   r9   r:   r   1  s&    

zLRUCache._manage_size)r   r   N)N)rW   rX   rY   rZ   r   r   re   r   r   r   r~   rm   ri   rl   rR   r   propertyr   r   r9   r9   r9   r:   r     s2   
		    
r   c                   @  s   e Zd ZddddZdS )_CreateFuncTyper&   rG   c                 C  s   d S r=   r9   rI   r9   r9   r:   __call__J  rr   z_CreateFuncType.__call__NrW   rX   rY   r   r9   r9   r9   r:   r   I  s   r   c                   @  s   e Zd ZddddZdS )_ScopeFuncTyper   rG   c                 C  s   d S r=   r9   rI   r9   r9   r:   r   N  rr   z_ScopeFuncType.__call__Nr   r9   r9   r9   r:   r   M  s   r   c                   @  sx   e Zd ZU dZdZded< ded< ded< d	d
dddZddddZddddZdddddZ	ddddZ
dS )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]r   r   r   r   r   Callable[[], _T]zCallable[[], Any])r   r   c                 C  s   || _ || _i | _dS )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).

        Nr   )rJ   r   r   r9   r9   r:   re   f  s    zScopedRegistry.__init__r"   rG   c                 C  s>   |   }z| j| W S  ty8   | j||   Y S 0 d S r=   )r   r   r   
setdefaultr   r}   r9   r9   r:   r   w  s
    zScopedRegistry.__call__r   c                 C  s   |   | jv S )z9Return True if an object is present in the current scope.)r   r   rI   r9   r9   r:   has~  s    zScopedRegistry.hasrN   rz   r-   c                 C  s   || j |  < dS )z$Set the value for the current scope.N)r   r   rJ   rz   r9   r9   r:   r.     s    zScopedRegistry.setc                 C  s(   z| j |  = W n ty"   Y n0 dS )z Clear the current scope, if any.N)r   r   r   rI   r9   r9   r:   r     s    zScopedRegistry.clearN)rW   rX   rY   rZ   r   r   re   r   r   r.   r   r9   r9   r9   r:   r   Q  s   
r   c                   @  sX   e Zd ZdZddddZdddd	Zd
dddZdddddZddddZdS )ThreadLocalRegistryz\A :class:`.ScopedRegistry` that uses a ``threading.local()``
    variable for storage.

    r   )r   c                 C  s   || _ t | _d S r=   )r   r   localr   )rJ   r   r9   r9   r:   re     s    zThreadLocalRegistry.__init__r"   rG   c                 C  s6   z
| j jW S  ty0   |   }| j _| Y S 0 d S r=   )r   rQ   r   r   )rJ   r   r9   r9   r:   r     s
    
zThreadLocalRegistry.__call__r   c                 C  s   t | jdS )NrQ   )r   r   rI   r9   r9   r:   r     s    zThreadLocalRegistry.hasrN   r   c                 C  s   || j _d S r=   )r   rQ   r   r9   r9   r:   r.     s    zThreadLocalRegistry.setc                 C  s"   z
| j `W n ty   Y n0 d S r=   )r   rQ   r   rI   r9   r9   r:   r     s    
zThreadLocalRegistry.clearN)	rW   rX   rY   rZ   re   r   r   r.   r   r9   r9   r9   r:   r     s   r   c                 C  s0   d}| D ]"}||u r|d7 }|dkr dS qdS )zrGiven a sequence and search object, return True if there's more
    than one, False if zero or one of them.


    r   r   TFr9   )sequencetargetcr   r9   r9   r:   	has_dupes  s    
r   )N)N)N)WrZ   
__future__r   r   r   r   r   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   Z_has_cyr   r   r   r   TYPE_CHECKINGZ_py_collectionsr   r   r   r   r    r!   Z$sqlalchemy.cyextension.immutabledictZ"sqlalchemy.cyextension.collectionsr"   r$   r%   r&   	frozensetr(   r   r)   r;   rA   r>   rB   r[   r\   r]   r   r   r   rL   r   Zsort_dictionaryr   r   r   r   r.   r   Zcolumn_dictZordered_column_setr   r   r   r   r   r   r   r   MutableMappingr   r   r   r   r   r   r9   r9   r9   r:   <module>	   s   8	W


"	%
		

i@