B
    da                 @   s$  d Z dZdZddlZddlZddlZddlZddlZddlZddl	m
Z
 G dd dZG d	d
 d
ejjZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZedddddgZe
jdd fd!d"Ze
jdfd#d$ZdS )%z0Extensible memoizing collections and decorators.)
Cache	FIFOCacheLFUCacheLRUCacheMRUCacheRRCache	TLRUCacheTTLCachecachedcachedmethodz5.3.1    N   )keysc               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	_DefaultSize c             C   s   dS )Nr   r   )self_r   r   E/var/www/html/venv/lib/python3.7/site-packages/cachetools/__init__.py__getitem__    s    z_DefaultSize.__getitem__c             C   s   |dkst d S )Nr   )AssertionError)r   r   valuer   r   r   __setitem__#   s    z_DefaultSize.__setitem__c             C   s   dS )Nr   r   )r   r   r   r   r   pop&   s    z_DefaultSize.popN)__name__
__module____qualname__	__slots__r   r   r   r   r   r   r   r      s   r   c               @   s   e Zd ZdZe Ze Zd!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dZefddZd#ddZedd Zedd Zedd  ZdS )$r   z?Mutable mapping to serve as a simple cache or cache base class.Nc             C   s6   |r
|| _ | j tj k	rt | _t | _d| _|| _d S )Nr   )	getsizeofr   dict_Cache__size_Cache__data_Cache__currsize_Cache__maxsize)r   maxsizer   r   r   r   __init__1   s    zCache.__init__c             C   s   d| j jt| j| j| jf S )Nz%s(%s, maxsize=%r, currsize=%r))	__class__r   reprr   r!   r    )r   r   r   r   __repr__:   s
    zCache.__repr__c             C   s*   y
| j | S  tk
r$   | |S X d S )N)r   KeyError__missing__)r   keyr   r   r   r   B   s    
zCache.__getitem__c             C   s   | j }| |}||kr td|| jks8| j| |k rTx| j| |krR|   q:W || jkrn|| j|  }n|}|| j|< || j|< |  j|7  _d S )Nzvalue too large)r!   r   
ValueErrorr   r   r    popitem)r   r)   r   r"   sizeZdiffsizer   r   r   r   H   s    



zCache.__setitem__c             C   s&   | j |}| j|= |  j|8  _d S )N)r   r   r   r    )r   r)   r,   r   r   r   __delitem__X   s    zCache.__delitem__c             C   s
   || j kS )N)r   )r   r)   r   r   r   __contains__]   s    zCache.__contains__c             C   s   t |d S )N)r'   )r   r)   r   r   r   r(   `   s    zCache.__missing__c             C   s
   t | jS )N)iterr   )r   r   r   r   __iter__c   s    zCache.__iter__c             C   s
   t | jS )N)lenr   )r   r   r   r   __len__f   s    zCache.__len__c             C   s   || kr| | S |S d S )Nr   )r   r)   defaultr   r   r   geti   s    z	Cache.getc             C   s4   || kr| | }| |= n|| j kr,t|n|}|S )N)_Cache__markerr'   )r   r)   r3   r   r   r   r   r   o   s    

z	Cache.popc             C   s"   || kr| | }n| | |< }|S )Nr   )r   r)   r3   r   r   r   r   
setdefaulty   s    
zCache.setdefaultc             C   s   | j S )zThe maximum size of the cache.)r!   )r   r   r   r   r"      s    zCache.maxsizec             C   s   | j S )zThe current size of the cache.)r    )r   r   r   r   currsize   s    zCache.currsizec             C   s   dS )z+Return the size of a cache element's value.r   r   )r   r   r   r   r      s    zCache.getsizeof)N)N)N)r   r   r   __doc__objectr5   r   r   r#   r&   r   r   r-   r.   r(   r0   r2   r4   r   r6   propertyr"   r7   staticmethodr   r   r   r   r   r   *   s$   
	


r   c               @   s>   e Zd ZdZdddZejfddZejfddZd	d
 ZdS )r   z/First In First Out (FIFO) cache implementation.Nc             C   s   t | || t | _d S )N)r   r#   collectionsOrderedDict_FIFOCache__order)r   r"   r   r   r   r   r#      s    zFIFOCache.__init__c             C   s@   || || y| j | W n tk
r:   d | j |< Y nX d S )N)r>   move_to_endr'   )r   r)   r   cache_setitemr   r   r   r      s
    zFIFOCache.__setitem__c             C   s   || | | j |= d S )N)r>   )r   r)   cache_delitemr   r   r   r-      s    
zFIFOCache.__delitem__c             C   sN   yt t| j}W n( tk
r:   tdt| j dY nX || |fS dS )z9Remove and return the `(key, value)` pair first inserted.z%s is emptyN)nextr/   r>   StopIterationr'   typer   r   )r   r)   r   r   r   r+      s
    zFIFOCache.popitem)N)	r   r   r   r8   r#   r   r   r-   r+   r   r   r   r   r      s
   
r   c               @   sL   e Zd ZdZdddZejfddZejfddZejfd	d
Zdd Z	dS )r   z1Least Frequently Used (LFU) cache implementation.Nc             C   s   t | || t | _d S )N)r   r#   r<   Counter_LFUCache__counter)r   r"   r   r   r   r   r#      s    zLFUCache.__init__c             C   s(   || |}|| kr$| j |  d8  < |S )Nr   )rF   )r   r)   cache_getitemr   r   r   r   r      s    
zLFUCache.__getitem__c             C   s"   || || | j |  d8  < d S )Nr   )rF   )r   r)   r   r@   r   r   r   r      s    zLFUCache.__setitem__c             C   s   || | | j |= d S )N)rF   )r   r)   rA   r   r   r   r-      s    
zLFUCache.__delitem__c             C   sR   y| j d\\}}W n( tk
r>   tdt| j dY nX || |fS dS )z@Remove and return the `(key, value)` pair least frequently used.r   z%s is emptyN)rF   most_commonr*   r'   rD   r   r   )r   r)   r   r   r   r   r+      s
    zLFUCache.popitem)N)
r   r   r   r8   r#   r   r   r   r-   r+   r   r   r   r   r      s   
r   c               @   sT   e Zd ZdZdddZejfddZejfddZejfd	d
Zdd Z	dd Z
dS )r   z/Least Recently Used (LRU) cache implementation.Nc             C   s   t | || t | _d S )N)r   r#   r<   r=   _LRUCache__order)r   r"   r   r   r   r   r#      s    zLRUCache.__init__c             C   s    || |}|| kr|  | |S )N)_LRUCache__update)r   r)   rG   r   r   r   r   r      s    

zLRUCache.__getitem__c             C   s   || || |  | d S )N)rJ   )r   r)   r   r@   r   r   r   r      s    zLRUCache.__setitem__c             C   s   || | | j |= d S )N)rI   )r   r)   rA   r   r   r   r-      s    
zLRUCache.__delitem__c             C   sN   yt t| j}W n( tk
r:   tdt| j dY nX || |fS dS )z>Remove and return the `(key, value)` pair least recently used.z%s is emptyN)rB   r/   rI   rC   r'   rD   r   r   )r   r)   r   r   r   r+      s
    zLRUCache.popitemc             C   s4   y| j | W n tk
r.   d | j |< Y nX d S )N)rI   r?   r'   )r   r)   r   r   r   __update   s    zLRUCache.__update)N)r   r   r   r8   r#   r   r   r   r-   r+   rJ   r   r   r   r   r      s   
	r   c               @   sT   e Zd ZdZdddZejfddZejfddZejfd	d
Zdd Z	dd Z
dS )r   z.Most Recently Used (MRU) cache implementation.Nc             C   s   t | || t | _d S )N)r   r#   r<   r=   _MRUCache__order)r   r"   r   r   r   r   r#      s    zMRUCache.__init__c             C   s    || |}|| kr|  | |S )N)_MRUCache__update)r   r)   rG   r   r   r   r   r      s    

zMRUCache.__getitem__c             C   s   || || |  | d S )N)rM   )r   r)   r   r@   r   r   r   r      s    zMRUCache.__setitem__c             C   s   || | | j |= d S )N)rL   )r   r)   rA   r   r   r   r-     s    
zMRUCache.__delitem__c             C   sN   yt t| j}W n( tk
r:   tdt| j dY nX || |fS dS )z=Remove and return the `(key, value)` pair most recently used.z%s is emptyN)rB   r/   rL   rC   r'   rD   r   r   )r   r)   r   r   r   r+     s
    zMRUCache.popitemc             C   s8   y| j j|dd W n tk
r2   d | j |< Y nX d S )NF)last)rL   r?   r'   )r   r)   r   r   r   rK     s    zMRUCache.__update)N)r   r   r   r8   r#   r   r   r   r-   r+   rM   r   r   r   r   r      s   
	r   c               @   s4   e Zd ZdZejdfddZedd Zdd ZdS )	r   z-Random Replacement (RR) cache implementation.Nc             C   s   t | || || _d S )N)r   r#   _RRCache__choice)r   r"   choicer   r   r   r   r#     s    zRRCache.__init__c             C   s   | j S )z(The `choice` function used by the cache.)rO   )r   r   r   r   rP     s    zRRCache.choicec             C   sN   y|  t| }W n( tk
r:   tdt| j dY nX || |fS dS )z/Remove and return a random `(key, value)` pair.z%s is emptyN)rO   list
IndexErrorr'   rD   r   r   )r   r)   r   r   r   r+   !  s
    zRRCache.popitem)	r   r   r   r8   randomrP   r#   r:   r+   r   r   r   r   r     s   r   c                   s   e Zd ZdZG dd dZejdfddZej	fddZ	ej
fd	d
Z
e fddZedd Zdd Zdd Zdd Zdd Z  ZS )_TimedCachez0Base class for time aware cache implementations.c               @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )z_TimedCache._Timerc             C   s   || _ d| _d S )Nr   )_Timer__timer_Timer__nesting)r   timerr   r   r   r#   /  s    z_TimedCache._Timer.__init__c             C   s   | j dkr|  S | jS d S )Nr   )rV   rU   _Timer__time)r   r   r   r   __call__3  s    
z_TimedCache._Timer.__call__c             C   s2   | j dkr|   | _}n| j}|  j d7  _ |S )Nr   r   )rV   rU   rX   )r   timer   r   r   	__enter__9  s
    
z_TimedCache._Timer.__enter__c             G   s   |  j d8  _ d S )Nr   )rV   )r   excr   r   r   __exit__A  s    z_TimedCache._Timer.__exit__c             C   s   t j| jffS )N)rT   _TimerrU   )r   r   r   r   
__reduce__D  s    z_TimedCache._Timer.__reduce__c             C   s   t | j|S )N)getattrrU   )r   namer   r   r   __getattr__G  s    z_TimedCache._Timer.__getattr__N)	r   r   r   r#   rY   r[   r]   r_   rb   r   r   r   r   r^   .  s   r^   Nc             C   s   t | || t|| _d S )N)r   r#   rT   r^   _TimedCache__timer)r   r"   rW   r   r   r   r   r#   J  s    z_TimedCache.__init__c          	   C   s$   | j }| | || S Q R X d S )N)rc   expire)r   Z
cache_reprrZ   r   r   r   r&   N  s    
z_TimedCache.__repr__c          	   C   s$   | j }| | || S Q R X d S )N)rc   rd   )r   Z	cache_lenrZ   r   r   r   r2   S  s    
z_TimedCache.__len__c          	      s$   | j }| | t jS Q R X d S )N)rc   rd   superr7   )r   rZ   )r$   r   r   r7   X  s    
z_TimedCache.currsizec             C   s   | j S )z%The timer function used by the cache.)rc   )r   r   r   r   rW   ^  s    z_TimedCache.timerc          	   C   s*   | j }| | t|  W d Q R X d S )N)rc   rd   r   clear)r   rZ   r   r   r   rf   c  s    
z_TimedCache.clearc          	   O   s$   | j  tj| f||S Q R X d S )N)rc   r   r4   )r   argskwargsr   r   r   r4   h  s    z_TimedCache.getc          	   O   s$   | j  tj| f||S Q R X d S )N)rc   r   r   )r   rg   rh   r   r   r   r   l  s    z_TimedCache.popc          	   O   s$   | j  tj| f||S Q R X d S )N)rc   r   r6   )r   rg   rh   r   r   r   r6   p  s    z_TimedCache.setdefault)r   r   r   r8   r^   rZ   	monotonicr#   r   r&   r2   r:   r7   rW   rf   r4   r   r6   __classcell__r   r   )r$   r   rT   +  s   rT   c               @   s   e Zd ZdZG dd dZejdfddZdd Ze	j
fd	d
Z
e	jfddZe	jfddZdd Zdd Zedd ZdddZdd Zdd ZdS )r   z@LRU Cache implementation with per-item time-to-live (TTL) value.c               @   s*   e Zd ZdZd	ddZdd Zdd ZdS )
zTTLCache._Link)r)   expiresrB   prevNc             C   s   || _ || _d S )N)r)   rk   )r   r)   rk   r   r   r   r#   |  s    zTTLCache._Link.__init__c             C   s   t j| j| jffS )N)r   _Linkr)   rk   )r   r   r   r   r_     s    zTTLCache._Link.__reduce__c             C   s   | j }| j}||_ ||_d S )N)rB   rl   )r   rB   rl   r   r   r   unlink  s    zTTLCache._Link.unlink)NN)r   r   r   r   r#   r_   rn   r   r   r   r   rm   x  s   
rm   Nc             C   s>   t | ||| t  | _}| |_|_t | _	|| _
d S )N)rT   r#   r   rm   _TTLCache__rootrl   rB   r<   r=   _TTLCache__links_TTLCache__ttl)r   r"   ttlrW   r   rootr   r   r   r#     s
    
zTTLCache.__init__c             C   s6   y| j | }W n tk
r"   dS X |  |jk S d S )NF)rp   r'   rW   rk   )r   r)   linkr   r   r   r.     s
    zTTLCache.__contains__c             C   sT   y|  |}W n tk
r&   d}Y nX |  |jk  }|rF| |S || |S d S )NF)_TTLCache__getlinkr'   rW   rk   r(   )r   r)   rG   rt   expiredr   r   r   r     s    

zTTLCache.__getitem__c          	   C   s   | j }| | || || W d Q R X y| |}W n( tk
r^   t| | j|< }Y n
X |  || j |_	| j
 |_}|j |_}| |_|_d S )N)rW   rd   ru   r'   r   rm   rp   rn   rq   rk   ro   rB   rl   )r   r)   r   r@   rZ   rt   rs   rl   r   r   r   r     s    
zTTLCache.__setitem__c             C   s8   || | | j |}|  |  |jk s4t|d S )N)rp   r   rn   rW   rk   r'   )r   r)   rA   rt   r   r   r   r-     s
    
zTTLCache.__delitem__c          	   c   sH   | j }|j}x6||k	rB| j}||jk r0|jV  W d Q R X |j}qW d S )N)ro   rB   rW   rk   r)   )r   rs   currrZ   r   r   r   r0     s    

zTTLCache.__iter__c             C   sn   | j | | j}| |_|_x<t| j dd dD ]"}||_|j |_}| |_|_q6W | | 	  d S )Nc             S   s   | j S )N)rk   )objr   r   r   <lambda>      z'TTLCache.__setstate__.<locals>.<lambda>)r)   )
__dict__updatero   rl   rB   sortedrp   valuesrd   rW   )r   staters   rt   rl   r   r   r   __setstate__  s    zTTLCache.__setstate__c             C   s   | j S )z,The time-to-live value of the cache's items.)rq   )r   r   r   r   rr     s    zTTLCache.ttlc             C   sj   |dkr|   }| j}|j}| j}tj}x<||k	rd||jk sd|| |j ||j= |j}|  |}q*W dS )z$Remove expired items from the cache.N)	rW   ro   rB   rp   r   r-   rk   r)   rn   )r   rZ   rs   rw   linksrA   rB   r   r   r   rd     s    zTTLCache.expirec          	   C   sj   | j Z}| | ytt| j}W n( tk
rL   tdt| j dY nX || 	|fS W dQ R X dS )zmRemove and return the `(key, value)` pair least recently used that
        has not already expired.

        z%s is emptyN)
rW   rd   rB   r/   rp   rC   r'   rD   r   r   )r   rZ   r)   r   r   r   r+     s    
zTTLCache.popitemc             C   s   | j | }| j | |S )N)rp   r?   )r   r)   r   r   r   r   Z	__getlink  s    
zTTLCache.__getlink)N)r   r   r   r8   rm   rZ   ri   r#   r.   r   r   r   r-   r0   r   r:   rr   rd   r+   ru   r   r   r   r   r   u  s   


r   c               @   s   e Zd ZdZejG dd dZejdfddZ	dd Z
ejfd	d
ZejfddZejfddZdd Zedd ZdddZdd Zdd ZdS )r   z;Time aware Least Recently Used (TLRU) cache implementation.c               @   s"   e Zd ZdZdddZdd ZdS )zTLRUCache._Item)r)   rk   removedNc             C   s   || _ || _d| _d S )NF)r)   rk   r   )r   r)   rk   r   r   r   r#     s    zTLRUCache._Item.__init__c             C   s   | j |j k S )N)rk   )r   otherr   r   r   __lt__  s    zTLRUCache._Item.__lt__)NN)r   r   r   r   r#   r   r   r   r   r   _Item  s   
r   Nc             C   s*   t | ||| t | _g | _|| _d S )N)rT   r#   r<   r=   _TLRUCache__items_TLRUCache__order_TLRUCache__ttu)r   r"   tturW   r   r   r   r   r#     s    
zTLRUCache.__init__c             C   s6   y| j | }W n tk
r"   dS X |  |jk S d S )NF)r   r'   rW   rk   )r   r)   itemr   r   r   r.     s
    zTLRUCache.__contains__c             C   sT   y|  |}W n tk
r&   d}Y nX |  |jk  }|rF| |S || |S d S )NF)_TLRUCache__getitemr'   rW   rk   r(   )r   r)   rG   r   rv   r   r   r   r     s    

zTLRUCache.__getitem__c          	   C   s   | j 6}| |||}||k s"d S | | || || W d Q R X yd| |_W n tk
rf   Y nX t|| | j|< }t	
| j| d S )NT)rW   r   rd   r   r   r'   r   r   r   heapqheappushr   )r   r)   r   r@   rZ   rk   r   r   r   r   r      s    
zTLRUCache.__setitem__c          	   C   sD   | j }|| | W d Q R X | j|}d|_||jk s@t|d S )NT)rW   r   r   r   rk   r'   )r   r)   rA   rZ   r   r   r   r   r-   0  s    
zTLRUCache.__delitem__c          
   c   s>   x8| j D ].}| j}||jk r,|js,|jV  W d Q R X qW d S )N)r   rW   rk   r   r)   )r   rw   rZ   r   r   r   r0   9  s    zTLRUCache.__iter__c             C   s   | j S )z1The local time-to-use function used by the cache.)r   )r   r   r   r   r   @  s    zTLRUCache.ttuc             C   s   |dkr|   }| j}| j}t|t|d krNdd |D  | _}t| tj}xD|r|d jsr||d j	k st
|}|jsV|| |j ||j= qVW dS )z$Remove expired items from the cache.N   c             S   s   g | ]}|j s|qS r   )r   ).0r   r   r   r   
<listcomp>M  s    z$TLRUCache.expire.<locals>.<listcomp>r   )rW   r   r   r1   r   heapifyr   r-   r   rk   heappopr)   )r   rZ   itemsorderrA   r   r   r   r   rd   E  s    

zTLRUCache.expirec          	   C   sh   | j X}| | ytt| j}W n& tk
rJ   td| jj dY nX || 	|fS W dQ R X dS )zmRemove and return the `(key, value)` pair least recently used that
        has not already expired.

        z%s is emptyN)
rW   rd   rB   r/   r   rC   r'   r$   r   r   )r   rZ   r)   r   r   r   r+   V  s    
zTLRUCache.popitemc             C   s   | j | }| j | |S )N)r   r?   )r   r)   r   r   r   r   Z	__getitemd  s    
zTLRUCache.__getitem)N)r   r   r   r8   	functoolstotal_orderingr   rZ   ri   r#   r.   r   r   r   r-   r0   r:   r   rd   r+   r   r   r   r   r   r     s   	
r   	CacheInfohitsmissesr"   r7   Fc                s    fdd}|S )z_Decorator to wrap a function with a memoizing callable that saves
    results in a cache.

    c                s  rd t tr(fddn.t tjjrHfddnfddd kr fdd}fdd	}}nhd kr fd
d}fdd	}}n6 fdd}fdd	}fdd}nld kr
 fdd}dd	 }nHd kr2 fdd}fdd	}n  fdd}fdd	}d }|_|_|_||_||_	t
| S )Nr   c                  s   t  j jS )N)
_CacheInfor"   r7   r   )cacher   r   r   r   getinfo{  s    z*cached.<locals>.decorator.<locals>.getinfoc                  s   t d t S )N)r   r1   r   )r   r   r   r   r   r     s    c                  s   t  ddS )Nr   )r   r   )r   r   r   r   r     s    c                 s   d7  | |S )Nr   r   )rg   rh   )funcr   r   r   wrapper  s    z*cached.<locals>.decorator.<locals>.wrapperc                  s   d  d S )Nr   r   r   )r   r   r   r   cache_clear  s    z.cached.<locals>.decorator.<locals>.cache_clearc                 sl   | |}y | }d7 |S  t k
r:   d7 Y nX | |}y| |< W n tk
rf   Y nX |S )Nr   )r'   r*   )rg   rh   kresultv)r   r   r   r)   r   r   r   r     s    

c                  s       d d S )Nr   )rf   r   )r   r   r   r   r   r     s    c                 s   | |}y$  | }d7 |S Q R X W n, t k
rZ    d7 W d Q R X Y nX | |}y  ||S Q R X W n tk
r   |S X d S )Nr   )r'   r6   r*   )rg   rh   r   r   r   )r   r   r   r)   lockr   r   r   r     s    

c            	      s$        d W d Q R X d S )Nr   )rf   r   )r   r   r   r   r   r   r     s    c            	      s      S Q R X d S )Nr   r   )r   r   r   r   
cache_info  s    z-cached.<locals>.decorator.<locals>.cache_infoc                 s
    | |S )Nr   )rg   rh   )r   r   r   r     s    c               S   s   d S )Nr   r   r   r   r   r     s    c                 sX   | |}y | S  t k
r&   Y nX | |}y| |< W n tk
rR   Y nX |S )N)r'   r*   )rg   rh   r   r   )r   r   r)   r   r   r     s    

c                  s       d S )N)rf   r   )r   r   r   r     s    c           	      sx   | |}y
  | S Q R X W n t k
r6   Y nX | |}y  ||S Q R X W n tk
rr   |S X d S )N)r'   r6   r*   )rg   rh   r   r   )r   r   r)   r   r   r   r     s    

c            	      s        W d Q R X d S )N)rf   r   )r   r   r   r   r     s    )
isinstancer   r<   abcMappingr   	cache_key
cache_lockr   r   r   update_wrapper)r   r   r   r   )r   infor)   r   )r   r   r   r   r   	decoratoru  sB    



zcached.<locals>.decoratorr   )r   r)   r   r   r   r   )r   r   r)   r   r   r	   o  s     r	   c                s    fdd}|S )zoDecorator to wrap a class or instance method with a memoizing
    callable that saves results in a cache.

    c                sj   d kr& fdd}fdd}n  fdd}fdd}|_ |_|_||_t| S )Nc                s    | }|d kr | f||S | f||}y|| S  t k
rL   Y nX | f||}y|||< W n tk
r~   Y nX |S )N)r'   r*   )r   rg   rh   cr   r   )r   r)   methodr   r   r     s    z0cachedmethod.<locals>.decorator.<locals>.wrapperc                s    | }|d k	r|   d S )N)rf   )r   r   )r   r   r   rf   &  s    z.cachedmethod.<locals>.decorator.<locals>.clearc          	      s    | }|d kr | f||S | f||}y| 
 || S Q R X W n t k
r`   Y nX | f||}y |  |||S Q R X W n tk
r   |S X d S )N)r'   r6   r*   )r   rg   rh   r   r   r   )r   r)   r   r   r   r   r   -  s    

c          	      s0    | }|d k	r,|  |   W d Q R X d S )N)rf   )r   r   )r   r   r   r   rf   ?  s    
)r   r   r   r   r   r   )r   r   rf   )r   r)   r   )r   r   r     s    zcachedmethod.<locals>.decoratorr   )r   r)   r   r   r   )r   r)   r   r   r
     s    9r
   )r8   __all____version__r<   collections.abcr   r   rS   rZ    r   r   r   MutableMappingr   r   r   r   r   r   rT   r   r   
namedtupler   Zhashkeyr	   Z	methodkeyr
   r   r   r   r   <module>   s2   f%%J t 