
    hG              	           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	  S SK
JrJ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	\S
\S\SS4S jjr " S S5      r\" 5       rg)    N)Path)Thread)Requesturlopen)SETTINGS__version__)ARGVENVIRONMENTGITIS_PIP_PACKAGEONLINEPYTHON_VERSIONRANKTESTS_RUNNING)GITHUB_ASSETS_NAMES)get_cpu_infourldatatimeoutreturnc                      [         R                  " USS9R                  5       n[        XSS0S9n[	        XBS9R                  5         g! [         a     gf = f)z"Send a one-shot JSON POST request.),:)
separatorszContent-Typezapplication/json)r   headers)r   N)jsondumpsencoder   r   close	Exception)r   r   r   bodyreqs        R/home/james-whalen/.local/lib/python3.13/site-packages/ultralytics/utils/events.py_postr$      sU    zz$:6==?c~?Q.RS%++- s   AA	 	
AAc                   4    \ rS rSrSrSrSS jrS	SS jjrSrg)
Events   a  
Collect and send anonymous usage analytics with rate-limiting.

Event collection and transmission are enabled when sync is enabled in settings, the current process is rank -1 or 0,
tests are not running, the environment is online, and the installation source is either pip or the official
Ultralytics GitHub repository.

Attributes:
    url (str): Measurement Protocol endpoint for receiving anonymous events.
    events (list[dict]): In-memory queue of event payloads awaiting transmission.
    rate_limit (float): Minimum time in seconds between POST requests.
    t (float): Timestamp of the last transmission in seconds since the epoch.
    metadata (dict): Static metadata describing runtime, installation source, and environment.
    enabled (bool): Flag indicating whether analytics collection is active.

Methods:
    __init__: Initialize the event queue, rate limiter, and runtime metadata.
    __call__: Queue an event and trigger a non-blocking send when the rate limit elapses.
zihttps://www.google-analytics.com/mp/collect?measurement_id=G-X8NCJYTQXM&api_secret=QLQrATrNSwGRFRLE-cbHJwNc           
      &   / U l         SU l        SU l        [        [        S   5      R
                  S:H  [        R                  (       a  SO[        (       a  SOS[        R                  " SS	5      S   [        5       [        [        [        [        R                  " 5       S
-  5      SS.U l        ["        S   =(       aO    [$        S;   =(       a?    [&        (       + =(       a-    [(        =(       a     [        =(       d    [        R*                  S:H  U l        g)zRInitialize the Events instance with queue, rate limiter, and environment metadata.g      >@g        r   yologitpipother.   g  4&kCi  )cliinstallpythonCPUversionenv
session_idengagement_time_msecsync>   r   z.https://github.com/ultralytics/ultralytics.gitN)events
rate_limittr   r	   namer   is_repor   r   rsplitr   r   r
   roundrandommetadatar   r   r   r   originenabled)selfs    r#   __init__Events.__init__1   s    Q=%%/ #u..g$++C3A6>"$ 67$(

 V cc!!c c  a3::1a#a 	    c                    U R                   (       d  g[        U R                  5      S:  a  0 U R                  EUR                  UR
                  [        ;   a  UR
                  OS[        U5      S.EnUR                  S:X  a  UR                  US'   U R                  R                  UR                  US.5        [        R                  " 5       nX@R                  -
  U R                  :  a  g[        U R                  5      n[        [         U R"                  [$        S   US	.4S
S9R'                  5         / U l        X@l        g)a  
Queue an event and flush the queue asynchronously when the rate limit elapses.

Args:
    cfg (IterableSimpleNamespace): The configuration object containing mode and task information.
    device (torch.device | str, optional): The device type (e.g., 'cpu', 'cuda').
N   custom)taskmodeldeviceexportformat)r<   paramsuuid)	client_idr9   T)targetargsdaemon)rC   lenr9   rA   rK   rL   r   strmoderO   appendtimer;   r:   listr   r$   r   r   start)rD   cfgrM   rP   r;   payload_eventss         r#   __call__Events.__call__I   s     || t{{b --&)ii3F&FHf+	F xx8##&::x KKFCD IIKJ$//) dkk*(((6*:nUV	
 %' rG   )rC   r9   rA   r:   r;   )r   N)N)	__name__
__module____qualname____firstlineno____doc__r   rE   r_   __static_attributes__ rG   r#   r&   r&      s    ( vC
0' 'rG   r&   )g      @) r   r@   rZ   pathlibr   	threadingr   urllib.requestr   r   ultralyticsr   r   ultralytics.utilsr	   r
   r   r   r   r   r   r   ultralytics.utils.downloadsr   ultralytics.utils.torch_utilsr   rW   dictfloatr$   r&   r9   rg   rG   r#   <module>rq      sb         + - q q q ; 6s $   V Vr 
rG   