
    g                      P    S r  SSKJr   " S S\5      rg! \ a	    SSKJr   Nf = f)zpasslib.utils.compat._ordered_dict -- backport of collections.OrderedDict for py26

taken from stdlib-suggested recipe at http://code.activestate.com/recipes/576693/

this should be imported from passlib.utils.compat.OrderedDict, not here.
    )	get_identc                      \ rS rSrSrS r\R                  4S jr\R                  4S jrS r	S r
S rSS	 jrS
 rS rS rS rS rS rS r\r\" 5       r\4S jrSS jr0 4S jrS rS r\SS j5       rS rS rSr g)OrderedDict   z)Dictionary that remembers insertion orderc                     [        U5      S:  a  [        S[        U5      -  5      e U R                    U R
                  " U0 UD6  g! [         a    / =U l        nX3S/USS& 0 U l         N6f = f)zInitialize an ordered dictionary.  Signature is the same as for
regular dictionaries, but keyword arguments are not recommended
because their insertion order is arbitrary.

   z$expected at most 1 arguments, got %dN)len	TypeError_OrderedDict__rootAttributeError_OrderedDict__map_OrderedDict__update)selfargskwdsroots       [/home/matz/Project1/venv/lib/python3.13/site-packages/passlib/utils/compat/_ordered_dict.py__init__OrderedDict.__init__   su     t9q=BSYNOO	KK
 	t$t$	  	!##DK$4(DGDJ	s   A !A+*A+c                 x    X;  a,  U R                   nUS   nXTU/=US'   =US'   U R                  U'   U" XU5        g)z!od.__setitem__(i, y) <==> od[i]=yr   r   N)r   r   )r   keyvaluedict_setitemr   lasts         r   __setitem__OrderedDict.__setitem__)   sI     ?;;D7D37s2CCDGCd1g

3T&    c                 `    U" X5        U R                   R                  U5      u  p4nXCS'   X4S'   g)z od.__delitem__(y) <==> del od[y]r   r   N)r   pop)r   r   dict_delitem	link_prev	link_nexts        r   __delitem__OrderedDict.__delitem__3   s1     	T$(JJNN3$7!	c ! !r   c              #   \   #    U R                   nUS   nX!La  US   v   US   nX!La  M  gg7f)zod.__iter__() <==> iter(od)r      Nr   r   r   currs      r   __iter__OrderedDict.__iter__<   7     {{Awq'M7D    &,,c              #   \   #    U R                   nUS   nX!La  US   v   US   nX!La  M  gg7f)z#od.__reversed__() <==> reversed(od)r   r&   Nr'   r(   s      r   __reversed__OrderedDict.__reversed__D   r,   r-   c                      U R                   R                  5        H  nUSS2	 M
     U R                  nX"S/USS& U R                   R                  5         [
        R                  U 5        g! [         a     N"f = f)z.od.clear() -> None.  Remove all items from od.N)r   
itervaluesr   clearr   dict)r   noder   s      r   r3   OrderedDict.clearL   sn    	

--/G 0;;D4(DGJJ 	

4  		s   AA+ +
A87A8c                     U (       d  [        S5      eU R                  nU(       a  US   nUS   nX$S'   XBS'   OUS   nUS   nXRS'   X%S'   US   nU R                  U	 [        R	                  X5      nXg4$ )zod.popitem() -> (k, v), return and remove a (key, value) pair.
Pairs are returned in LIFO order if last is true or FIFO order if false.

zdictionary is emptyr   r   r&   )KeyErrorr   r   r4   r   )r   r   r   linkr!   r"   r   r   s           r   popitemOrderedDict.popitemX   s    
 011{{7DQIaLG7DQIGaL1gJJsO#zr   c                     [        U 5      $ )zod.keys() -> list of keys in od)listr   s    r   keysOrderedDict.keysq       Dzr   c                 6    U  Vs/ s H  oU   PM	     sn$ s  snf )z#od.values() -> list of values in od r   r   s     r   valuesOrderedDict.valuesu   s    %)*TcS	T***s   c                 8    U  Vs/ s H  oX   4PM
     sn$ s  snf )z.od.items() -> list of (key, value) pairs in odrC   rD   s     r   itemsOrderedDict.itemsy   s    ,01DSdi D111s   c                     [        U 5      $ )z0od.iterkeys() -> an iterator over the keys in od)iterr>   s    r   iterkeysOrderedDict.iterkeys}   rA   r   c              #   *   #    U  H	  nX   v   M     g7f)z2od.itervalues -> an iterator over the values in odNrC   r   ks     r   r2   OrderedDict.itervalues   s     A'M s   c              #   .   #    U  H  nXU   4v   M     g7f)z=od.iteritems -> an iterator over the (key, value) items in odNrC   rO   s     r   	iteritemsOrderedDict.iteritems   s     A1g, s   c                     [        U 5      S:  a  [        S[        U 5      4-  5      eU (       d  [        S5      eU S   nSn[        U 5      S:X  a  U S   n[        U[        5      (       a  U H	  nX4   X$'   M     O>[	        US5      (       a  UR                  5        H	  nX4   X$'   M     OU H	  u  pEXRU'   M     UR                  5        H	  u  pEXRU'   M     g)	a[  od.update(E, **F) -> None.  Update od from dict/iterable E and F.

If E is a dict instance, does:           for k in E: od[k] = E[k]
If E has a .keys() method, does:         for k in E.keys(): od[k] = E[k]
Or if E is an iterable of items, does:   for k, v in E: od[k] = v
In either case, this is followed by:     for k, v in F.items(): od[k] = v

r&   z8update() takes at most 2 positional arguments (%d given)z,update() takes at least 1 argument (0 given)r   rC   r   r?   N)r	   r
   
isinstancer4   hasattrr?   rH   )r   r   r   otherr   r   s         r   updateOrderedDict.update   s     t9q= 369$i\B C CJKKAwt9>GEeT""!J	 UF##zz|!J	 $ $
!S	 $**,JCI 'r   c                 R    X;   a  X   nX	 U$ X R                   L a  [        U5      eU$ )zod.pop(k[,d]) -> v, remove specified key and return the corresponding value.
If key is not found, d is returned if given, otherwise KeyError is raised.

)_OrderedDict__markerr8   )r   r   defaultresults       r   r   OrderedDict.pop   s3    
 ;YF	Mmm#3-r   Nc                      X;   a  X   $ X U'   U$ )zDod.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in odrC   )r   r   r]   s      r   
setdefaultOrderedDict.setdefault   s    ;9S	r   c                     [        U 5      [        5       4nX!;   a  gSX'    U (       d  U R                  R                  < S3X	 $ U R                  R                  < SU R	                  5       < S3X	 $ ! X	 f = f)zod.__repr__() <==> repr(od)z...r   z()())id
_get_ident	__class____name__rH   )r   _repr_runningcall_keys      r   __repr__OrderedDict.__repr__   sj    d8Z\)$"#	(!%!8!8: '  $~~66

E''s    A2 +A2 2A6c                    U  Vs/ s H  oX   /PM
     nn[        U 5      R                  5       n[        [        5       5       H  nUR                  US5        M     U(       a  U R                  U4U4$ U R                  U44$ s  snf )z%Return state information for picklingN)varscopyr   r   rh   )r   rP   rH   	inst_dicts       r   
__reduce__OrderedDict.__reduce__   su    '+,t!TWt,JOO%	km$AMM!T" %NNUHi88~~x'' -s   Bc                 $    U R                  U 5      $ )z!od.copy() -> a shallow copy of od)rh   r>   s    r   rp   OrderedDict.copy   s    ~~d##r   c                 .    U " 5       nU H  nX#U'   M	     U$ )zpOD.fromkeys(S[, v]) -> New ordered dictionary with keys from S
and values equal to v (which defaults to None).

rC   )clsiterabler   dr   s        r   fromkeysOrderedDict.fromkeys   s!     ECcF r   c                     [        U[        5      (       a?  [        U 5      [        U5      :H  =(       a!    U R                  5       UR                  5       :H  $ [        R                  X5      $ )zod.__eq__(y) <==> od==y.  Comparison to another OD is order-sensitive
while comparison to a regular mapping is order-insensitive.

)rV   r   r	   rH   r4   __eq__r   rX   s     r   r}   OrderedDict.__eq__   sI    
 e[))t9c%j(JTZZ\U[[]-JJ{{4''r   c                     X:X  + $ NrC   r~   s     r   __ne__OrderedDict.__ne__   s      r   )__map__root)Tr   )!ri   
__module____qualname____firstlineno____doc__r   r4   r   r#   r*   r/   r3   r:   r?   rE   rH   rL   r2   rS   rY   r   objectr\   r   ra   rl   rr   rp   classmethodrz   r}   r   __static_attributes__rC   r   r   r   r      s    3%  483C3C ' -1,<,< !
2+2

> HxH'  &( (($  (!r   r   N)r   threadr   rg   ImportErrordummy_threadr4   r   rC   r   r   <module>r      s4   5.e!$ e!  545s    %%