
    E#iې                         S SK rS SKJrJrJr  S SKrS SKJrJ	r	J
r
JrJrJrJrJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJr   " S	 S
\R2                  R4                  5      rg)    N)
ArrayCacheArrayCacheBySymbolByIdArrayCacheByTimestamp)AnyIntOrder	OrderBookStrStringsTickersTrade)Client)List)ExchangeError)NotSupported)Precisec                   `  ^  \ rS rSrS\4U 4S jjrSS0 4S\S\S\S\\	   4S jjr
SS0 4S	\\   S\S\S\\	   4S
 jjrS*S\	4S jjrS\4S jrS\4S jrS\S\4S jrSSS0 4S\S\S\S\S\\   4
S jjrS\4S jrS0 4S\S\S\4S jjrS\4S jrS0 4S	\\   S\S\4S jjrS0 4S	\S\4S jjrS\S\S\4S jrS0 4S\S	\\   4S jjrS\S\S\4S jrS\4S jrSSS0 4S\S\S\S\\    4S jjr!S\4S  jr"S\4S! jr#S\4S" jr$S*S# jr%S$ r&S% r'S\4S& jr(S\4S' jr)0 4S( jr*S)r+U =r,$ )+gemini   returnc                 x   > U R                  [        [        U ]  5       SSSSSSSSSSSSS.SSS0SS0S.S	.5      $ )
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/home/james-whalen/.local/lib/python3.13/site-packages/ccxt/pro/gemini.pyr+   gemini.describe   su    fd < > %$ %!%#)-!&#"&,0" ) 0 8	!A
  	    Nsymbolsincelimitc                   #    U R                  5       I Sh  vN   U R                  U5      nSUS   -   nUS   nSSUR                  5       /S./S.nS	US   -   n	U R                  S
   S   S-   n
U R	                  XX5      I Sh  vN nU R
                  (       a  UR                  US   U5      nU R                  XUSS5      $  N N@7f)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:r1   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,   r1   r2   r3   paramsrC   messageHashmarketIdrequestsubscribeHashurltradess               r.   watch_trades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r;   c                    #    U R                  SX5      I Sh  vN nU R                  (       a5  U R                  US5      nU R                  US5      nUR	                  Xs5      nU R                  XRUSS5      $  N^7f)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>`
rO   Nr   r1   rA   T)#helper_for_watch_multiple_constructrF   	safe_listsafe_stringrG   rH   )r,   r;   r2   r3   rI   rO   firsttradeSymbols           r.   watch_trades_for_symbolsgemini.watch_trades_for_symbolsP   sp      ??'ZZ??NN61-E**5(;KOOK7E))&TRR [s   A9A7AA9c                    U R                  US5      nU R                  USS5      nU R                  US5      nU R                  USS5      nU R                  US5      nUc#  U R                  US5      nUS	:X  a  S
nOUS:X  a  SnU R                  US5      n	U R	                  X5      n
U R                  US UUU R                  U5      U
S US US US S.U5      $ )NrA   event_idtidpricequantityamountside	makerSidebidsellaskbuyr1   )r6   orderinforA   datetimer1   r=   r`   takerOrMakerr]   costr_   fee)safe_integersafe_string_2rU   safe_string_lowersafe_symbol
safe_tradeiso8601)r,   traderC   rA   r6   priceStringamountStringr`   
marketSiderK   r1   s              r.   parse_ws_tradegemini.parse_ws_tradec   s    2 %%e[9	z59&&ug6))%XF%%eV4<//{CJU"u$))%:!!(3"Y/  " 
  	r0   clientc                 (   U R                  U5      nUS   nU R                  U R                  SS5      nU R                  U R                  U5      nUc  [        U5      nX`R                  U'   UR                  U5        SU-   nUR                  Xg5        g )Nr1   tradesLimit  r5   )rv   rl   options
safe_valuerO   r   appendresolve)r,   rx   messagerr   r1   rz   storedrJ   s           r.   handle_tradegemini.handle_trade   s     ##G,x''mTJf5>,F"(KKe&(v+r0   c                    U R                  US5      nU R                  U5      nU R                  US5      nUb  US   nU R                  U R                  SS5      nU R                  U R
                  U5      nUc  [        U5      nXR
                  U'   [        S[        U5      5       H(  n	U R                  XY   U5      n
UR                  U
5        M*     SU-   nUR                  X5        g g )Nr1   rO   rz   r{   r   r5   )rn   safe_marketr}   rl   r|   rO   r   rangelenrv   r~   r   )r,   rx   r   rK   rC   rO   r1   rz   r   irr   rJ   s               r.   handle_tradesgemini.handle_trades   s    L ))'8<!!(+(3H%F++DLL-NK__T[[&9F~#K0&,F#1c&k*++FIv>e$ + $f,KNN6/ r0   rA   c                 r   UGb3  U R                  U R                  SS5      n0 n[        S[        U5      5       H  nX&   S   nU R	                  UR                  5       5      nUS   n	U R                  X&   U5      n
X:S'   U R                  U5      U
S'   U R                  U R                  U	5      nUc  [        U5      nXR                  U	'   UR                  U
5        XU	'   M     [        UR                  5       5      n[        S[        U5      5       H!  nX   n	XY   nSU	-   nUR                  X5        M#     g g )Nrz   r{   r   r1   rA   rh   r5   )rl   r|   r   r   r   lowerrv   rq   r}   rO   r   r~   listkeysr   )r,   rx   rO   rA   rz   storesForSymbolsr   rK   rC   r1   rr   r   r;   rJ   s                 r.   handle_trades_for_multidata"gemini.handle_trades_for_multidata   s/   ++DLL-NK%'1c&k*!9X.))(..*:;)++FIv>%.k"$(LL$;j!f=>'4F*0KK'e$+1( + +0023G1c'l+ )1'&0v3	 ,# r0   1m	timeframec                   #    U R                  5       I Sh  vN   U R                  U5      nU R                  U R                  X"5      nSSU-   US   R	                  5       /S./S.nSUS   -   S	-   U-   n	U R
                  S
   S   S-   n
U R                  XX5      I Sh  vN nU R                  (       a  UR                  X5      nU R                  XUSS5      $  N N<7f)aL  
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
Nr7   candles_r6   r9   r<   ohlcv:r1   :r$   r   r@   r   T)
rB   rC   rU   
timeframesrD   r(   rE   rF   rG   rH   )r,   r1   r   r2   r3   rI   rC   timeframeIdrL   rJ   rN   ohlcvs               r.   watch_ohlcvgemini.watch_ohlcv   s      !!!V$&&t	M '4t**, 

 !11C7+Eiit$'77jj7HH??NN61E))%q$GG' 	"  Is"   CCBCC;CCc                    U R                  USS5      nUSS  nUR                  S5      nUSU nU R                  USS5      R                  5       nU R                  U5      nU R	                  Xg5      nU R                  US/ 5      n	U R                  U5      n
U R                  U R                  U5      nUc  0 U R                  U'   U R                  U R                  U   U
5      nUc9  U R                  U R                  SS	5      n[        U5      nXR                  U   U
'   [        U	5      n[        SU5       H0  nX-
  S
-
  nU R                  U	U   U5      nUR                  U5        M2     SU-   S-   U-   nUR                  UU5        U$ )Nr=       _r   r1   changes
OHLCVLimitr{      r   r   )rU   findr   r   ro   r}   find_timeframeohlcvsrl   r|   r   r   r   parse_ohlcvr~   r   )r,   rx   r   r=   r   timeframeEndIndexrK   rC   r1   r   r   ohlcvsBySymbolr   r3   changesLengthr   indexparsedrJ   s                      r.   handle_ohlcvgemini.handle_ohlcv   s   4 412h',,S1!!$56##GXr:@@B!!(+!!(3//'9b9''4	f=!"$DKKV!4i@>%%dllL$GE*51F-3KK	*Gq-(A!%)E%%genf=FMM&! ) '#-;v{+r0   c                 <  #    U R                  5       I Sh  vN   U R                  U5      nSUS   -   nUS   nSSUR                  5       /S./S.nS	US   -   nU R                  S
   S   S-   n	U R	                  XXx5      I Sh  vN n
U
R                  5       $  N N7f)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:r1   r6   r7   r8   r9   r<   r?   r$   r   r@   )rB   rC   rD   r(   rE   r3   )r,   r1   r3   rI   rC   rJ   rK   rL   rM   rN   	orderbooks              r.   watch_order_bookgemini.watch_order_bookU  s      !!!V$"VH%55$< ! ( 

 x 00iit$'77**SwNN	  % 	"" Os"   BBA,BBBBc                    U R                  US/ 5      nU R                  US5      nU R                  U5      nUS   nSU-   nX`R                  ;  a  U R	                  5       U R                  U'   U R                  U   n[        S[        U5      5       HQ  n	X9   n
U R                  U
S5      nU R                  U
S5      nU
S   S:X  a  SOS	nX   nUR                  X5        XU'   MS     XhS'   XR                  U'   UR                  X5        g )
Nr   r1   r   r   r      re   bidsasks)
r}   rn   r   
orderbooks
order_bookr   r   safe_numberstorer   )r,   rx   r   r   rK   rC   r1   rJ   r   r   deltar]   sizer`   booksides                  r.   handle_order_bookgemini.handle_order_bookt  s   //'9b9))'8<!!(+!"V+//)&*oo&7DOOF#OOF+	q#g,'AJE$$UA.E##E1-D#Ah%/6fD HNN5'&dO ( %("+y.r0   c                 b   #    U R                  SX5      I Sh  vN nUR                  5       $  N7f)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)rS   r3   )r,   r;   r3   rI   r   s        r.   watch_order_book_for_symbols#gemini.watch_order_book_for_symbols  s0      BB;PW``	   as   /-/c                 B   #    U R                  SX5      I Sh  vN $  N7f)aJ  
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)rS   )r,   r;   rI   s      r.   watch_bids_asksgemini.watch_bids_asks  s       ==j'ZZZZs   noncec                    US   S   nU R                  UR                  5       5      nUS   nXpR                  ;  a/  U R                  0 5      U R                  U'   XpR                  U   S'   U R                  U   nSU-   n	[	        S[        U5      5       H  n
X*   nU R                  US5      nU R                  US5      nU R                  US5      n[        R                  " US5      (       a  M[  U R                  U5      nUS:X  a
  XS'   XS	'   M|  XS
'   XS'   M     X8S'   U R                  U5      US'   X(S'   0 nUUU'   XR                  U'   UR                  UU	5        g )Nr   r1   z	bidsasks:r`   r]   	remaining0rb   	bidVolumerd   	askVolumerA   rh   rg   )r   r   r   parse_tickerr   r   rU   r   r   	string_eqparse_numberrq   r   )r,   rx   rawBidAskChangesrA   r   rK   rC   r1   currentBidAskrJ   r   entryrawSider]   
sizeStringr   bidsAsksDicts                    r.   handle_bids_asks_for_multidata%gemini.handle_bids_asks_for_multidata  sq   8 $A&x0!!(.."23!--'$($5$5b$9DMM&!.4MM&!(+f-!F*q#./0A$'E&&uf5G$$UG4E))%=J  S11$$Z0D%',e$-1k*',e$-1k* 1 &/k"$(LL$;j! 0f,V -f|[1r0   itemHashNamec                   #    U R                  5       I S h  vN   Uc  [        U R                  S-   5      eU R                  US SSS5      nU R	                  US   5      nUS   (       d"  US   (       d  [        U R                  S-   5      e/ n/ n[        S[        U5      5       HE  nX'   nUS-   U-   n	UR                  U	5        U R	                  U5      n
UR                  U
S	   5        MG     S
R                  U5      nU R                  S   S   S-   U-   S-   nUS:X  a  US-  nOUS:X  a  US-  nOUS:X  a  US-  nU R                  XS 5      I S h  vN $  GN@ N7f)Nz+ watchMultiple requires at least one symbolFTr   spotlinearz8 watchMultiple supports only spot or linear-swap symbolsr   r6   ,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=truerO   z#trades=true&bids=false&offers=false)rB   r   r6   market_symbolsrC   r   r   r~   joinr(   watch_multiple)r,   r   r;   rI   firstMarketmessageHashes	marketIdsr   r1   rJ   rC   queryStrrN   s                r.   rS   *gemini.helper_for_watch_multiple_construct  sp    !!!?tww)VVWW%%gtUD$Gkk'!*-6";x+@tww)ccdd	q#g,'AZF&,v5K  -[[(FVD\* ( 88I&iit$'EEPSee;&77CZ'HHCX%88C((TBBB/ 	". Cs"   EED:EEEEc                    US   S   nU R                  UR                  5       5      nUS   nSU-   nXpR                  ;  a  U R                  5       n	XR                  U'   U R                  U   n
U
S   nU
S   n[	        S[        U5      5       Hi  nX-   nU R                  US5      nU R                  US5      nU R                  US5      nUS	:X  a  UR                  UU5        MW  UR                  UU5        Mk     XS'   XS'   XzS'   XJS
'   X:S'   U R                  U5      U
S'   XR                  U'   UR                  X5        g )Nr   r1   r   r   r   r]   r   r`   rb   r   rA   rh   )r   r   r   r   r   r   r   rU   r   rq   r   )r,   rx   rawOrderBookChangesrA   r   rK   rC   r1   rJ   obr   r   r   r   r   r]   r   r   s                     r.   handle_order_book_for_multidata&gemini.handle_order_book_for_multidata  sP     'q)(3!!(.."23!"V+//)"B&(OOF#OOF+	  q#123A'*E$$UG4E##E;7D&&uf5G%

5$'

5$' 4 !& &$("'!*+ $Y 7	*"+y.r0   c                 H    U R                  X5        U R                  X5        g N)r   r   r,   rx   r   s      r.   handle_l2_updatesgemini.handle_l2_updates%  s!    L 	v/6+r0   c                   #    U R                   S   S   S-   nU R                  5       I Sh  vN   SU0nU R                  U5      I Sh  vN   Ub  U R                  U5      nUS   nSnU R	                  XXSU5      I Sh  vN n	U R
                  (       a  U	R                  X5      nU R                  XX#S5      $  N Nq N=7f)	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=bookedNrN   r1   ordersT)r(   rB   authenticaterC   rE   rF   rG   filter_by_symbol_since_limit)
r,   r1   r2   r3   rI   rN   
authParamsrC   rJ   r   s
             r.   watch_ordersgemini.watch_ordersN  s      iit$  (J  J!!!3

 
+++[[(FH%Fzz#D+FF??OOF2E00tTT 	" 	,
 Gs3   )B>B8B>B:	5B>>B<?:B>:B><B>c                 0    U R                  5       Ul        U$ r   )millisecondslastPongr   s      r.   handle_heartbeatgemini.handle_heartbeati  s     ++-r0   c                     U$ r    r   s      r.   handle_subscriptiongemini.handle_subscriptionv  s	     r0   c                 L   SnU R                   c-  U R                  U R                  SS5      n[        U5      U l         U R                   n[	        S[        U5      5       H'  nU R                  X&   5      nUR                  U5        M)     UR                  U R                   U5        g )Nr   ordersLimitr{   r   )	r   rl   r|   r   r   r   parse_ws_orderr~   r   )r,   rx   r   rJ   r3   r   r   rf   s           r.   handle_ordergemini.handle_order  s    0 ;;%%dllM4HE07DKq#g,'A''
3EMM%  ( 	t{{K0r0   c                    U R                  US5      nU R                  US5      nU R                  US5      nU R                  US5      nU R                  US5      nSnSn	US:X  a  S	nOUS
:X  a  SnO
US:X  a  SnSn	U R                  0 SU R                  US5      _SU R                  US5      _SU_SU_SU R                  U5      _SS _SU R	                  U5      _SU R                  XR5      _SU R                  U5      _SU_SU	_SU R                  US5      _SU R                  US5      _SS _SU R                  US5      _SS _S U R                  US!5      _U R                  US"5      U R                  US#5      S S S$.EU5      $ )%Ntimestampmsr=   r1   
order_typebehaviorGTCFzimmediate-or-cancelIOCzfill-or-killFOKzmaker-or-cancelPOTr6   order_idclientOrderIdclient_order_idrg   rA   rh   lastTradeTimestampstatustimeInForcepostOnlyr`   r]   	stopPriceaverageavg_execution_pricerj   r_   original_amountexecuted_amountremaining_amount)filledr   rk   rO   )rl   rU   
safe_orderrq   parse_ws_order_statusro   parse_ws_order_typer   )
r,   rf   rC   rA   r  rK   typeIdr  r  r  s
             r.   r  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+ 
, - 	r0   c                 8    SSSSSSS.nU R                  X!U5      $ )Nopenclosedcanceledrejected)acceptedbookedfill	cancelledcancel_rejectedr$  rU   )r,   r  statusess      r.   r  gemini.parse_ws_order_status  s0    #)"
 &99r0   c                 2    SSSS.nU R                  X!U5      $ )Nr3   rC   )zexchange limitz
market buyzmarket sellr*  )r,   r=   typess      r.   r  gemini.parse_ws_order_type  s'    %"#

 T22r0   c                 6    [        U R                  U5      5      er   )r   jsonr   s      r.   handle_errorgemini.handle_error  s     DIIg.//r0   c                    [        U[        5      nU(       a  U R                  X5        g U R                  US5      nUS:X  a  U R	                  X5        U R
                  U R                  U R                  U R                  S.nU R                  USS5      nUR                  S5      S:  a  U R                  X5        g U R                  XV5      nUb  U" X5        US:X  Ga  U R                  US	U R                  5       5      nU R                  US
5      n	U R                  US5      n
/ n/ n/ n[        U
5      n[!        S[        U
5      5       H  nX   nU R                  US5      nUS:H  =(       a#    SU;   =(       a    U R#                  US   SS/5      nU R                  US5      nUS:H  =(       d    U=(       a    US:H  =(       a    US:H  nU(       a  UR%                  U5        M  U(       a  UR%                  U5        M  US:X  d  M  UR%                  X   5        M     [        U5      nUS:  a  U R'                  XX5        [        U5      nUS:  a  U R)                  XX5        [        U5      nUS:  a  U R+                  XU5        g g g )Nreasonerror)
l2_updatesrr   subscription_ack	heartbeatr=   r   candlesr   updater  eventIdeventschanger`   rd   rb   ztop-of-bookinitialr   rr   )
isinstancer   r  rU   r2  r   r   r   r   r   r   r}   rl   r   rT   r   r   in_arrayr~   r   r   r   )r,   rx   r   isArrayr5  methodsr=   methodtsr<  r=  orderBookItemsbidaskItemscollectedEventsOfTradeseventsLengthr   event	eventTypeisOrderBookeventReasonisBidAsklengthBalengthOblengthTradess                           r.   handle_messagegemini.handle_message  sr   H Wd+f.!!'84Wf.00&& $ 8 8..	
 499Y1$f./6#8""7M4;L;L;NOB'';G^^GX6FNK&(#v;L1c&k*	 ,,UF;	(H4|6U?|PTP]P]^cdj^knsuzm{P|"..uh?'=8k>~{^gOg>~my}~m~&&u- "))%0')+2269= + ;'H!|33FU>*H!|44VRY67La00RTU  7 r0   c                   #    U R                  US5      nU R                  b  X R                  ;   a  g U R                  5         [        U R                  S   S   5      nUR                  S5      n[        U5      nUS:  a  UOUnX#U nUU R                  5       S.nU R                  U R                  U5      5      n	U R                  U R                  U	5      U R                  U R                  5      [        R                  S5      n
SSS	0 000nU R                  U5        U R                  S   S   S	   nU R                   U	U
S
.nXR                  S   S   S	'   U R#                  U5        XR                  S   S   S	'   g 7f)NrN   r$   r   ?r   )rL   r   hexr|   headers)zX-GEMINI-APIKEYzX-GEMINI-PAYLOADzX-GEMINI-SIGNATURE)rU   clientscheck_required_credentialsr   r(   r   r   string_to_base64r1  hmacencodesecrethashlibsha384extend_exchange_optionsr|   apiKeyrx   )r,   rI   rN   
startIndexurlParamsIndex	urlLengthendIndexrL   payloadb64	signaturedefaultOptionsoriginalHeadersrW  s                 r.   r   gemini.authenticateT  sn    vu-LL$3,,+>'')5)$/0
#H	&4&9>	*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   r   )-__name__
__module____qualname____firstlineno__r   r+   strr   r   r   rP   rX   rv   r   r   r   r   r   r   r   r	   r   r   r   r   r   r   r   rS   r   r   r
   r   r   r   r   r  r  r  r  r2  rR  r   __static_attributes____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 ?CQUdhqs  H  H  H3  H^a  Hx|  ~B  yC  HD36 3j @DB !S ! !S\ !>/ /, SW_a !$s) !C !fo ! 8<B 
[W 
[7 
[92V 92Z] 92fi 92v aemo Cc CTXY\T] C4*/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 !Cr0   r   )ccxt.async_supportccxt ccxt.async_support.base.ws.cacher   r   r   r^  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   r0   r.   <module>r|     sG     f f  T T T 4  * ) %dCT&& dCr0   