
    @OOf&^                        d 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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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  G d d      Z G d de      Z G d de      Z  G d de      Z! G d de      Z"g d Z#d!ejH                  jJ                  d"dfd#Z&d!ejH                  jJ                  d$e'd"dfd%Z( G d& d'ejR                  j                        Z* G d( d)      Z+ G d* d+ejR                  jX                        Z-y),a.  
The View:

- Keeps track of a store of flows
- Maintains a filtered, ordered view onto that list of flows
- Exposes a number of signals so the view can be monitored
- Tracks focus within the view
- Exposes a settings store for flows that automatically expires if the flow is
  removed from the store.
    N)Iterator)MutableMapping)Sequence)Any)Optional)command)
connection)ctx)dns)
exceptions)
flowfilter)hooks)http)io)tcp)udp)ALERT)human)signalsc                   \    e Zd Zd Zdej
                  j                  defdZd Z	d Z
d Zy)		_OrderKeyc                     || _         y N)viewselfr   s     V/var/www/premiumrankchecker/venv/lib/python3.12/site-packages/mitmproxy/addons/view.py__init__z_OrderKey.__init__3   s	    	    freturnc                      y r    r   r    s     r   generatez_OrderKey.generate6   s    r   c                    | j                         }| j                  j                  |   |   }| j                  |      }||k7  r| j                  j                  j                  |       || j                  j                  |   |<   | j                  j                  j                  |       | j                  j                  j                          y y r   )	_keyr   settingsr%   _viewremoveaddsig_view_refreshsend)r   r    koldnews        r   refreshz_OrderKey.refresh9   s    IIKii  #A&mmA#:IIOO""1%'*DIIq!!$IIOO"II&&++-	 r   c                     dt        |       z  S Nz	_order_%s)idr   s    r   r'   z_OrderKey._keyC   s    RX%%r   c                     |j                   | j                  j                  v rJ| j                         }| j                  j                  |   }||v r||   S | j                  |      }|||<   |S | j                  |      S r   )r4   r   _storer'   r(   r%   )r   r    r.   svals        r   __call__z_OrderKey.__call__F   sr    44499###		A		""1%AAvt--"CAaDJ==##r   N)__name__
__module____qualname__r   	mitmproxyflowFlowr   r%   r1   r'   r:   r#   r   r   r   r   2   s3    )..-- # .&
$r   r   c                   D    e Zd Zdej                  j
                  defdZy)OrderRequestStartr    r!   c                     |j                   S r   )timestamp_createdr$   s     r   r%   zOrderRequestStart.generateT   s    """r   N)r;   r<   r=   r>   r?   r@   floatr%   r#   r   r   rB   rB   S   s    #)..-- #% #r   rB   c                   D    e Zd Zdej                  j
                  defdZy)OrderRequestMethodr    r!   c                    t        |t        j                        r|j                  j                  S t        |t
        j                  t        j                  f      r|j                  j                         S t        |t        j                        r3t        j                  j                  |j                  j                        S t!               r   )
isinstancer   HTTPFlowrequestmethodr   TCPFlowr   UDPFlowtypeupperr   DNSFlowop_codesto_strop_codeNotImplementedErrorr$   s     r   r%   zOrderRequestMethod.generateY   s}    a'99###CKK5666<<>!3;;'<<&&qyy'8'899%''r   Nr;   r<   r=   r>   r?   r@   strr%   r#   r   r   rG   rG   X       ()..-- (# (r   rG   c                   D    e Zd Zdej                  j
                  defdZy)OrderRequestURLr    r!   c                    t        |t        j                        r|j                  j                  S t        |t
        j                  t        j                  f      r)t        j                  |j                  j                        S t        |t        j                        r;|j                  j                  r#|j                  j                  d   j                   S dS t#               )Nr    )rI   r   rJ   rK   urlr   rM   r   rN   r   format_addressserver_connaddressr   rQ   	questionsnamerU   r$   s     r   r%   zOrderRequestURL.generatee   s    a'99== CKK56''(=(=>>3;;'23))2E2E199&&q)..M2M%''r   NrV   r#   r   r   rZ   rZ   d   rX   r   rZ   c                   D    e Zd Zdej                  j
                  defdZy)OrderKeySizer    r!   c                 t   t        |t        j                        rd}|j                  j                  r"|t        |j                  j                        z  }|j                  r8|j                  j                  r"|t        |j                  j                        z  }|S t        |t        j                  t        j                  f      r-d}|j                  D ]  }|t        |j                        z  } |S t        |t        j                        r$|j                  r|j                  j                  S dS t!               Nr   )rI   r   rJ   rK   raw_contentlenresponser   rM   r   rN   messagescontentr   rQ   sizerU   )r   r    rl   messages       r   r%   zOrderKeySize.generateq   s    a'Dyy$$AII1122zzajj44AJJ2233KCKK56D:: -GOO,,-K3;;'&'jj1::??7a7%''r   N)r;   r<   r=   r>   r?   r@   intr%   r#   r   r   rd   rd   p   s    ()..-- (# (r   rd   ))ttime)mrL   )ur]   )zrl   r?   r!   c                      y r   r#   r?   s    r   _signal_with_flowrv          r   indexc                      y r   r#   r?   rx   s     r   _sig_view_remover{      rw   r   c            	       X    e Zd Zde fdZd Zd ZdedefdZd Zde	fd	Z
d
ej                  j                  defdZ	 dfd
ej                  j                  dededz  defdZd
e	defdZd Zd Zd Z	  ej*                  d      deddfd       Z ej*                  d      ded       Z ej*                  d      ded       Z ej*                  d      dee   fd       Z ej*                  d      deddfd       Z ej*                  d      d eddfd!       Z ej*                  d"      defd#       Z ej*                  d$      d%eddfd&       Zd'e jB                  dz  fd(Z" ej*                  d)      ded*       Z# ej*                  d+      ded,       Z$ ej*                  d-      d.ej                  j                  d/ed0edefd1       Z% ej*                  d2      d3eej                  j                     d/eddfd4       Z& ej*                  d5      d3eej                  j                     d/ed6eddfd7       Z' ej*                  d8      d3eej                  j                     ddfd9       Z( ej*                  d:      d3eej                  j                     ddfd;       Z) ej*                  d<      d=edeej                  j                     fd>       Z* ej*                  d?      d@edAeddfdB       Z+ ej*                  dC      dDejX                  jZ                  ddfdE       Z.d3eej                  j                     ddfdFZ/dGedej                  j                  dz  fdHZ0 ej*                  dI      defdJ       Z1 ej*                  dK      defdL       Z2 ej*                  dM      dedN       Z3 ej*                  dO      dPedefdQ       Z4dR Z5dS Z6dT Z7dU Z8dV Z9dW Z:dX Z;dY Z<dZ Z=d[ Z>d\ Z?d] Z@d^ ZAd_ ZBd` ZCda ZDdb ZEdc ZFd3eej                  j                     ddfddZG xZHS )gViewr!   Nc                 @   t         |           t        j                         | _        t
        j                  | _        d| _        t        |       | _
        t        t        |       t        |       t        |       t        |             | _        | j                  | _        d| _        d| _        t'        j(                  | j                         | _        t-        j.                  t0              | _        t-        j.                  t0              | _        t-        j.                  t6              | _        t-        j.                  d       | _        t-        j.                  t0              | _        t-        j.                  d       | _        tA        |       | _!        tE        |       | _#        y )NF)rp   rL   r]   rl   keyc                       y r   r#   r#   r   r   <lambda>zView.__init__.<locals>.<lambda>   rw   r   c                       y r   r#   r#   r   r   r   zView.__init__.<locals>.<lambda>   rw   r   )$superr   collectionsOrderedDictr7   r   	match_allfiltershow_markedrB   default_orderdictrG   rZ   rd   orders	order_keyorder_reversedfocus_followsortedcontainersSortedListWithKeyr)   r   
SyncSignalrv   sig_view_updatesig_view_addr{   sig_view_remover,   sig_store_removesig_store_refreshFocusfocusSettingsr(   )r   	__class__s    r   r   zView.__init__   s6   ##% 	 !** .t4"4(%d+%d#	
 %)$6$6#!%77DNNK

  '112CD#../@A&112BC ' 2 2< @ !( 2 23D E!(!3!3L!A4[
 r   c                    |j                  dt        t           d d       |j                  dt        ddt        t	        d t
                           |j                  dt        d	d
       |j                  dt        d	d       y )Nview_filterz!Limit the view to matching flows.
view_orderrp   zFlow sort order.c                     | d   S N   r#   )cs    r   r   zView.load.<locals>.<lambda>   s
    qt r   )choicesview_order_reversedFzReverse the sorting order.console_focus_followzFocus follows new flows.)
add_optionr   rW   listmapr   bool)r   loaders     r   loadz	View.load   s    8C=$0S	
 	^V45 	 	
 	!40L	
 	"D%1K	
r   c                 ,    t        | j                        S r   )rh   r7   r5   s    r   store_countzView.store_count   s    4;;r   idxc                     | j                   r3|dk  r| dz
  }|S t        | j                        |z
  dz
  }|dk  rt        |S )z.
        Reverses an index, if needed
        r   r   )r   rh   r)   
IndexErrorr   r   s     r   _revz	View._rev   sQ     QwdQh
 
 $**o+a/7$$
r   c                 ,    t        | j                        S r   )rh   r)   r5   s    r   __len__zView.__len__   s    4::r   c                 >    | j                   | j                  |         S r   )r)   r   r   offsets     r   __getitem__zView.__getitem__   s    zz$))F+,,r   r    c                 f    | j                   j                  |      }| j                  |dz
        dz   S r   )r)   bisect_rightr   r   r    vs      r   _bisectzView._bisect   s.    JJ##A&yyQ!##r   startstopc                 Z    | j                  | j                  j                  |||            S r   )r   r)   rx   )r   r    r   r   s       r   rx   z
View.index   s&     yy))!UD9::r   c                 8    | j                   j                  |      S r   )r)   __contains__r$   s     r   r   zView.__contains__   s    zz&&q))r   c                 2    dt        | j                        z  S r3   )r4   r   r5   s    r   _order_key_namezView._order_key_name   s    R///r   c                     | j                  |      | j                  |   | j                         <   | j                  j	                  |       y r   )r   r(   r   r)   r+   r$   s     r   	_base_addzView._base_add   s7    37>>!3Da--/0

qr   c                 "   | j                   j                          | j                  j                         D ]>  }| j                  r|j
                  s| j                  |      s.| j                  |       @ | j                  j                          y r   )
r)   clearr7   valuesr   markedr   r   r,   r-   )r   is     r   	_refilterzView._refilter   sk    

##% 	"A{{1~q!		"
 	""$r   zview.focus.gor   c                     t        |       dk(  ry|dk  rt        |       |z   }|dk  rd}|t        |       dz
  kD  rt        |       dz
  }| |   | j                  _        y)z
        Go to a specified offset. Positive offests are from the beginning of
        the view, negative from the end of the view, so that 0 is the first
        flow, -1 is the last flow.
        r   Nr   )rh   r   r?   r   s     r   gozView.go  s_     t9>A:Y'FA:FCIM!Y]Fv,

r   zview.focus.nextc                     | j                   j                  @| j                   j                  dz   }| j                  |      r| |   | j                   _        yyy)z-
        Set focus to the next flow.
        Nr   r   rx   inboundsr?   r   s     r   
focus_nextzView.focus_next  M    
 ::'**""Q&C}}S!"&s)

 " r   zview.focus.prevc                     | j                   j                  @| j                   j                  dz
  }| j                  |      r| |   | j                   _        yyy)z1
        Set focus to the previous flow.
        Nr   r   r   s     r   
focus_prevzView.focus_prev#  r   r   zview.order.optionsc                 Z    t        t        | j                  j                                     S )z=
        Choices supported by the view_order option.
        )r   sortedr   keysr5   s    r   order_optionszView.order_options0  s!    
 F4;;++-.//r   zview.order.reversebooleanc                 F    || _         | j                  j                          y r   )r   r,   r-   )r   r   s     r   set_reversedzView.set_reversed7  s    %""$r   zview.order.setr   c                     || j                   vrt        j                  d|z        | j                   |   }|| _        t	        j
                  |      }|j                  | j                         || _        y)z.
        Sets the current view order.
        Unknown flow order: %sr   N)r   r   CommandErrorr   r   r   updater)   )r   r   r   newviews       r   	set_orderzView.set_order<  sc    
 DKK'))*BY*NOOkk)$"44=tzz"
r   z
view.orderc                     d}| j                   j                         D ]!  }| j                  | j                   |   k(  s |}# |S )z1
        Returns the current view order.
        r\   )r   r   r   )r   orderr.   s      r   	get_orderzView.get_orderI  sE    
 !!# 	A~~Q/	 r   zview.filter.setfilter_exprc                     d}|r	 t        j                  |      }| j                  |       y# t        $ r$}t        j                  t        |            |d}~ww xY w)z/
        Sets the current view filter.
        N)r   parse
ValueErrorr   r   rW   
set_filter)r   r   filtes       r   set_filter_cmdzView.set_filter_cmdU  sX    
 =!''4 	  = --c!f51<=s   - 	AAAfltc                 V    |xs t         j                  | _        | j                          y r   )r   r   r   r   )r   r   s     r   r   zView.set_filterb  s    1Z11r   z
view.clearc                     | j                   j                          | j                  j                          | j                  j	                          | j
                  j	                          y)z1
        Clears both the store and view.
        N)r7   r   r)   r,   r-   r   r5   s    r   r   z
View.clearg  sH    
 	

""$##%r   zview.clear_unmarkedc                    | j                   j                         j                         D ]4  }|j                  r| j                   j	                  |j
                         6 | j                          | j                  j                          y)z1
        Clears only the unmarked flows.
        N)	r7   copyr   r   popr4   r   r   r-   r   r?   s     r   clear_not_markedzView.clear_not_markedq  sb    
 KK$$&--/ 	)D;;(	) 	##%r   zview.settings.getvalr?   r   defaultc                 @    | j                   |   j                  ||      S )zM
        Get a value from the settings store for the specified flow.
        )r(   get)r   r?   r   r   s       r   getvaluezView.getvalue~  s     
 }}T"&&sG44r   zview.settings.setval.toggleflowsc                     g }|D ]K  }| j                   |   j                  dd      }|dk(  rdnd| j                   |   |<   |j                  |       M t        j                  j
                  j                  t        j                  |             y)zz
        Toggle a boolean value in the settings store, setting the value to
        the string "true" or "false".
        r   falsetrueN)	r(   r   appendr
   masteraddonstriggerr   
UpdateHook)r   r   r   updatedr    currents         r   setvalue_togglezView.setvalue_toggle  s      	AmmA&**5':G/6&/@GfDMM!S!NN1	 	

!!%"2"27";<r   zview.settings.setvalvaluec                     g }|D ]%  }|| j                   |   |<   |j                  |       ' t        j                  j                  j                  t        j                  |             y)zL
        Set a value in the settings store for the specified flows.
        N)r(   r   r
   r   r   r  r   r  )r   r   r   r  r  r    s         r   setvaluezView.setvalue  s\      	A$)DMM!S!NN1	 	

!!%"2"27";<r   zview.flows.duplicatec                     |D cg c]  }|j                          }}|rL| j                  |       |d   | j                  _        t	        j
                  t        dt        |      z         yyc c}w )zd
        Duplicates the specified flows, and sets the focus to the first
        duplicate.
        r   zDuplicated %s flowsN)r   r+   r   r?   logginglogr   rh   )r   r   r    dupss       r   	duplicatezView.duplicate  s\     #((Q((HHTN"1gDJJOKK4s4y@A  )s   A-zview.flows.removec                    |D ]  }|j                   | j                  v s|j                  r|j                          || j                  v rS| j                  j                  |      }| j                  j                  |       | j                  j                  ||       | j                  |j                   = | j                  j                  |        t        |      dkD  r't        j                  t        dt        |      z         yy)zJ
        Removes the flow from the underlying store and the view.
        rz   ru   r   zRemoved %s flowsN)r4   r7   killablekillr)   rx   r*   r   r-   r   rh   r
  r  r   r   r   r    r   s       r   r*   zView.remove  s    
  	3Attt{{"::FFH

? ****1-CJJ%%a(((--1C-@KK%%%***2	3 u:>KK1CJ>? r   zview.flows.resolve	flow_specc                 D   |dk(  r(| j                   j                         D cg c]  }| c}S |dk(  r/| j                  j                  r| j                  j                  gS g S |dk(  r| D cg c]  }| c}S |dk(  r7| j                   j                         D cg c]  }|| j                  vs| c}S |dk(  r5| j                   j                         D cg c]  }|j
                  s| c}S |dk(  r5| j                   j                         D cg c]  }|j
                  r| c}S t        j                  d|      rK|dd	 j                  d
      }| j                   j                         D cg c]  }|j                  |v s| c}S 	 t        j                  |      }| j                   j                         D cg c]  } ||      s| c}S c c}w c c}w c c}w c c}w c c}w c c}w # t        $ r$}t        j                  t        |            |d	}~ww xY wc c}w )zO
        Resolve a flow list specification to an actual list of flows.
        z@allz@focusz@shownz@hiddenz@markedz	@unmarkedz@[0-9a-f\-,]{36,}r   N,)r7   r   r   r?   r)   r   rematchsplitr4   r   r   r   r   r   rW   )r   r  r   idsr   r   s         r   resolvezView.resolve  s   
 #{{1134!A44 (,

DJJOO$?R?("#$!A$$)##{{113K!q

7JAKK)##{{113@!qxxA@@+%#{{113D!188ADDXX*I6AB-%%c*C#{{113C!qtts{ACC=!''	2  ${{113?!tAwA??' 5 %K@D D  = --c!f51<=?s_   	G+	GG,GG&GG# G#-G(G(	G- :HH-	H6HHzview.flows.createrL   r]   c                    	 t         j                  j                  |j                         |      }t        j                  dd|j                  dz
        }t        j                  |j                  |j                  f      }t        j                  ||      }||_        |j                  |j                  j                  d<   | j!                  |g       y # t        $ r}t        j                  d|z        d }~ww xY w)NzInvalid URL: %s)r\   r   g-C6?)peernamesocknametimestamp_start)r`   Host)r   RequestmakerP   r   r   r   r	   Clientr  ServerhostportrJ   rK   headersr+   )r   rL   r]   reqr   r   r8   r    s           r   createzView.create  s    	A,,##FLLNC8C //&8

 sxx&:;MM!Q	$'HH		&!!  	A))*;a*?@@	As   .C 	C:C55C:zview.flows.loadpathc                    	 t        |d      5 }t        j                  |      j                         D ]"  }| j	                  |j                         g       $ 	 ddd       y# 1 sw Y   yxY w# t        $ r)}t        j                  |j                         Y d}~yd}~wt        j                  $ r(}t        j                  t        |             Y d}~yd}~ww xY w)zP
        Load flows into the view, without processing them with addons.
        rbN)openr   
FlowReaderstreamr+   r   OSErrorr
  errorstrerrorr   FlowReadExceptionrW   )r   r(  r    r   r   s        r   	load_filezView.load_file  s    

	"dD! )Qq)002 )A HHaffhZ(	)) ) )  	&MM!**%%++ 	"MM#a&!!	"sA   A- A	A!A- !A*&A- *A- -	C6BC0CCc                 .   |D ]  }|j                   | j                  vs|| j                  |j                   <   | j                  |      sG| j                  |       | j                  r|| j
                  _        | j                  j                  |        y)z^
        Adds a flow to the state. If the flow already exists, it is
        ignored.
        ru   N)	r4   r7   r   r   r   r   r?   r   r-   )r   r   r    s      r   r+   zView.add  sw    
  	3Att4;;&$%ADD!;;q>NN1%((*+

%%***2	3r   flow_idc                 8    | j                   j                  |      S )zk
        Get flow with the given id from the store.
        Returns None if the flow is not found.
        )r7   r   )r   r4  s     r   	get_by_idzView.get_by_id  s    
 {{w''r   zview.properties.lengthc                     t        |       S )z&
        Returns view length.
        rh   r5   s    r   
get_lengthzView.get_length  s    
 4yr   zview.properties.markedc                     | j                   S )z9
        Returns true if view is in marked mode.
        )r   r5   s    r   
get_markedzView.get_marked  s    
 r   zview.properties.marked.togglec                 H    | j                    | _         | j                          y)z;
        Toggle whether to show marked views only.
        N)r   r   r5   s    r   toggle_markedzView.toggle_marked#  s    
  $///r   zview.properties.inboundsrx   c                 4    d|cxk  xr t        |       k  S c S )z1
        Is this 0 <= index < len(self)?
        r   r8  )r   rx   s     r   r   zView.inbounds+  s    
 E%CI%%%%r   c                    d|v r[d }t         j                  j                  r.	 t        j                  t         j                  j                        }| j                  |       d|v rt         j                  j                  | j                  vr0t        j                  dt         j                  j                  z        | j                  t         j                  j                         d|v r)| j                  t         j                  j                         d|v r t         j                  j                  | _        y y # t
        $ r$}t        j                  t        |            |d }~ww xY w)Nr   r   r   r   r   )r
   optionsr   r   r   r   r   OptionsErrorrW   r   r   r   r   r   r   r   r   )r   r  r   r   s       r   	configurezView.configure3  s   G#D{{&&A%++CKK,C,CDD OOD!7"{{%%T[[8 --,s{{/E/EE  NN3;;112 G+ckk==>!W, # @ @D - " A$11#a&9q@As   -D5 5	E">EE"c                 (    | j                  |g       y r   r+   r$   s     r   requestheaderszView.requestheadersG      !r   c                 (    | j                  |g       y r   r   r$   s     r   r/  z
View.errorJ      QCr   c                 (    | j                  |g       y r   rH  r$   s     r   ri   zView.responseM  rI  r   c                 (    | j                  |g       y r   rH  r$   s     r   	interceptzView.interceptP  rI  r   c                 (    | j                  |g       y r   rH  r$   s     r   resumezView.resumeS  rI  r   c                 (    | j                  |g       y r   rH  r$   s     r   r  z	View.killV  rI  r   c                 (    | j                  |g       y r   rD  r$   s     r   	tcp_startzView.tcp_startY  rF  r   c                 (    | j                  |g       y r   rH  r$   s     r   tcp_messagezView.tcp_message\  rI  r   c                 (    | j                  |g       y r   rH  r$   s     r   	tcp_errorzView.tcp_error_  rI  r   c                 (    | j                  |g       y r   rH  r$   s     r   tcp_endzView.tcp_endb  rI  r   c                 (    | j                  |g       y r   rD  r$   s     r   	udp_startzView.udp_starte  rF  r   c                 (    | j                  |g       y r   rH  r$   s     r   udp_messagezView.udp_messageh  rI  r   c                 (    | j                  |g       y r   rH  r$   s     r   	udp_errorzView.udp_errork  rI  r   c                 (    | j                  |g       y r   rH  r$   s     r   udp_endzView.udp_endn  rI  r   c                 (    | j                  |g       y r   rD  r$   s     r   dns_requestzView.dns_requestq  rF  r   c                 (    | j                  |g       y r   rH  r$   s     r   dns_responsezView.dns_responset  rI  r   c                 (    | j                  |g       y r   rH  r$   s     r   	dns_errorzView.dns_errorw  rI  r   c                 T   |D ]  }|j                   | j                  v s| j                  |      r|| j                  vrK| j	                  |       | j
                  r|| j                  _        | j                  j                  |       | j                  j                  |       | j                  j                  |       	 | j                  j                  |      }| j                  j                  |       | j                  j                  ||        y# t         $ r Y #w xY w)zU
        Updates a list of flows. If flow is not in the state, it's ignored.
        ru   rz   N)r4   r7   r   r)   r   r   r   r?   r   r-   r   r1   r   rx   r*   r   r   r  s       r   r   zView.updatez  s      	EAttt{{";;q>

*q),,./DJJO))..A.6 ..q1,,11q19E"jj..q1 

))!,,,11q1D-	E$ & s   D	D'&D')r!   N)r   N)Ir;   r<   r=   r   r   r   rn   r   r   r   r   r>   r?   r@   r   rx   r   r   r   r   r   r   r   r   r   r   rW   r   r   r   r   r   r   TFilterr   r   r   r   r  r  r  r*   r  r'  typesPathr2  r+   r6  r9  r;  r=  r   rB  rE  r/  ri   rL  rN  r  rQ  rS  rU  rW  rY  r[  r]  r_  ra  rc  re  r   __classcell__)r   s   @r   r}   r}      s   ('T
$   -S -
$,, $ $
 JN;$$;-0;<?$J;	;
*c *d *0%  W___%' ' ' &'  W__&'	 (	 W__&'	 (	 W__)*0x} 0 +0 W__)*%D %T % +% W__%&
3 
4 
 '
 W__\"3  # W__&'
# 
$ 
 (
j0047 
 W__\"& #& W__*+	& ,	& W__+,5Y^^00 5s 5S 5S 5 -5 W__23
=Xinn.A.A%B 
= 
=QU 
= 4
= W__+,
=inn112
=9<
=EH
=	
= -
= W__+,	Bx	(;(;< 	B 	B -	B W__()@HY^^%8%89 @d @ *@& W__)*@ @)..2E2E)F @ +@4 W__()S s t  *$ W__&'"ioo22 "t " (" 3).."5"56 34 3( ()<)<t)C ( W__-.C  / W__-. D   /  W__45 6 W__/0&c &d & 1&A(EHY^^%8%89 Ed Er   r}   c                      e Zd ZdZdeddfdZedej                  j                  dz  fd       Zej                  dej                  j                  dz  fd       Zededz  fd	       Zej                  d
        Zd Zd Zd Zd Zy)r   z/
    Tracks a focus element within a View.
    r   r!   Nc                    || _         d | _        t        j                  d       | _        t        | j                         r| j                   d   | _        |j                  j                  | j                         |j                  j                  | j                         |j                  j                  | j                         y )Nc                       y r   r#   r#   r   r   r   z Focus.__init__.<locals>.<lambda>  rw   r   r   )r   _flowr   r   
sig_changerh   r?   r   connect_sig_view_addr   r{   r,   _sig_view_refresh)r   r   s     r   r   zFocus.__init__  s    	15
!,,\:tyy>		!DI	t112	!!$"7"78	""4#9#9:r   c                     | j                   S r   )rn  r5   s    r   r?   z
Focus.flow  s    zzr   r    c                 |    ||| j                   vrt        d      || _        | j                  j	                          y )Nz(Attempt to set focus to flow not in view)r   r   rn  ro  r-   r$   s     r   r?   z
Focus.flow  s5    =Qdii/GHH
r   c                 f    | j                   r%| j                  j                  | j                         S y r   )r?   r   rx   r5   s    r   rx   zFocus.index  s#    9999??499--r   c                     |dk  s|t        | j                        dz
  kD  rt        d      | j                  |   | _        y )Nr   r   zIndex out of view bounds)rh   r   r   r?   r   s     r   rx   zFocus.index  s8    7cC		NQ..788IIcN	r   c                 P    t        |j                  |      t        |      dz
        S r   )minr   rh   r   s      r   _nearestzFocus._nearest  s    199Q<Q!,,r   c                     t        | j                        dk(  rd | _        y || j                  u r(t        |t        | j                        dz
        | _        y y )Nr   r   )rh   r   r?   rx  rx   )r   r?   rx   s      r   r{   zFocus._sig_view_remove  sE    tyy>QDITYYUC		NQ$67DJ r   c                 (   t        | j                        dk(  rd | _        y | j                  | j                  d   | _        y | j                  | j                  vr9| j                  | j                  | j                  | j                           | _        y y rf   )rh   r   r?   ry  r5   s    r   rr  zFocus._sig_view_refresh  sj    tyy>QDIYY		!DIYYdii'		$--		499"EFDI (r   c                 ,    | j                   s|| _         y y r   ru   r   s     r   rq  zFocus._sig_view_add  s    yyDI r   )r;   r<   r=   __doc__r}   r   propertyr>   r?   r@   setterrn   rx   ry  r{   rr  rq  r#   r   r   r   r     s    ;$ ;4 ; inn))D0   
[[inn))D0   sTz  
 \\# #
-8Gr   r   c                   x    e Zd ZdeddfdZdefdZdefdZde	j                  j                  defdZd	 Zd
 Zy)r   r   r!   Nc                     || _         i | _        |j                  j                  | j                         |j
                  j                  | j                         y r   )r   _valuesr   rp  _sig_store_remover   _sig_store_refreshr   s     r   r   zSettings.__init__  sD    	24%%d&<&<=&&t'>'>?r   c                 ,    t        | j                        S r   )iterr  r5   s    r   __iter__zSettings.__iter__  s    DLL!!r   c                 ,    t        | j                        S r   )rh   r  r5   s    r   r   zSettings.__len__  s    4<<  r   r    c                     |j                   | j                  j                  vrt        | j                  j                  |j                   i       S r   )r4   r   r7   KeyErrorr  
setdefaultr$   s     r   r   zSettings.__getitem__  s8    44tyy'''N||&&qttR00r   c                 d    |j                   | j                  v r| j                  |j                   = y y r   )r4   r  r   s     r   r  zSettings._sig_store_remove  s'    77dll"TWW% #r   c                     t        | j                  j                               D ](  }|| j                  j                  vs| j                  |= * y r   )r   r  r   r   r7   )r   fids     r   r  zSettings._sig_store_refresh  sA    ))+, 	&C$))***LL%	&r   )r;   r<   r=   r}   r   r   r  rn   r   r>   r?   r@   r   r   r  r  r#   r   r   r   r     sW    @T @d @"( "! !1Y^^00 1T 1
&&r   r   ).r}  r   r
  r  collections.abcr   r   r   typingr   r   r   mitmproxy.flowr>   r   r	   r
   r   r   r   r   r   r   r   r   mitmproxy.logr   mitmproxy.utilsr   r   r   rB   rG   rZ   rd   r   r?   r@   rv   rn   r{   abcr}   r   Mappingr   r#   r   r   <module>r     s
  	   	 $ * $                    ! #$ $B#	 #
	( 	(	(i 	((9 ((
 >INN// =D = I9>>.. Hs Ht HBE;??## BEJ: :z&{&& &r   