o
    &j                     @   s  d Z dZdZdZdZdZd\ZZdZedkr#e	Z
e
dZe
e	dZnUedkr>dd	lZejZ
d
e _e
dZe
e	dZn:edkrUdd	lZejZ
[e
dZe
e	dZn#edkrtdd	lZeed ejZ
e
e	dZe Z[nedee Ze
dZe
dZG dd dZG dd dZG dd dZd;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&d(d) Z'd*d+ Z(efd,d-Z)efd.d/Z*d0d1 Z+d2d3 Z,dd4l-m.Z. e/ Z0G d5d6 d6e/Z1G d7d8 d8e/Z2G d9d: d:e1Z3d	S )<)isect_segmentsisect_polygonisect_segments_include_segmentsisect_polygon_include_segmentsisect_segments__naiveisect_polygon__naiveTF       nativez1e-4infdecimalr   NP   z1e-10numpygmpy2   zType not foundg        g      ?c                   @   s^   e Zd Zdes	dnd ZG dd dZdd Zdd	 Zd
d Zdd Z	e
dd Zdd ZdS )Event)typepointsegmentslopespan )otherin_sweepc                   @   s$   e Zd ZdZdZdZerdZdS dS )z
Event.Typer   r	         N)__name__
__module____qualname__ENDINTERSECTIONSTARTUSE_VERTICALSTART_VERTICALr   r   r   h/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/imgaug/external/poly_point_isect_py2py3.pyTypeh   s    r%   c                 C   s`   t |tsJ || _|| _|| _|| _|d ur$|d t |d t  | _tr.d | _	d| _
d S d S )Nr	   r   F)
isinstancetupler   r   r   r   Xr   	USE_DEBUGr   r   )selfr   r   r   r   r   r   r$   __init__o   s   
zEvent.__init__c                 C   s
   t | jS N)hashr   r*   r   r   r$   __hash__   s   
zEvent.__hash__c                 C   s
   | j tkS r,   )r   NUM_ZEROr.   r   r   r$   is_vertical      
zEvent.is_verticalc                 C   s   t r|  rd S || jd t kr| jd t S || jd t kr(| jd t S || jd t  }| jd t | }||krH|| j }t| }n	|| j }t| }|tksWJ | jd t | | jd t |  S Nr   r	   )r"   r1   r   r(   Yr   NUM_ONE)r*   xZdelta_x0Zdelta_x1Zifacfacr   r   r$   y_intercept_x   s    


$zEvent.y_intercept_xc                 C   s>  ||u rdS t r|j|u rdS | j}||}||}tr0|d u r'|jt }|d u r0|jt }|| }|tk ||k ks>J t|t	krL|tk rJdS dS |j
}|j
}||kri| jra||kr_dS dS ||krgdS dS |jd t |jd t  }	|	tkr|	tk rdS dS |jd t |jd t  }
|
tkr|
tk rdS dS dS )Nr   r	   )r)   r   _current_event_point_xr8   r"   r   r4   r0   absNUM_EPSr   _beforer   r(   )
sweep_linethisthatZcurrent_point_xZthis_yZthat_yZdelta_yZ
this_slopeZ
that_slopeZ
delta_x_p1Z
delta_x_p2r   r   r$   Compare   s<   




zEvent.Comparec                 C   sR   | j d urdt| | j d | j d | j| j| jf S dt| dd| j| j| jf S )Nz2Event(0x%x, s0=%r, s1=%r, p=%r, type=%d, slope=%r)r   r	   None)r   idr   r   r   r.   r   r   r$   __repr__   s   
zEvent.__repr__N)r   r   r   r)   	__slots__r%   r+   r/   r1   r8   staticmethodrA   rD   r   r   r   r$   r   X   s    
	
+r   c                   @   sr   e Zd Z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dd ZdS )	SweepLine)intersectionsqueue_events_current_sweepr:   r=   c                 C   s&   i | _ d | _ttj| d| _d| _d S )N)cmpcmp_dataT)rH   r:   RBTreer   rA   rJ   r=   r.   r   r   r$   r+      s   
zSweepLine.__init__c                 C   s*   t tu rt| j S dd | j D S )zA
        Return a list of unordered intersection points.
        c                 S   $   g | ]}t |d  t |d fqS r   float.0pr   r   r$   
<listcomp>     $ z/SweepLine.get_intersections.<locals>.<listcomp>)RealrP   listrH   keysr.   r   r   r$   get_intersections   s   zSweepLine.get_intersectionsc                 C   s0   t tu rdd | j D S dd | j D S )z
        Return a list of unordered intersection '(point, segment)' pairs,
        where segments may contain 2 or more values.
        c                 S   s"   g | ]\}}|d d |D fqS )c                 S   s   g | ]}|j qS r   )r   rR   eventr   r   r$   rT     s    HSweepLine.get_intersections_with_segments.<locals>.<listcomp>.<listcomp>r   rR   rS   	event_setr   r   r$   rT   
  s    z=SweepLine.get_intersections_with_segments.<locals>.<listcomp>c                 S   s6   g | ]\}}t |d  t |d fdd |D fqS )r   r	   c                 S   sT   g | ]&}t |jd  d  t |jd  d ft |jd d  t |jd d ffqS r   )rP   r   rZ   r   r   r$   rT     s
    ""r\   rO   r]   r   r   r$   rT     s    )rV   rP   rH   itemsr.   r   r   r$   get_intersections_with_segments  s   z)SweepLine.get_intersections_with_segmentsc                 C   s>  |d u s|d u s|j tjjks|j tjjkrd S ||u rd S t|jd |jd |jd |jd }|d u r7d S trct||jd tk sMt||jd tk rct||jd tk sat||jd tk rcd S | j	
|t }t|dk}|| || || j	|< |r|t | jkrttjj|d d }| j|| d S d S d S r3   )r   r   r%   r    isect_seg_seg_v2_pointr   USE_IGNORE_SEGMENT_ENDINGSlen_squared_v2v2
NUM_EPS_SQrH   popsetlenaddr(   r:   rI   offer)r*   abrS   Zevents_for_pointZis_newZevent_isectr   r   r$   _check_intersection  s6   


zSweepLine._check_intersectionc                 C   s    |t  | jkr	d S |t  | _d S r,   )r(   r:   )r*   rS   r   r   r$   	_sweep_toH  s   zSweepLine._sweep_toc                 C   sn   || j vsJ tr|jtjjksJ tr#|jdksJ |jjdks#J | j 	|d  tr5d|_d|j_d S d S )NFT)
rJ   r"   r   r   r%   r#   r)   r   r   insertr*   r[   r   r   r$   rn   P  s   zSweepLine.insertc                 C   sz   z!| j | tr|jdksJ |jjdksJ d|_d|j_W dS  ty<   tr9|jdks1J |jjdks9J Y dS w NTF)rJ   remover)   r   r   KeyErrorro   r   r   r$   rq   ]  s   zSweepLine.removec                 C      | j |d S r,   )rJ   succ_keyro   r   r   r$   abovel     zSweepLine.abovec                 C   rs   r,   )rJ   prev_keyro   r   r   r$   belowo  rv   zSweepLine.belowc                 C   s   | j j|d ddS )NFreverse)rJ   	key_slicero   r   r   r$   	above_all{  s   zSweepLine.above_allc                 C   s   t |dkrd S |d | jksJ ts;t |dkr;tdt |d D ]}t|d t |D ]}| || ||  q-q"|D ]}| | q=d S r3   )rg   r:   rb   rangerl   handle_event)r*   rS   events_currentijer   r   r$   handle  s   zSweepLine.handlec           
      C   s<  |j }|tjjkr3d| _| | | |}| |}| || | || t	r1| || d S d S |tjj
krcd| _| |}| |}| | | || t	ra| || | || d S d S |tjjkrd| _| j|j }g }|D ]}| |r|| qvd| _|r| }| | | |}| |}| || | || t	r| || |sd S d S tr|tjjkr|jd t |jd t ksJ |jd t |jd t ksJ |jd t }| |D ]0}|j tjjkrq|| j}	tr	|	|t kr d S n|	|kr d S | || qd S d S d S )NFTr   r	   )r   r   r%   r!   r=   rn   ru   rx   rl   USE_PARANOIDr   rq   r    rH   r   appendre   r"   r#   r   r(   r4   r|   r8   r:   rb   r<   )
r*   r[   tZe_aboveZe_belowr^   Zreinsert_stackr   Zy_above_maxZy_abover   r   r$   r~     sz   










  

zSweepLine.handle_eventN)r   r   r   rE   r+   rY   r`   rl   rm   rn   rq   ru   rx   r|   r   r~   r   r   r   r$   rG      s    
.	rG   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	
EventQueue)events_scanc                 C   s   t  | _|D ]r}|d t |d t ksJ t| }|d |d kr#qtrJ|d t |d t krJttjj|d ||}trA||_	| 
|d | qttjj|d ||}ttjj|d ||}trh||_	||_	| 
|d | | 
|d | q| |_d S r3   )rM   r   r(   
slope_v2v2r"   r   r%   r#   r)   r   ri   r!   r   rI   )r*   segmentslinesr   Ze_startZe_endr   r   r$   r+     s&   
zEventQueue.__init__c                 C   s:   | j |trg g g g fng g g f}	 ||j | dS )zG
        Offer a new event ``s`` at point ``p`` in this queue.
        N)r   
setdefaultr"   r   r   )r*   rS   r   existingr   r   r$   ri     s   zEventQueue.offerc                 C   s(   t | jdks	J | j \}}||fS )z
        Get, and remove, the first (lowest) item from this queue.

        :return: the first (lowest) item from this queue.
        :rtype: Point, Event pair.
        r   )rg   r   pop_min)r*   rS   r   r   r   r$   poll!  s   zEventQueue.pollN)r   r   r   rE   r+   ri   r   r   r   r   r$   r     s
    r   c                 C   s   t tu rdd | D } ndd | D } t }t| |}t|jdkrLtr-tt|j|j |	 \}}|D ]}|rD|
| ||| q5t|jdks"|du rT| S | S )Nc                 S   s<   g | ]}|d  |d kr|d  |d fn|d |d  fqS r   r   rR   r   r   r   r$   rT   0  s
     z'isect_segments_impl.<locals>.<listcomp>c                 S      g | ]J}|d  |d kr,t |d  d  t |d  d ft |d d  t |d d ffnt |d d  t |d d ft |d  d  t |d  d ffqS r   rV   r   r   r   r$   rT   7  s    r   F)rV   rP   rG   r   rg   r   USE_VERBOSEprintr:   r   rm   r   rY   r`   )r   include_segmentsr>   rI   rS   Ze_lsr   r   r   r$   isect_segments_impl-  s,   

	r   c                    s,   t   fddt D }t||dS )Nc                    s,   g | ]}t | t |d     fqS )r	   )r'   )rR   r   npointsr   r$   rT   X  s    z&isect_polygon_impl.<locals>.<listcomp>r   )rg   r}   r   )r   r   r   r   r   r$   isect_polygon_implV  s
   r   c                 C      t | ddS NFr   r   r   r   r   r$   r   ^     r   c                 C   r   r   r   r   r   r   r$   r   b  r   r   c                 C   r   NTr   r   r   r   r   r$   r   f  r   r   c                 C   r   r   r   r   r   r   r$   r   j  r   r   c                 C   sJ   | t  |t  kr| t |t k rtS t S |t | t  |t  | t    S r,   )r(   r4   NUM_INF)p1Zp2r   r   r$   r   r  s
    r   c                 C   s    | d |d  | d |d  fS r3   r   rj   rk   r   r   r$   sub_v2v2|  s   r   c                 C   s    | d |d  | d |d   S r3   r   r   r   r   r$   dot_v2v2  s   r   c                 C   s   t | |}t||S r,   )r   r   )rj   rk   cr   r   r$   rc     s   

rc   c                 C   s8   t ||}t | |}t||}|tkrt||| S |S r,   )r   r   r0   )rS   l1l2defaultuhdotr   r   r$   line_point_factor_v2  s   


r   c                 C   s  | |kr	|| } }||kr||}}| |f||fkr$||| |f\} }}}|d | d  |d |d   |d | d  |d |d    }|t krJd S |d |d  | d |d  | d |d    | d |d  |d |d  |d |d     | |d |d  | d |d  | d |d    | d |d  |d |d  |d |d     | f}t|| |t d}|t | k s|t| krd S t|||t d}|t | k s|t| krd S |S )Nr   r	   )r   )r0   r   r5   )Zv1Zv2Zv3Zv4Zbiasdivvir7   r   r   r$   ra     sF   

@ra   c           
      C   s   g }t tu rdd | D } ndd | D } t| }t|D ]4}| | \}}t|d |D ]$}| | \}}|||fvrP|||fvrPt||||}	|	durP||	 q,q|S )zN
    Brute force O(n2) version of ``isect_segments`` for test validation.
    c                 S   sD   g | ]}|d  t  |d t  kr|d  |d fn|d |d  fqS r   )r(   r   r   r   r$   rT     s
    (z)isect_segments__naive.<locals>.<listcomp>c                 S   r   r   r   r   r   r   r$   rT     s    	r	   N)rV   rP   rg   r}   ra   r   )
r   isectr   r   a0a1r   b0b1ixr   r   r$   r     s(   	
r   c           
      C   s   g }t | }ttu rndd | D } t|D ]a}| | | |d |  }}t|d |D ]J}| | | |d |  }}|||fvrv|||fvrvt||||}	|	durvtrqt|	|tk sbt|	|tk rqt|	|tk spt|	|tk rqq,||	 q,q|S )zM
    Brute force O(n2) version of ``isect_polygon`` for test validation.
    c                 S   rN   r   r   rQ   r   r   r$   rT     rU   z(isect_polygon__naive.<locals>.<listcomp>r	   N)	rg   rV   rP   r}   ra   rb   rc   rd   r   )
r   r   r   r   r   r   r   r   r   r   r   r   r$   r     s,   
r   )
attrgetterc                   @   s(  e Zd Zd=ddZdd Zedd Zdd	 Zd
d ZeZ	dd Z
dd ZefddZefddZdd Zdd Zdd Zdd Zd>ddZeZd>ddZd d! Zefd"d#Zefd$d%Zd&d' Zd(d) Zd*d+ Zd,d- Zd?d/d0Zd@d1d2ZdAd3d4ZdAd5d6Z e!d7e!d8ddfd9d:Z"d;d< Z#dS )B_ABCTreeNc                 C   sB   d| _ d| _|du rdd }|| _|| _|dur| | dS dS )zDT.__init__(...) initializes T; see T.__class__.__doc__ for signatureNr   c                 S   s   ||k rdS ||krdS dS )Nr9   r	   r   r   )rL   rj   rk   r   r   r$   rK     s
   z_ABCTree.__init__.<locals>.cmp)_root_count_cmp	_cmp_dataupdate)r*   r_   rK   rL   r   r   r$   r+     s   z_ABCTree.__init__c                    s&    fdd  | j  d| _d| _ dS )z,T.clear() -> None.  Remove all items from T.c                    s,   | d ur | j   | j |   d S d S r,   )leftrightfreenode_clearr   r$   r   +  s
   

z_ABCTree.clear.<locals>._clearr   N)r   r   r.   r   r   r$   clear)  s   

z_ABCTree.clearc                 C      | j S )zGet items count.)r   r.   r   r   r$   count4  s   z_ABCTree.countc                 C   sX   | j }|d ur&| | j||j}|dkr|jS |dk r|j}n|j}|d ustt|Nr   )	r   r   r   keyvaluer   r   rr   str)r*   r   r   rK   r   r   r$   	get_value9  s   z_ABCTree.get_valuec                 C   s^   |   rtd| j}	 |jdur|j}n
|jdur|j}nnq|j}|j}| | ||fS )zT.pop_item() -> (k, v), remove and return some (key, value) pair as a
        2-tuple; but raise KeyError if T is empty.
        zpop_item(): tree is emptyTN)is_emptyrr   r   r   r   r   r   rq   )r*   r   r   r   r   r   r$   pop_itemE  s   


z_ABCTree.pop_itemc                 C   <   |   rtd| j}|jdur|j}|jdus|j|jfS )zBGet item with min key of tree, raises ValueError if tree is empty.Tree is emptyN)r   
ValueErrorr   r   r   r   r*   r   r   r   r$   min_itemY     

z_ABCTree.min_itemc                 C   r   )zBGet item with max key of tree, raises ValueError if tree is empty.r   N)r   r   r   r   r   r   r   r   r   r$   max_itemb  r   z_ABCTree.max_itemc                 C   s  | j }d}|dur8| | j||j}|dkrn!|dk r1|du s+| | j|j|jdk r-|}|j}n|j}|dus	|du rH|tu rFtt||S |jdurs|j}|jdur]|j}|jdusU|du rd|}n| | j|j|jdk rr|}n|du r|tu rtt||S |j|j	fS )z~Get successor (k,v) pair of key, raises KeyError if key is max key
        or key does not exist. optimized for pypy.
        Nr   
r   r   r   r   r   r   	_sentinelrr   r   r   )r*   r   r   r   Z	succ_noderK   r   r   r$   	succ_itemk  s>    


z_ABCTree.succ_itemc                 C   s  | j }d}|dur8| | j||j}|dkrn!|dk r|j}n|du s/| | j|j|jdk r1|}|j}|dus	|du rH|tu rFtt||S |jdurs|j}|jdur]|j}|jdusU|du rd|}n| | j|j|jdk rr|}n|du r|tu rtt||S |j|j	fS )zGet predecessor (k,v) pair of key, raises KeyError if key is min key
        or key does not exist. optimized for pypy.
        Nr   r   )r*   r   r   r   Z	prev_noderK   r   r   r$   	prev_item  s>    


z_ABCTree.prev_itemc                 C   s,   d| j jdf }|ddd |  D  S )zT.__repr__(...) <==> repr(x)z%s({%s})z%sz, c                 s   s    | ]}d | V  qdS )z%r: %rNr   )rR   itemr   r   r$   	<genexpr>      z$_ABCTree.__repr__.<locals>.<genexpr>)	__class__r   joinr_   )r*   Ztplr   r   r$   rD     s   z_ABCTree.__repr__c                 C   s&   z|  | W dS  ty   Y dS w )z+k in T -> True if T has a key k, else FalseTFr   rr   r*   r   r   r   r$   __contains__  s   
z_ABCTree.__contains__c                 C   r   )zT.__len__() <==> len(x)r   r.   r   r   r$   __len__  s   z_ABCTree.__len__c                 C   s
   | j dkS )z7T.is_empty() -> False if T contains any items else Truer   r   r.   r   r   r$   r     r2   z_ABCTree.is_emptyc                 C   s0   z|  |W S  ty   | || | Y S w )zAT.set_default(k[,d]) -> T.get(k,d), also set T[k]=d if k not in T)r   rr   rn   r*   r   r   r   r   r$   set_default  s   z_ABCTree.set_defaultc                 C   s$   z|  |W S  ty   | Y S w )z<T.get(k[,d]) -> T[k] if k in T, else d.  d defaults to None.r   r   r   r   r$   get  s
   z_ABCTree.getc                 G   sd   t |dkrtddt |  z| |}| | |W S  ty1   t |dkr+ |d  Y S w )zT.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
        r	   z(pop expected at most 2 arguments, got %dr   )rg   	TypeErrorr   rq   rr   )r*   r   argsr   r   r   r$   re     s   

z_ABCTree.popc                 C       |  ||}||u r|S |d S )zaGet predecessor to key, raises KeyError if key is min key
        or key does not exist.
        r   )r   r*   r   r   r   r   r   r$   rw        z_ABCTree.prev_keyc                 C   r   )z_Get successor to key, raises KeyError if key is max key
        or key does not exist.
        r   )r   r   r   r   r$   rt     r   z_ABCTree.succ_keyc                 C      |   }| |d  |S )zeT.pop_min() -> (k, v), remove item with minimum key, raise ValueError
        if T is empty.
        r   )r   rq   r*   r   r   r   r$   r        z_ABCTree.pop_minc                 C   r   )zeT.pop_max() -> (k, v), remove item with maximum key, raise ValueError
        if T is empty.
        r   )r   rq   r   r   r   r$   pop_max  r   z_ABCTree.pop_maxc                 C      |   d S )z9Get min key of tree, raises ValueError if tree is empty. r   )r   r.   r   r   r$   min_key     z_ABCTree.min_keyc                 C   r   )z9Get max key of tree, raises ValueError if tree is empty. r   )r   r.   r   r   r$   max_key  r   z_ABCTree.max_keyFc                 C   s   dd | j |||dD S )zT.key_slice(start_key, end_key) -> key iterator:
        start_key <= key < end_key.

        Yields keys in ascending order if reverse is False else in descending order.
        c                 s   s    | ]\}}|V  qd S r,   r   )rR   kvr   r   r$   r     r   z%_ABCTree.key_slice.<locals>.<genexpr>ry   )
iter_itemsr*   	start_keyend_keyrz   r   r   r$   r{     s   z_ABCTree.key_slicec                 C   s(   |   rg S |r| ||S | ||S )zIterates over the (key, value) items of the associated tree,
        in ascending order if reverse is True, iterate in descending order,
        reverse defaults to False)r   _iter_items_backward_iter_items_forwardr   r   r   r$   r     s
   z_ABCTree.iter_itemsc                 c   ,    | j tdtd||dD ]}|V  qd S )Nr   r   r   r   r   r   _iter_itemsr   r*   r   r   r   r   r   r$   r   ,     
z_ABCTree._iter_items_forwardc                 c   r   )Nr   r   r   r   r  r   r   r$   r   1  r  z_ABCTree._iter_items_backwardr   r   c           	      c   s    | j }g }d}| ||}	 ||d ur!|r!|| ||}n%||jr-|j|jfV  ||d ur:||}d}nt|s@d S | }d}qrp   )r   _get_in_range_funcr   r   r   rg   re   )	r*   r   r   r   r   r   stackZgo_leftZin_ranger   r   r$   r  6  s&   


z_ABCTree._iter_itemsc                    sN   d u r d u rdd S d u r   d u rfddS  fddS )Nc                 S   s   dS NTr   r6   r   r   r$   <lambda>N  s    z-_ABCTree._get_in_range_func.<locals>.<lambda>c                    s      j| dkS r   r   r   r  )r*   r   r   r$   r  S  s    c                    s(    j| dko j|  dk S r   r	  r  r   r*   r   r   r$   r  U  s    )r   )r*   r   r   r   r
  r$   r  L  s   z_ABCTree._get_in_range_func)NNNr,   F)NNFNN)$r   r   r   r+   r   propertyr   r   r   popitemr   r   r   r   r   rD   r   r   r   r   r   r   re   rw   rt   r   r   r   r   r{   r   r   r   r   r  r  r   r   r   r$   r     s@    

		()





r   c                   @   s:   e Zd ZdZg dZdddZdd Zdd	 Zd
d ZdS )Nodez(Internal object, represents a tree node.r   r   redr   r   Nc                 C   s"   || _ || _d| _d | _d | _d S r  r  r*   r   r   r   r   r$   r+   `  s
   
zNode.__init__c                 C   s   d | _ d | _d | _d | _d S r,   )r   r   r   r   r.   r   r   r$   r   g  s   
z	Node.freec                 C   s   |dkr| j S | jS )zCN.__getitem__(key) <==> x[key], where key is 0 (left) or 1 (right).r   r   r   r   r   r   r$   __getitem__m  s   zNode.__getitem__c                 C   s   |dkr	|| _ dS || _dS )zPN.__setitem__(key, value) <==> x[key]=value, where key is 0 (left) or 1 (right).r   Nr  r  r   r   r$   __setitem__q  s   

zNode.__setitem__r  )	r   r   r   __doc__rE   r+   r   r  r  r   r   r   r$   r  \  s    
r  c                   @   sL   e Zd ZdZedd Zedd Zedd Zdd	 Zd
d Z	dd Z
dS )rM   z
    RBTree implements a balanced binary tree with a dict-like interface.

    see: http://en.wikipedia.org/wiki/Red_black_tree
    c                 C   s   | d ur	| j r	dS dS rp   r  r   r   r   r$   is_red  s   zRBTree.is_redc                 C   s4   d| }| | }|| | |< | ||< d| _ d|_ |S )Nr	   TFr  )root	direction
other_sidesaver   r   r$   
jsw_single  s   zRBTree.jsw_singlec                 C   s(   d| }t | | || |< t | |S )Nr	   )rM   r  )r  r  r  r   r   r$   
jsw_double  s   zRBTree.jsw_doublec                 C   s   |  j d7  _ t||S )zCreate a new tree node.r	   )r   r  r  r   r   r$   	_new_node  s   
zRBTree._new_nodec                 C   sh  | j du r| ||| _ d| j _dS t }d}|}d}d}d}| j |_|j}		 |	du r6| ||}	|	||< nt|	jrMt|	jrMd|	_d|	j_d|	j_t|	r{t|r{|j|u r^dnd}
|	|| u rqt|d| ||
< n
t	|d| ||
< | 
| j||	jdkr||	_n |}| 
| j||	jdk rdnd}|dur|}|}|	}|	| }	q'|j| _ d| j _dS )zFT.insert(key, value) <==> T[key] = value, insert key, value into tree.NFr   Tr	   )r   r  r  r  r   rM   r  r   r  r  r   r   r   r   )r*   r   r   headgrand_parentZgrand_grand_parentparentr  lastr   
direction2r   r   r$   rn     sL   

zRBTree.insertc                 C   s8  | j du rtt|t }|}| j |_d}d}d}d}|| dur|}|}|}|| }| | j|j|dk r9dnd}| | j||jdkrH|}t	|st	|| st	|d|  rjt
||||< || }nkt	|d|  s|d|  }	|	durt	|	d|  st	|	| sd|_d|	_d|_n>|j|u rdnd}
t	|	| rt||||
< nt	|	d|  rt
||||
< d||
 _d|_d||
 j_d||
 j_|| dus"|dur|j|_|j|_|t|jdu  |t|j|u < |  |  jd8  _|j| _ | j durd| j _|stt|dS )z;T.remove(key) <==> del T[key], remove item <key> from tree.Nr	   r   FT)r   rr   r   r  r   r   r   r   rM   r  r  r  r  r   r   intr   r   )r*   r   r   r   r"  r!  foundr  r#  Zsiblingr$  r   r   r$   rq     sd   

 

( zRBTree.removeN)r   r   r   r  rF   r  r  r  r  rn   rq   r   r   r   r$   rM   y  s    

	
4rM   r  )4__all__rb   r)   r   r   r"   r(   r4   ZNUMBER_TYPErP   rV   r<   r   r   Decimal
getcontextprecr   Zfloat64r   Zset_contextZieeeZmpzZget_emax_max	Exceptionrd   r0   r5   r   rG   r   r   r   r   r   r   r   r   r   r   rc   r   ra   r   r   operatorr   objectr   r   r  rM   r   r   r   r$   <module>   s|   
   
E
)
&'2  G