
    ^i                        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  \R                  (       a  S SKJ	r	  \R                  " S5      r " S S\ R                  5      r\R                  " SS	9S
\S\R                  \\4   4S j5       r\R                  " SS	9S\S\S\4S j5       rS\S\R                  \\4   4S jrS\R,                  \\R                  \\4   4   S\R                  \\4   4S jrg)    N   )
StrOrBytesSOCKS5ATypez'^\[(?P<address>[^\]]+)\]:(?P<port>\d+)$c                   4    \ rS rSrSrSrSr\SS j5       rSr	g)	AddressType   IPV4IPV6DNc                     SSK Jn  XR                  :X  a  [        R                  $ XR
                  :X  a  [        R                  $ XR                  :X  a  [        R                  $ [        U5      e)Nr   r   )
socksio.socks5r   IPV4_ADDRESSr   r
   DOMAIN_NAMEr   IPV6_ADDRESSr   
ValueError)clssocks5atyper   s      G/home/james-whalen/.local/lib/python3.13/site-packages/socksio/utils.pyfrom_socks5_atypeAddressType.from_socks5_atype   sV    .222###333>>!444###%%     N)r   r   returnr   )
__name__
__module____qualname____firstlineno__r
   r   r   classmethodr   __static_attributes__r   r   r   r   r      s#    DD	B	& 	&r   r   @   )maxsizeaddrr   c                    [        U [        5      (       a  U R                  5       OU n  [        R                  [
        R                  " [
        R                  U 5      4$ ! [         ak     [        R                  [
        R                  " [
        R                  U 5      4s $ ! [         a%    [        R                  U R                  5       4s s $ f = ff = f)zKDetermines the type of address and encodes it into the format SOCKS expects)
isinstancebytesdecoder   r   socket	inet_ptonAF_INET6OSErrorr
   AF_INETr   encode)r#   s    r   encode_addressr.   "   s     'tU334;;=D1!1!1&//4!HHH 1	1##V%5%5fnnd%KKK 	1>>4;;=00	11s/   4A 
C)4B C *C
CCCaddress_typeencoded_addrc                 2   U [         R                  :X  a%  [        R                  " [        R                  U5      $ U [         R
                  :X  a%  [        R                  " [        R                  U5      $ U [         R                  :X  d   eUR                  5       $ )z&Decodes the address from a SOCKS reply)	r   r   r(   	inet_ntopr*   r
   r,   r   r'   )r/   r0   s     r   decode_addressr3   /   so     {'''>>	))	)=={~~---""$$r   addressc                 P   [        U [        5      (       a  U R                  5       OU n [        R                  " [
        U 5      nU(       a"  UR                  S5      UR                  S5      p OU R                  S5      u  pn U [        U5      4$ ! [         a    [        S5      Sef = f)zReturns a tuple (address: str, port: int) from an address string with a port
i.e. '127.0.0.1:8080', '[0:0:0:0:0:0:0:1]:3080' or 'localhost:8080'.

Note no validation is done on the domain or IP itself.
r4   port:zInvalid address + port. Please supply a valid domain name, IPV4 or IPV6 address with the port as a suffix, i.e. `127.0.0.1:3080`, `[0:0:0:0:0:0:0:1]:3080` or `localhost:3080`N)
r%   r&   r'   rematchIP_V6_WITH_PORT_REGEXgroup	partitionintr   )r4   r9   str_port_s       r   split_address_port_from_stringr@   ;   s     #-We"<"<gnn'GHH*G4E!KK	2EKK4G&005HH%% ;
 		s   B B%c                     [        U [        5      (       aR  U u  p[        U [        5      (       a  U R                  5       n [        U[        [        45      (       a  [        U5      nX4$ [        U 5      u  pX4$ )z@Returns an (address, port) from an address string-like or tuple.)r%   tupler&   r'   strr=   r@   )r4   r6   s     r   #get_address_port_tuple_from_addressrD   R   sk     '5!!gu%%nn&GdS%L))t9D = 7w?=r   )enum	functoolsr8   r(   typing_typesr   TYPE_CHECKINGr   r   compiler:   Enumr   	lru_cacheTupler&   r.   rC   r3   r=   r@   UnionrD   r   r   r   <module>rO      s     	   	* 

#MN &$)) &$ R 	1 	1[%5G(H 	1 !	1 R % %E %c % !%J 6<<S;Q .\\*fll:s?&CCD\\#s(r   