
    |h(                        d dl Z d dlZd dlZd dlZd dlmZ d dlmZmZ d dl	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mZmZmZmZmZ d dlmZ d dlmZ e j@                  jC                  dd	      Z"e j@                  jC                  d
d      Z# ed      Z$dZ%de&defdZ'de&de&de	jP                  fdZ)	 	 	 	 	 	 dde&de&de*de*de+de*de+de+dee	jP                     fdZ, G d d      Z- e-       Z.y)    N)Path)AnyOptional)__version__)ARGVENVIRONMENTIS_COLAB
IS_GIT_DIRIS_PIP_PACKAGELOGGERONLINEPYTHON_VERSIONRANKSETTINGSTESTS_RUNNINGTQDM	TryExceptcolorstrget_git_origin_url)GITHUB_ASSETS_NAMES)get_cpu_infoULTRALYTICS_HUB_APIzhttps://api.ultralytics.comULTRALYTICS_HUB_WEBzhttps://hub.ultralytics.comzUltralytics HUB: z]If this issue persists please visit https://github.com/ultralytics/hub/issues for assistance.urlreturnc                     t         st        d      ddlm} ddlm} |j                  |j                  d|  d             |j                  d      S )a/  
    Make an AJAX request with cookies attached in a Google Colab environment.

    Args:
        url (str): The URL to make the request to.

    Returns:
        (Any): The response data from the AJAX request.

    Raises:
        OSError: If the function is not run in a Google Colab environment.
    z:request_with_credentials() must run in a Colab environmentr   )output)displayz
            window._hub_tmp = new Promise((resolve, reject) => {
                const timeout = setTimeout(() => reject("Failed authenticating existing browser session"), 5000)
                fetch("a  ", {
                    method: 'POST',
                    credentials: 'include'
                })
                    .then((response) => resolve(response.json()))
                    .then((json) => {
                    clearTimeout(timeout);
                    }).catch((err) => {
                    clearTimeout(timeout);
                    reject(err);
                });
            });
            _hub_tmp)r	   OSErrorgoogle.colabr   IPythonr   
Javascripteval_js)r   r   r   s      T/var/www/html/test/engine/venv/lib/python3.12/site-packages/ultralytics/hub/utils.pyrequest_with_credentialsr&   (   sZ     RSS#OO u 	
( >>*%%    methodc                    |j                  dd      }|st        j                  | |fi |S t        j                  | |fddi|}t        t	        |t
              r|j                  j                  dd      n|      }	 t        |ddd	      }|j                  d
      D ]  }|j                  t        |              |j                          |S # t        j                  j                  $ r |j                          Y |S w xY w)a  
    Make an HTTP request using the specified method and URL, with an optional progress bar.

    Args:
        method (str): The HTTP method to use (e.g. 'GET', 'POST').
        url (str): The URL to send the request to.
        **kwargs (Any): Additional keyword arguments to pass to the underlying `requests.request` function.

    Returns:
        (requests.Response): The response object from the HTTP request.

    Notes:
        - If 'progress' is set to True, the progress bar will display the download progress for responses with a known
          content length.
        - If 'progress' is a number then progress bar will display assuming content length = progress.
    progressFstreamTzcontent-lengthr   Bi   )totalunit
unit_scaleunit_divisor)
chunk_size)poprequestsrequestint
isinstanceboolheadersgetr   iter_contentupdatelenclose
exceptionsChunkedEncodingError)r(   r   kwargsr*   responser-   pbardatas           r%   requests_with_progressrD   Q   s    " zz*e,H6v66CDCFCHZRV=W  $$%5q9]efE%cdN))T): 	#DKKD	"	#

 O 33 Os   =AC -D ?D retrytimeoutthreadcodeverboser*   c                     dt              fd       }	| |f}
||d<   |r(t        j                  |	|
|d      j                          y |	|
i |S )a)  
    Make an HTTP request using the 'requests' library, with exponential backoff retries up to a specified timeout.

    Args:
        method (str): The HTTP method to use for the request. Choices are 'post' and 'get'.
        url (str): The URL to make the request to.
        retry (int, optional): Number of retries to attempt before giving up.
        timeout (int, optional): Timeout in seconds after which the function will give up retrying.
        thread (bool, optional): Whether to execute the request in a separate daemon thread.
        code (int, optional): An identifier for the request, used for logging purposes.
        verbose (bool, optional): A flag to determine whether to print out to console or not.
        progress (bool, optional): Whether to show a progress bar during the request.
        **kwargs (Any): Keyword arguments to be passed to the requests function specified in method.

    Returns:
        (requests.Response | None): The HTTP response object. If the request is executed in a separate thread, returns
            None.
    )i  i  )rI   c                    d}t        j                          }t        	dz         D ]  }t        j                          |z
  kD  r |S t        | |fi |}|j                  dk  r |S 	 |j	                         j                  dd      }|dk(  r|j                  
v r|	r	d	 d	 d
ndz  }n0|j                  dk(  r!|j                  }d|d    d|d    d|d    d
}r5t        j                  t         | dt         d|j                   d d	       |j                  
vr|c S t        j                  d|z          |S # t        $ r d}Y w xY w)zNMake HTTP requests with retries and timeouts, with optional progress tracking.N   i,  messagezNo JSON message.zUnable to read JSON.r   z
 Retrying zx for zs. i  zRate limit reached (zX-RateLimit-Remaining/zX-RateLimit-Limitz). Please retry after zRetry-After z (z #)   )timerangerD   status_codejsonr9   AttributeErrorr8   r   warningPREFIXHELP_MSGsleep)func_methodfunc_urlfunc_kwargsrt0imhrH   rE   retry_codesrF   rI   s           r%   funczsmart_request.<locals>.func   s    YY[uqy! 	A		b G+, + '{HLLA}}s"& %+FFHLL,>? Av==K/%:eWF7)2>ROA]]c)		A.q1H/I.J!ANaLbKc d../.>-?rC  NNfXaS(2amm_BtfTU#VW==3HJJq!t/	0 ! " +*+s   ' EEEr*   T)targetargsr@   daemonN)r   	threadingThreadstart)r(   r   rE   rF   rG   rH   rI   r*   r@   re   rg   rd   s     `` ``    @r%   smart_requestrl   q   sf    : Kw  < 3;D!F:4tLRRTT$V$$r'   c                   "    e Zd ZdZdZd ZddZy)Eventsan  
    A class for collecting anonymous event analytics.

    Event analytics are enabled when sync=True in settings and disabled when sync=False. Run 'yolo settings' to see and
    update settings.

    Attributes:
        url (str): The URL to send anonymous events.
        events (list): List of collected events to be sent.
        rate_limit (float): The rate limit in seconds for sending events.
        t (float): Rate limit timer in seconds.
        metadata (dict): A dictionary containing metadata about the environment.
        enabled (bool): A flag to enable or disable Events based on certain conditions.
    zihttps://www.google-analytics.com/mp/collect?measurement_id=G-X8NCJYTQXM&api_secret=QLQrATrNSwGRFRLE-cbHJwc           
         g | _         d| _        d| _        t        t        d         j
                  dk(  t        rdn	t        rdndt        j                  dd	      d   t               t        t        t        t        j                         d
z        dd| _        t         d   xr0 t"        dv xr& t$         xr t&        xr t        xs t)               dk(  | _        y)zVInitialize the Events object with default values for events, rate_limit, and metadata.g      >@g        r   yologitpipother.rL   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
   r   r   rsplitr   r   r   roundrandommetadatar   r   r   r   r   enabled)selfs    r%   __init__zEvents.__init__   s    Q=%%/ *uW$++C3A6>"$ 67$(

 V mm!!m m  k#5#7;k#k 	r'   Nc                 B   | j                   syt        | j                        dk  ri | j                  |j                  |j
                  t        v r|j
                  ndt        |      d}|j                  dk(  r|j                  |d<   | j                  j                  |j                  |d       t        j                         }|| j                  z
  | j                  k  ryt        d   | j                  d	}t        d
| j                   |dd       g | _        || _        y)a@  
        Attempt to add a new event to the events list and send events if the rate limit is reached.

        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_idr   postr   F)rV   rE   rI   )r   r<   r   r   r   r   r   strmoder   appendrS   r   r   r   rl   r   )r   cfgr   r   r   rC   s         r%   __call__zEvents.__call__   s     || t{{b --&)ii3F&FHf+	F xx8##&::x KKFCD IIKJ$//) &f-E 	fdhhTEJ r'   )N)__name__
__module____qualname____doc__r   r   r    r'   r%   rn   rn      s     vC
0&r'   rn   )      Tr~   TF)/osr   ri   rS   pathlibr   typingr   r   r3   ultralyticsr   ultralytics.utilsr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   ultralytics.utils.downloadsr   ultralytics.utils.torch_utilsr   environr9   HUB_API_ROOTHUB_WEB_ROOTrY   rZ   r   r&   ResponserD   r5   r7   rl   rn   r   r   r'   r%   <module>r      sL   
        #    " < 6zz~~35RSzz~~35RS	%	&j&&# &&# &&R3 S x?P?P F C%C%	C% C% 	C%
 C% C% C% C% h C%LP Ph 
r'   