Ë
    }D™jhI  ã                   ó€  — d dl m Z mZ d dlmZmZ d dlmZmZmZm	Z	m
Z
mZmZ d dlmZmZ d dl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mZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z% ddl&m'Z' erddlm(Z(m)Z) g d¢Z* ee+«      Z, ed¬«       G d„ de«      «       Z-dede'de.fd„Z/de
e0e0f   de
e0e0f   dee0   fd„Z1de0defd„Z2y) é    )ÚdatetimeÚ	timedelta)ÚDEBUGÚ	getLogger)ÚTYPE_CHECKINGÚDictÚListÚMappingÚMutableMappingÚOptionalÚUnion)ÚdefineÚfield)ÚPreparedRequestÚResponse)ÚCaseInsensitiveDicté   )Úcoalesce)Únormalize_headers)Ú	RichMixiné   )
ÚDO_NOT_CACHEÚEXPIRE_IMMEDIATELYÚNEVER_EXPIREÚCacheDirectivesÚExpirationTimeÚKeyCallbackÚget_expiration_datetimeÚget_expiration_secondsÚget_url_expirationÚutcnow)ÚCacheSettings)ÚCachedRequestÚCachedResponse)zX-HTTP-Method-OverridezX-HTTP-MethodzX-Method-OverrideF)Úreprc            	       ó.  — e Zd ZU dZ edd¬«      Zeed<    ed¬«      Ze	ed<    ed¬«      Z
eed<    ed¬«      Ze	ed	<    ed¬«      Ze	ed
<    ed¬«      Ze	ed<    ed¬«      Ze	ed<    ed¬«      Ze	ed<    ed¬«      Zee   ed<    edd¬«      Zeed<    edd¬«      Zeed<    edd¬«      Ze	ed<    edd¬«      Ze	ed<    edd¬«      Zeed<    edd¬«      Zee	ef   ed<    edd¬«      Zee	ef   ed<    eed¬«      Ze eef   ed<   e!	 d0dededee   fd„«       Z"e#dee$   fd„«       Z%d1ded   de	fd „Z&	 d0ded   d!ee'   fd"„Z(d#e)fd$„Z*dedefd%„Z+d#e)ddddfd&„Z,d'efd(„Z-d2d)„Z.ddd!e'de	fd*„Z/d+d,de	fd-„Z0d.e1e   dee1e   e	f   fd/„Z2y)3ÚCacheActionsa´  Translates cache settings and headers into specific actions to take for a given cache item.
     The resulting actions are then handled in :py:meth:`CachedSession.send`.

    .. rubric:: Notes

    * See :ref:`precedence` for behavior if multiple sources provide an expiration
    * See :ref:`headers` for more details about header behavior
    * The following arguments/properties are the outputs of this class:

    Args:
        cache_key: The cache key created based on the initial request
        error_504: Indicates the request cannot be fulfilled based on cache settings
        expire_after: User or header-provided expiration value
        send_request: Send a new request
        resend_request: Send a new request to refresh a stale cache item
        resend_async: Return a stale cache item, and send a non-blocking request to refresh it
        skip_read: Skip reading from the cache
        skip_write: Skip writing to the cache
    NF)Údefaultr%   Ú	cache_key)r(   Ú	error_504Úexpire_afterÚsend_requestÚresend_requestÚresend_asyncÚ	skip_readÚ
skip_writeÚvary_cache_keyÚ_directivesÚ	_settingsÚ_only_if_cachedÚ_refreshÚ_requestÚ_stale_if_errorÚ_stale_while_revalidate)Úfactoryr%   Ú_validation_headersÚrequestÚsettingsc                 ó  — |xs
 t        «       }t        j                  |j                  «      }t        j                  d|› �«       t        |j                  t        |j                  |j                  «      |j                  «      }|j                  xs	 |t        k(  }|j                  xs |j                  }|j                   xs |j                   }|j                  t"        k(  xs |j$                  }	|j&                  xs |j&                  }
|j(                  xs |j(                  }|j*                  t-        ||«       ||dœ}t/        d|«        | |||||	||t1        |j3                  «       «      |j                  |
|¬«      }|S )ai  Initialize from request info and cache settings.

        Note on refreshing: `must-revalidate` isn't a standard request header, but is used here to
        indicate a user-requested refresh. Typically that's only used in response headers, and
        `max-age=0` would be used by a client to request a refresh. However, this would conflict
        with the `expire_after` option provided in :py:meth:`.CachedSession.request`.

        Args:
            cache_key: The cache key created based on the initial request
            request: The outgoing request
            settings: Session-level cache settings
        z'Cache directives from request headers: )údisabled cacheúdisabled methodzdisabled by headers or refreshúdisabled by expirationÚread)r)   Ú
directivesr+   Úonly_if_cachedÚrefreshr;   r<   r/   r0   Ústale_if_errorÚstale_while_revalidate)r"   r   Úfrom_headersÚheadersÚloggerÚdebugr   Úmax_ager    ÚurlÚurls_expire_afterr+   Úactual_no_cacher   Úno_cacheÚno_storerC   r   Úmust_revalidaterE   rF   ÚdisabledÚ_is_method_allowedÚ_log_cache_criteriaÚanyÚvalues)Úclsr)   r;   r<   rB   r+   rN   Úkinda_no_cacherC   rD   rE   rF   Úread_criteriaÚactionss                 úi/var/www/html/Astrologybackend/backend/venv/lib/python3.12/site-packages/requests_cache/policy/actions.pyÚfrom_requestzCacheActions.from_requestT   so  € ð& Ò.œ}›ˆÜ$×1Ñ1°'·/±/ÓBˆ
Ü�‰Ð>¸z¸lÐKÔLô  Ø×ÑÜ˜wŸ{™{¨H×,FÑ,FÓGØ×!Ñ!ó
ˆð %×4Ñ4ÒT¸ÌÑ8TˆØ#×,Ñ,ÒC°
×0CÑ0CˆØ!×0Ñ0ÒM°J×4MÑ4MˆØ×$Ñ$Ô(:Ñ:ÒX¸j×>XÑ>XˆØ!×0Ñ0ÒM°J×4MÑ4Mˆà×+Ñ+ÒP¨z×/PÑ/Pð 	ð '×/Ñ/Ü#5°g¸xÓ#HÐHØ.<Ø&5ñ	
ˆô 	˜F MÔ2áØØ!Ø%Ø)ØØØÜ˜-×.Ñ.Ó0Ó1Ø!×*Ñ*Ø)Ø#9ô
ˆð ˆó    Úreturnc                 ó,   — t        | j                  «      S )z®Convert the user/header-provided expiration value to a datetime. Applies to new cached
        responses, and previously cached responses that are being revalidated.
        )r   r+   )Úselfs    r[   ÚexpireszCacheActions.expires”   s   € ô
 ' t×'8Ñ'8Ó9Ð9r]   Úcached_responser$   Úerrorc                 óª  — |€y|j                   �*|j                  r| j                  du s|r| j                  du ry|r,| j                  r t	        t        | j                  «      ¬«      }nR|j                  r,| j                  r t	        t        | j                  «      ¬«      }n| j                  j                  «       }t        «       |j                   |z   k  S )zìDetermine whether a given cached response is "fresh enough" to satisfy the request,
        based on:

        * min-fresh
        * max-stale
        * stale-if-error (if an error has occurred)
        * stale-while-revalidate
        FT)Úseconds)	ra   Ú
is_expiredr8   r7   r   r   r2   Úget_expire_offsetr!   )r`   rb   rc   Úoffsets       r[   Ú	is_usablezCacheActions.is_usable›   s¸   € ð Ð"Øà×#Ñ#Ð+Ø×*Ò*¨t×/KÑ/KÈtÑ/SÙ˜$×.Ñ.°$Ñ6àá�t×+Ò+ÜÔ'=¸d×>RÑ>RÓ'SÔT‰Fà×'Ò'¨D×,HÒ,HÜÔ'=¸d×>ZÑ>ZÓ'[Ô\‰Fð ×%Ñ%×7Ñ7Ó9ˆFä‹x˜/×1Ñ1°FÑ:Ñ:Ð:r]   Ú
create_keyc                 ó¬  — | j                  |«      }| j                  |d¬«      }|s| j                  r
|sd| _        na|€d| _        nW|r | j                  ||fi |¤Žsd| _        n9|s| j                  r|sd| _        n!|j                  r|r| j                  rd| _        |�| j                  s| j                  |«       t        j                  d| › �«       y)a²  Determine if we can reuse a cached response, or set headers for a conditional request
        if possible.

        Used after fetching a cached response, but before potentially sending a new request.

        Args:
            cached_response: Cached response to examine
            create_key: Cache key function, used for validating ``Vary`` headers
            key_kwargs: Additional keyword arguments for ``create_key``.
        T)rc   NzPost-read cache actions: )ri   r4   r*   r,   Ú_validate_varyr-   rf   r8   r.   Ú_update_validation_headersrI   rJ   )r`   rb   rj   Ú
key_kwargsÚusable_responseÚusable_if_errors         r[   Úupdate_from_cached_responsez(CacheActions.update_from_cached_response¸   sË   € ð  Ÿ.™.¨Ó9ˆØŸ.™.¨À˜.ÓEˆñ  4×#7Ò#7ÁØ!ˆD�NàÐ$Ø $ˆDÕáÐ 3 × 3Ñ 3°OÀZÑ ^ÐS]Ò ^Ø $ˆDÕá ¨$×*>Ò*>Á?Ø"&ˆDÕà×'Ò'©OÀ×@\Ò@\Ø $ˆDÔàÐ&¨t×/CÒ/CØ×+Ñ+¨OÔ<Ü�‰Ð0°°Ð7Õ8r]   Úresponsec                 ó–  — t        j                  |j                  «      }| j                  j                  r| j                  |«       | j                  t        k(  xr |j                   }| j                  t        k(  }| j                  j                  }|duxr	  ||«       }| j                  j                  t        |j                  | j                  «       |j                  | j                  j                  v|| j                   |xs || j                  j"                  dœ}t%        |j'                  «       «      | _        t)        d|«       y)z­Update expiration + actions based on headers and other details from a new response.

        Used after receiving a new response, but before saving it to the cache.
        N)r>   r?   zdisabled statuszdisabled by filterzdisabled by headersr@   zdisabled by read-onlyÚwrite)r   rG   rH   r3   Úcache_controlÚ_update_from_response_headersr+   r   Úhas_validatorr   Ú	filter_fnrR   rS   r;   Ústatus_codeÚallowable_codesr0   Ú	read_onlyrU   rV   rT   )r`   rr   rB   Ú
skip_staleÚdo_not_cacheÚcallbackÚfiltered_outÚwrite_criterias           r[   Úupdate_from_responsez!CacheActions.update_from_responseß   s  € ô
 %×1Ñ1°(×2BÑ2BÓCˆ
Ø�>‰>×'Ò'Ø×.Ñ.¨zÔ:ð ×&Ñ&Ô*<Ñ<Ò]ÀZ×E]ÑE]ÐA]ˆ
Ø×(Ñ(¬LÑ8ˆð —>‘>×+Ñ+ˆØ tÐ+ÒF±H¸XÓ4FÐ0Fˆð #Ÿn™n×5Ñ5Ü#5°h×6FÑ6FÈÏÉÓ#WÐWØ'×3Ñ3¸4¿>¹>×;YÑ;YÐYØ".Ø#'§?¡?Ø&2Ò&@°jØ%)§^¡^×%=Ñ%=ñ
ˆô ˜n×3Ñ3Ó5Ó6ˆŒÜ˜G ^Õ4r]   c                 óP   — |j                   j                  | j                  «       |S )z:Apply validation headers (if any) before sending a request)rH   Úupdater:   )r`   r;   s     r[   Úupdate_requestzCacheActions.update_requestý   s   € à�‰×Ñ˜t×7Ñ7Ô8Øˆr]   c                 ód  ‡— t         j                  d|j                  j                  › d�«       t	        ˆfd„|j
                  j                  «       D «       «      }| j                  ‰j                  k7  }| j                  j                  xs. | j                  j                  xs | j                  j                  }|xs |xs | | _        | j                  ‰_        ‰j
                  j                  |j
                  «       d‰j
                  v rd‰j
                  v r‰j
                  d= d‰_        ‰S )zGAfter revalidation, update the cached response's expiration and headerszResponse for URL z has not been modifiedc              3   ó`   •K  — | ]%  \  }}‰j                   j                  |«      |k7  –— Œ' y ­w©N)rH   Úget)Ú.0ÚkÚvrb   s      €r[   ú	<genexpr>z;CacheActions.update_revalidated_response.<locals>.<genexpr>  s0   øè ø€ ò 
Ù48°A°qˆO×#Ñ#×'Ñ'¨Ó*¨aÕ/ñ
ùs   ƒ+.zContent-LengthzTransfer-EncodingT)rI   rJ   r;   rL   rU   rH   Úitemsra   r3   r{   rR   r2   rP   r0   rƒ   Úrevalidated)r`   rr   rb   Úheaders_changedÚexpiration_changedÚpermanent_skips     `   r[   Úupdate_revalidated_responsez(CacheActions.update_revalidated_response  s  ø€ ô 	�‰Ð(¨×)9Ñ)9×)=Ñ)=Ð(>Ð>TÐUÔVô
 ó 
Ø<D×<LÑ<L×<RÑ<RÓ<Tô
ó 
ˆð "Ÿ\™\¨_×-DÑ-DÑDÐà�N‰N×$Ñ$Ò\¨¯©×(?Ñ(?Ò\À4×CSÑCS×C\ÑC\ð 	ð )ÒWÐ1CÒ1VÀÐ,WˆŒà"&§,¡,ˆÔð 	×Ñ×&Ñ& x×'7Ñ'7Ô8à × 7Ñ 7Ñ7Ø# ×'>Ñ'>Ñ>à×'Ñ'Ð(8Ð9à&*ˆÔ#ØÐr]   rB   c                 ó@  — t         j                  d|› �«       | j                  xs |j                  | _        |j                  rt
        | _        n0t        |j                  |j                  | j                  «      | _        | j                  xs |j                  | _
        y)z@Check response headers for expiration and other cache directivesz(Cache directives from response headers: N)rI   rJ   r7   rE   Ú	immutabler   r+   r   rK   ra   r0   rP   )r`   rB   s     r[   rv   z*CacheActions._update_from_response_headers"  s€   € ä�‰Ð?À
¸|ÐLÔMà#×3Ñ3ÒP°z×7PÑ7PˆÔØ×ÒÜ ,ˆDÕä (Ø×"Ñ"Ø×"Ñ"Ø×!Ñ!ó!ˆDÔð
 Ÿ/™/Ò@¨Z×-@Ñ-@ˆ�r]   c                 óà  — t        j                  |j                  «      }|j                  xr2 |j                  xs$ | j
                  xs | j                  j                  }| j                  j                  xr |j                  xs |j                  }|s|rY|j                  r|j                  | j                  d<   |j                  r|j                  | j                  d<   d| _        d| _        yy)z®If needed, get validation headers based on a cached response. Revalidation may be
        triggered by a stale response, request headers, or cached response headers.
        zIf-None-MatchzIf-Modified-SinceFTN)r   rG   rH   rw   rf   r5   r3   Úalways_revalidateru   rO   rQ   Úetagr:   Úlast_modifiedr,   r-   )r`   rb   rB   Ú
revalidateÚcc_revalidates        r[   rm   z'CacheActions._update_validation_headers1  sÒ   € ô %×1Ñ1°/×2IÑ2IÓJˆ
à×-Ñ-ò 
Ø×&Ñ&Ò[¨$¯-©-Ò[¸4¿>¹>×;[Ñ;[ð 	ð Ÿ™×4Ñ4ò 
Ø×ÑÒ= :×#=Ñ#=ð 	ñ
 ™Ø�ŠØ<F¿O¹O�×(Ñ(¨Ñ9Ø×'Ò'Ø@J×@XÑ@X�×(Ñ(Ð)<Ñ=Ø %ˆDÔØ"&ˆDÕð 'r]   c                 ó¤  ‡ — |j                   j                  d«      }|sy|dk(  ry|j                  d«      D �cg c]   }|j                  «       j	                  «       ‘Œ" }}|j
                  r|j
                  d   j                  n|j                  }d|v r8‰ j                  |«      st        j                  d«       y|j                  d«       |sy‰ j                  j                  xs g D �ch c]  }|j	                  «       ’Œ }	}|	t        |«      z  }
|
r-t        ˆ fd	„|
D «       «      rt        j                  d
|
› �«       y||d<    ||fi |¤Ž} |‰ j                  fi |¤Ž}||k(  }|s\t!        ‰ j                  j                   |j                   |d   «       ‰ j#                  |«      }||d<    |‰ j                  fi |¤Ž‰ _        |S c c}w c c}w )zTIf the cached response contains Vary, check that the specified request headers matchÚVaryTÚ*Fú,éÿÿÿÿÚcookiez'Failed Vary check: cookies do not matchc              3   óN   •K  — | ]  }|‰j                   j                  v –— Œ y ­wr‡   )r6   rH   )r‰   Úhr`   s     €r[   rŒ   z.CacheActions._validate_vary.<locals>.<genexpr>i  s    øè ø€ Ò!UÀ ! t§}¡}×'<Ñ'<Ô"<Ñ!Uùs   ƒ"%z=Failed Vary check: Vary header(s) are in ignored_parameters: Úmatch_headers)rH   rˆ   ÚsplitÚstripÚlowerÚhistoryr;   Ú_cookies_matchrI   rJ   Úremover3   Úignored_parametersÚsetrU   r6   Ú_log_vary_diffÚ_merge_match_headersr1   )r`   rb   rj   rn   ÚvaryrŠ   r£   Úvary_requestr¢   ÚignoredÚignore_overlapÚvary_key_cachedÚvary_key_currentÚheaders_matchÚmergeds   `              r[   rl   zCacheActions._validate_varyH  sË  ø€ ð ×&Ñ&×*Ñ*¨6Ó2ˆÙØØ�SŠ[Øð 59·J±J¸s³OÖD¨q˜Ÿ™›Ÿ™Õ*ÐDˆÐDð ×&Ò&ð ×#Ñ# BÑ'×/Ò/à ×(Ñ(ð 	ð �}Ñ$Ø×&Ñ& |Ô4Ü—‘ÐFÔGØØ× Ñ  Ô*áØð (,§~¡~×'HÑ'HÒ'NÈBÖP �1—7‘7•9ÐPˆÐPØ ¤3 }Ó#5Ñ5ˆÙœcÓ!UÀnÔ!UÔUÜ�L‰LØOÐP^ÐO_Ð`ôð à&3ˆ
�?Ñ#Ù$ \Ñ@°ZÑ@ˆÙ% d§m¡mÑB°zÑBÐØ(¨OÑ;ˆÙÜØ—‘×%Ñ%Ø×$Ñ$Ø˜?Ñ+ôð ×.Ñ.¨}Ó=ˆFØ*0ˆJ�Ñ'Ù",¨T¯]©]Ñ"I¸jÑ"IˆDÔØÐùòS Eùò& Qs   ¹%GÃ,GÚcached_requestr#   c                 ó˜   — dt         t           dt        fd„} ||j                  «      } |t	        | j
                  dd«      «      }||k(  S )zOCompare cookies between the current request and cached request for Vary: CookieÚcookiesr^   c                 ó˜   — | xs i j                  «       D ��cg c]  \  }}|› d|› �‘Œ }}}dj                  t        |«      «      S c c}}w )Nú=z; )r�   ÚjoinÚsorted)r¸   rŠ   r‹   Úcookie_lists       r[   Únormalize_cookiesz6CacheActions._cookies_match.<locals>.normalize_cookies‚  sJ   € Ø3:²=¸b×2GÑ2GÓ2I×J©$¨!¨Q˜a˜S  ! š:ÐJˆKÑJØ—9‘9œV KÓ0Ó1Ð1ùó Ks   ˜AÚ_cookiesN)r   r
   Ústrr¸   Úgetattrr6   )r`   r¶   r¾   Úcached_cookiesÚrequest_cookiess        r[   r¨   zCacheActions._cookies_match  sN   € ð	2¤x´Ñ'8ð 	2¼Só 	2ñ +¨>×+AÑ+AÓBˆÙ+¬G°D·M±MÀ:ÈtÓ,TÓUˆØ .Ñ0Ð0r]   Úvary_headersc           
      ó°   — | j                   j                  }|du ry|s|S t        t        ||D �cg c]  }|j	                  «       ‘Œ c}z   «      «      S c c}w )z}Merge Vary headers with user-configured match_headers to build a complete
        set of headers for the secondary cache key.T)r3   r£   r¼   r«   r¦   )r`   rÄ   Úuser_headersr¢   s       r[   r­   z!CacheActions._merge_match_headersŠ  sP   € ð —~‘~×3Ñ3ˆØ˜4ÑØÙØÐÜ”c˜,¸\Ö)J¸¨!¯'©'­)Ò)JÑJÓKÓLÐLùÒ)Js   ¯Ar‡   )F)rb   r$   )3Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r)   rÀ   Ú__annotations__r*   Úboolr+   r   r,   r-   r.   r/   r0   r1   r   r2   r   r3   r"   r4   r5   r6   r   r7   r   r8   Údictr:   r   Úclassmethodr\   Úpropertyr   ra   ri   r   rq   r   r�   r„   r’   rv   rm   rl   r¨   r	   r­   © r]   r[   r'   r'   '   s…  … ññ*  4¨eÔ4€IˆsÓ4Ù EÔ*€IˆtÓ*Ù#(°Ô#6€L�.Ó6Ù uÔ-€L�$Ó-Ù ¨Ô/€N�DÓ/Ù uÔ-€L�$Ó-Ù EÔ*€IˆtÓ*Ù UÔ+€J�Ó+Ù$)°$Ô$7€N�H˜S‘MÓ7ñ $)°¸EÔ#B€K�ÓBÙ$¨T¸Ô>€Iˆ}Ó>ñ "¨%°eÔ<€O�TÓ<Ù 5¨uÔ5€HˆdÓ5Ù %¨d¸Ô ?€HˆoÓ?Ù38ÀÈEÔ3R€O�U˜4 Ð/Ñ0ÓRÙ;@ÈÐTYÔ;ZÐ˜U 4¨Ð#7Ñ8ÓZÙ*/¸À5Ô*IÐ˜˜c 3˜h™ÓIàð
 -1ñ	=àð=ð !ð=ð ˜=Ñ)ò	=ó ð=ð~ ð:˜ (Ñ+ò :ó ð:ñ;¨Ð2BÑ)Cð ;ÈDó ;ð@ -1ñ%9à!Ð"2Ñ3ð%9ð ˜[Ñ)ó%9ðN5¨Xó 5ð< oð ¸/ó ð
Ø ðØ3Cðà	óð@A¸ó Aó'ð.5Ø/ð5Ø=Hð5à	ó5ðn	1¨_ð 	1Àó 	1ðM°°c±ð M¸uÀTÈ#ÁYÐPTÀ_Ñ?Uô Mr]   r'   r;   r<   r^   c                 óÊ   ‡— | j                   xs
 t        «       }t        D �cg c]  }|j                  |«      ‘Œ }}|| j                  gz  }t        ˆfd„|D «       «      S c c}w )z7Check request method as well as method override headersc              3   óF   •K  — | ]  }|d uxr |‰j                   v –— Œ y ­wr‡   )Úallowable_methods)r‰   Úmr<   s     €r[   rŒ   z%_is_method_allowed.<locals>.<genexpr>š  s(   øè ø€ ÒRÀQˆq˜ˆ}Ò@  h×&@Ñ&@Ð!@Ó@ÑRùs   ƒ!)rH   r   ÚMETHOD_OVERRIDE_HEADERSrˆ   ÚmethodrU   )r;   r<   rH   rŠ   Úmethodss    `   r[   rS   rS   •  sX   ø€ à�o‰oÒ6Ô!4Ó!6€GÜ'>Ö? !ˆw�{‰{˜1�~Ð?€GÐ?Ø�—‘ÐÑ€GÜÓRÈ'ÔRÓRÐRùò @s   ¢A Ú	headers_1Ú	headers_2r®   c                 ó  — t         j                  t        kD  ryt        | «      } t        |«      }|D �cg c](  }| j	                  |«      |j	                  |«      k7  sŒ'|‘Œ* }}t         j                  ddj                  |«      › �«       yc c}w )z:Log which specific headers specified by Vary did not matchNz)Failed Vary check. Non-matching headers: ú, )rI   Úlevelr   r   rˆ   rJ   r»   )rØ   rÙ   r®   rŠ   Únonmatchings        r[   r¬   r¬   �  sw   € ô ‡|�|”eÒØÜ! )Ó,€IÜ! )Ó,€IØ"ÖK˜ i§m¡m°AÓ&6¸)¿-¹-ÈÓ:JÓ&J’1ÐK€KÐKÜ
‡L�LÐ<¸T¿Y¹YÀ{Ó=SÐ<TÐUÕVùò Ls   ³(B
ÁB
Ú	operationÚcriteriac                 ó  — t         j                  t        kD  ryt        |j	                  «       «      r6dj                  |j                  «       D ��cg c]
  \  }}|sŒ	|‘Œ c}}«      }nd}t         j                  d| › d|› �«       yc c}}w )z8Log details on any failed checks for cache read or writeNrÛ   ÚPassedzPre-z cache checks: )rI   rÜ   r   rU   rV   r»   r�   rJ   )rÞ   rß   rŠ   r‹   Ústatuss        r[   rT   rT   «  sj   € ä‡|�|”eÒØÜ
ˆ8�?‰?ÓÔØ—‘¨(¯.©.Ó*:×@¡$ ! QºašAÓ@ÓA‰àˆÜ
‡L�L�4˜	�{ /°&°Ð:Õ;ùó As   Á
B
ÁB
N)3r   r   Úloggingr   r   Útypingr   r   r	   r
   r   r   r   Úattrsr   r   Úrequestsr   r   Úrequests.structuresr   Ú_utilsr   Ú
cache_keysr   Úmodelsr   Ú r   r   r   r   r   r   r   r   r    r!   r<   r"   r#   r$   rÕ   rÇ   rI   r'   rÌ   rS   rÀ   r¬   rT   rÐ   r]   r[   ú<module>rì      så   ðß (ß $ß V× VÑ Vç ß .Ý 3å Ý *Ý ÷÷ ÷ õ $áß6òÐ ñ 
�8Ó	€ñ ˆUÔôjM�9ó jMó ðjMðZS ð S¸=ð SÈTó SðWØ˜c 3˜hÑ'ðWà˜c 3˜hÑ'ðWð ˆs‰)óWð< 3ð <°$ô <r]   