a
    zekE                    @   s,  g d Z ddlmZ ddlmZ ddlmZ eddZ	dd Z
G d	d
 d
Zd9ddZdd ZG dd dZddlZedjfddZd:ddZdd Zd;ddZd d! Zd<d"d#Zd$d% Zd=d(d)Zdefd*d+Zddefd,d-Zd.Zd/Zd0Zd1ZG d2d3 d3e Z![d4d5 Z"d6d7 Z#e$d8kr(e#  dS )>)get_close_matchesndiffrestoreSequenceMatcherDifferIS_CHARACTER_JUNKIS_LINE_JUNKcontext_diffunified_diff
diff_bytesHtmlDiffMatch    )nlargest)
namedtuple)GenericAliasr   za b sizec                 C   s   |rd|  | S dS )Ng       @      ? )matcheslengthr   r   /usr/lib/python3.9/difflib.py_calculate_ratio'   s    r   c                   @   sz   e Zd ZdddZdd Zdd	 Zd
d Zdd ZdddZdd Z	dd Z
d ddZdd Zdd Zdd ZeeZdS )!r   N Tc                 C   s(   || _ d  | _| _|| _| || d S N)isjunkabautojunkset_seqs)selfr   r   r   r   r   r   r   __init__x   s    ;zSequenceMatcher.__init__c                 C   s   |  | | | d S r   )set_seq1set_seq2)r   r   r   r   r   r   r      s    	
zSequenceMatcher.set_seqsc                 C   s$   || j u rd S || _ d  | _| _d S r   )r   matching_blocksopcodes)r   r   r   r   r   r       s    
zSequenceMatcher.set_seq1c                 C   s2   || j u rd S || _ d  | _| _d | _|   d S r   )r   r"   r#   
fullbcount_SequenceMatcher__chain_b)r   r   r   r   r   r!      s    
zSequenceMatcher.set_seq2c                 C   s   | j }i  | _}t|D ]\}}||g }|| qt  | _}| j}|r~| D ]}||rV|	| qV|D ]
}||= qrt  | _
}t|}	| jr|	dkr|	d d }
| D ]\}}t||
kr|	| q|D ]
}||= qd S )N   d      )r   b2j	enumerate
setdefaultappendsetbjunkr   keysaddZbpopularlenr   items)r   r   r)   ieltindicesZjunkr   ZpopularnZntestZidxsr   r   r   Z	__chain_b
  s,    
zSequenceMatcher.__chain_br   c                 C   sT  | j | j| j| jjf\}}}}|d u r.t|}|d u r>t|}||d  }	}
}i }g }t||D ]}|j}i }||| |D ]\}||k rq~||kr q||d dd  }||< ||kr~|| d || d |  }	}
}q~|}q`|	|kr@|
|kr@|||
d  s@||	d  ||
d  kr@|	d |
d |d   }	}
}q|	| |k r|
| |k r|||
|  s||	|  ||
|  kr|d7 }q@|	|kr|
|kr|||
d  r||	d  ||
d  kr|	d |
d |d   }	}
}q|	| |k rH|
| |k rH|||
|  rH||	|  ||
|  krH|d }qt|	|
|S Nr   r(   )	r   r   r)   r.   __contains__r1   rangegetr   )r   aloahiblobhir   r   r)   ZisbjunkZbestiZbestjZbestsizeZj2lenZnothingr3   Zj2lengetZnewj2lenjkr   r   r   find_longest_match1  sZ    :"	 z"SequenceMatcher.find_longest_matchc                 C   s|  | j d ur| j S t| jt| j }}d|d|fg}g }|r| \}}}}| |||| \}	}
}}|r8|| ||	k r||
k r|||	||
f |	| |k r8|
| |k r8||	| ||
| |f q8|  d } }}g }|D ]V\}}}|| |kr|| |kr||7 }q|r,||||f |||  }}}q|rT||||f |||df tt	t
j|| _ | j S Nr   )r"   r1   r   r   poprA   r,   sortlistmapr   _make)r   lalbqueuer"   r;   r<   r=   r>   r3   r?   r@   xi1j1Zk1Znon_adjacenti2j2Zk2r   r   r   get_matching_blocks  s8    


z#SequenceMatcher.get_matching_blocksc                 C   s   | j d ur| j S d }}g  | _ }|  D ]\}}}d}||k rN||k rNd}n||k r\d}n||k rhd}|r||||||f || ||  }}|r*|d||||f q*|S )Nr   r   replacedeleteinsertequal)r#   rP   r,   )r   r3   r?   Zansweraibjsizetagr   r   r   get_opcodes  s$    

zSequenceMatcher.get_opcodes   c           
      c   sn  |   }|sdg}|d d dkrZ|d \}}}}}|t||| |t||| |f|d< |d d dkr|d \}}}}}||t||| |t||| f|d< || }g }	|D ]\}}}}}|dkr(|| |kr(|	||t||| |t||| f |	V  g }	t||| t|||  }}|	|||||f q|	rjt|	dkrd|	d d dksj|	V  d S )N)rT   r   r(   r   r(   r   rT   r(   )rY   maxminr,   r1   )
r   r6   ZcodesrX   rL   rN   rM   rO   nngroupr   r   r   get_grouped_opcodes#  s(    &&(&z#SequenceMatcher.get_grouped_opcodesc                 C   s0   t dd |  D }t|t| jt| j S )Nc                 s   s   | ]}|d  V  qdS )r[   Nr   ).0Ztripler   r   r   	<genexpr>k      z(SequenceMatcher.ratio.<locals>.<genexpr>)sumrP   r   r1   r   r   )r   r   r   r   r   ratioU  s    zSequenceMatcher.ratioc                 C   s   | j d u r4i  | _ }| jD ]}||dd ||< q| j }i }|jd }}| jD ]>}||rf|| }n||d}|d ||< |dkrP|d }qPt|t| jt| j S r7   )r$   r   r:   r8   r   r   r1   )r   r$   r4   ZavailZavailhasr   Znumbr   r   r   quick_ration  s    






zSequenceMatcher.quick_ratioc                 C   s*   t | jt | j }}tt|||| S r   )r1   r   r   r   r]   )r   rH   rI   r   r   r   real_quick_ratio  s    z SequenceMatcher.real_quick_ratio)Nr   r   T)r   Nr   N)rZ   )__name__
__module____qualname__r   r   r    r!   r%   rA   rP   rY   r`   re   rf   rg   classmethodr   __class_getitem__r   r   r   r   r   ,   s   L
@,'
tG7
2r   rZ   333333?c                 C   s   |dkst d|f d|  kr*dks:n t d|f g }t }||  |D ]D}|| | |krR| |krR| |krR|| |f qRt||}dd |D S )Nr   zn must be > 0: %rg        r   z cutoff must be in [0.0, 1.0]: %rc                 S   s   g | ]\}}|qS r   r   )ra   ZscorerK   r   r   r   
<listcomp>  rc   z%get_close_matches.<locals>.<listcomp>)	
ValueErrorr   r!   r    rg   rf   re   r,   	_nlargest)ZwordZpossibilitiesr6   cutoffresultsrK   r   r   r   r     s"    




r   c                 C   s   d dd t| |D S )Nr   c                 s   s*   | ]"\}}|d kr|  r|n|V  qdS ) N)isspace)ra   cZtag_cr   r   r   rb     s   z$_keep_original_ws.<locals>.<genexpr>)joinzip)rs   Ztag_sr   r   r   _keep_original_ws  s    
ry   c                   @   sF   e Z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S )r   Nc                 C   s   || _ || _d S r   linejunkcharjunk)r   r{   r|   r   r   r   r   *  s    zDiffer.__init__c           
   	   c   s   t | j||}| D ]\}}}}}|dkrB| ||||||}	n\|dkr\| d|||}	nB|dkrv| d|||}	n(|dkr| d|||}	ntd|f |	E d H  qd S )	NrQ   rR   -rS   +rT   rt   unknown tag %r)r   r{   rY   _fancy_replace_dumpro   )
r   r   r   cruncherrX   r;   r<   r=   r>   gr   r   r   compareA  s    zDiffer.comparec                 c   s&   t ||D ]}d||| f V  q
d S )Nz%s %s)r9   )r   rX   rK   lohir3   r   r   r   r   j  s    zDiffer._dumpc           
      c   sn   || || k r2|  d|||}|  d|||}n |  d|||}|  d|||}||fD ]}	|	E d H  qZd S )Nr~   r}   )r   )
r   r   r;   r<   r   r=   r>   firstsecondr   r   r   r   _plain_replaceo  s    zDiffer._plain_replacec                 c   s:  d\}}t | j}	d\}
}t||D ]}|| }|	| t||D ]j}|| }||krl|
d u rD|| }
}qD|	| |	 |krD|	 |krD|	 |krD|	 ||  }}}qDq$||k r|
d u r| ||||||E d H  d S |
|d  }}}nd }
| 	||||||E d H  || ||  }}|
d u r
d }}|	
|| |	 D ]\}}}}}|| ||  }}|dkr|d| 7 }|d| 7 }nb|dkr|d| 7 }nJ|d	kr|d
| 7 }n2|dkr|d| 7 }|d| 7 }ntd|f qH| ||||E d H  n
d| V  | 	||d |||d |E d H  d S )N)gGz?g      ?)NNr   r   rQ   ^rR   r}   rS   r~   rT   rt   r     r(   )r   r|   r9   r!   r    rg   rf   re   r   _fancy_helperr   rY   ro   _qformat)r   r   r;   r<   r   r=   r>   Z
best_ratiorq   r   ZeqiZeqjr?   rV   r3   rU   Zbest_iZbest_jZaeltZbeltatagsbtagsrX   Zai1Zai2Zbj1Zbj2rH   rI   r   r   r   r   }  s\    











zDiffer._fancy_replacec                 c   sb   g }||k r<||k r*|  ||||||}qT| d|||}n||k rT| d|||}|E d H  d S )Nr}   r~   )r   r   )r   r   r;   r<   r   r=   r>   r   r   r   r   r     s    zDiffer._fancy_helperc                 c   sX   t || }t || }d| V  |r8d| dV  d| V  |rTd| dV  d S )N- z? 
+ )ry   rstrip)r   ZalineZbliner   r   r   r   r   r     s    

zDiffer._qformat)NN)
rh   ri   rj   r   r   r   r   r   r   r   r   r   r   r   r     s   V
)^r   Nz\s*(?:#\s*)?$c                 C   s   || d uS r   r   )linepatr   r   r   r     s    r    	c                 C   s   | |v S r   r   )Zchwsr   r   r   r   %  s    r   c                 C   s:   | d }||  }|dkr"d |S |s.|d8 }d ||S Nr(   z{}z{},{}formatstartstopZ	beginningr   r   r   r   _format_range_unified<  s    
r   r   r   c                 c   sP  t | |||||| d}td | ||D ]}	|s|d}|rFd|nd}
|rXd|nd}d||
|V  d|||V  |	d |	d  }}t|d	 |d
 }t|d |d }d|||V  |	D ]\}}}}}|dkr| || D ]}d| V  qq|dv r"| || D ]}d| V  q|dv r||| D ]}d| V  q6qq*d S )NFT	{}r   
--- {}{}{}z
+++ {}{}{}r   r[   r(      rZ      z@@ -{} +{} @@{}rT   rt   >   rQ   rR   r}   >   rQ   rS   r~   )_check_typesr   r`   r   r   )r   r   fromfiletofilefromfiledate
tofiledater6   linetermstartedr_   fromdatetodater   lastfile1_rangefile2_rangerX   rL   rN   rM   rO   r   r   r   r   r	   G  s0    )
r	   c                 C   sB   | d }||  }|s|d8 }|dkr.d |S d ||| d S r   r   r   r   r   r   _format_range_context  s    
r   c                 c   s  t | |||||| tddddd}d}	td | ||D ]R}
|	sd}	|rVd|nd	}|rhd|nd	}d
|||V  d|||V  |
d |
d  }}d| V  t|d |d }d||V  tdd |
D r|
D ]8\}}}}}|dkr| || D ]}|| | V  qqt|d |d }d||V  tdd |
D r:|
D ]<\}}}}}|dkrP||| D ]}|| | V  qtqPq:d S )Nr   r   z! r   )rS   rR   rQ   rT   FTr   r   z
*** {}{}{}r   r   r[   z***************r(   r   z*** {} ****{}c                 s   s    | ]\}}}}}|d v V  qdS )>   rQ   rR   Nr   ra   rX   _r   r   r   rb     rc   zcontext_diff.<locals>.<genexpr>rS   rZ   r   z--- {} ----{}c                 s   s    | ]\}}}}}|d v V  qdS )>   rQ   rS   Nr   r   r   r   r   rb     rc   rR   )r   dictr   r`   r   r   any)r   r   r   r   r   r   r6   r   prefixr   r_   r   r   r   r   r   rX   rL   rN   r   r   r   rM   rO   r   r   r   r     s4    ,

r   c                 G   s   | r0t | d ts0tdt| d j| d f |r`t |d ts`tdt|d j|d f |D ]}t |tsdtd|f qdd S )Nr   z)lines to compare must be str, not %s (%r)z"all arguments must be str, not: %r)
isinstancestr	TypeErrortyperh   )r   r   argsargr   r   r   r     s    
r   rc      
c	              	   c   s~   dd }	t t|	|}t t|	|}|	|}|	|}|	|}|	|}|	|}| ||||||||}
|
D ]}|ddV  qfd S )Nc              
   S   sT   z|  ddW S  tyN } z(dt| j| f }t||W Y d }~n
d }~0 0 d S )Nasciisurrogateescapez(all arguments must be bytes, not %s (%r))decodeAttributeErrorr   rh   r   )rs   errmsgr   r   r   r     s    zdiff_bytes.<locals>.decoder   r   )rE   rF   encode)Zdfuncr   r   r   r   r   r   r6   r   r   linesr   r   r   r   r
     s    r
   c                 C   s   t ||| |S r   )r   r   )r   r   r{   r|   r   r   r   r     s    #r   c                 #   s  dd l }|dt| |||ddgffdd	fdd  fdd}| }|d u rj|E d H  n|d	7 }d}dd g|  }	}
d
}|d
u rzt|\}}}W n ty   Y d S 0 |	| }|||f|
|< |	d	7 }	q|	|krdV  |}n|	}d}	|r |	| }|	d	7 }	|
| V  |d	8 }q|d	 }z@|rft|\}}}|rN|d	 }n|d	8 }|||fV  q*W qv ty~   Y d S 0 qvd S )Nr   z(\++|\-+|\^+)c                    s   ||  d7  < |d u r2|| |  ddd  fS |dkr|  d|  d }}g }|fdd} || t|D ]<\}\}	}
|d|	 d | ||	|
  d ||
d   }qt|dd  }n*|  ddd  }|sd	}d| | d }|| |fS )
Nr(   r   r   ?c                 S   s&   | | dd |  g | dS )Nr(   r   )r,   r_   span)Zmatch_objectsub_infor   r   r   record_sub_info  s    z3_mdiff.<locals>._make_line.<locals>.record_sub_info rt   )rC   subreversed)r   Z
format_keysideZ	num_linestextZmarkersr   r   keyZbeginend)	change_rer   r   
_make_linef  s     2z_mdiff.<locals>._make_linec                  3   sn  g } d\}}t | dk r*| td qddd | D }|drP|}n|dr| | dd	 | dd
dfV  qn|dr|d
8 } | dd	d dfV  qnl|drֈ | dd	d  }}|d
 d	 }}n>|dr | d d	 | dd
dfV  qn|dr0 | dd	 | d d
dfV  qn|dr\|d
8 } | dd	d dfV  qn|dr|d
7 }d  | dd
dfV  qn|drd  | dd
 }}|d
 d	 }}n^|dr|d
7 }d  | dd
dfV  qn2|dr | d d  d d	 | d d
dfV  q|d	k r0|d
7 }dV  q|d	krL|d
8 }dV  q0|dr\d S ||dfV  qd S )N)r   r   r   Xr   c                 S   s   g | ]}|d  qS )r   r   ra   r   r   r   r   rn     rc   z2_mdiff.<locals>._line_iterator.<locals>.<listcomp>z-?+?r   r   r(   Tz--++r}   )z--?+z--+r   z-+?z-?+z+--r~   )r   z+-rt   F)Nr   r   T)r   NT)r1   r,   nextrw   
startswith)r   Znum_blanks_pendingZnum_blanks_to_yieldrs   	from_lineto_line)r   diff_lines_iteratorr   r   _line_iterator  sd    



$



z_mdiff.<locals>._line_iteratorc                  3   s     } g g  }}t |dks(t |dkr~zt| \}}}W n tyN   Y d S 0 |d urf|||f |d ur|||f q|d\}}|d\}}|||p|fV  qd S rB   )r1   r   StopIterationr,   rC   )Zline_iterator	fromlinestolinesr   r   
found_diffZfromDiffZto_diff)r   r   r   _line_pair_iterator  s    
z#_mdiff.<locals>._line_pair_iteratorr(   F)NNN)recompiler   r   r   )r   r   contextr{   r|   r   r   Zline_pair_iteratorZlines_to_writeindexZcontextLinesr   r   r   r3   r   )r   r   r   r   r   _mdiff<  sR    "
8X!



r   an  
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html>

<head>
    <meta http-equiv="Content-Type"
          content="text/html; charset=%(charset)s" />
    <title></title>
    <style type="text/css">%(styles)s
    </style>
</head>

<body>
    %(table)s%(legend)s
</body>

</html>aH  
        table.diff {font-family:Courier; border:medium;}
        .diff_header {background-color:#e0e0e0}
        td.diff_header {text-align:right}
        .diff_next {background-color:#c0c0c0}
        .diff_add {background-color:#aaffaa}
        .diff_chg {background-color:#ffff77}
        .diff_sub {background-color:#ffaaaa}aZ  
    <table class="diff" id="difflib_chg_%(prefix)s_top"
           cellspacing="0" cellpadding="0" rules="groups" >
        <colgroup></colgroup> <colgroup></colgroup> <colgroup></colgroup>
        <colgroup></colgroup> <colgroup></colgroup> <colgroup></colgroup>
        %(header_row)s
        <tbody>
%(data_rows)s        </tbody>
    </table>a  
    <table class="diff" summary="Legends">
        <tr> <th colspan="2"> Legends </th> </tr>
        <tr> <td> <table border="" summary="Colors">
                      <tr><th> Colors </th> </tr>
                      <tr><td class="diff_add">&nbsp;Added&nbsp;</td></tr>
                      <tr><td class="diff_chg">Changed</td> </tr>
                      <tr><td class="diff_sub">Deleted</td> </tr>
                  </table></td>
             <td> <table border="" summary="Links">
                      <tr><th colspan="2"> Links </th> </tr>
                      <tr><td>(f)irst change</td> </tr>
                      <tr><td>(n)ext change</td> </tr>
                      <tr><td>(t)op</td> </tr>
                  </table></td> </tr>
    </table>c                   @   s   e Zd ZeZeZeZeZdZdddefddZ	dd	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dZdS )r   r      Nc                 C   s   || _ || _|| _|| _d S r   )_tabsize_wrapcolumn	_linejunk	_charjunk)r   tabsizeZ
wrapcolumnr{   r|   r   r   r   r     s    zHtmlDiff.__init__r   F   zutf-8)charsetc                C   s:   | j t| j| j| j||||||d|d |d|S )N)r   numlines)ZstylesZlegendtabler   xmlcharrefreplace)_file_templater   _styles_legend
make_tabler   r   )r   r   r   fromdesctodescr   r   r   r   r   r   	make_file  s    zHtmlDiff.make_filec                    s8   fdd  fdd|D } fdd|D }||fS )Nc                    s6   |  dd} |  j} |  dd} |  dddS )Nrt   r   	r   )rQ   
expandtabsr   r   )r   )r   r   r   expand_tabs  s    z2HtmlDiff._tab_newline_replace.<locals>.expand_tabsc                    s   g | ]} |qS r   r   r   r   r   r   rn     rc   z1HtmlDiff._tab_newline_replace.<locals>.<listcomp>c                    s   g | ]} |qS r   r   r   r   r   r   rn     rc   r   )r   r   r   r   )r   r   r   _tab_newline_replace  s    
	zHtmlDiff._tab_newline_replacec                 C   s  |s| ||f d S t|}| j}||ksB||dd  |krT| ||f d S d}d}d}||k r||k r|| dkr|d7 }|| }|d7 }q`|| dkr|d7 }d}q`|d7 }|d7 }q`|d | }	||d  }
|r|	d }	d| |
 }
| ||	f | |d|
 d S )Nr   rZ   r   r   r(   r   >)r,   r1   r   count_split_line)r   Z	data_listZline_numr   rW   r\   r3   r6   ZmarkZline1Zline2r   r   r   r     s8    


zHtmlDiff._split_linec                 c   s   |D ]\}}}|d u r$|||fV  q|| \}}\}}g g  }	}
|  |	|| |  |
|| |	sd|
r|	rt|	d}nd}|
r|
d}nd}|||fV  q\qd S )Nr   )r   rt   )r   rC   )r   diffsfromdatatodataflagZfromlineZfromtextZtolineZtotextfromlisttolistr   r   r   _line_wrapper  s     
zHtmlDiff._line_wrapperc              	   C   s   g g g   }}}|D ]t\}}}z8| | jd|g|R   | | jd|g|R   W n& ty|   | d  | d  Y n0 | | q|||fS r7   )r,   _format_liner   )r   r   r  r  flaglistr   r  r  r   r   r   _collect_lines.  s    
zHtmlDiff._collect_linesc                 C   sp   zd| }d| j | |f }W n ty4   d}Y n0 |dddddd	}|d
d }d|||f S )Nz%dz
 id="%s%s"r   &z&amp;r   z&gt;<z&lt;rt   &nbsp;z<<td class="diff_header"%s>%s</td><td nowrap="nowrap">%s</td>)_prefixr   rQ   r   )r   r   r  Zlinenumr   idr   r   r   r  C  s    
zHtmlDiff._format_linec                 C   s0   dt j }dt j }t  jd7  _||g| _d S )Nzfrom%d_zto%d_r(   )r   _default_prefixr  )r   Z
fromprefixtoprefixr   r   r   _make_prefixZ  s    

zHtmlDiff._make_prefixc                 C   s   | j d }dgt| }dgt| }d\}	}
d}t|D ]V\}}|r|
sd}
|}td|| g}d||	f ||< |	d7 }	d||	f ||< q:d}
q:|sdg}dg}dg}d}|rd	g}|}n
d
g }}|d sd| |d< d| ||< |||||fS )Nr(   r   )r   Fr   Tz id="difflib_chg_%s_%d"z"<a href="#difflib_chg_%s_%d">n</a>Fz2<td></td><td>&nbsp;No Differences Found&nbsp;</td>z(<td></td><td>&nbsp;Empty File&nbsp;</td>z!<a href="#difflib_chg_%s_0">f</a>z#<a href="#difflib_chg_%s_top">t</a>)r  r1   r*   r\   )r   r  r  r  r   r   r  next_id	next_hrefZnum_chgZ	in_changer   r3   r  r   r   r   _convert_flagse  s<    

zHtmlDiff._convert_flagsc              
   C   sR  |    | ||\}}|r"|}nd }t|||| j| jd}| jrL| |}| |\}	}
}| |	|
|||\}	}
}}}g }d}t	t
|D ]P}|| d u r|dkr|d q|||| || |	| || |
| f  q|s|rddd| dd| f }nd}| jtd||| jd	 d
 }|ddddddddddS )Nrz   zV            <tr><td class="diff_next"%s>%s</td>%s<td class="diff_next">%s</td>%s</tr>
r   z)        </tbody>        
        <tbody>
z <thead><tr>%s%s%s%s</tr></thead>z!<th class="diff_next"><br /></th>z+<th colspan="2" class="diff_header">%s</th>r   r(   )Z	data_rows
header_rowr   z +z<span class="diff_add">z -z<span class="diff_sub">z ^z<span class="diff_chg">r   z</span>r   r  )r  r   r   r   r   r   r  r  r  r9   r1   r,   _table_templater   rw   r  rQ   )r   r   r   r   r   r   r   Zcontext_linesr   r  r  r  r  r  rs   fmtr3   r  r   r   r   r   r     sZ    



zHtmlDiff.make_table)r   r   Fr   )r   r   Fr   )rh   ri   rj   r   r   r  r   r  r   r   r   r   r   r  r  r  r  r  r   r   r   r   r   r     s.   
  7/  r   c                 c   sl   zdddt | }W n  ty6   td| d Y n0 d|f}| D ]"}|d d |v rD|dd  V  qDd S )Nr   r   )r(   r   z)unknown delta choice (must be 1 or 2): %rr   r   )intKeyErrorro   )ZdeltawhichrX   prefixesr   r   r   r   r     s    r   c                  C   s   dd l } dd l}| |S rB   )doctestdifflibtestmod)r  r  r   r   r   _test  s    r  __main__)rZ   rm   )r   )r   r   r   r   rZ   r   )r   r   r   r   rZ   r   )rc   rc   rc   rc   rZ   r   )%__all__heapqr   rp   collectionsr   Z_namedtupletypesr   r   r   r   r   ry   r   r   r   matchr   r   r   r	   r   r   r   r
   r   r   r   r   r  r   objectr   r   r  rh   r   r   r   r   <module>   s`   
    r
1	  A
  
I  
L  
%
  	
  a 
