�
I�g:� � � � d dl mZ ddlmZ ddlmZmZmZ ed-d�� � Zed.d�� � Z ed� � � Z
ed � � � Zg d
�Zd� Z
ed/d
�� � Zed� � � Zed� � � Zed� � � Zed� � � Zed� � � Zed� � � Zed0d�� � Zd� Zd� Zd� Zd� Zed� � � Zed0d�� � Zed0d�� � Zed� � � Zed� � � Zed1d �� � Zed2d!�� � Z d"� Z!d#� Z"ed gdfd$�� � Z#edgd fd%�� � Z$d&� Z%d'� Z&d(� Z'd)� Z(ed3d+�� � Z)ed,� � � Z*dS )4� )�print_function� )�xrange� )�defun�
defun_wrapped�defun_staticc �@ � ��� � � � �� � �� � �� � ��dk r� � d� � S t � d� � r� j }n i x}� _ �dk r+�dk r� j
S �|v r|� \ }}|� j k r|
S d� �� � �fd�}� j } �dk r&d� _ � � |d� j gd� � � � |d
z t �dz � � z � _ � � |d� j gd� � � }� � �� � �z d�z z � � �� � �dz z �dz z z
d|z �z � z z }|� _ n# |� _ w xY w�dk r!� �
�� � r� j |f|�<