
    @OOfP                       d dl mZ d dlZ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	 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 d d
lmZ d dlZd dlmZ d dlmZ d dlmZ 	  e       Z G d d      Ze G d d             ZddZddZ G d d      Z d dZ!d!d"dZ"d Z#d!d#dZ$d$dZ%	 d%	 	 	 	 	 	 	 	 	 d&dZ&d%d'dZ'd(dZ(y))    )annotationsN)Callable)Iterable)Sequence)	dataclass)Path)Any)Optional)TextIO)
exceptions)signals)	typecheckc                  t    e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 ddZd Zed        ZddZddZ	ddZ
ddZdd	Zd
 Zy)_Option)nametypespecvalue_defaultchoiceshelpc                    t        j                  |||       || _        || _        || _        t
        | _        t        j                  |      j                         j                  dd      | _        || _        y )N
 )r   check_option_typer   r   r   unsetr   textwrapdedentstripreplacer   r   selfr   r   defaultr   r   s         U/var/www/premiumrankchecker/venv/lib/python3.12/site-packages/mitmproxy/optmanager.py__init__z_Option.__init__!   s_     	##D'8<	 
OOD)//199$D	    c                B    | j                          d| j                   dS )Nz [])currentr   r!   s    r#   __repr__z_Option.__repr__1   s     ,,.!DMM?!44r%   c                @    t        j                  | j                        S N)copydeepcopyr   r)   s    r#   r"   z_Option.default4   s    }}T]]++r%   c                    | j                   t        u r| j                  }n| j                   }t        j                  |      S r,   )r   r   r"   r-   r.   )r!   vs     r#   r(   z_Option.current8   s/    ::A

A}}Qr%   c                h    t        j                  | j                  || j                         || _        y r,   )r   r   r   r   r   )r!   r   s     r#   setz_Option.set?   s#    ##DIIudmmD
r%   c                    t         | _        y r,   )r   r   r)   s    r#   resetz_Option.resetC   s	    
r%   c                <    | j                         | j                  k7  S r,   )r(   r"   r)   s    r#   has_changedz_Option.has_changedF   s    ||~--r%   c                \    | j                   D ]  }t        | |      t        ||      k7  s y y)NFT)	__slots__getattr)r!   otheris      r#   __eq__z_Option.__eq__I   s3     	AtQ75!#44	 r%   c                    t        | j                  | j                  | j                  | j                  | j
                        }| j                         r| j                         |_        |S r,   )	r   r   r   r"   r   r   r6   r(   r   )r!   _os      r#   __deepcopy__z_Option.__deepcopy__O   sF    DIIt}}dllDIIt||TllnAGr%   Nr   strr   ztype | objectr"   r	   r   rB   r   zSequence[str] | NonereturnNone)rC   r	   )r   r	   rC   rD   rC   rD   )rC   bool)__name__
__module____qualname__r8   r$   r*   propertyr"   r(   r2   r4   r6   r<   r@    r%   r#   r   r      s}    LI   	
  & 
 5 , , .r%   r   c                      e Zd ZU ded<   y)_UnconvertedStrings	list[str]valN)rG   rH   rI   __annotations__rK   r%   r#   rM   rM   V   s    	Nr%   rM   c                     y r,   rK   updateds    r#   _sig_changed_specrT   [       r%   c                     y r,   rK   excs    r#   _sig_errored_specrY   _   rU   r%   c                      e Zd ZdZddZ	 d	 	 	 	 	 	 	 	 	 	 	 d dZej                  d!d       Zd Z	ddZ
d Zdd	ZeZd
 Z fdZd Zd Zd Zd Zd Zd Zd Zd Zd Zd"dZd Zd Zd Zddd#dZddZd$dZd%dZ  xZ!S )&
OptManagera  
    OptManager is the base class from which Options objects are derived.

    .changed is a Signal that triggers whenever options are
    updated. If any handler in the chain raises an exceptions.OptionsError
    exception, all changes are rolled back, the exception is suppressed,
    and the .errored signal is notified.

    Optmanager always returns a deep copy of options to ensure that
    mutation doesn't change the option state inadvertently.
    c                    i | _         t        j                  t              | _        | j                  j                  | j                         t        j                  t              | _        g | _	        i | _
        y r,   )deferredr   
SyncSignalrT   changedconnect_notify_subscribersrY   errored_subscriptions_optionsr)   s    r#   r$   zOptManager.__init__p   sX    (*))*;<T556))*;<LN )+r%   c                v    t        |||||      | j                  |<   | j                  j                  |h       y )NrR   )r   rd   r_   sendr    s         r#   
add_optionzOptManager.add_optionz   s6     &dHgtWMd4&)r%   Fc              #  *  K   t        j                  | j                        }	 d  y # t        j                  $ rU}| j
                  j                  |       || j                  d<   | j                  j                  |       |r|Y d }~y d }~ww xY ww)NrW   rd   rR   )	r-   r.   rd   r   OptionsErrorrb   rf   __dict__r_   )r!   rS   reraiseoldes        r#   rollbackzOptManager.rollback   sz     mmDMM*		&& 	LL!$(+DMM*%LLg. 	s+    B( BBABBBBc                    |D ](  }|| j                   vst        j                  d|z         | j                  j	                  t        j                  |      t        |      f       y)a)  
        Subscribe a callable to the .changed signal, but only for a
        specified list of options. The callable should accept arguments
        (options, updated), and may raise an OptionsError.

        The event will automatically be unsubscribed if the callable goes out of scope.
        No such option: %sN)rd   r   ri   rc   appendr   make_weak_refr2   )r!   funcoptsr;   s       r#   	subscribezOptManager.subscribe   sb      	HA% --.BQ.FGG	H 	""G$9$9$$?T#KLr%   c                    d}| j                   D ]   \  }} |       }|||z  s || |       d}" |r7| j                   D cg c]  \  }} |       ||f c}}| j                  d<   y y c c}}w )NFTrc   )rc   rj   )r!   rS   cleanuprefrt   callbacks         r#   ra   zOptManager._notify_subscribers   s    ,, 	ICuH#'>T7+	 /3/B/B/ +dceFWd/DMM*+ /s   A,A,c                V    t        |t              r| j                  |j                  k(  S y)NF)
isinstancer[   rd   )r!   r:   s     r#   r<   zOptManager.__eq__   s"    eZ(==ENN22r%   c                t    t               }t        j                  | j                  |      |j                  d<   |S )Nrd   )r[   r-   r.   rd   rj   )r!   memodictr?   s      r#   r@   zOptManager.__deepcopy__   s+    L!%t}}h!G

:r%   c                t    || j                   v r| j                   |   j                         S t        d|z        )Nrp   )rd   r(   AttributeError)r!   attrs     r#   __getattr__zOptManager.__getattr__   s7    4== ==&..00 !5!<==r%   c                    | j                   j                  d      }|st        |   ||       y  | j                  di ||i y )Nrd   rK   )rj   getsuper__setattr__update)r!   r   r   rt   	__class__s       r#   r   zOptManager.__setattr__   s@     }}  ,Ge,DKK(4-(r%   c                H    t        | j                  j                               S r,   )r2   rd   keysr)   s    r#   r   zOptManager.keys   s    4==%%'((r%   c                6    | j                   j                         S r,   )rd   itemsr)   s    r#   r   zOptManager.items   s    }}""$$r%   c                    || j                   v S r,   )rd   )r!   ks     r#   __contains__zOptManager.__contains__   s    DMM!!r%   c                    | j                   j                         D ]  }|j                           | j                  j	                  t        | j                   j                                      y)z3
        Restore defaults for all options.
        rR   N)rd   valuesr4   r_   rf   r2   r   )r!   r?   s     r#   r4   zOptManager.reset   sP     %%' 	AGGI	#dmm&8&8&:";<r%   c                   i i }}|j                         D ]  \  }}|| j                  v r|||<   |||<     t        |j                               }|rp| j	                  |d      5  |j                         D ]#  \  }}| j                  |   j                  |       % | j
                  j                  |       ddd       |S |S # 1 sw Y   |S xY w)zp
        Update and set all known options from kwargs. Returns a dictionary
        of unknown options.
        T)rk   rR   N)r   rd   r2   r   rn   r_   rf   )r!   kwargsknownunknownr   r0   rS   s          r#   update_knownzOptManager.update_known   s    
 RwLLN 	DAqDMM!a
		
 ejjl#w5 3!KKM ,DAqMM!$((+,!!'!23 w	3 s   $ACCc                ^     | j                   di |}| j                  j                  |       y )NrK   )r   r]   r   )r!   r   r   s      r#   update_deferzOptManager.update_defer   s)    #$##-f-W%r%   c                     | j                   di |}|r+t        ddj                  |j                               z        y )NzUnknown options: %s, rK   )r   KeyErrorjoinr   )r!   r   us      r#   r   zOptManager.update   s?    D''0499QVVX3FFGG r%   c                N      j                   vrt        dz         fd}|S )zt
        Generate a setter for a given attribute. This returns a callable
        taking a single argument.
        rp   c                     t        |        y r,   )setattr)xr   r!   s    r#   setterz!OptManager.setter.<locals>.setter  s    D$"r%   )rd   r   )r!   r   r   s   `` r#   r   zOptManager.setter   s.    
 t}}$/$677	# r%   c                      j                   vrt        dz         j                      }|j                  t        k7  rt	        d       fd}|S )zv
        Generate a toggler for a boolean attribute. This returns a callable
        that takes no arguments.
        rp   z-Toggler can only be used with boolean optionsc                 6    t         t                       y r,   )r   r9   )r   r!   s   r#   togglez"OptManager.toggler.<locals>.toggle  s    D$GD$$7 78r%   )rd   r   r   rF   
ValueError)r!   r   r?   r   s   ``  r#   togglerzOptManager.toggler  sT    
 t}}$/$677MM$::LMM	9 r%   c                4    | j                   |   j                  S r,   )rd   r"   r!   options     r#   r"   zOptManager.default  s    }}V$,,,r%   c                <    | j                   |   j                         S )z:
        Has the option changed from the default?
        )rd   r6   r   s     r#   r6   zOptManager.has_changed  s     }}V$0022r%   c                    i }|j                         D ]6  \  }}|	t        |t        t        f      rt	        | |      |z   ||<   2|||<   8  | j
                  di | y)z
        Merge a dict of options into this object. Options that have None
        value are ignored. Lists and tuples are appended to the current
        option value.
        NrK   )r   r{   listtupler9   r   )r!   rt   tosetr   r0   s        r#   mergezOptManager.merge  sf     JJL 	!DAq}a$/&tQ/!3E!H E!H	! 	er%   c                    t        j                  | j                  d      j                  d      }d|v rd|z   dz   }dj	                  t        |       j                  t        |       j                  |      S )N   )indentz {}r   z
    z{mod}.{cls}({{{options}}}))modclsoptions)pprintpformatrd   r   formattyperH   rG   )r!   r   s     r#   r*   zOptManager.__repr__.  sj    ..q9??F7?(4/G+22T
%%4:+>+> 3 
 	
r%   )deferc          
        i }|D ]P  }d|v r8|j                  dd      \  }}|j                  |g       j                  |       ?|j                  |g        R i }t        |j	                               D ]B  }|| j
                  v s| j                  | j
                  |   |j                  |            ||<   D |rG| j                  j                  |j                         D 	ci c]  \  }}	|t        |	       c}	}       n)|r't        j                  ddj                  |              | j                  di | yc c}	}w )ae  
        Takes a list of set specification in standard form (option=value).
        Options that are known are updated immediately. If defer is true,
        options that are not known are deferred, and will be set once they
        are added.

        May raise an `OptionsError` if a value is malformed or an option is unknown and defer is False.
        =   )maxsplitzUnknown option(s): r   NrK   )split
setdefaultrq   r   r   rd   _parse_setvalpopr]   r   r   rM   r   ri   r   )
r!   r   specsunprocessedspecr   r   	processedr   r0   s
             r#   r2   zOptManager.set6  s=    -/ 	1Dd{"jjqj9e&&tR077>&&tR0	1 %'	))+, 	Dt}}$"&"4"4MM$')>#	$	 MM  7B7H7H7JKtq!'**K ))%dii&<%=> 
 	 i  Ls   "D=
c                N   i }| j                   j                         D ]R  \  }}|| j                  v st        |t              r)| j                  | j                  |   |j                        }|||<   T  | j                  di | |j                         D ]  }| j                   |=  y)zs
        Processes options that were deferred in previous calls to set, and
        have since been added.
        NrK   )	r]   r   rd   r{   rM   r   rO   r   r   )r!   r   optnamer   r   s        r#   process_deferredzOptManager.process_deferred]  s    
 "$"mm113 	(NGU$--'e%89 ..t}}W/EuyyQE"'w		(
 	f 	!Aa 	!r%   c                <   |j                   t        t           k(  r|S t        |      dkD  r%t	        j
                  d|j                   d|       |r|d   }nd}|j                   t        t        t           fv r9|j                   t        k(  r$|"t	        j
                  d|j                         |S |j                   t        t        t           fv rD|r	 t        |      S |j                   t        k(  r"t	        j
                  d|j                         y|j                   t        k(  r9|dk(  r|j                          S |r|d	k(  ry
|dk(  ryt	        j
                  d      t        d|j                          # t        $ r t	        j
                  d|       w xY w)zN
        Convert a string to a value appropriate for the option type.
        r   zReceived multiple values for : r   NzOption is required: zNot an integer: r   trueTfalseFzRBoolean must be "true", "false", or have the value omitted (a synonym for "true").zUnsupported option type: )r   r   rB   lenr   ri   r   r
   intr   rF   r(   NotImplementedError)r!   r?   r   optstrs       r#   r   zOptManager._parse_setvall  s    ::#&Mv;?))/xr&B 
 AYFF::#x}--zzS V^ --0DQVVH.MNNMZZC#//Ov;& s" --0DQVVH.MNNZZ4!99;&Vv-7" --h  "$=ajj\"JKK# " O$114DVH2MNNOs   
E9 9"Fc           
        || j                   vry| j                   |   }d } |||      }|j                  t        k(  r|j                  d      } ||d      }	 |d|z   d      }
|r"|j                  r |d|z   |      }
n	 |||      }	 |j
                  |
d|d  |j
                  |	d||j                  d	  |j                  di |di y|j                  t        t        t           fv r% |j
                  |d
t        ||j                  |d y|j                  t        t        t           fv r0 |j
                  |d
t        ||j                  ||j                  d y|j                  t        t           k(  r3 |j
                  |dt        ||j                  dz   ||j                  d yt        d|j                        )z
        Auto-Create a command-line parser entry for a named option. If the
        option does not exist, it is ignored.
        Nc                b    | j                  dd      } d| z  g}|r|j                  d|z          |S )Nr>   -z--%s)r   rq   )r   sfs      r#   mkfz#OptManager.make_parser.<locals>.mkf  s5    		#s#A!Aq!Hr%   F)requiredzno-store_false)actiondest
store_true)r   r   r   store)r   r   r   r   metavar)r   r   r   r   r   r   rq   z May be passed multiple times.zUnsupported option type: %srK   )rd   r   rF   add_mutually_exclusive_groupr"   add_argumentr   set_defaultsr   r
   rB   r   r   r   )r!   parserr   r   shortr?   r   flagsgonfofffs              r#   make_parserzOptManager.make_parser  s   
 $--'MM'"	 GU#::33U3CAgt$Cuw-D99uw6Dgu-CANN$
 ANNC7PF27D/2ZZC#//FVV ZZC#//FVV		 ZZ8C=(FVV>>		 :AJJGGr%   rE   r,   rA   F)r   rB   rC   r	   )r   rB   r   rF   rC   rD   )r?   r   r   rN   rC   r	   )NN)"rG   rH   rI   __doc__r$   rg   
contextlibcontextmanagerrn   ru   ra   r<   r@   __copy__r   r   r   r   r   r4   r   r   r   r   r   r"   r6   r   r*   r2   r   r   r   __classcell__)r   s   @r#   r[   r[   c   s    
+  )-	*	*  	* 		*
 	* &	* 
	*  M

 H>))%"=&&H
 -3
 .3 %!N!*LXBHr%   r[   c                   t         j                  j                  j                         }t	        | j                               D ]  }| j                  |   }|j                  ||<   |j                  j                         }|j                  r)|ddj                  d |j                  D              z  z  }n't        j                  |j                        }|d|z  z  }dj                  t        j                   |            }|j#                  |d|z           t         j                  j%                         j'                  ||      S )z3
    Dumps an annotated file with all options.
    z Valid values are %s.r   c              3  2   K   | ]  }t        |        y wr,   )repr).0cs     r#   	<genexpr>z dump_defaults.<locals>.<genexpr>  s     6R1tAw6Rs   z	 Type %s.r   )before)ruamelyamlcommentsCommentedMapsortedr   rd   r"   r   r   r   r   r   typespec_to_strr   r   wrap!yaml_set_comment_before_after_keyYAMLdump)rt   outr   r   r?   txtts          r#   dump_defaultsr    s    
 	))+ADIIK  BMM!yy!fflln99*TYY6R		6R-RRRC))!**5A;?"Ciic*+	++AdSj+AB ;;""1c**r%   c                   i }|| j                         }t        |      D ]i  }| j                  |   }t        j                  |j
                        }||j                  |j                         |j                  |j                  d}|||<   k |S )z
    Dumps the options into a list of dict object.

    Return: A list like: { "anticache": { type: "bool", default: false, value: true, help: "help text"} }
    )r   r"   r   r   r   )
r   r   rd   r   r   r   r"   r(   r   r   )rt   r   options_dictr   r?   r  r   s          r#   
dump_dictsr    s     L|yy{D\ 
!MM!%%ajj1yyYY[FFyy
 !Q
! r%   c                   | si S 	 t         j                  j                  dd      }|j                  |       }t        |t              rt        j                  d      |i S |S # t         j                  j                  j
                  $ r}t        |d      rZ|j                  j                         }t        j                  d|j                  j                  dz   d|dt        |d	d
            t        j                  d      d }~ww xY w)NsafeT)typpureproblem_markzConfig error at line r   z:
r   problem zCould not parse options.zConfig error - no keys found.)r   r   r   loaderror	YAMLErrorhasattrr  get_snippetr   ri   liner9   r{   rB   )textr   datar0   snips        r#   parser  
  s    	F{{F6yy $%%&EFF		K ;;&& F1n%>>--/D))>>&&*D'!Y2KM 
 ))*DEEFs   2A# #'D

A;DD
c                    t        |      }|j                  d      }|;|9|D cg c]*  }t        t        t	        |      t	        |                  , c}|d<    | j
                  di | yc c}w )z
    Load configuration from text, over-writing options already set in
    this object. May raise OptionsError if the config file is invalid.
    scriptsN)relative_torK   )r  r   rB   relative_pathr   r   )rt   r  cwdr  r  paths         r#   r  r     sl    
 ;Dhhy!GsNU
FJCd4jd3i@A
Y D	
s   /A-c           	        |D ]  }t        |      j                         }|j                         s-|j                         s>|j	                  d      5 }	 |j                         }	 ddd       	 t        | |j                         j                          y# t        $ r }t        j                  d| d|       d}~ww xY w# 1 sw Y   _xY w# t        j                  $ r }t        j                  d| d|       d}~ww xY w)z
    Load paths in order. Each path takes precedence over the previous
    path. Paths that don't exist are ignored, errors raise an
    OptionsError.
    utf8encodingzError reading r   N)r  )r   
expanduserexistsis_fileopenreadUnicodeDecodeErrorr   ri   r  absoluteparent)rt   pathspr   r  rm   s         r#   
load_pathsr,  0  s      IG 88:!))+( MAM&&(CM
IT3AJJL$7$78I * M$11N1#Rs2KLLMM M ** I --qcA3.GHHIsB   CB/&C	C!B<<CCC	D#C>>Dc                F   t        |      }| j                         D ]%  }|s| j                  |      st        | |      ||<   ' t	        |j                               D ]  }|| j
                  vs||=  t        j                  j                         j                  ||       y)ar  
    Performs a round-trip serialization. If text is not None, it is
    treated as a previous serialization that should be modified
    in-place.

    - If "defaults" is False, only options with non-default values are
        serialized. Default values in text are preserved.
    - Unknown options in text are removed.
    - Raises OptionsError if text is invalid.
    N)
r  r   r6   r9   r   rd   r   r   r   r   )rt   filer  defaultsr  r   s         r#   	serializer0  D  s     ;DYY[ 't''*dA&DG' $))+ DMM!Q KKD$'r%   c                   t        |      j                         }|j                         r>|j                         r.|j	                  d      5 }	 |j                         }	 ddd       nd}|j	                  dd      5 }t        | ||       ddd       y# t        $ r }t        j                  d| d|       d}~ww xY w# 1 sw Y   `xY w# 1 sw Y   yxY w)z
    Save to path. If the destination file exists, modify it in-place.

    Raises OptionsError if the existing data is corrupt.
    r  r   zError trying to modify r   Nr  w)
r   r"  r#  r$  r%  r&  r'  r   ri   r0  )rt   r  r/  r   r  rm   s         r#   saver3  \  s     :  "D{{}YYY' 	U1Uvvx	U 	U 	3	( +A$4*+ + & U --0GvRPQs.STTU	U 	U+ +s6   CB=C	B>B99B>>CC
Cc                   t        |       } | j                         | k7  r.| j                         s| j                         j                         } || j                         z  j                         S )z
    Make relative paths found in config files relative to said config file,
    instead of relative to where the command is ran.
    )r   r"  is_absoluter(  )script_pathr  s     r#   r  r  p  s^    
 {#K;.{7N7N7P!,,.779+0022<<>>r%   )rS   zset[str]rC   rD   )rX   	ExceptionrC   rD   )r   r   r,   )r   zIterable[str] | NonerC   dict)rt   r[   r  rB   r  zPath | str | NonerC   rD   )rt   r[   r*  
Path | strrC   rD   r   )
rt   r[   r.  r   r  rB   r/  rF   rC   rD   )rt   r[   r  r9  r/  rF   rC   rD   )r6  r9  r  r9  rC   r   ))
__future__r   r   r-   r   r   weakrefcollections.abcr   r   r   dataclassesr   pathlibr   typingr	   r
   r   ruamel.yamlr   	mitmproxyr   mitmproxy.utilsr   r   objectr   r   rM   rT   rY   r[   r  r  r  r  r,  r0  r3  r  rK   r%   r#   <module>rD     s    "      $ $ $ !        # % 	5 5p   wH wHt+,., I* AF(
("(*-(9=(	(0+(	?r%   