
    Ii0                        S r SSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKJr  SSK	J
r
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  SSKJr  SSKJr  SS	K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(J)r)  SSK*J+r+  SSK,J-r-  SSK.J/r/J0r0  \" S5      r1\\2\S\24   4   r3 " S S5      r4 " S S5      r5Sr6S\&S\-S\)4S jr7 " S S5      r8g) z0
The starlette extension to rate-limit requests
    N)datetime)
formatdateparsedate_to_datetime)wraps)	AnyCallableDictListOptionalSetTupleTypeVarUnion)RateLimitItem)ConfigurationError)MemoryStoragestorage_from_string)
STRATEGIESRateLimiter)Config)MutableHeaders)Request)JSONResponseResponse)Literal   )RateLimitExceeded)Limit
LimitGroupT.c                   X    \ rS rSrSrSrSrSrSrSr	Sr
S	rS
rSrSrSrSrSrSrSrSrSrg)C-   RATELIMIT_ENABLEDRATELIMIT_HEADERS_ENABLEDRATELIMIT_STORAGE_URLRATELIMIT_STORAGE_OPTIONSRATELIMIT_STRATEGYRATELIMIT_GLOBALRATELIMIT_DEFAULTRATELIMIT_APPLICATIONRATELIMIT_HEADER_LIMITRATELIMIT_HEADER_REMAININGRATELIMIT_HEADER_RESETRATELIMIT_SWALLOW_ERRORSRATELIMIT_IN_MEMORY_FALLBACK$RATELIMIT_IN_MEMORY_FALLBACK_ENABLEDRATELIMIT_HEADER_RETRY_AFTER"RATELIMIT_HEADER_RETRY_AFTER_VALUERATELIMIT_KEY_PREFIX N)__name__
__module____qualname____firstlineno__ENABLEDHEADERS_ENABLEDSTORAGE_URLSTORAGE_OPTIONSSTRATEGYGLOBAL_LIMITSDEFAULT_LIMITSAPPLICATION_LIMITSHEADER_LIMITHEADER_REMAININGHEADER_RESETSWALLOW_ERRORSIN_MEMORY_FALLBACKIN_MEMORY_FALLBACK_ENABLEDHEADER_RETRY_AFTERHEADER_RETRY_AFTER_VALUE
KEY_PREFIX__static_attributes__r5       7/venv/lib/python3.13/site-packages/slowapi/extension.pyr"   r"   -   s]    !G1O)K1O#H&M(N0+L3+L/N7!G7C'JrL   r"   c                   $    \ rS rSrSrSrSrSrSrg)HEADERSA   r            r5   N)	r6   r7   r8   r9   RESET	REMAININGLIMITRETRY_AFTERrK   r5   rL   rM   rO   rO   A   s    EIEKrL   rO      requestexcreturnc                     [        SSUR                   30SS9nU R                  R                  R                  R                  X R                  R                  5      nU$ )z
Build a simple JSON response that includes the details of the rate limit
that was hit. If no limit is hit, the countdown is added to headers.
errorzRate limit exceeded: i  )status_code)r   detailappstatelimiter_inject_headersview_rate_limit)rY   rZ   responses      rM   _rate_limit_exceeded_handlerrf   K   sZ    
 	)#**67SH {{  ((88--//H OrL   c            #       j   \ rS rSrSr/ / SSS0 SS/ SSSSSS4S\S	\4   S
\\   S\\   S\	S\
\   S\
\   S\\\4   S\	S\	S\\   S\	S\
\   S\S\	S\
\   S\S   SS4"S jjrS>S jrS?S\S\S\4S jjrS\	4S  jrS>S! jr\S\4S" j5       rS#\S$\\\\   4   S\4S% jrS&\S$\\\\   4   S\4S' jrS(\S)\S*\\   SS4S+ jrS\4S, jr  S@S(\S-\
\S	\!4      S.\	SS4S/ jjr"         SAS0\S\
\S	\4      S1\	S2\
\   S3\	S4\
\\      S5\
\   S6\
\S	\	4      S7\#\\S	\4   4   S8\	S\S	\!4   4S9 jjr$       SBS0\S\
\S	\4      S3\	S4\
\\      S5\
\   S6\
\S	\	4      S7\#\\S	\4   4   S8\	S\4S: jjr%     SCS0\S2\S\
\S	\4      S5\
\   S6\
\S	\	4      S7\#\\S	\4   4   S8\	S\4S; jjr&S< r'S=r(g)DLimiterY   a  
Initializes the slowapi rate limiter.

** parameter **

* **app**: `Starlette/FastAPI` instance to initialize the extension
 with.

* **default_limits**: a variable list of strings or callables returning strings denoting global
 limits to apply to all routes. `ratelimit-string` for  more details.

* **application_limits**: a variable list of strings or callables returning strings for limits that
 are applied to the entire application (i.e a shared limit for all routes)

* **key_func**: a callable that returns the domain to rate limit by.

* **headers_enabled**: whether ``X-RateLimit`` response headers are written.

* **strategy:** the strategy to use. refer to `ratelimit-strategy`

* **storage_uri**: the storage location. refer to `ratelimit-conf`

* **storage_options**: kwargs to pass to the storage implementation upon
  instantiation.
* **auto_check**: whether to automatically check the rate limit in the before_request
 chain of the application. default ``True``
* **swallow_errors**: whether to swallow errors when hitting a rate limit.
 An exception will still be logged. default ``False``
* **in_memory_fallback**: a variable list of strings or callables returning strings denoting fallback
 limits to apply when the storage is down.
* **in_memory_fallback_enabled**: simply falls back to in memory storage
 when the main storage is down and inherits the original limits.
* **key_prefix**: prefix prepended to rate limiter keys.
* **enabled**: set to False to deactivate the limiter (default: True)
* **config_filename**: name of the config file for Starlette from which to load settings
 for the rate limiter. Defaults to ".env".
* **key_style**: set to "url" to use the url, "endpoint" to use the view_func
FNT urlkey_func.default_limitsapplication_limitsheaders_enabledstrategystorage_uristorage_options
auto_checkswallow_errorsin_memory_fallbackin_memory_fallback_enabledretry_after
key_prefixenabledconfig_filename	key_style)endpointrk   r[   c                 v   [         R                  " S5      U l        [        R                  R                  S5      n[        U(       a  Uc  SOU5      U l        Xl        / U l	        / U l
        / U l        U=(       d    [        U
5      S:  U l        [        5       U l        / U l        X@l        0 U l        Xl        XPl        X`l        Xpl        Xl        Xl        Xl        Xl        UU l        [        U5       H:  nU R                  R9                  [;        UU R2                  SSSSSSS5	      /5        M<     U H:  nU R                  R9                  [;        UU R2                  SSSSSSS5	      /5        M<     U
 H:  nU R                  R9                  [;        UU R2                  SSSSSSS5	      /5        M<     0 U l        0 U l        SU l         SU l!        SU l"        [F        RF                  " 5       U l$        0 U l%         " S S	[         RL                  5      nU R                  RO                  U" 5       5        U RQ                  [R        RT                  U R                  5      U l        U RQ                  [R        RV                  U R0                  5      U l        U R"                  =(       d     U RQ                  [R        RX                  S5      U l        U R,                  R[                  U RQ                  [R        R\                  0 5      5        [_        U R*                  =(       d     U RQ                  [R        R`                  S
5      40 U R,                  D6U l1        U R(                  =(       d     U RQ                  [R        Rd                  S5      nU[f        ;  a  [i        SU-  5      e[f        U   " U Rb                  5      U l5        U R$                  R[                  [l        Rn                  U R$                  Rq                  [l        Rn                  U RQ                  [R        Rr                  S5      5      [l        Rt                  U R$                  Rq                  [l        Rt                  U RQ                  [R        Rv                  S5      5      [l        Rx                  U R$                  Rq                  [l        Rx                  U RQ                  [R        Rz                  S5      5      [l        R|                  U R$                  Rq                  [l        R|                  U RQ                  [R        R~                  S5      5      05        U R&                  =(       d    U RQ                  [R        R                  5      U l        U R4                  =(       d    U RQ                  [R        R                  5      U l        U RQ                  [R        R                  S5      nU R                  (       d*  U(       a#  [;        UU R2                  SSSSSSS5	      /U l
        U RQ                  [R        R                  S5      nU R                  (       d*  U(       a#  [;        UU R2                  SSSSSSS5	      /U l	        U RQ                  [R        R                  S5      nU RQ                  [R        R                  S5      nU R                  (       d*  U(       a#  [;        UU R2                  SSSSSSS5	      /U l        U R                  (       d&  U=(       d    [        U R                  5      S:  U l        U R                  (       a.  [        5       U lG        [f        U   " U R                  5      U l!        gg)z)
Configure the rate limiter at app level
slowapiz.envNr   Fr   globalc                       \ rS rSrS rSrg)*Limiter.__init__.<locals>.BlackHoleHandler   c                      g Nr5   )_s    rM   emit/Limiter.__init__.<locals>.BlackHoleHandler.emit   s    rL   r5   N)r6   r7   r8   r9   r   rK   r5   rL   rM   BlackHoleHandlerr      s    rL   r   z	memory://zfixed-windowz!Invalid rate limiting strategy %szX-RateLimit-ResetzX-RateLimit-RemainingzX-RateLimit-LimitRetry-After)Hlogging	getLoggerloggerospathisfiler   
app_configry   _default_limits_application_limits_in_memory_fallbacklen_in_memory_fallback_enabledset_exempt_routes_request_filters_headers_enabled_header_mapping_retry_after	_strategy_storage_uri_storage_options_auto_check_swallow_errors	_key_func_key_prefix
_key_styleextendr   _route_limits_dynamic_route_limits_storage_dead_fallback_limiter_Limiter__check_backend_counttime_Limiter__last_check_backend_Limiter__marked_for_limitingStreamHandler
addHandlerget_app_configr"   r:   rE   r;   updater=   r   r<   _storager>   r   r   _limiterrO   rT   getrD   rU   rC   rV   rB   rW   rH   rI   rJ   rA   r@   rG   rF   r   _fallback_storage)selfrl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   rz   r{   dotenv_file_existslimitr   
app_limitsconf_limitsfallback_enabledfallback_limitss                           rM   __init__Limiter.__init__   s   6 ''	2WW^^F3 !o&=  
 !#% 57 &E#.@*AA*E 	( ),;= //1+6!' /%-!%#(E  ''t~~tUD$aQV ) (E$$++ 
 (  (E$$++t~~tUD$aQV ( 68BD"#(!%%&"$(IIK!@B"	w44 	 	/12**199dllC#22d22 
 !% 5 5 !
9L9Lu:
 	$$T%8%89J9JB%OP+P!4!4Q]]K!P
##
 >>TT%8%8^%T:%$%H8%STT%/%9$--%H##t3377MM''8KL  !!4#7#7#;#;%%''(:(:<ST$ t3377MM''8KL  ##T%9%9%=%=''''(<(<mL&	
( !-- 
1D1D&&2
  ++Pt/B/B1<</P151D1D  $2

 ''JNN
(D$ 372E2Ed3
 ##udD$PQSX$D 
  ..q/K/KUS6:6I6I  $7
 ''O#NN
(D$ // EC(@(@$AA$E , ++%2_D"%/%9$:P:P%QD" ,rL   c                 j    U [         R                  l        [         R                  [        [
        5        g)zO
Starlette startup event handler that links the app with the Limiter instance.
N)r`   ra   rb   add_exception_handlerr   rf   r   s    rM   slowapi_startupLimiter.slowapi_startupH  s"     !		!!"35QRrL   keydefault_valuec                 `    U(       a  U R                  X[        U5      S9$ U R                  XS9$ )zA
Place holder until we find a better way to load config from app
)defaultcast)r   )r   type)r   r   r   s      rM   r   Limiter.get_app_configO  s8      OOCT-=POQ	
 <	
rL   c                    U R                   [        :  a  SU l         [        R                  " 5       U R                  -
  [	        SU R                   5      :  a0  [        R                  " 5       U l        U =R                   S-  sl         gg)Nr   rQ   r   TF)r   MAX_BACKEND_CHECKSr   r   powr   s    rM   __should_check_backendLimiter.__should_check_backendY  sd    %%(::)*D&99;222SD<V<V5WW(,		D%&&!+&rL   c                      U R                   R                  5         U R                  R                  S5        g! [         a    U R                  R                  S5         gf = f)z/
resets the storage if it supports being reset
z-Storage has been reset and all limits clearedz.This storage type does not support being resetN)r   resetr   infoNotImplementedErrorwarningr   s    rM   r   Limiter.resetb  sO    	RMM!KKLM" 	RKK PQ	Rs   58 %A A c                     U R                   (       a5  U R                  (       a$  U R                  (       d   S5       eU R                  $ U R                  $ )zD
The backend that keeps track of consumption of endpoints vs limits
z=Fallback limiter is needed when in memory fallback is enabled)r   r   r   r   r   s    rM   rb   Limiter.limiterl  sF    
 $"B"B&&ONO&)))== rL   re   current_limitc                    U R                   (       Ga  U R                  (       Ga  UGb  [        U[        5      (       d  [	        S5      e U R
                  R                  " US   /US   Q76 nSUS   -   nUR                  R                  U R                  [        R                     [        US   R                  5      5        UR                  R                  U R                  [        R                     [        US   5      5        UR                  R                  U R                  [        R                     [        U5      5        UR                  R!                  S5      nUb  [#        U R%                  U5      U5      nU R&                  S:X  a  [)        U5      O)[        [+        U[,        R,                  " 5       -
  5      5      UR                  U R                  [        R.                     '   U$ U$ !   U R0                  (       aD  U R2                  (       d3  U R4                  R7                  S5        SU l        U R9                  X5      nU R:                  (       a  U R4                  R=                  S5         U$ e = f)	NzHparameter `response` must be an instance of starlette.responses.Responser   r   r   	http-dateBRate limit storage unreachable - falling back to in-memory storageT5Failed to update rate limit headers. Swallowing error)ry   r   
isinstancer   	Exceptionrb   get_window_statsheadersappendr   rO   rV   stramountrU   rT   r   max_determine_retry_timer   r   intr   rW   r   r   r   r   rc   r   	exception)r   re   r   window_statsreset_inexisting_retry_after_headers         rM   rc   Limiter._inject_headersy  s    <<<D111m6Oh11^ *040M0M!!$1'4Q'71 |A.  ''((7]1=M=T=T9U   ''(():):;Sa=Q   ''((7X
 /7.>.>.B.B=.Q+.:"223NO  H ((K7 x(SDIIK!789   !5!5g6I6I!JK& x++D4F4FKK''- *.D&#33HLH''KK))O
  s   
F!G/ /BI65I6r   c                 
   U R                   (       Ga]  U R                  (       GaK  UGbG   U R                  R                  " US   /US   Q76 nSUS   -   n[	        US   R
                  5      XR                  [        R                     '   [	        US   5      XR                  [        R                     '   [	        U5      XR                  [        R                     '   UR                  S5      nUb  [        U R                  U5      U5      nU R                  S:X  a  [        U5      O)[	        [!        U["        R"                  " 5       -
  5      5      XR                  [        R$                     '   U$ U$ ! [&         a    U R(                  (       aD  U R*                  (       d3  U R,                  R/                  S5        SU l        U R1                  X5      nU R2                  (       a  U R,                  R5                  S5         U$ e f = f)z
Injects 'X-RateLimit-Reset', 'X-RateLimit-Remaining', 'X-RateLimit-Limit'
and 'Retry-After' headers into :headers parameter if needed.

Basically the same as _inject_headers, but without access to the Response object.
-> supports ASGI Middlewares.
r   r   r   r   r   Tr   )ry   r   rb   r   r   r   r   rO   rV   rU   rT   r   r   r   r   r   r   r   rW   r   r   r   r   r   _inject_asgi_headersr   r   )r   r   r   r   r   r   s         rM   r   Limiter._inject_asgi_headers  s    <<<D111m6O&040M0M!!$1'4Q'71 |A.?B!!$++@,,W]];< DG|TUCW,,W->->?@?B8},,W]];< /6kk-.H+.:"223NO  H ((K7 x(SDIIK!789 ,,W-@-@AB& w  ++D4F4FKK''- *.D&"77OG''KK))O
  s   EE2 2BH HrY   r|   limitsc                 p   S nS nU GH	  nUR                   =(       d    UnUR                  (       a  M,  UR                  b*  UR                  R	                  5       UR                  ;  a  Mc  UR
                  (       a  USUR                  -  -  nS[        R                  " UR                  5      R                  R                  5       ;   a  UR                  U5      nOUR                  5       nX/n	[        U	5      (       a  U R                  (       a  U R                  /U	-   n	U(       a  UR                  US   :  a  UR                  U	4n[        UR                  5      (       a  UR                  U5      OUR                  n
U R                   R"                  " UR                  /U	Q7SU
06(       d:  U R$                  R'                  SUR                  UU5        UnUR                  U	4n  O.GM  U R$                  R)                  SUR                  5        GM     XQR*                  l        U(       a  [/        U5      eg )Nz:%srY   r   costz*ratelimit %s (%s) exceeded at endpoint: %sz4Skipping limit: %s. Empty value found in parameters.)scope	is_exemptmethodsmethodlower
per_methodinspect	signaturerl   
parameterskeysallr   r   callabler   rb   hitr   r   r]   ra   rd   r   )r   rY   r|   r   failed_limitlimit_for_headerlimlimit_scope	limit_keyargsr   s              rM   __evaluate_limitsLimiter.__evaluate_limits  s    C))/xK}}{{&7>>+?+?+A+T~~uw~~55G--cll;FFKKMMLL1	LLN	+D4yy## ,,-4D'3997G7J+J(+		4'8$,4SXX,>,>sxx(CHH||''		DDDtDKK''D		!#	 $'L(+		4'8$ E !!JCII I L )9%#L11 rL   c                 6    [        U5      nUb-  [        [        R
                  " UR                  5       5      5      $  [        U5      n[        [        R                  " 5       U-   5      $ ! [        [        4 a    S n Nqf = f! [         a    [        S5      ef = f)NzQRetry-After Header does not meet RFC2616 - value is not of http-date or int type.)r   	TypeError
ValueErrorr   r   mktime	timetuple)r   retry_header_valueretry_after_dateretry_after_ints       rM   r   Limiter._determine_retry_time  s    	$3H"4 't{{#3#=#=#?@AA	#&'9#:O 499;011 :& 	$#	$  	c 	s   A* B *A?>A?Bendpoint_funcin_middlewarec                    US   =(       d    SnUnU(       a  UR                    SUR                   3OSnU R                  S:X  a  UOUnU(       aA  U R                  (       a0  X`R                  ;   d!  [        S U R                   5       5      (       a  g/ n/ n	U(       dq  X`R                  ;   a  U R                  U   O/ n/ n	X`R                  ;   a@  U R                  U    H-  n
 U	R                  [        U
R                  U5      5      5        M/      / nU R                  (       a  U R                   (       a  U(       a  X`R"                  ;   a  OU R%                  5       (       aI  U R&                  R)                  5       (       a*  U R                  R+                  S5        S	U l        S
U l        O&[        [.        R0                  " U R2                  6 5      nU(       d  X-   nU(       a&  [        [.        R0                  " U R4                  6 5      O/ nX-  n[7        S U 5       5      nU(       d  U(       a  X`R"                  ;   a  U(       a)  U[        [.        R0                  " U R8                  6 5      -  nU R;                  XU5        g! [         a)  nU R                  R                  SUU5         SnAGM  SnAff = f! [<         a  n[?        U[@        5      (       a  e U RB                  (       aJ  U R                  (       d9  U R                  RE                  S5        SU l        U RG                  XU5         SnAgU RH                  (       a   U R                  RK                  S5         SnAge SnAff = f)z+
Determine if the request is within limits
r   rj   .rk   c              3   .   #    U  H  o" 5       v   M     g 7fr   r5   ).0fns     rM   	<genexpr>/Limiter._check_request_limit.<locals>.<genexpr>=  s     8"7B244"7s   Nz2failed to load ratelimit for view function %s (%s)zRate limit storage recoveredFr   c              3   B   #    U  H  oR                   (       + v   M     g 7fr   )override_defaults)r  r   s     rM   r  r  i  s      (=IE////\s   r   Tz&Failed to rate limit. Swallowing error)&r7   r6   r   ry   r   anyr   r   r   r   listwith_requestr  r   r]   r   r   r   _Limiter__should_check_backendr   checkr   r   	itertoolschainr   r   r   r   _Limiter__evaluate_limitsr   r   r   r   warn_check_request_limitr   r   )r   rY   r  r  endpoint_url	view_funcendpoint_func_name_endpoint_keyr   dynamic_limitsr   e
all_limitsroute_limitscombined_defaultss                  rM   r#  Limiter._check_request_limit&  s    v,"!	 ?Hy##$Ai&8&8%9:R 	 )-5(@FX << "%8%888$"7"7888 &( &););; ""#56 
  N!%?%??556HIC&--d33C3CG3L.MN J0	&(J!!d&<&< %7;U;U%U22449L9L9N9N(()GH-2*562%))//4;S;S*T%U
,2,C % $*B*BCD 
 *
$' (=I( %! %%.2L2LL($y8L8L'M"NNJ""7:FQ & ))P. R  	!.////8J8J  ) &*"))'-PP''KK))*RSS	s>   !)I>E.J4 >
J1J,,J14
M&>A,M!/,M! M!!M&limit_valuesharedr   r   r   error_messageexempt_whenr   r  c                 p   ^ ^^^^^^^	^
^ U(       a  UOS mS[         S[        4   4UU	UUUUUU
UU 4
S jjnU$ )Nfunc.c                   >
^ ^ T=(       d    TR                   nT R                   ST R                   3nS n/ n[        T5      (       a  [	        TUTTTTTTT5	      nO [        [	        TUTTTTTTT5	      5      nTR                  R                  U/ 5      R                  T 5        U(       a,  TR                  R                  U/ 5      R                  U5        O+TR                  R                  U/ 5      R                  U5        S n[        R                   " T 5      n[#        UR$                  R'                  5       5       H4  u  mnUR(                  S:X  d  UR(                  S:X  d  M(  UR(                  n  O   [+        ST  S35      e[,        R.                  " T 5      (       a7  [0        R2                  " T 5      S[4        S[4        S	[6        4U UU4S
 jj5       n	U	$ [0        R2                  " T 5      S[4        S[4        S	[6        4U UU4S jj5       n
U
$ ! [         a(  nTR                  R                  SUU5         S nAGNS nAff = f)Nr  z*Failed to configure throttling for %s (%s)rY   	websocketz2No "request" or "websocket" argument on function ""r  kwargsr[   c                  z  >#    TR                   (       a  UR                  SU (       a  U T   OS 5      n[        U[        5      (       d  [	        S5      eTR
                  (       a@  [        UR                  SS5      (       d$  TR                  UTS5        SUR                  l	        T" U 0 UD6I S h  vN nTR                   (       ar  [        U[        5      (       d7  TR                  UR                  S5      WR                  R                  5        U$ TR                  UWR                  R                  5        U$  N7fNrY   zEparameter `request` must be an instance of starlette.requests.Request_rate_limiting_completeFTre   ry   r   r   r   r   r   getattrra   r#  r:  r   rc   rd   r  r7  rY   re   r3  idxr   s       rM   async_wrapperCLimiter.__limit_decorator.<locals>.decorator.<locals>.async_wrapper  s     ||"(**YTS	t"T)'7;;"+ g#   ++G#MM+De5 5 !55gtUKDHGMMA%)4%:6%::H||)(H== 00 &

: 68U8U $O !00 ('--*G*G $O  ;s   B,D;/D90B
D;c                  ^  > TR                   (       a  UR                  SU (       a  U T   OS 5      n[        U[        5      (       d  [	        S5      eTR
                  (       a@  [        UR                  SS5      (       d$  TR                  UTS5        SUR                  l	        T" U 0 UD6nTR                   (       ar  [        U[        5      (       d7  TR                  UR                  S5      WR                  R                  5        U$ TR                  UWR                  R                  5        U$ r9  r;  r=  s       rM   sync_wrapperBLimiter.__limit_decorator.<locals>.decorator.<locals>.sync_wrapper  s     ||"(**YTS	t"T)'7;;"+ g#   ++G#MM+De5 5 !55gtUKDHGMMA#T4V4H||)(H== 00 &

: 68U8U $O !00 ('--*G*G $OrL   )r   r7   r6   r   r   r  r  r   r]   r   
setdefaultr   r   r   r   r   r   	enumerater   valuesnamer   asyncioiscoroutinefunction	functoolsr   r   r   )r3  keyfuncrG  dynamic_limitstatic_limitsr)  connection_typesig	parameterr?  rB  r>  _scoper   r0  r1  rl   r.  r   r  r   r   s   `          @rM   	decorator,Limiter.__limit_decorator.<locals>.decorator  s4   0$..Goo&a7D M)+M$$ *!%
!$("'#"&#)' -
%M& &&11$;BB4H**55dB?FF}U""--dB7>>}M-1O##D)C"+CNN,A,A,C"DY>>Y.)..K2O&/nnO #E
  HaP  **400&$s $c $h $ $ '$6 %$ &$ $s $x $ $ '$6 $#k " KK%%D s   H 
H?H::H?)r   r   )r   r.  rl   r/  r   r   r   r0  r1  r   r  rR  rQ  s   ```  `````` @rM   __limit_decoratorLimiter.__limit_decorator  s;     !du	$HS(]3 u	$ u	$ u	$n rL   c	                 .    U R                  UUUUUUUUS9$ )ae  
Decorator to be used for rate limiting individual routes.

* **limit_value**: rate limit string or a callable that returns a string.
 :ref:`ratelimit-string` for more details.
* **key_func**: function/lambda to extract the unique identifier for
 the rate limit. defaults to remote address of the request.
* **per_method**: whether the limit is sub categorized into the http
 method of the request.
* **methods**: if specified, only the methods in this list will be rate
 limited (default: None).
* **error_message**: string (or callable that returns one) to override the
 error message used in the response.
* **exempt_when**: function returning a boolean indicating whether to exempt
the route from the limit
* **cost**: integer (or callable that returns one) which is the cost of a hit
* **override_defaults**: whether to override the default limits (default: True)
)r   r   r0  r1  r   r  _Limiter__limit_decorator)	r   r.  rl   r   r   r0  r1  r   r  s	            rM   r   Limiter.limit  s4    : %%!'#/ & 	
 		
rL   c                 .    U R                  UUSUUUUUS9$ )a  
Decorator to be applied to multiple routes sharing the same rate limit.

* **limit_value**: rate limit string or a callable that returns a string.
 :ref:`ratelimit-string` for more details.
* **scope**: a string or callable that returns a string
 for defining the rate limiting scope.
* **key_func**: function/lambda to extract the unique identifier for
 the rate limit. defaults to remote address of the request.
* **per_method**: whether the limit is sub categorized into the http
 method of the request.
* **methods**: if specified, only the methods in this list will be rate
 limited (default: None).
* **error_message**: string (or callable that returns one) to override the
 error message used in the response.
* **exempt_when**: function returning a boolean indicating whether to exempt
the route from the limit
* **cost**: integer (or callable that returns one) which is the cost of a hit
* **override_defaults**: whether to override the default limits (default: True)
T)r0  r1  r   r  rW  )r   r.  r   rl   r0  r1  r   r  s           rM   shared_limitLimiter.shared_limit7  s4    < %%'#/ & 	
 		
rL   c                   ^ TR                   < STR                  < 3nU R                  R                  U5        [        R
                  " T5      (       a  [        T5      U4S j5       nU$ [        T5      U4S j5       nU$ )z6
Decorator to mark a view as exempt from rate limits.
r  c                  0   >#    T" U 0 UD6I S h  vN $  N7fr   r5   akobjs     rM   __async_inner%Limiter.exempt.<locals>.__async_innerj  s      !\q\)))s   c                     > T" U 0 UD6$ r   r5   r_  s     rM   __innerLimiter.exempt.<locals>.__innerq  s    A||#rL   )r7   r6   r   addrH  rI  r   )r   rb  rG  _Limiter__async_inner_Limiter__inners    `   rM   exemptLimiter.exempt`  sy     ..#,,7%&&s++3Z* * !  3Z$ $ NrL   )__check_backend_count__last_check_backend__marked_for_limitingr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ry   r   )r[   Nr   )T)	NFNFNNNr   T)NFNNNr   T)NNNr   T))r6   r7   r8   r9   __doc__r   r   r
   StrOrCallableStrboolr   r	   r   r   r   r    r   r  r   propertyr   rb   r   r   r   rc   r   r   r   r   r!  r   r   r   r#  r   rX  r   r[  rk  rK   r5   rL   rM   rh   rh   Y   s   %V 2457 %"&%)*,$57+0%))-05%ER 38$ER -.	ER
 !!12ER ER 3-ER c]ER c3hER ER ER !!12ER %)ER c]ER ER  !ER" "##ER$ ,-%ER& 
'ERNS
# 
a 
1 
 R 
! 
! 
!3 316}d3i7O1P3	3j2%26;M4PS9<T6U2	2h.2.2*-.27;E{.2	.2`23 20 #	__  c 23_ 	_
 
_H 26,0 '+'+59/0"&F%F 8CH-.F 	F
 ()F F $s)$F  }F hsDy12F C#s(++,F  F 
#s(	FV 26 '+'+59/0"&&
%&
 8CH-.&
 	&

 $s)$&
  }&
 hsDy12&
 C#s(++,&
  &
 
&
X 26'+59/0"&'
%'
  '
 8CH-.	'

  }'
 hsDy12'
 C#s(++,'
  '
 
'
RrL   rh   )9rp  rH  rJ  r   r  r   r   r   r   email.utilsr   r   r   typingr   r   r	   r
   r   r   r   r   r   r   r   limits.errorsr   limits.storager   r   limits.strategiesr   r   starlette.configr   starlette.datastructuresr   starlette.requestsr   starlette.responsesr   r   typing_extensionsr   errorsr   wrappersr   r   r    r   rq  r"   rO   r   rf   rh   r5   rL   rM   <module>r     s         	   9 
 
 
 ! , = 5 # 3 & 6 % % ' CLhsCx001 ( ((   ' 8I h \ \rL   