U
    /e3                     @   s  d dl Z d dlZd dlZd dlZd dlmZ dejks:td dlZd dl	m
Z d dlZd dlmZ d dlmZ dZdejeZG d	d
 d
eZe Zddde_dd Zeed dZdd Zdd Zdd fddZdd Zdd Z dd Z!dd dfd d!Z"d"defd#defd$d%ed&fd'ded(dfd)d*e d+fd,d*e d-fd.ded/dfd0d1e!fd2d3ed4fd5d6e"d7dd8fd9d:e"d;fd<d=e"d>fd?d@e"dAefgZ#dBdC Z$dDdE Z%dFdG Z&dHdI Z'dJdK Z(dLdM Z)dNdO Z*dPdQ Z+dS )R    N)	find_specpydevd)pydevd_runpy)log)apiz2<filename> | -m <module> | -c <code> | --pid <pid>a0  debugpy {0}
See https://aka.ms/debugpy for documentation.

Usage: debugpy --listen | --connect
               [<host>:]<port>
               [--wait-for-client]
               [--configure-<name> <value>]...
               [--log-to <path>] [--log-to-stderr]
               {1}
               [<arg>]...
c                   @   s,   e Zd ZdZdZdZdZdZdZdZ	dZ
dS )OptionsNF)__name__
__module____qualname__modeaddresslog_tolog_to_stderrtargettarget_kindwait_for_clientadapter_access_token r   r   6/tmp/pip-unpacked-wheel-dg3irmqq/debugpy/server/cli.pyr   *   s   r   noneT)ZqtZ
subProcessc                    s    fdd}|S )Nc                    sH    | }d k	r&|k r&t dd k	rD|krDt d|S )Nzmust be >= {0}zmust be < {0})
ValueErrorformat)snparserstartstopr   r   parse:   s    zin_range.<locals>.parser   )r   r   r   r   r   r   r   in_range9   s    r   c                 C   s   t ttjd td d S )Nfiler   )printHELPsysstderrexitswitchitr   r   r   print_help_and_exitH   s    r*   c                 C   s   t tj td d S )Nr   )r"   debugpy__version__r$   r&   r'   r   r   r   print_version_and_exitM   s    
r-   c                 C   s   | S Nr   xr   r   r   <lambda>R       r1   c                    s    fdd}|S )Nc                    s    t |}tt| d S r.   )nextsetattroptions)argr)   valuer   varnamer   r   doS   s    zset_arg.<locals>.dor   )r9   r   r:   r   r8   r   set_argR   s    r;   c                    s    fdd}|S )Nc                    s   t t  d S r.   )r4   r5   )r6   r)   r7   r9   r   r   r:   [   s    zset_const.<locals>.dor   )r9   r7   r:   r   r<   r   	set_constZ   s    r=   c                    s    fdd}|S )Nc                    s   t jd k	rtdt|}|d\}}}|s6d}|}zt|}W n tk
rZ   d}Y nX d|  krpdk szn td t _||ft _d S )Nz---listen and --connect are mutually exclusive:z	127.0.0.1r   i   zinvalid port number)r5   r   r   r3   	partitionint	Exceptionr   )r6   r)   r7   hostsepportr   r   r   r:   b   s    

zset_address.<locals>.dor   )r   r:   r   rF   r   set_addressa   s    rG   c                 C   s   d}|  |st| t|d  }t|}|tjkrBtd|ttj| }z(|t	krnddd|
  }n||}W n& tk
r   td||jY nX |tj|< d S )Nz--configure-zunknown property {0!r}TF)truefalsez{0!r} must be a {1})
startswithAssertionErrorlenr3   r5   configr   r   typeboollowerrB   r   )r6   r)   prefixnamer7   Zexpected_typer   r   r   
set_configy   s    
rS   c                 C   s   | S r.   r   r/   r   r   r   r1      r2   Fc                    s    fdd}|S )Nc                    s    t _r| nt|}t|trz|t }W nP tk
r   z|d}W n, tk
r   dd l	}||
d}Y nX Y nX |t _d S )Nutf-8r   F)r5   r   r3   
isinstancebytesdecoder$   getfilesystemencodingUnicodeDecodeErrorlocalegetpreferredencodingr   )r6   r)   r   rZ   kindr   
positionalr   r   r:      s    
zset_target.<locals>.dor   )r]   r   r^   r:   r   r\   r   
set_target   s    r_   z-(\?|h|-help)z-(V|-version)z--log-toz<path>r   z--log-to-stderrr   z--listenz	<address>listenz	--connectconnectz--wait-for-clientr   z--configure-.+z<value>z--adapter-access-tokenz<token>r    z
<filename>r!   )r^   z-mz<module>module-cz<code>codez--pidz<pid>pidc                  c   s,   t tjdkr(tjd } tjd= | V  q d S )N      )rL   r$   argv)r7   r   r   r   consume_argv   s    
rj   c               
   C   s  t  } t }zt|}W n  tk
r8   tdt Y nX |}|dsLd}tD ]"\}}}t	d| d |rP qqPtd| || krtd| n
| 
| z||| W nd tk
r   |d k	sttd||Y n6 tk
r } ztd	|||W 5 d }~X Y nX tjd k	rq$qtjd kr8td
tjd k	rXtjdkrXtdtjdkrttjrttdtjd k	sttjd k	sttjd k	std S )Nzmissing target: -rb   z^(z)$zunrecognized switch zduplicate switch z{0}: missing {1}zinvalid {0} {1}: {2}z(either --listen or --connect is requiredra   z)--adapter-access-token requires --connectrf   z(--pid does not support --wait-for-client)setrj   r3   StopIterationr   TARGETrJ   switchesrematchaddrK   r   rB   r5   r   r   r   r   r   r   )seenr)   r6   r(   patternplaceholderactionexcr   r   r   
parse_argv   sD    

$
rx   c                 C   sz   | t jd< tdt j ttj tjdkr<t	tj
 n,tjdkrZtjtj
tjd ntttjtjrvt  d S )Nr   zsys.argv after patching: {0!r}r`   ra   )Zaccess_token)r$   ri   r   debugr+   	configurer5   rM   r   r`   r   ra   r   rK   reprr   )argv_0r   r   r   start_debugging   s    


r}   c                  C   sj   t j} t|  tj| r6tj| }tjd| nt	
d|  t	d t	d|  tj| dd d S )Nr   zNot a file: {0!r}Pre-launch environment:zRunning file {0!r}__main__)run_name)r5   r   r}   ospathisfiledirnamer$   insertr   ry   describe_environmentinforunpyrun_path)r   dirr   r   r   run_file
  s    
r   c                  C   s   t jdtd t jd } zttj}|d k	r6|j} W n t	k
rV   t
d Y nX t|  t
d t
dtj z
tj}W n. tk
r   t
d tjtjdd Y nX |tjdd	 d S )
Nr   rb   z*Error determining module path for sys.argvr~   zRunning module {0!r}zArunpy._run_module_as_main is missing, falling back to run_module.T)	alter_sys)
alter_argv)r$   r   r   strri   r   r5   r   originrB   r   Zswallow_exceptionr}   r   r   r   _run_module_as_mainAttributeErrorwarning
run_module)r|   specZrun_module_as_mainr   r   r   r     s"    





r   c                  C   sZ   t jdtd ttjtdtd} ttd t	d t
dtj t| i  d S )Nr   rb   z<string>execrd   r~   zRunning code:

{0})r$   r   r   r   compiler5   r   r}   r   r   r   eval)re   r   r   r   run_code@  s    
r   c               	   C   sZ  t j} td|  dd }tjtjj	}tj
|s:t||}t jt jt jt jt jd}|t|}d}|ddddj||d	}td
|dd ddddht|@ rtdtjtjtj	d}tj
|sttj| z6dd l}td|  |j| |dttddd W n" tk
rH   td|  Y nX td|  d S )Nz!Attaching to process with PID={0}c                 S   s   | d k	rt t| dS d S )NrT   )list	bytearrayencode)r   r   r   r   r1   Q  r2   zattach_to_pid.<locals>.<lambda>)r   r   r   r   r   a9  
import codecs;
import json;
import sys;

decode = lambda s: codecs.utf_8_decode(bytearray(s))[0] if s is not None else None;

script_dir = decode({script_dir});
setup = json.loads(decode({setup}));

sys.path.insert(0, script_dir);
import attach_pid_injected;
del sys.path[0];

attach_pid_injected.attach(setup);
rb   
)
script_dirsetupzCode to be injected: 
{0};z;
"'zOInjected code should not contain any single quotes, double quotes, or newlines.Zpydevd_attach_to_processr   z,Injecting code into process with PID={0} ...TZ DEBUGPY_ATTACH_BY_PID_DEBUG_INFO0)Zconnect_debugger_tracingZshow_debug_infoz#Code injection into PID={0} failed:z&Code injection into PID={0} completed.) r5   r   r   r   r   r   r   r+   server__file__existsrK   r   r   r   r   r   jsondumpsreplacer   rl   joinr   r$   appendadd_code_to_python_processZrun_python_coderA   getenvrB   reraise_exception)rf   r   r   r   Zpython_codeZpydevd_attach_to_process_pathr   r   r   r   attach_to_pidM  sZ       
r   c               
   C   s   t tj} z
t  W nN tk
rb } z0ttttd t| tjd t	d W 5 d }~X Y nX t
jd k	rztt
j t
jrttj t  ttd| tj zttttdt
j }|  W n4 tk
r } ztjd|jdd W 5 d }~X Y nX d S )	Nz
Error: r    rg   z=sys.argv before parsing: {0!r}
         after parsing:  {1!r})r!   rc   re   rf   z%Debuggee exited via SystemExit: {0!r}ry   )level)r   r$   ri   rx   rB   r"   r   r#   r%   r&   r5   r   r+   r   r   Zensure_loggingr   r   r   r   r   r   r   
SystemExitr   re   )Zoriginal_argvrw   runr   r   r   main  s>    

"

  r   ),r   r   rp   r$   importlib.utilr   modulesrK   r   Z_pydevd_bundler   r   r+   Zdebugpy.commonr   Zdebugpy.serverr   rn   r   r,   r#   objectr   r5   rM   r   rA   rf   r*   r-   r;   r=   rG   rS   r_   ro   rj   rx   r}   r   r   r   r   r   r   r   r   r   <module>   sb    /!E