�
��g� � �, � d dl mZ d dlmZ d dlmZmZmZmZm Z m
Z
mZmZ d dl
mZ d dlmZmZmZmZmZmZmZ d dlmZmZ d dlmZ d dlmZ d d lmZm Z m!Z! d d
l"m#Z# d dl$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- d dl$m.Z. d d
l/m0Z0 d dl1m2Z2 d dl3m4Z4m5Z5m6Z6m7Z7 d dl8m9Z9 d dl:m;Z; d dl<m=Z= d dl>m?Z? d dl@mAZA d dlBmCZC d dlDmEZE d dlFmGZG g dddfd�ZHe2e0fZId� ZJd0d�ZKd� ZLdd�d �ZMd!� ZNd"aOd#� ZPd$� ZQd%� ZRd&� ZSd'� ZTd(� ZUd0d)�ZVed0d*�� � ZWdd+�d,�ZXd-� ZYd.� ZZd1d/�Z[d"S )2� )�defaultdict)�reduce)�sympify�Basic�S�Expr�factor_terms�Mul�Add� bottom_up)�cacheit)� count_ops�_mexpand�
FunctionClass�expand�
expand_mul�_coeff_isneg�
Derivative)�I�Integer)�igcd)�_nodes)�Dummy�symbols�Wild)�
SYMPY_INTS) �sin�cos�exp�cosh�tanh�sinh�tan�cot�coth)�atan2)�HyperbolicFunction)�TrigonometricFunction)�Poly�factor�cancel�parallel_poly_from_expr)�ZZ)�PolificationFailed)�groebner)�cse)�identity)�greedy)�iterable)�debugF�grlexc
� ������������ d� �d� ����fd�}t d� � �| � t j �� � } �t j fg}t | � � � � � \ }� t
|�g� � \ \ }} }
n# t $ r | cY S w xY wt d|
j � � ||
j |� � \ }��t d|� � t d�dt �� � � � t d �dt �� � � � �s| S t |��t �
� � �t dt �� � dt �� � � � dd
lm� ��r� | j t# �� � � | j � � � �r� t'