
    Uj
\                         S r SSKrSSKrSSKrSSKJr  SSKJr  SSKJrJ	r	J
r
JrJrJrJrJrJrJr  SSK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r " S S5      rg)ub  
V11 — Bot Momentum Taker.

Ciclo por ventana de 5min o 15min:
  1. Descubrir mercado y obtener tokens + strike
  2. Conectar CLOB websocket para best_ask real de YES y NO
  3. Monitorear precio Binance cada segundo
  4. Cuando |price/strike - 1| > MOMENTUM_THRESHOLD → tomar posición al ask real
  5. Al final: esperar settle oficial, calcular PnL
    N)datetime)Path   )
ConfigCLOB_WSMOMENTUM_THRESHOLDENTRY_SIZE_USDTAKER_FEE_RATEOUTCOME_MAX_WAITLOSS_STREAK_MAXLOSS_STREAK_COOLDAILY_LOSS_LIMIT
write_json)BinanceFeedCLOBFeed)Market)Logger)Executor)MomentumStrategyc                       \ rS rSrS\4S jrS rS rS rS r	S\
S	\4S
 jrS\S-  4S jrSS jrS rS rS\S\S-  4S jrS rS rSrg)Bot    cfgc           	         Xl         [        R                  " 5       U l        U R                  R                  R                  SS05        SU l        [        U5      U l        [        U5      U l
        [        U5      U l        [        UR                  5      U l        S U l        S U l        S U l        SU l        SU l        SU l        SU l        SU l        SU l        SU l        SU l        SU l        SU l        / U l        SU l        SU l        SU l         [B        RD                  " 5       RG                  S5      U l$        SU l%        URL                  S-  U l'        URP                  (       a  S	OS
n[S        SU SURT                  RW                  5        SURX                   S35        [S        SURZ                  S SU R                   R\                   S[^        S 35        g )N
User-AgentMozilla/5.0F         r   %Y-%m-%ddd_resetLIVEPAPERz[*] V11 Momentum Taker z [z] minz    threshold: .4%
 | size: $z | fee: z.0%)0r   requestsSessionsessionheadersupdate_stopr   loggerr   strategyr   executorr   
binance_wsbinanceclob_yesclob_nomarket_entered_entry_side_entry_price_entry_size_entry_cost_entry_move_entry_token_bal_before_windows_count_trades_count_trade_history_loss_streak_cooldown_left
_daily_pnlr   utcnowstrftime_daily_date_dd_stoppedlog_dir_dd_reset_fileliveprintassetupperwindowmomentum_thresholdentry_size_usdr
   )selfr   live_tags      /var/www/html/v11b/bot.py__init__Bot.__init__!   s    ((*##\=$AB
s(- #CNN3 $ !!!! !      "&oo/88D#!kkJ6 XX67'zCIIOO4E3FbC! 	" 6 6s; <//08LN 	O    c                 t    SU l         SU l        SU l        SU l        SU l        SU l        SU l        SU l        g )NFr   r   )r4   r5   r6   r7   r8   r9   r:   r;   rO   s    rQ   _reset_window_stateBot._reset_window_stateQ   sA    !rT   c                    SSK nU R                  R                  nUR                  5       (       d  g [	        U5       nUR                  U5      nU H  nUR                  S5      UR                  :w  a  M$  UR                  S5      S;   d  M;  SU l        US   U l	        [        US   5      U l        [        US   5      U l        [        UR                  S	S5      5      U l        [        UR                  S
S5      5      U l        [        SUS    SUS    SUS    S35          SSS5        g   SSS5        g! , (       d  f       g= f! [          a  n[        SU 35         SnAgSnAff = f)z9Restaurar entrada de trades.csv si existe para este slug.r   Nslugside)YESNOTpricesizecostmove_pctz  [RESTORED] entry  @ z x z sh (de CSV)z%  [warn] no se pudo restaurar entry: )csvr   
trades_csvexistsopen
DictReadergetrZ   r4   r5   floatr6   r7   r8   r9   rI   	Exception)rO   mrc   pathfreaderrowes           rQ   _restore_entry_from_csvBot._restore_entry_from_csv[   s=   xx""{{}}	?dq*!Cwwv!&&0 wwv-7(,+.v;(,1#g,,?)+0V+=(+01C+D(+0Q1G+H( 3CK=CL> R##&v;-|= > !   	?9!=>>	?sH   E AD6BD6"E +D6-E 6
E E E 
E)E$$E)c                    [         R                  " 5       R                  S5      nXR                  :w  aL  U R                  S:  a'  [        SU R                   SU R                  S S35        Xl        SU l        SU l        g	g	)
z(Reset daily PnL counter at UTC midnight.r   r   z
  [DAILY RESET] z
 PnL was $+.2fz, resettingr   FN)r   rB   rC   rD   rA   rI   rE   )rO   todays     rQ   _check_daily_resetBot._check_daily_resetv   sy    !**:6$$$"*4+;+;*< =//$/{< =$!DO$D %rT   c                    U R                   (       d  gU R                  R                  5       (       aC   U R                  R                  5         SU l         SU l        SU l        SU l        [        S5        gg! [         a     N5f = f)z/Check if dashboard sent a manual resume signal.NFr   r   z:
  [RESUMED] drawdown stop cleared manually from dashboard)	rE   rG   re   unlinkOSErrorrA   r?   r@   rI   rV   s    rQ   _check_dd_resumeBot._check_dd_resume   s}    %%''##**,  %D!DO !D"#DOQ (  s   A6 6
BBpnl_netwonc                    U(       a  SU l         OTU =R                   S-  sl         U R                   [        :  a+  [        U l        [	        SU R                    S[         S35        U =R
                  U-  sl        U R
                  [        * ::  a<  U R                  (       d*  SU l        [	        SU R
                  S S	[        S
 S35        ggg)z7Update streak and daily drawdown after a trade settles.r   r   z
  [COOLDOWN] z losses in a row -> pausing z windowsTz
  [DD STOP] daily PnL $rt   z hit limit -$.0fz> -> STOPPED
  Resume from dashboard or wait until next UTC dayN)r?   r   r   r@   rI   rA   r   rE   )rO   r}   r~   s      rQ   _update_defense_after_settle Bot._update_defense_after_settle   s      !D"  O3&6#(9(9': ;$$4#5X? @ 	7"??///8H8H#D-dood-C D!!1# 6 7IJ K 9I/rT   returnNc                 J    U R                   (       a  gU R                  S:  a  gg)z:Return reason to skip this window, or None if OK to trade.
DD_STOPPEDr   COOLDOWNN)rE   r@   rV   s    rQ   _should_skip_windowBot._should_skip_window   s"    "rT   c                    U R                   R                  SS9n[        U R                  R                  [        [        R                  " 5       5      U(       a  UR                  OSU(       a  UR                  OSU(       a  UR                  OSU(       a5  [        SUR                  [        [        R                  " 5       5      -
  5      OSU(       a  UR                  OSU R                  R                  SU R                  R                  S-  SU R                  (       a  SOSU R                   U R"                  [%        US	5      U R&                  U R(                  [%        U R*                  S	5      U R                  U R,                  S
.S.5        g)z>Write state.json with defense info (for dashboard visibility).T	use_cacher   r   d   F
dd_stoppedcooldown   loss_streakcooldown_left	daily_pnlr   
daily_date)tsrZ   start_tsend_tst_leftstriker^   ra   	thresholdenteredphasewindowstrades_totalbalancedefenseN)r.   get_balancer   r   
state_jsoninttimerZ   r   r   maxr   r0   last_pxrM   rE   r<   r=   roundr?   r@   rA   rD   )rO   rk   bals      rQ   _write_defense_stateBot._write_defense_state   s   mm''$'7488&&diik"AFFR&'

Q"#ahh=>c!QXXDIIK(889A"#ahh\\))44s:%)%5%5\:** ..S!}#00!%!4!4"4??A6".."..)
 	rT   c                    U R                   nU(       d  g U R                  R                  nUS:X  a  g [        SUR                  [        [        R                  " 5       5      -
  5      nUR                  (       a  X!R                  -
  UR                  -  OSnU R                  (       a  U R                  R                  OSnU R                  (       a  U R                  R                  OSnU R                  R                  UUR                  UUR                  UR                  UUU R                  S9nU(       Ga  [!        SUR"                   SUR$                  S SUS SUR                  S S	UR&                  S
 3
5        U R(                  R*                  (       a  U R,                  R/                  5       U l        U R,                  R3                  UR4                  UR&                  UR6                  SUR"                   35      u  pn
U(       Ga*  SU l        UR"                  U l        Xl        UR6                  U l        [?        XR6                  -  S5      U l         UR$                  U l!        UR4                  U l"        U =RF                  S-  sl#        U R(                  R*                  (       Ga+  [        RH                  " S5        U R,                  RK                  U RL                  UR4                  5      nU(       a  US   S:  a  US   UR6                  S-  ::  a
  US   U l        US   S:  a
  US   U l        [?        U R:                  U R<                  -  S5      U l         [!        SUR"                   SU R<                  S SU R:                  S 35        OE[!        SUR"                   SUR6                  S SU
S
 35        U R,                  RO                  U	5        U RP                  RS                  URT                  UR"                  U R:                  U R<                  U R@                  UR$                  SSSS5
        SnU R                  (       a  SU R8                   SU R:                  S
 3nSnUS:  d  US:  a
  SUS
 SUS
 3nU R(                  RV                  nU R(                  RX                  nXs=:  =(       a    U:  Os  nU(       a  U R                  (       d  S OSnU R                  (       a  S!nOX>:  a  S"nOX?:  a  S#nU R(                  R*                  (       a  SOS$n[Z        R\                  " 5       R_                  S%5      n[!        S&U S'US( S)US* SUS+ S,U U U U 3S-S.9  [        [        R                  " 5       5      S/-  S:X  Gaq  U R,                  R/                  SS09n[a        U R(                  Rb                  0 S1[        [        R                  " 5       5      _S2URT                  _S3URd                  _S4UR                  _S5U_S6UR                  _S7U_S8[?        US9-  S5      _S:U R(                  Rf                  S9-  _S;U_S<U_S=U R                  _S>U R8                  _S?U R:                  _S@U R<                  _SAURi                  5       _SBU Rj                  _U RF                  [?        US5      U Rl                  U Rn                  [?        U Rp                  S5      U Rr                  U Rt                  SC.SD.E5        g g )ENr   )r^   r   r   	token_yestoken_nobest_ask_yesbest_ask_noalready_enteredz
  [SIGNAL]  | move=+.4fz% | price=$,.2fz vs strike=$z | ask=.2fzMOM Tr   r      r_   g      ?	avg_pricez  [FILL OK] z confirmed: z.1fsh @ .4fz  [UNVERIFIED] u    — asumiendo fill r   r   z | POS=rb   z | aY=z aN=SCANNINGHOLDINGWARMUPCUTOFFz [PAPER]z%H:%M:%S[z] t-3dzs | $z,.0fz+.4%z | )end   r   r   rZ   r   r   r   r   r^   ra   r   r   ask_yesask_nor   
entry_sideentry_price
entry_sizer   r   r   )r   r   r   );r3   r0   r   r   r   r   r   r   r1   best_askr2   r-   check_signalr   r   r4   rI   r[   ra   r^   r   rH   r.   r   r;   place_taker_ordertoken_idr_   r5   r6   r7   r   r8   r9   r:   r=   sleepverify_fillr(   cancel_orderr,   	log_traderZ   signal_start_tleftsignal_stop_tleftr   nowrC   r   r   r   rM   lowerr<   r?   r@   rA   rE   rD   )rO   rk   r^   r   mover   r   sigokoid
fill_pricepos	entry_tagask_tagsssesignal_zonezone_tagpapernow_strr   s                        rQ   tickBot.tick   sE   KK$$A:Q3tyy{#33401 AHH,a -1MM$--((q+/<<$,,''Q mm((88kkZZ  MM ) 	
 M#((8CLL3F G!$<|AHHT? C3) * xx}}#'==#<#<#> "&--"A"Aciisxxj!##BZ  %)$'HH $.!$'HH $)*xx*?$C $'LL $'LL!""a'" 88===JJqM--33cll4Cs6{Qv;#((S.8/26{D,{+a/03K0@D-+0 --0@0@@!,E(SXXJl!%!1!1# 6e!%!2!23 79 : z :003~U!+C 02 3 2237%%FFCHHd&7&7$$d&6&6LL"aA/ 	=="4#3#3"4C --c24I Q;&1*wsm4s|<GXX((XX''((b(!,T]]:== H[H[Hhhmm,,.))*5yVBKuU4L 9;c(G9YKwH	
 tyy{a1$--++d+;Ctxx** -c$))+&-- AJJ- !((	-
 &- !((- - E$*a0- TXX883>- 7- &- 4==- d..- t00- d..-  )!-" 4..#-$ !% 2 2 a=#'#4#4%)%8%8!&t!:"&"2"2"&"2"2)-  %rT   c                    U R                   R                  (       a  U R                  R                  5         U R                  R
                  nU R                  (       a  [        OSn[        SUR                   SU SU R                  (       a  SOS S35        U R                  X5      nU(       dl  [        SUR                   S	[         S
35        U R                  R                  XSU R                  U R                  U R                  U R                   SSS5
        gU R                  (       d3  U R                  R                  XUSSSSSSS5
        [        SU S35        gU R                  nU R                  nU R                  n[        SUR                   SU 35        [        SU SUS SUS SU R                   S S3	5        U R                   R                  (       a  ["        R$                  " S5        U R                  R'                  5       n[)        XR*                  -
  S5      n	U	S:  n
[)        U R,                  [.        -  S5      n[)        X-   S5      nU
(       a  SOSn[        SU R*                  S S US S!U	S" S#U 35        OUS$:H  =(       a    US%:H  =(       d    US&:H  =(       a    US':H  n
U
(       a  [)        S(U-
  U-  S5      nO[)        U* U-  S5      n[)        U R,                  [.        -  S5      n[)        X-
  S5      n	U
(       a  SOSn[        S)US" S*US S+U	S" S#U 35        U R                  R1                  UR                  XvXPR,                  U R                   XLX5
        U R                  R                  XUXvXPR                   XU	5
        U R2                  R5                  [7        ["        R"                  " 5       5      UR                  XtXS,.5        U R9                  X5        g)-z.Settle: esperar outcome oficial, calcular PnL.<   z

[settle] u$    — esperando outcome oficial (max zs, consinz posicion)...z  [!! OUTCOME DESCONOCIDO] u    — Polymarket no resolvio en sUNKNOWNr   Nr   z  [settle] u    — sin posicionz -> z  z: r   r   r   r   rt   %   r   WINLOSSz  PnL real (balance): $r   u    → $z = r    r\   Upr]   Downg      ?z  PnL gross: $z	 | fee: $z	 | net: $)r   rZ   r[   outcomer}   r~   )r   rH   r.   
cancel_allr0   r   r4   r   rI   rZ   _fetch_outcomer,   
log_windowr5   r6   r7   r9   r   r   r   r   r;   r8   r
   r   r>   appendr   r   )rO   rk   price_finalwaitr   npr[   	bal_afterr}   r~   fee	pnl_grosstags                 rQ   _settle_windowBot._settle_windowX  s    88==MM$$&ll** $(==bAFF8 $V3u5AP 	Q%%a./x 833C2DAG HKK""	  $"3"3T5E5E  !Q+ }}KK""Aq!Q1& Ky(9:; AFF84y124&1S'qg .&&t,A/ 	0 88==JJqM113Ii*:*::A>G!Cd..?CCgmQ/I%FC+D,<,<S+A B_C~Qse= > 5=4W_ 74<5Gv$5 !37a-3	!1"q&!,	D,,~=qACIOQ/G%FCN9T"2 3s)9WTN!C5B C 	FFDQ 0 0g#	@ 	GQ((G	%
 	""diik"AFF$
 	 	))'7rT   max_waitc                    [         R                   " 5       U-   nSn[         R                   " 5       U:  a  US-  nUR                  U R                  5      nU(       a  [        SU SU S35        U$ U[         R                   " 5       -
  nUS::  a   g [         R                   " 5       X2-
  -
  S:  a  SOSn[         R                  " [        Xv5      5        [         R                   " 5       U:  a  M  g )	Nr   r   z  [OK outcome] z
 (intento )   r   
   )r   fetch_outcomer(   rI   r   r#   )rO   rk   r   deadlineattemptr   	remainingr   s           rQ   r   Bot._fetch_outcome  s    99;)iikH$qLGoodll3Gy
7)1EF 499;.IA~  		x':;b@1bDJJs4+, iikH$ rT   c                   ^  [         R                   " [         R                  U 4S j5        [         R                   " [         R                  U 4S j5        [        R                  " T R
                  R                  SSS9R                  5         [        S5        T R                  (       d]  T R
                  R                  S:X  aC  [        R                  " S5        T R                  (       d  T R
                  R                  S:X  a  MC  T R                  R                  nT R                  R                  (       a  S	OS
n[        SU SU ST R                  R                    S35        [        ST R                  R"                  S ST R                  R$                   S35        SnT R                  (       Gd   ['        [        R                  " 5       5      nXDU-  -
  nXQ-   nXd-
  S:  a:  XQ-  n[)        SXT-
  S-   5      n[        SU S35        [        R                  " U5        T R*                  R-                  5         [.        R0                  " 5       T l        T R*                  R2                  R5                  SS05        [7        UT R                  5      nUR9                  T R*                  T R
                  R                  5      (       d?  US-  n[;        SSU-  5      n	[        SU SU	 S35        [        R                  " U	5        GMc  SnT =R<                  S-  sl        T R?                  5         T RA                  5         T RC                  5         T RE                  5       n
U
S:X  a  T =RF                  S-  sl#        U['        [        R                  " 5       5      -
  n[        ST RF                   S35        T RI                  U5        [        R                  " [)        SU5      5        GMC  U
S:X  Ga   U['        [        R                  " 5       5      -
  n[        S T RJ                  S! S"35        T R                  (       d  ['        [        R                  " 5       5      U:  a~  T RC                  5         T RL                  (       d  O\T RI                  U5        [        R                  " S5        T R                  (       d$  ['        [        R                  " 5       5      U:  a  M~  T RL                  (       a  GMJ  T RO                  U5        T RP                  (       a  T RP                  RS                  5         T RT                  (       a  T RT                  RS                  5         [W        URX                  [Z        5      T l(        [W        UR\                  [Z        5      T l*        [        R                  " T RP                  R                  SS#9R                  5         [        R                  " T RT                  R                  SS#9R                  5         [        R                  " S$5        T R^                   Vs/ s H  nURa                  S%5      S&;  d  M  UPM     nn[c        S' U 5       5      n[c        S( U 5       5      nT RP                  Rd                  nT RT                  Rd                  nS)nT Rf                  S:  a  US*T Rf                   3-  nT RJ                  S:w  a  US+T RJ                  S! 3-  n[        S,S- 35        [        S.URh                   35        [        S/URj                  S0 S1URl                   S235        [        S3U S435        [        S5T R                  R"                  S 35        [        S6US7 S8US7 35        [        S9T R<                   S:T Rn                   U 35        U(       a+  [q        U5      n[        S;US< S=U S>U S1UU-  S?-  S@ SA3	5        [        S- 5        UT l9        T R                  (       d  ['        [        R                  " 5       5      URt                  :  ae  T Rw                  5         [        R                  " S5        T R                  (       d.  ['        [        R                  " 5       5      URt                  :  a  Me  T R                  (       d  T Ry                  U5        T R                  (       d  GM  g g s  snf ! [z         aB  nSS K>n[        SBU 35        UR                  5         [        R                  " SC5         S nANbS nAff = f)DNc                  $   > TR                  5       $ Nshutdown_rO   s    rQ   <lambda>Bot.run.<locals>.<lambda>      rT   c                  $   > TR                  5       $ r  r  r  s    rQ   r  r    r  rT   Tr0   )targetdaemonnamez&-> esperando primer tick de Binance...r   g?r!   r"   z	-> modo: z | ventana: zs (zmin)z-> threshold: r$   r%   z/trader  r   z
-> proxima ventana en zs...r   r   r   z([!] No se pudo cargar la ventana (fail #z), retry en r   z
  [COOLDOWN] skipping window (z more after this)r   z
  [DD STOPPED] daily PnL $rt   u'    — waiting for resume or UTC midnight)r  r  r   r   r   Nc              3   <   #    U  H  oS    (       d  M  Sv   M     g7fr~   r   N .0ts     rQ   	<genexpr>Bot.run.<locals>.<genexpr>  s     8ex11e   	c              3   *   #    U  H	  oS    v   M     g7fr}   Nr  r  s     rQ   r  r    s     7AY<   r   z
 | streak=z | day=$
zH========================================================================z  Ventana    : z  Strike     : $r    (r  z  Modo       : z | MOMENTUM TAKERz  Threshold  : z  CLOB asks  : YES=r   z NO=z  Stats      : windows=z trades=z  PnL acum.  : $r   z | WR=/r   r   %)z
[!! ERROR] r  )@signalSIGINTSIGTERM	threadingThreadr0   runstartrI   r+   r   r   r   r   win_secsrH   rL   rM   rN   r   r   r(   closer&   r'   r)   r*   r   
fetch_datar#   r<   rW   rv   r{   r   r@   r   rA   rE   rq   r1   stopr2   r   r   r   r   r>   rh   sumr   r?   rZ   r   strike_sourcer=   lenr3   r   r   r   rj   	traceback	print_exc)rO   wsrP   _consecutive_failsr   r   r   r   rk   delayskipr  r  knownwinspnlask_yask_n
def_statusnkrp   r6  s   `                     rQ   r-  Bot.run  s   fmm&@Afnn&@A<<##Dy	

%'67**!5!5!:JJsO **!5!5!: XX!XX]]6	(<t3txx6GtLMtxx::3? @//08 	9 ***wtyy{+r>#=<"$NHq(.1"45D4TF$?@JJt$""$'//1$$++\=,IJ8TXX.||DLL$,,2F2FGG&!+&A(:$:;E $$6#7|E7$P QJJu%%&"##q(#((* '')%%'//1:%''1,' &TYY[)9 9I "1122CE F --a0JJs1i01<' &TYY[)9 9I "ood3 434 5 #jjS-=-F--/#//!11!4

1 #jjS-=-F '' ,,Q/ ==MM&&(<<LL%%' (g > (W =  ==,,T;;@57  <<++D::?%'

1$($7$7 G$7qEE),4EE $7 G8e88777..--  
$$q(Jt/@/@.A"BBJ??a'HT__T,B"CCJ6(m$x01($ 8//*!- .z1BCD(C(CC'HIJ+E#;d5+FG/0C0C/D E  $ 2 23J<A BUB,SJ 7  $vQrd"T"WS[,=RA B" **TYY[)9AHH)DIIKJJqM **TYY[)9AHH)D
 zz''*e ***VGR   aS)*##%

2	sS   3Eb: Cb: #C1b: b: *D7b: !b5>b5H7b: ="b: 5b: :
d8ddc           	         U R                   (       a  g SU l         [        S5        U R                  R                  (       a  U R                  R                  5         U R                  R                  5         U R                  (       a  U R                  R                  5         U R                  (       a  U R                  R                  5         U R                   Vs/ s H  nUR                  S5      S;  d  M  UPM     nnU(       a  [        S U 5       5      n[        U5      n[        [        S U 5       5      S5      n[        SS	 35        [        S
5        [        SU R                   35        [        SU R                    35        U(       a  [        SU SU SX4-  S-  S S35        [        SUS 35        [        S	 5        g g s  snf )NTz
-> shutdown...r   r  c              3   <   #    U  H  oS    (       d  M  Sv   M     g7fr  r  r  s     rQ   r  Bot.shutdown.<locals>.<genexpr>X  s     4%QU8qq%r   c              3   *   #    U  H	  oS    v   M     g7fr"  r  r  s     rQ   r  rF  Z  s     8%QiL%r#  r   r$  z2==================================================z  RESUMEN V11 MOMENTUM TAKERz  Ventanas   : z  Trades     : z  Win rate   : r&  r%  r   r   r'  z  PnL total  : $r   )r+   rI   r   rH   r.   r   r0   r2  r1   r2   r>   rh   r3  r5  r   r<   r=   )rO   r  r<  r=  rB  r>  s         rQ   r  Bot.shutdownH  so   ::
 !88==MM$$&==MM <<LL // ?/qEE)$,== / ?4%44DUB8%88!<CBvh- 02OD$7$7#89:OD$6$6#789vQrd"TWS[4ERHI$SJ/0VH ?s   G5G)r;   r@   rD   rA   rG   rE   r4   r8   r9   r6   r5   r7   r:   r?   r+   r>   r=   r<   r0   r   r2   r1   r.   r,   r3   r(   r-   r  )__name__
__module____qualname____firstlineno__r   rR   rW   rq   rv   r{   ri   boolr   strr   r   r   r   r   r   r-  r  __static_attributes__r  rT   rQ   r   r       s    ,OF ,O` ?6	%RKE K K(S4Z :K^O8b# #* $KZrT   r   )__doc__r(  r+  r   r   pathlibr   configr   r   r   r	   r
   r   r   r   r   r   feedsr   r   r3   r   r,   r   r.   r   r-   r   r&   r   r  rT   rQ   <module>rT     sG   	       )    & B	 B	rT   