
    ":h                         d dl Zd dlmZmZmZ d dlZd dlmZm	Z	m
Z
mZmZmZmZmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ  G d	 d
ej2                  j4                        Zy)    N)
ArrayCacheArrayCacheBySymbolByIdArrayCacheByTimestamp)AnyIntOrder	OrderBookStrStringsTickersTrade)Client)List)ExchangeError)NotSupported)Precisec            
           e Zd Zdef fdZddi fdedededee   fdZ	ddi fdee   dededee   fd	Z
d'defd
ZdefdZdefdZdedefdZdddi fdedededee   fdZdefdZdi fdededefdZdefdZdi fdee   dedefdZdi fdedefdZdededefdZi fdedee   fdZdededefdZdefdZdddi fdedededee   fdZ defdZ!defdZ"defd Z#d'd!Z$d" Z%d# Z&defd$Z'defd%Z(i fd&Z) xZ*S )(geminireturnc                 x    | j                  t        t        |          ddddddddddddddddiddidd	      S )
NTF)wswatchBalancewatchTickerwatchTickerswatchBidsAskswatchTradeswatchTradesForSymbolswatchMyTradeswatchOrderswatchOrderBookwatchOrderBookForSymbols
watchOHLCVzapi.gemini.comr   zwss://api.gemini.comzwss://api.sandbox.gemini.com)apitest)hashostnameurls)deep_extendsuperr   describe)self	__class__s    I/var/www/html/turnos/venv/lib/python3.12/site-packages/ccxt/pro/gemini.pyr*   zgemini.describe   su    fd < > %$ %!%#)-!&#"&,0" ) 0 8	!A
  	    Nsymbolsincelimitc                   K   | j                          d{    | j                  |      }d|d   z   }|d   }dd|j                         gdgd}d	|d   z   }	| j                  d
   d   dz   }
| j	                  |
|||	       d{   }| j
                  r|j                  |d   |      }| j                  |||dd      S 7 7 <w)a%  
        watch the list of most recent trades for a particular symbol

        https://docs.gemini.com/websocket-api/#market-data-version-2

        :param str symbol: unified symbol of the market to fetch trades for
        :param int [since]: timestamp in ms of the earliest trade to fetch
        :param int [limit]: the maximum amount of trades to fetch
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
        Ntrades:r/   id	subscribel2namesymbolstypesubscriptionsl2:r#   r   /v2/marketdata	timestampT)load_marketsmarketupperr'   watch
newUpdatesgetLimitfilter_by_since_limit)r+   r/   r0   r1   paramsrA   messageHashmarketIdrequestsubscribeHashurltradess               r-   watch_tradeszgemini.watch_trades.   s      !!!V$&"22$< ! ( 

 x 00iit$'77zz#{G]KK??OOF8$4e<E))&%TRR) 	"" Ls"   CC A.CC;CCr9   c                    K   | j                  d||       d{   }| j                  r6| j                  |d      }| j                  |d      }|j	                  ||      }| j                  |||dd      S 7 [w)a   

        https://docs.gemini.com/websocket-api/#multi-market-data

        get the list of most recent trades for a list of symbols
        :param str[] symbols: unified symbol of the market to fetch trades for
        :param int [since]: timestamp in ms of the earliest trade to fetch
        :param int [limit]: the maximum amount of trades to fetch
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
        rM   Nr   r/   r?   T)#helper_for_watch_multiple_constructrD   	safe_listsafe_stringrE   rF   )r+   r9   r0   r1   rG   rM   firsttradeSymbols           r-   watch_trades_for_symbolszgemini.watch_trades_for_symbolsP   sx      ??'SYZZ??NN61-E**5(;KOOK7E))&%TRR [s   A7A5AA7c                    | j                  |d      }| j                  |dd      }| j                  |d      }| j                  |dd      }| j                  |d      }|!| j                  |d      }|d	k(  rd
}n|dk(  rd}| j                  |d      }	| j	                  |	|      }
| j                  |d ||| j                  |      |
d |d |d |d d|      S )Nr?   event_idtidpricequantityamountside	makerSidebidsellaskbuyr/   )r4   orderinfor?   datetimer/   r;   r\   takerOrMakerrY   costr[   fee)safe_integersafe_string_2rR   safe_string_lowersafe_symbol
safe_tradeiso8601)r+   traderA   r?   r4   priceStringamountStringr\   
marketSiderI   r/   s              r-   parse_ws_tradezgemini.parse_ws_tradec   s   2 %%e[9	z59&&ug6))%XF%%eV4<//{CJU"u$))%:!!(F3"Y/  " 
  	r.   clientc                 *   | j                  |      }|d   }| j                  | j                  dd      }| j                  | j                  |      }|t        |      }|| j                  |<   |j                  |       d|z   }|j                  ||       y )Nr/   tradesLimit  r3   )rr   rh   options
safe_valuerM   r   appendresolve)r+   rs   messagern   r/   ru   storedrH   s           r-   handle_tradezgemini.handle_trade   s     ##G,x''mTJf5>,F"(DKKe&(v{+r.   c                    | j                  |d      }| j                  |      }| j                  |d      }||d   }| j                  | j                  dd      }| j                  | j
                  |      }|t        |      }|| j
                  |<   t        dt        |            D ](  }	| j                  ||	   |      }
|j                  |
       * d|z   }|j                  ||       y y )Nr/   rM   ru   rv   r   r3   )rj   safe_marketrx   rh   rw   rM   r   rangelenrr   ry   rz   )r+   rs   r{   rI   rA   rM   r/   ru   r|   irn   rH   s               r-   handle_tradeszgemini.handle_trades   s    L ))'8<!!(+(3H%F++DLL-NK__T[[&9F~#K0&,F#1c&k* %++F1Iv>e$% $f,KNN6;/ r.   r?   c                 v   |6| j                  | j                  dd      }i }t        dt        |            D ]  }||   d   }| j	                  |j                               }|d   }	| j                  ||   |      }
||
d<   | j                  |      |
d<   | j                  | j                  |	      }|t        |      }|| j                  |	<   |j                  |
       |||	<    t        |j                               }t        dt        |            D ]#  }||   }	||	   }d|	z   }|j                  ||       % y y )Nru   rv   r   r/   r?   rd   r3   )rh   rw   r   r   r   lowerrr   rm   rx   rM   r   ry   listkeysrz   )r+   rs   rM   r?   ru   storesForSymbolsr   rI   rA   r/   rn   r|   r9   rH   s                 r-   handle_trades_for_multidataz"gemini.handle_trades_for_multidata   sJ   ++DLL-NK%'1c&k* 2!!9X.))(..*:;)++F1Iv>%.k"$(LL$;j!f=>'4F*0DKK'e$+1 (2 +0023G1c'l+ 4 )&1'&0v{3	4# r.   1mc                   K   | j                          d{    | j                  |      }| j                  | j                  ||      }dd|z   |d   j	                         gdgd}d|d   z   d	z   |z   }	| j
                  d
   d   dz   }
| j                  |
|	||	       d{   }| j                  r|j                  ||      }| j                  |||dd      S 7 7 9w)a  
        watches historical candlestick data containing the open, high, low, and close price, and the volume of a market

        https://docs.gemini.com/websocket-api/#candles-data-feed

        :param str symbol: unified symbol of the market to fetch OHLCV data for
        :param str timeframe: the length of time each candle represents
        :param int [since]: timestamp in ms of the earliest candle to fetch
        :param int [limit]: the maximum amount of candles to fetch
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns int[][]: A list of candles ordered, open, high, low, close, volume
        Nr5   candles_r4   r7   r:   ohlcv:r/   :r#   r   r>   r   T)
r@   rA   rR   
timeframesrB   r'   rC   rD   rE   rF   )r+   r/   	timeframer0   r1   rG   rA   timeframeIdrJ   rH   rL   ohlcvs               r-   watch_ohlcvzgemini.watch_ohlcv   s      !!!V$&&t	9M '4t**, 

 !11C7+Eiit$'77jjk7KHH??NN651E))%q$GG' 	"  Is"   CCB
C!C"8CCc                    | j                  |dd      }|dd  }|j                  d      }|d| }| j                  |dd      j                         }| j                  |      }| j	                  ||      }| j                  |dg       }	| j                  |      }
| j                  | j                  |      }|i | j                  |<   | j                  | j                  |   |
      }|:| j                  | j                  dd	      }t        |      }|| j                  |   |
<   t        |	      }t        d|      D ]0  }||z
  d
z
  }| j                  |	|   |      }|j                  |       2 d|z   dz   |z   }|j                  ||       |S )Nr;       _r   r/   changes
OHLCVLimitrv      r   r   )rR   findr   r   rk   rx   find_timeframeohlcvsrh   rw   r   r   r   parse_ohlcvry   rz   )r+   rs   r{   r;   r   timeframeEndIndexrI   rA   r/   r   r   ohlcvsBySymbolr|   r1   changesLengthr   indexparsedrH   s                      r-   handle_ohlcvzgemini.handle_ohlcv   s   4 412h',,S1!!$56##GXr:@@B!!(+!!(F3//'9b9''4	f=!"$DKKV!4i@>%%dllL$GE*51F-3DKK	*Gq-( 	"A!A%)E%%genf=FMM&!	" '#-;v{+r.   c                 @  K   | j                          d{    | j                  |      }d|d   z   }|d   }dd|j                         gdgd}d	|d   z   }| j                  d
   d   dz   }	| j	                  |	|||       d{   }
|
j                         S 7 7 w)a:  
        watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data

        https://docs.gemini.com/websocket-api/#market-data-version-2

        :param str symbol: unified symbol of the market to fetch the order book for
        :param int [limit]: the maximum amount of order book entries to return
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
        N
orderbook:r/   r4   r5   r6   r7   r:   r=   r#   r   r>   )r@   rA   rB   r'   rC   r1   )r+   r/   r1   rG   rA   rH   rI   rJ   rK   rL   	orderbooks              r-   watch_order_bookzgemini.watch_order_bookU  s      !!!V$"VH%55$< ! ( 

 x 00iit$'77**S+wNN	  % 	"" Os"   BBA.BBBBc                    | j                  |dg       }| j                  |d      }| j                  |      }|d   }d|z   }|| j                  vr| j	                         | j                  |<   | j                  |   }t        dt        |            D ]S  }	||	   }
| j                  |
d      }| j                  |
d      }|
d   dk(  rdnd	}||   }|j                  ||       |||<   U ||d<   || j                  |<   |j                  ||       y )
Nr   r/   r   r   r      ra   bidsasks)
rx   rj   r   
orderbooks
order_bookr   r   safe_numberstorerz   )r+   rs   r{   r   rI   rA   r/   rH   r   r   deltarY   sizer\   booksides                  r-   handle_order_bookzgemini.handle_order_bookt  s   //'9b9))'8<!!(+!"V+$//)&*oo&7DOOF#OOF+	q#g,' 	'AAJE$$UA.E##E1-D#Ah%/6fD HNN5$'&IdO	' %	("+y+.r.   c                 d   K   | j                  d||       d{   }|j                         S 7 w)a  
        watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data

        https://docs.gemini.com/websocket-api/#multi-market-data

        :param str[] symbols: unified array of symbols
        :param int [limit]: the maximum amount of order book entries to return
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
        r   N)rP   r1   )r+   r9   r1   rG   r   s        r-   watch_order_book_for_symbolsz#gemini.watch_order_book_for_symbols  s4      BB;PWY_``	   as   0.0c                 D   K   | j                  d||       d{   S 7 w)az  
        watches best bid & ask for symbols

        https://docs.gemini.com/websocket-api/#multi-market-data

        :param str[] symbols: unified symbol of the market to fetch the ticker for
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
        bidsasksN)rP   )r+   r9   rG   s      r-   watch_bids_askszgemini.watch_bids_asks  s$      ==j'SYZZZZs     noncec                    |d   d   }| j                  |j                               }|d   }|| j                  vr0| j                  i       | j                  |<   || j                  |   d<   | j                  |   }d|z   }	t	        dt        |            D ]  }
||
   }| j                  |d      }| j                  |d      }| j                  |d      }t        j                  |d      rU| j                  |      }|dk(  r||d<   ||d	<   v||d
<   ||d<    ||d<   | j                  |      |d<   ||d<   || j                  |<   |j                  ||	       y )Nr   r/   z	bidsasks:r\   rY   	remaining0r^   	bidVolumer`   	askVolumer?   rd   rc   )r   r   r   parse_tickerr   r   rR   r   r   	string_eqparse_numberrm   rz   )r+   rs   rawBidAskChangesr?   r   rI   rA   r/   currentBidAskrH   r   entryrawSiderY   
sizeStringr   s                   r-   handle_bids_asks_for_multidataz%gemini.handle_bids_asks_for_multidata  sx   8 $A&x0!!(.."23!$--'$($5$5b$9DMM&!.4DMM&!(+f-!F*q#./0 	2A$Q'E&&uf5G$$UG4E))%=J  S1$$Z0D%',e$-1k*',e$-1k*	2 &/k"$(LL$;j! 0f -f}k2r.   itemHashNamec                 j  K   | j                          d {    | j                  |d ddd      }| j                  |d         }|d   s|d   st        | j                  dz         g }g }t        dt        |            D ]E  }||   }|dz   |z   }	|j                  |	       | j                  |      }
|j                  |
d          G d	j                  |      }| j                  d
   d   dz   |z   dz   }|dk(  r|dz  }n|dk(  r|dz  }n
|dk(  r|dz  }| j                  ||d        d {   S 7 7 w)NFTr   spotlinearz8 watchMultiple supports only spot or linear-swap symbolsr   r4   ,r#   r   z/v1/multimarketdata?symbols=z&heartbeat=true&r   z"trades=false&bids=true&offers=truer   z3trades=false&bids=true&offers=true&top_of_book=truerM   z#trades=true&bids=false&offers=false)r@   market_symbolsrA   r   r4   r   r   ry   joinr'   watch_multiple)r+   r   r9   rG   firstMarketmessageHashes	marketIdsr   r/   rH   rA   queryStrrL   s                r-   rP   z*gemini.helper_for_watch_multiple_construct  sa    !!!%%gtUD$Gkk'!*-6";x+@tww)ccdd	q#g,' 	+AQZF&,v5K  -[[(FVD\*	+ 88I&iit$'EEPSee;&77CZ'HHCX%88C((mTBBB+ 	"* Cs"   D3D.DD3)D1*D31D3c                    |d   d   }| j                  |j                               }|d   }d|z   }|| j                  vr| j                         }	|	| j                  |<   | j                  |   }
|
d   }|
d   }t	        dt        |            D ]g  }||   }| j                  |d      }| j                  |d      }| j                  |d      }|d	k(  r|j                  ||       V|j                  ||       i ||
d<   ||
d<   ||
d<   ||
d
<   ||
d<   | j                  |      |
d<   |
| j                  |<   |j                  |
|       y )Nr   r/   r   r   r   rY   r   r\   r^   r   r?   rd   )r   r   r   r   r   r   r   rR   r   rm   rz   )r+   rs   rawOrderBookChangesr?   r   rI   rA   r/   rH   obr   r   r   r   r   rY   r   r   s                     r-   handle_order_book_for_multidataz&gemini.handle_order_book_for_multidata  si     'q)(3!!(.."23!"V+$//)"B&(DOOF#OOF+	  q#123 	(A'*E$$UG4E##E;7D&&uf5G%

5$'

5$'	( !	& 	&$	("	'!*	+ $Y 7	*"+y+.r.   c                 L    | j                  ||       | j                  ||       y N)r   r   r+   rs   r{   s      r-   handle_l2_updateszgemini.handle_l2_updates!  s%    L 	vw/67+r.   c                 |  K   | j                   d   d   dz   }| j                          d{    d|i}| j                  |       d{    || j                  |      }|d   }d}| j	                  ||d|       d{   }	| j
                  r|	j                  ||      }| j                  |	|||d      S 7 7 o7 ;w)	a*  
        watches information on multiple orders made by the user

        https://docs.gemini.com/websocket-api/#order-events

        :param str symbol: unified market symbol of the market orders were made in
        :param int [since]: the earliest time in ms to fetch orders for
        :param int [limit]: the maximum number of order structures to retrieve
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
        r#   r   z/v1/order/events?eventTypeFilter=initial&eventTypeFilter=accepted&eventTypeFilter=rejected&eventTypeFilter=fill&eventTypeFilter=cancelled&eventTypeFilter=bookedNrL   r/   ordersT)r'   r@   authenticaterA   rC   rD   rE   filter_by_symbol_since_limit)
r+   r/   r0   r1   rG   rL   
authParamsrA   rH   r   s
             r-   watch_orderszgemini.watch_ordersJ  s      iit$  (J  J!!!3

 
+++[[(FH%Fzz#{D+FF??OOFE2E00tTT 	" 	,
 Gs3   )B<B6B<B8	5B<>B:?8B<8B<:B<c                 0    | j                         |_        |S r   )millisecondslastPongr   s      r-   handle_heartbeatzgemini.handle_heartbeate  s     ++-r.   c                     |S r    r   s      r-   handle_subscriptionzgemini.handle_subscriptionr  s	     r.   c                 H   d}| j                   -| j                  | j                  dd      }t        |      | _         | j                   }t	        dt        |            D ]'  }| j                  ||         }|j                  |       ) |j                  | j                   |       y )Nr   ordersLimitrv   r   )	r   rh   rw   r   r   r   parse_ws_orderry   rz   )r+   rs   r{   rH   r1   r   r   rb   s           r-   handle_orderzgemini.handle_order  s    0 ;;%%dllM4HE07DKq#g,' 	!A''
3EMM% 	! 	t{{K0r.   c                    | j                  |d      }| j                  |d      }| j                  |d      }| j                  |d      }| j                  |d      }d}d}	|dk(  rd	}n|d
k(  rd}n	|dk(  rd}d}	| j                  i d| j                  |d      d| j                  |d      d|d|d| j                  |      dd d| j	                  |      d| j                  ||      d| j                  |      d|d|	d| j                  |d      d| j                  |d      dd d| j                  |d      dd d | j                  |d!      | j                  |d"      | j                  |d#      d d d$|      S )%Ntimestampmsr;   r/   
order_typebehaviorGTCFzimmediate-or-cancelIOCzfill-or-killFOKzmaker-or-cancelPOTr4   order_idclientOrderIdclient_order_idrc   r?   rd   lastTradeTimestampstatustimeInForcepostOnlyr\   rY   	stopPriceaverageavg_execution_pricerf   r[   original_amountexecuted_amountremaining_amount)filledr   rg   rM   )rh   rR   
safe_orderrm   parse_ws_order_statusrk   parse_ws_order_typer   )
r+   rb   rA   r?   r   rI   typeIdr   r   r   s
             r-   r   zgemini.parse_ws_order  s%   , %%e];	!!%0##E84!!%6##E:6,,K'K**KH  
$""5*5 
T--e5FG 
 E 
 	 

 Y/ 
 !$ 
 d008 
 d&&x8 
 D,,V4 
 ; 
  
 D$$UF3 
 T%%eW5 
  
 t''/DE 
  D! 
" d&&u.?@# 
$ &&u.?@))%1CD+ 
, - 	r.   c                 :    ddddddd}| j                  |||      S )Nopenclosedcanceledrejected)acceptedbookedfill	cancelledcancel_rejectedr  rR   )r+   r   statusess      r-   r  zgemini.parse_ws_order_status  s2    #)"
 &&99r.   c                 4    dddd}| j                  |||      S )Nr1   rA   )zexchange limitz
market buyzmarket sellr  )r+   r;   typess      r-   r  zgemini.parse_ws_order_type  s)    %"#

 tT22r.   c                 6    t        | j                  |            r   )r   jsonr   s      r-   handle_errorzgemini.handle_error  s     DIIg.//r.   c                    t        |t              }|r| j                  ||       y | j                  |d      }|dk(  r| j	                  ||       | j
                  | j                  | j                  | j                  d}| j                  |dd      }|j                  d      dk\  r| j                  ||       y | j                  ||      }|	 |||       |dk(  r| j                  |d	| j                               }| j                  |d
      }	| j                  |d      }
g }g }g }t        |
      }t!        dt        |
            D ]  }|
|   }| j                  |d      }|dk(  xr d|v xr | j#                  |d   ddg      }| j                  |d      }|dk(  xs |xr |dk(  xr |dk(  }|r|j%                  |       {|r|j%                  |       |dk(  s|j%                  |
|           t        |      }|dkD  r| j'                  ||||	       t        |      }|dkD  r| j)                  ||||	       t        |      }|dkD  r| j+                  |||       y y y )Nreasonerror)
l2_updatesrn   subscription_ack	heartbeatr;   r   candlesr   updater   eventIdeventschanger\   r`   r^   ztop-of-bookinitialr   rn   )
isinstancer   r   rR   r  r   r}   r   r   r   r   rx   rh   r   rQ   r   r   in_arrayry   r   r   r   )r+   rs   r{   isArrayr  methodsr;   methodtsr!  r"  orderBookItemsbidaskItemscollectedEventsOfTradeseventsLengthr   event	eventTypeisOrderBookeventReasonisBidAsklengthBalengthOblengthTradess                           r-   handle_messagezgemini.handle_message  s   H Wd+fg.!!'84Wfg.00&& $ 8 8..	
 499Y1$fg.$/67#8""7M4;L;L;NOB'';G^^GX6FNK&(#v;L1c&k* >q	 ,,UF;	(H4|6U?|PTP]P]^cdj^knsuzm{P|"..uh?'=8k>~{^gOg>~my}~m~&&u- "))%0')+226!9=> ;'H!|33FKWU>*H!|44V^RQXY67La009PRTU  7 r.   c                   K   | j                  |d      }| j                  || j                  v ry | j                          t        | j                  d   d         }|j                  d      }t        |      }|dk\  r|n|}||| }|| j                         d}| j                  | j                  |            }	| j                  | j                  |	      | j                  | j                        t        j                  d      }
ddd	i iii}| j                  |       | j                  d   d   d	   }| j                   |	|
d
}|| j                  d   d   d	<   | j#                  |       || j                  d   d   d	<   y w)NrL   r#   r   ?r   )rJ   r   hexrw   headers)zX-GEMINI-APIKEYzX-GEMINI-PAYLOADzX-GEMINI-SIGNATURE)rR   clientscheck_required_credentialsr   r'   r   r   string_to_base64r  hmacencodesecrethashlibsha384extend_exchange_optionsrw   apiKeyrs   )r+   rG   rL   
startIndexurlParamsIndex	urlLengthendIndexrJ   payloadb64	signaturedefaultOptionsoriginalHeadersr;  s                 r-   r   zgemini.authenticateP  sw    vu-LL$3$,,+>'')5)$/0
#H	&4&9>	j*ZZ\
 ##DIIg$67IIdkk#.DKK0H'..Z_`	r 
 	$$^4,,t,Y7	B#{{ #"+

 4;T9%i0C3BT9%i0s   E:E<r   )+__name__
__module____qualname__r   r*   strr   r   r   rN   rU   rr   r   r}   r   r   r   r   r   r	   r   r   r   r   r   r   r   rP   r   r   r
   r   r   r   r   r   r   r  r  r  r7  r   __classcell__)r,   s   @r-   r   r      s   # 6 <@d[]  S  SS  S  Sbfglbm  SD OSaenp Sd3i S S[^ Suyz  vA S&4E 4l,6 ,.40F 40l4& 4S 40 8<$]ajl  H  HC  HWZ  Hquvzq{  HD36 3j @DB !S ! !S\ !>/ /, SW_a !$s) !C !fo ! 8<B 
[W 
[7 
[73V 73Z] 73fi 73r gi Cc CTXY\T] C0*/f */^a */jm */X', ',R 04$UYbd U UC Us Uimnsit U6v &  16  1D:x	:306 0UVV UVn )+ !Cr.   r   )ccxt.async_supportccxt ccxt.async_support.base.ws.cacher   r   r   rB  ccxt.base.typesr   r   r   r	   r
   r   r   r   !ccxt.async_support.base.ws.clientr   typingr   ccxt.base.errorsr   r   ccxt.base.preciser   async_supportr   r   r.   r-   <module>r]     sG     f f  T T T 4  * ) %`CT&& `Cr.   