a fWc @sHdZzddlmZWney2ddlmZYn0GdddeZdS)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@seZdZdZddZejfddZejfddZdd Zd d Z d d Z d0ddZ ddZ ddZ ddZddZddZddZddZeZeZefdd Zd1d"d#Zifd$d%Zd&d'Zd(d)Zed2d*d+Zd,d-Zd.d/Zd!S)3 OrderedDictz)Dictionary that remembers insertion ordercOspt|dkrtdt|z |jWn4tyZg|_}||dg|dd<i|_Yn0|j|i|dS)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__rootAttributeError_OrderedDict__map_OrderedDict__update)selfargskwdsrootrF/usr/lib/python3.9/site-packages/passlib/utils/compat/_ordered_dict.py__init__s     zOrderedDict.__init__cCsF||vr6|j}|d}|||g|d<|d<|j|<||||dS)z!od.__setitem__(i, y) <==> od[i]=yrrN)rr )r keyvalueZ dict_setitemrlastrrr __setitem__)s  zOrderedDict.__setitem__cCs0||||j|\}}}||d<||d<dS)z od.__delitem__(y) <==> del od[y]rrN)r pop)r rZ dict_delitem link_prev link_nextrrr __delitem__3s zOrderedDict.__delitem__ccs.|j}|d}||ur*|dV|d}qdS)zod.__iter__() <==> iter(od)rNrr rZcurrrrr__iter__<s  zOrderedDict.__iter__ccs.|j}|d}||ur*|dV|d}qdS)z#od.__reversed__() <==> reversed(od)rrNrrrrr __reversed__Ds  zOrderedDict.__reversed__cCsbz@|jD]}|dd=q |j}||dg|dd<|jWntyRYn0t|dS)z.od.clear() -> None. Remove all items from od.N)r itervaluesrclearrdict)r Znoderrrrr Ls  zOrderedDict.clearTcCs||s td|j}|r8|d}|d}||d<||d<n |d}|d}||d<||d<|d}|j|=t||}||fS)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. zdictionary is emptyrrr)KeyErrorrr r!r)r rrlinkrrrrrrrpopitemXs   zOrderedDict.popitemcCst|S)zod.keys() -> list of keys in od)listr rrrkeysqszOrderedDict.keyscsfddDS)z#od.values() -> list of values in odcsg|] }|qSrr.0rr&rr wz&OrderedDict.values..rr&rr&rvaluesuszOrderedDict.valuescsfddDS)z.od.items() -> list of (key, value) pairs in odcsg|]}||fqSrrr(r&rrr*{r+z%OrderedDict.items..rr&rr&ritemsyszOrderedDict.itemscCst|S)z0od.iterkeys() -> an iterator over the keys in od)iterr&rrriterkeys}szOrderedDict.iterkeysccs|D]}||VqdS)z2od.itervalues -> an iterator over the values in odNrr krrrrszOrderedDict.itervaluesccs|D]}|||fVqdS)z=od.iteritems -> an iterator over the (key, value) items in odNrr0rrr iteritemsszOrderedDict.iteritemscOst|dkr tdt|fn |s,td|d}d}t|dkrL|d}t|trn|D]}||||<qZn 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 rz8update() takes at most 2 positional arguments (%d given)z,update() takes at least 1 argument (0 given)rrrr'N)rr isinstancer!hasattrr'r-)r r r otherrrrrrupdates(       zOrderedDict.updatecCs0||vr||}||=|S||jur,t||S)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__markerr")r rdefaultresultrrrrs zOrderedDict.popNcCs||vr||S|||<|S)zDod.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in odr)r rr8rrr setdefaultszOrderedDict.setdefaultcCsft|tf}||vrdSd||<z6|s>d|jjfW||=Sd|jj|fW||=S||=0dS)zod.__repr__() <==> repr(od)z...rz%s()z%s(%r)N)id _get_ident __class____name__r-)r Z _repr_runningZcall_keyrrr__repr__szOrderedDict.__repr__csXfddD}t}ttD]}||dq(|rLj|f|fSj|ffS)z%Return state information for picklingcsg|]}||gqSrr)r)r1r&rrr*r+z*OrderedDict.__reduce__..N)varscopyrrr=)r r-Z inst_dictr1rr&r __reduce__s zOrderedDict.__reduce__cCs ||S)z!od.copy() -> a shallow copy of od)r=r&rrrrAszOrderedDict.copycCs|}|D] }|||<q |S)zOD.fromkeys(S[, v]) -> New ordered dictionary with keys from S and values equal to v (which defaults to None). r)clsiterablerdrrrrfromkeyss zOrderedDict.fromkeyscCs6t|tr*t|t|ko(||kSt||S)zod.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive while comparison to a regular mapping is order-insensitive. )r3rrr-r!__eq__r r5rrrrGs  zOrderedDict.__eq__cCs ||k S)NrrHrrr__ne__szOrderedDict.__ne__)T)N)N)r> __module__ __qualname____doc__rr!rrrrr r$r'r,r-r/rr2r6r objectr7rr:r?rBrA classmethodrFrGrIrrrrr s4         rN)rLthreadrr< ImportErrorZ dummy_threadr!rrrrrs