
    h             
          d Z ddlZddlZddlZddlZddl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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%m&Z&m'Z' dd	l(m)Z) dd
l*m+Z+m,Z, ddl-m.Z.m/Z/m0Z0m1Z1 ddl2m3Z3m4Z4 ddl5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z; ddl<m=Z=m>Z>m?Z?m@Z@mAZAmBZB ddlCmDZDmEZEmFZFmGZGmHZH ddlImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZW eWrddlXmYZY  G d d          ZZ G d deMe[e\f                   Z] eTd          Z^ eTd          Z_ G d deOe^e_f         eF          Z` G d dea          ZbeUe`eJeJf         ebf         Zc G d deb          Zd G d d eb          Ze G d! d"eb          Zf G d# d$eb          Zg G d% d&eb          Zh G d' d(eb          Zi G d) d*ei          Zj G d+ d,ek          Zl G d- d.eb          Zm G d/ d0em          Zn G d1 d2e`e\ekf                   Zo G d3 d4e`ePe\         ekf                   Zp G d5 d6ep          Zq G d7 d8e`eUe\eGf         ekf                   Zr G d9 d:er          Zs G d; d<e`ePeUe\eAf                  ekf                   Zt G d= d>et          Zu G d? d@eteo          Zv G dA dBe`e[e[f                   Zw G dC dDew          Zx G dE dFew          Zy G dG dHe`e[e[f                   Zz G dI dJezex          Z{ G dK dLew          Z| G dM dNe|ex          Z}dO Z~ G dP dQe`e[eNe[         f                   Z G dR dSe          Z G dT dUe`e[e[f                   Z G dV dWe,          Z G dX dYe,          Z G dZ d[e,          Z G d\ d]ew          Z G d^ d_e`e[e[f                   Z G d` dae`e[e[f                   Z G db dce`e[e[f                   Z G dd dee`e[e[f                   Z G df dge          Z G dh die`e[e[f                   Z G dj dke`e[e[f                   Z G dl dme`e[e[f                   Z G dn doe`e[e[f                   Z G dp dqe          Z G dr dsee          Z G dt duee          Z G dv dwe`e[e[f                   Z G dx dye`e[e[f                   Z G dz d{e          Z G d| d}e`e[e[f                   Z G d~ de          Z G d dee          Z G d de`e[e[f                   Z G d de`e[e[f                   Z G d de`e^ekf                   Z G d deek                   Z G d de          Z G d d          Z G d dee          Z eTdeNeE         eEePeE                   Z G d dee                   Z G d dee                   Z G d deeE                   Z G d deePeE                            Z G d deeNeE                            Z G d de          Z G d dee          Z G d dee          Z G d de          Z G d de          Z G d de`ekekf                   Z G d dee          Z G d dee          Z G d dee          Z G d de          Z G d dee          Z G d dee          Z G d de          Z G d de`eNeJ         eNeJ         f                   Z G d de`e[e[f                   Z G d de          Z G d dee          Z G d de          Z G d de`e[e[f                   Z G d de`ee[f                   Z G dÄ de`e^e[f                   Z G dń dee[                   Z G dǄ de          Z G dɄ de          Z G d˄ de          Z G d̈́ de`eUeNe^         e^f         e^f                   Z G dτ dee^                   Z G dф dee\                   Z G dӄ deeUeNe[         e[f                  ee[                   Z G dՄ deee[                   Z G dׄ dee[                   Z G dل dee[                   Z G dۄ dee[                   Z G d݄ dee[                   Z G d߄ dee[                   Z G d deȦ          Z G d dee[                   Z G d dee[                   Z G d dee[                   Z G d deĦ          Z G d de|ee[                   Z G d deΦ          Z G d dee^                   Z G d dee[         ee[                   Z G d deeUeNe[         e[f                  ee[                   Z G d deȦ          Z G d deĦ          Z G d deʦ          Z G d de          Z G d dea          Z G d d ea          Z G d deePeUe[ef                                     Z ej        dddg          Z G d deeQe\                            Z G d d	e          Z G d
 de`eRe\e[f         eReke[f         f                   Z G d deަ          Z G d deަ          Z G d de`ee[f                   Z G d de`ee[f                   Z G d dea          Z G d dee`eUe[ef         eUe[ef         f                   Z G d dee          Z G d de{          Z G d de`eekf                   Z G d deee                   Z G d  d!e`ePe[         ekf                   Z G d" d#e          Z G d$ d%e          ZdS (&  z>
Fields: basic data structures that make up parts of packets.
    N)
MethodType)UUID)Enum)conf)DADict)RandBinRandByteRandEnumKeysRandIntRandIPRandIP6RandLongRandMACRandNum	RandShortRandSInt	RandSByteRandTermStringRandUUIDVolatileValue
RandSShort	RandSLong	RandFloat)EPOCH)log_runtimeScapy_Exception)	bytes_hex	plain_strrawbytes_encode)	inet_ntop	inet_pton)	inet_aton	inet_ntoalhexmac2strstr2macEDecimal)in6_6to4ExtractAddrin6_isaddr6to4in6_isaddrTeredoin6_ptopNet6teredoAddrExtractInfo)	_ScopedIP
BasePacketField_metaclassNetScopedIP)AnyAnyStrCallableDictListGenericOptionalSetTupleTypeTypeVarUnioncastTYPE_CHECKING)Packetc                   2    e Zd ZdZd	dZd Zd Zd Zd ZdS )
RawVala  
    A raw value that will not be processed by the field and inserted
    as-is in the packet string.

    Example::

        >>> a = IP(len=RawVal("####"))
        >>> bytes(a)
        b'F\x00####\x00\x01\x00\x005\xb5\x00\x00\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x00'

        c                 .    t          |          | _        d S N)r    val)selfrH   s     P/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/fields.py__init__zRawVal.__init__U   s    $$rE   c                 *    t          | j                  S rG   )strrH   rI   s    rJ   __str__zRawVal.__str__Y       48}}rE   c                     | j         S rG   rH   rN   s    rJ   	__bytes__zRawVal.__bytes__]   s	    xrE   c                 *    t          | j                  S rG   )lenrH   rN   s    rJ   __len__zRawVal.__len__a   rP   rE   c                     d| j         z  S )Nz<RawVal [%r]>rR   rN   s    rJ   __repr__zRawVal.__repr__e   s    ))rE   NrE   )	__name__
__module____qualname____doc__rK   rO   rS   rV   rX    rE   rJ   rD   rD   H   sn        
 
% % % %      * * * * *rE   rD   c                   B     e Zd ZdZ fdZd Z fdZ fdZd Z xZ	S )ObservableDictzQ
    Helper class to specify a protocol extendable for runtime modifications
    c                 V    g | _          t          t          |           j        |i | d S rG   )	observerssuperr`   rK   )rI   argskw	__class__s      rJ   rK   zObservableDict.__init__o   s2    ,nd##,d9b99999rE   c                 :    | j                             |           d S rG   )rb   append)rI   observers     rJ   observezObservableDict.observet   s    h'''''rE   c                     | j         D ]}|                    | ||           t          t          |                               ||           d S rG   )rb   
notify_setrc   r`   __setitem__)rI   keyvalueorf   s       rJ   rm   zObservableDict.__setitem__x   sS     	+ 	+ALLsE****nd##//U;;;;;rE   c                     | j         D ]}|                    | |           t          t          |                               |           d S rG   )rb   
notify_delrc   r`   __delitem__)rI   rn   rp   rf   s      rJ   rs   zObservableDict.__delitem__~   sO     	$ 	$ALLs####nd##//44444rE   c                 &    |D ]}||         | |<   d S rG   r^   )rI   anotherDictks      rJ   updatezObservableDict.update   s*     	% 	%A!!nDGG	% 	%rE   )
rZ   r[   r\   r]   rK   rj   rm   rs   rw   __classcell__rf   s   @rJ   r`   r`   j   s         : : : : :
( ( (< < < < <5 5 5 5 5% % % % % % %rE   r`   IMc                       e Zd ZdZg dZdZdZdZddZd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdS )Fieldz
    For more information on how this works, please refer to the
    'Adding new protocols' chapter in the online documentation:

    https://scapy.readthedocs.io/en/stable/build_dissect.html
    )namefmtdefaultszownersstructr   FHc                 P   t          |t                    st          d          || _        |d         dv r|| _        n
d|z   | _        t          j        | j                  | _        |                     d |          | _        t          j	        | j                  | _
        g | _        d S )Nzname should be a stringr   z@=<>!!)
isinstancerM   
ValueErrorr~   r   r   Structany2ir   calcsizer   r   )rI   r~   r   r   s       rJ   rK   zField.__init__   s    $$$ 	86777	q6WDHHSyDHmDH--zz$00/$(++rE   c                 :    | j                             |           d S rG   )r   rh   )rI   clss     rJ   register_ownerzField.register_owner   s    3rE   c                 X    t          |t                    rt          |          S | j        S )z<Convert internal value to a length usable by a FieldLenField)r   rD   rU   r   rI   pktxs      rJ   i2lenzField.i2len   s(     a   	q66MwrE   c                     dS )zqConvert internal value to a number of elements usable by a FieldLenField.
        Always 1 except for list fields   r^   r   s      rJ   i2countzField.i2count   s	     qrE   c                 ,    t          t          |          S )z%Convert human value to internal valuer@   rz   r   s      rJ   h2iz	Field.h2i        AqzzrE   c                     |S )z%Convert internal value to human valuer^   r   s      rJ   i2hz	Field.i2h   s	     rE   c                 ,    t          t          |          S )z'Convert machine value to internal valuer   r   s      rJ   m2iz	Field.m2i   r   rE   c                     |t          t          d          S t          |t                    r"t          t          t	          |                    S t          t          |          S )z'Convert internal value to machine valueNr   )r@   r{   r   rM   r    r   s      rJ   i2mz	Field.i2m   sM     91::3 	,<??+++AqzzrE   c                 .    |                      ||          S )zUTry to understand the most input values possible and make an internal value from themr   r   s      rJ   r   zField.any2i   s     xxQrE   c                 H    t          |                     ||                    S )z/Convert internal value to a nice representation)reprr   r   s      rJ   i2reprzField.i2repr   s      DHHS!$$%%%rE   c                     	 || j                             |                     ||                    z   S # t           j        $ r(}t	          d| j        z  d|z  z   dz   dz             d}~ww xY w)zAdd an internal value to a string

        Copy the network representation of field `val` (belonging to layer
        `pkt`) to the raw string packet `s`, and return the new string packet.
        z&Incorrect type of value for field %s:
zstruct.error('%s')
z7To inject bytes into the field regardless of the type, zuse RawVal. See help(RawVal)N)r   packr   errorr   r~   )rI   r   srH   exs        rJ   addfieldzField.addfield   s    	t{''c(:(:;;;;| 	 	 	9DIE&+,IJ //  	s   03 A*#A%%A*c           	          || j         d         |                     || j                            |d| j                            d                   fS )aD  Extract an internal value from a string

        Extract from the raw packet `s` the field value belonging to layer
        `pkt`.

        Returns a two-element list,
        first the raw packet string after having removed the extracted field,
        second the extracted field itself in internal representation.
        Nr   r   r   r   unpackrI   r   r   s      rJ   getfieldzField.getfield   sF     {DHHS$+*<*<Qxx[*I*I!*LMMMMrE   c                 >   t          |t                    rc|d d          }t          t          |                    D ]:}t          ||         t                    r||                                         ||<   ;|S t          |d          r|                                S |S )Ncopy)r   listrangerU   r0   r   hasattr)rI   r   is      rJ   do_copyzField.do_copy  s    a 	!!!A3q66]] ' 'adJ// 'Q499;;AaDH1f 	6688OrE   c                 |    d| j         j        dd                    d | j        D                       d| j        dS )N< (,c              3   $   K   | ]}|j         V  d S rG   )rZ   .0r   s     rJ   	<genexpr>z!Field.__repr__.<locals>.<genexpr>  s$      55AQZ555555rE   ).>)rf   rZ   joinr   r~   rN   s    rJ   rX   zField.__repr__  sM      N###HH555555555III
 	
rE   c                 *    t          j         |           S rG   )r   rN   s    rJ   r   z
Field.copy  s    yrE   c           
         | j         d         }|dv r@t          t          t          t          t
          t          t          t          d|                     S |dk    rW| j         d         dv rt          | j         dd                   }nt          | j         dd                   }t          |          S t          d	| j        d
| j         d          )zOReturn a volatile object whose value is both random and suitable for this fieldBbHhIiQq)Bbr   hrz   r   Qqr   r   
0123456789Nr   zno random class for [z] (fmt=r   )r   r	   r   r   r   r   r   r   r   intr   r   r~   )rI   fmttro   s      rJ   randvalzField.randval  s     x|:!	" x!	3 3 489 ; ; ; S[[x{l**DHSbSM**DHQrTN++5>>!*IIItxxx  rE   Nr   )rZ   r[   r\   r]   	__slots__islist	ismutableholds_packetsrK   r   r   r   r   r   r   r   r   r   r   r   r   rX   r   r   r^   rE   rJ   r}   r}      s8          I FIM              
  
  
       
& & &
  "N N N
 
 

 
 
      rE   r}   )	metaclassc                       e Zd ZdZdgZd ZdS )_FieldContainerz<
    A field that acts as a container for another field
    fldc                 ,    t          | j        |          S rG   getattrr   rI   attrs     rJ   __getattr__z_FieldContainer.__getattr__;      tx&&&rE   N)rZ   r[   r\   r]   r   r   r^   rE   rJ   r   r   5  s6          I' ' ' ' 'rE   r   c                   *    e Zd ZdZdgZd Zd Zd ZdS )EmphzEmpathize sub-layer for displayr   c                     || _         d S rG   r   rI   r   s     rJ   rK   zEmph.__init__G      rE   c                 2    t          | j        |k              S rG   boolr   rI   others     rJ   __eq__zEmph.__eq__K      DH%&&&rE   c                 *    t          | j                  S rG   hashr   rN   s    rJ   __hash__zEmph.__hash__O      DH~~rE   NrZ   r[   r\   r]   r   rK   r   r   r^   rE   rJ   r   r   C  sN        ))I  ' ' '    rE   r   c                   *    e Zd ZdZdgZd Zd Zd ZdS )MayEndap  
    Allow packet dissection to end after the dissection of this field
    if no bytes are left.

    A good example would be a length field that can be 0 or a set value,
    and where it would be too annoying to use multiple ConditionalFields

    Important note: any field below this one MUST default
    to an empty value, else the behavior will be unexpected.
    r   c                     || _         d S rG   r   r   s     rJ   rK   zMayEnd.__init__a  r   rE   c                 2    t          | j        |k              S rG   r   r   s     rJ   r   zMayEnd.__eq__e  r   rE   c                 *    t          | j                  S rG   r   rN   s    rJ   r   zMayEnd.__hash__i  r   rE   Nr   r^   rE   rJ   r   r   T  sT        	 	 I  ' ' '    rE   r   c                   "    e Zd Zg dZd Zd ZdS )ActionFieldr   _action_method	_privdatac                 0    || _         || _        || _        d S rG   r   )rI   r   action_methodkargss       rJ   rK   zActionField.__init__q  s    +rE   c                      t          || j                  || j        fi | j          t          | j        d          ||          S )Nr   )r   r   r   r   rI   r   rH   s      rJ   r   zActionField.any2iw  sK    )T())#txJJ4>JJJ)wtx))#s333rE   N)rZ   r[   r\   r   rK   r   r^   rE   rJ   r   r   n  s=        666I  4 4 4 4 4rE   r   c                   @    e Zd ZddgZd Zd Zd Zd Zd Zd Z	d	 Z
d
S )ConditionalFieldr   condc                 "    || _         || _        d S rG   )r   r  )rI   r   r  s      rJ   rK   zConditionalField.__init__  s    
 			rE   c                 F    t          |                     |                    S rG   )r   r  rI   r   s     rJ   	_evalcondzConditionalField._evalcond  s    DIIcNN###rE   c                 r    t          | j                  t          u r|S | j                            ||          S rG   )typer   r}   r   r   s      rJ   r   zConditionalField.any2i  s2     >>U""Hx~~c1%%%rE   c                 j    |r|                      |          sd S | j                            ||          S rG   )r  r   r   r  s      rJ   r   zConditionalField.i2h  s8     	t~~c** 	4x||C%%%rE   c                 j    |                      |          r| j                            ||          S |d fS rG   )r  r   r   r   s      rJ   r   zConditionalField.getfield  s7    >># 	8$$S!,,,d7NrE   c                 h    |                      |          r| j                            |||          S |S rG   )r  r   r   rI   r   r   rH   s       rJ   r   zConditionalField.addfield  s5    >># 	8$$S!S111HrE   c                 ,    t          | j        |          S rG   r   r   s     rJ   r   zConditionalField.__getattr__  r   rE   N)rZ   r[   r\   r   rK   r  r   r   r   r   r   r^   rE   rJ   r  r  }  s        I  $ $ $& & && & &    ' ' ' ' 'rE   r  c                      e Zd ZdZg dZdeeeee	e	f         e	e
f         eee	e	f         e	f         f                  dee	e	f         ddfdZd Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zed             ZdS )MultipleTypeFielda&  
    MultipleTypeField are used for fields that can be implemented by
    various Field subclasses, depending on conditions on the packet.

    It is initialized with `flds` and `dflt`.

    :param dflt: is the default field type, to be used when none of the
                 conditions matched the current packet.
    :param flds: is a list of tuples (`fld`, `cond`) or (`fld`, `cond`, `hint`)
                 where `fld` if a field type, and `cond` a "condition" to
                 determine if `fld` is the field type that should be used.

    ``cond`` is either:

    - a callable `cond_pkt` that accepts one argument (the packet) and
      returns True if `fld` should be used, False otherwise.
    - a tuple (`cond_pkt`, `cond_pkt_val`), where `cond_pkt` is the same
      as in the previous case and `cond_pkt_val` is a callable that
      accepts two arguments (the packet, and the value to be set) and
      returns True if `fld` should be used, False otherwise.

    See scapy.layers.l2.ARP (type "help(ARP)" in Scapy) for an example of
    use.
    )fldsdflthintsr~   r   r  r  returnNc                     d |D              _         d |D              _        | _        d  _         j        j         _        t           fd j        D                       r$t          j        d j        z  t                     d S d S )Nc                 R    i | ]$}t          |          d k    |d         |d         %S )   r      rU   r   s     rJ   
<dictcomp>z.MultipleTypeField.__init__.<locals>.<dictcomp>  s9     
 
 
1vv{{ aD!A${{rE   c                 .    g | ]}|d          |d         fS )r   r   r^   r   s     rJ   
<listcomp>z.MultipleTypeField.__init__.<locals>.<listcomp>  s1     
 
 
QqT1Q4L
 
 
rE   c              3   D   K   | ]}|d          j         j         k    V  dS )r   Nr~   )r   r   rI   s     rJ   r   z-MultipleTypeField.__init__.<locals>.<genexpr>  s0      99!qtyDI%999999rE   zLAll fields should have the same name in a MultipleTypeField (%s). Use hints.)	r  r  r  r   r~   anywarningswarnSyntaxWarning)rI   r  r  s   `  rJ   rK   zMultipleTypeField.__init__  s    
 

 
 



 
"&
 
 
	 	IN	9999ty99999 	M69=C    	 	rE   c                     | j         D ]X\  }}t          |t                    r/|r%|| j        j        } |d         ||          r|c S A|d         } ||          r|c S Y| j        S )z;Internal function used by _find_fld_pkt & _find_fld_pkt_valNr   r   )r  r   tupler  r   )rI   r   rH   use_valr   r  s         rJ   _iterate_fields_condz&MultipleTypeField._iterate_fields_cond  s      	 	IC$&& # #{"i/tAwsC(( #"


7DtCyy 


yrE   c                 0    |                      |dd          S )zGiven a Packet instance `pkt`, returns the Field subclass to be
used. If you know the value to be set (e.g., in .addfield()), use
._find_fld_pkt_val() instead.

        NF)r'  r  s     rJ   _find_fld_pktzMultipleTypeField._find_fld_pkt  s     ((dE:::rE   c                 J    |                      ||d          }||j        }||fS )zGiven a Packet instance `pkt` and the value `val` to be set,
returns the Field subclass to be used, and the updated `val` if necessary.

        T)r'  r   rI   r   rH   r   s       rJ   _find_fld_pkt_valz#MultipleTypeField._find_fld_pkt_val  s0     ''S$77;+CCxrE   c                 2   t          j                    j        j        }|r	 |j        d         }t	          |t          | j        j                            r#|j        s| j        S | 	                    |          S n# t          $ r Y nw xY w|j        }|r| j        S )a  Returns the Field subclass to be used, depending on the Packet
instance, or the default subclass.

DEV: since the Packet instance is not provided, we have to use a hack
to guess it. It should only be used if you cannot provide the current
Packet instance (for example, because of the current Scapy API).

If you have the current Packet instance, use ._find_fld_pkt_val() (if
the value to set is also known) of ._find_fld_pkt() instead.

        NrI   )inspectcurrentframef_backf_localsr   r%  r  r   default_fieldsr)  KeyError)rI   framer   s      rJ   	_find_fldzMultipleTypeField._find_fld  s     $&&-4	3nV, c5)9#:#:;; 3- )#y(--c222	3     LE  ys   A9 9
BBc                 T    |                      |                              ||          S rG   )r)  r   r   s      rJ   r   zMultipleTypeField.getfield1  s(    
 !!#&&//Q777rE   c                 b    |                      ||          \  }}|                    |||          S rG   )r,  r   )rI   r   r   rH   r   s        rJ   r   zMultipleTypeField.addfield8  s1    ))#s33S||CC(((rE   c                 `    |                      ||          \  }}|                    ||          S rG   )r,  r   r+  s       rJ   r   zMultipleTypeField.any2i=  /    ))#s33Syyc"""rE   c                 `    |                      ||          \  }}|                    ||          S rG   )r,  r   r+  s       rJ   r   zMultipleTypeField.h2iB  /    ))#s33SwwsC   rE   c                 `    |                      ||          \  }}|                    ||          S rG   )r,  r   r+  s       rJ   r   zMultipleTypeField.i2hG  s1    
 ))#s33SwwsC   rE   c                 `    |                      ||          \  }}|                    ||          S rG   )r,  r   r+  s       rJ   r   zMultipleTypeField.i2mO  r;  rE   c                 `    |                      ||          \  }}|                    ||          S rG   )r,  r   r+  s       rJ   r   zMultipleTypeField.i2lenT  r9  rE   c                     |                      ||          \  }}d}|| j        v rd| j        |         z  }|                    ||          |z   S )N z (%s))r,  r  r   )rI   r   rH   r   hints        rJ   r   zMultipleTypeField.i2reprY  sV    ))#s33S$*TZ_,Dzz#s##d**rE   c                     | j         D ]\  }}|j                            |            | j        j                            |           d S rG   )r  r   rh   r  )rI   r   r   _s       rJ   r   z MultipleTypeField.register_ownera  sO    i 	# 	#FCJc""""	$$$$$rE   c                     | gS rG   r^   rN   s    rJ   get_fields_listz!MultipleTypeField.get_fields_listg  s	    vrE   c                 *    |                                  S rG   )r5  rN   s    rJ   r   zMultipleTypeField.fldk  s     ~~rE   )rZ   r[   r\   r]   r   r8   r?   r<   r}   r4   rM   rK   r'  r)  r,  r5  r   r   r   r   r   r   r   r   r   rE  propertyr   r^   rE   rJ   r  r    s        2 =<<I5%S/3+,%S/3&'(
  CHo 
   4  $; ; ;    <8 8 8) ) )
# # #
! ! !
! ! !! ! !
# # #
+ + +% % %       X     rE   r  c                   4    e Zd ZdZg dZddZd Zd Zd ZdS )	PadFieldzhAdd bytes after the proxified field so that it ends at the specified
       alignment from its beginningr   _align_padwithNc                 4    || _         || _        |pd| _        d S N    rJ  )rI   r   alignpadwiths       rJ   rK   zPadField.__init__v  s     *7rE   c                     | | j         z  S rG   )rK  )rI   flenr   s      rJ   padlenzPadField.padlen|  s    ut{""rE   c                     | j                             ||          \  }}|                     t          |          t          |          z
  |          }||d          |fS rG   )r   r   rT  rU   )rI   r   r   remainrH   rT  s         rJ   r   zPadField.getfield  sV    
 h''Q//SVVc&kk1377fgg##rE   c                     | j                             |d|          }||z   |                     t          |          |          | j        z  z   S NrE   )r   r   rT  rU   rL  rI   r   r   rH   svals        rJ   r   zPadField.addfield  sL     x  c3//4xKKD		3''$-7
 	
rE   rG   )	rZ   r[   r\   r]   r   rK   rT  r   r   r^   rE   rJ   rI  rI  q  sj        ' '---I+ + + +# # #$ $ $	
 	
 	
 	
 	
rE   rI  c                   $    e Zd ZdZd Zd Zd ZdS )ReversePadFieldzkAdd bytes BEFORE the proxified field so that it starts at the specified
       alignment from its beginningc                 *    t          |j                  S rG   )rU   originalr  s     rJ   original_lengthzReversePadField.original_length  s    3<   rE   c                     |                      |                     |          t          |          z
  |          }| j                            |||d                    S rG   )rT  r_  rU   r   r   )rI   r   r   rT  s       rJ   r   zReversePadField.getfield  sP     T11#66Q?EEx  aj111rE   c           	          | j                             |d|          }|t          j        d|                     t          |          |          z  | j                  z   |z   S )NrE   %is)r   r   r   r   rT  rU   rL  rY  s        rJ   r   zReversePadField.addfield  sc     x  c3//6;uKKA$$ 
=   ! 	!rE   N)rZ   r[   r\   r]   r_  r   r   r^   rE   rJ   r\  r\    sK        ' '! ! !2 2 2	! 	! 	! 	! 	!rE   r\  c                   "     e Zd ZdZ fdZ xZS )TrailerByteszZ
    Reverses slice operations to take from the back of the packet,
    not the front
    c                 T   t          |t                    r"|dk     rd|z   }n_t          |           dz
  |z
  }nIt          |t                    r4|j        |j        |j        }}}|r| nd }|r| nd }t          |||          }t          | j        |           	                    |          S Nr   r   )
r   r   rU   slicestartstopsteprc   rf   __getitem__)rI   itemrh  ri  rj  	new_startnew_stoprf   s          rJ   rk  zTrailerBytes.__getitem__  s    dC   		4axx4x4yy1}t+e$$ 	4 $
DIty4E!%/4I!&0vvDHHd33DT^T**66t<<<rE   )rZ   r[   r\   r]   rk  rx   ry   s   @rJ   rd  rd    sB         
= = = = = = = = =rE   rd  c                   *    e Zd ZdZdgZd Zd Zd ZdS )TrailerFieldzSpecial Field that gets its value from the end of the *packet*
    (Note: not layer, but packet).

    Mostly used for FCS
    r   c                     || _         d S rG   r   r   s     rJ   rK   zTrailerField.__init__  r   rE   c                     |j         fd}t          ||          |_         t          |          }| j                            ||          \  }}t          |          |fS )Nc                 6    d | _         | _         |          S rG   )raw_packet_cachepost_dissect)rI   r   previous_post_dissects     rJ   _post_dissectz,TrailerField.getfield.<locals>._post_dissect  s&     %)D! 5D((+++rE   )ru  r   rd  r   r   bytes)rI   r   r   rw  rH   rv  s        @rJ   r   zTrailerField.getfield  so     # 0	, 	, 	, 	, 	, &mS99OO""3**3Qxx}rE   c                     |j         | j                            |d|          fd}t          ||          |_         |S )NrE   c                 4    |z  }| _          ||          S rG   )
post_build)rI   ppayprevious_post_buildro   s      rJ   _post_buildz*TrailerField.addfield.<locals>._post_build  s&    5LC1DO&&q#...rE   )r{  r   r   r   )rI   r   r   rH   r  r~  ro   s        @@rJ   r   zTrailerField.addfield  s[    !n!!#sC00	/ 	/ 	/ 	/ 	/ 	/
 $K55rE   N)rZ   r[   r\   r]   r   rK   r   r   r^   rE   rJ   rp  rp    sT         
 I        rE   rp  c                   (     e Zd ZdZ fdZd Z xZS )FCSFieldzP
    A FCS field that gets appended at the end of the *packet* (not layer).
    c                 l    t          t          |                               t          |i |           d S rG   )rc   r  rK   r}   )rI   rd   kwargsrf   s      rJ   rK   zFCSField.__init__  s4    h&&ud'=f'='=>>>>>rE   c                 H    t          |                     ||                    S rG   r%   r   r   s      rJ   r   zFCSField.i2repr      DHHS!$$%%%rE   )rZ   r[   r\   r]   rK   r   rx   ry   s   @rJ   r  r    sQ         ? ? ? ? ?& & & & & & &rE   r  c                   :    e Zd ZdgZi Zd Zd Zed             ZdS )	DestField
defaultdstc                     || _         d S rG   )r  rI   r~   r   s      rJ   rK   zDestField.__init__  s    !rE   c                     | j                             j        j        g           D ]G\  }}	 t	          fd|                                D                       r|c S 8# t          $ r Y Dw xY w| j        S )Nc              3   Z   K   | ]%\  }}j                             |          |k    V  &d S rG   )payloadgetfieldval)r   fieldro   r   s      rJ   r   z)DestField.dst_from_pkt.<locals>.<genexpr>  sP       > >'5% {..u55> > > > > > >rE   )bindingsgetr  rf   allitemsAttributeErrorr  )rI   r   addr	conditions    `  rJ   dst_from_pktzDestField.dst_from_pkt  s    #}001FKK 	 	OD) > > > >+4??+<+<> > > > >  KKK  "   s   .A
A,+A,c                 f    | j                             |g                               ||f           d S rG   )r  
setdefaultrh   )r   layerr  r  s       rJ   	bind_addrzDestField.bind_addr  s@     	r**119	
 	
 	
 	
 	
rE   N)	rZ   r[   r\   r   r  rK   r  classmethodr  r^   rE   rJ   r  r    sY        IH" " "	 	 	 
 
 [
 
 
rE   r  c                   2    e Zd Zd Zd Zd Zd Zd Zd ZdS )MACFieldc                 @    t                               | ||d           d S )N6sr}   rK   r  s      rJ   rK   zMACField.__init__       tT7D11111rE   c                     |sdS 	 t          |          }n+# t          j        t          f$ r t	          |          }Y nw xY w|S )Ns         )r&   r   r   OverflowErrorr    rI   r   r   ys       rJ   r   zMACField.i2m#  sW     	#"?	 

AAm, 	  	  	 QAAA	 s    %>>c                      t          |          S rG   )r'   r   s      rJ   r   zMACField.m2i-  s    qzzrE   c                     t          |t                    r)t          |          dk    r|                     ||          S t	          t
          |          S )N   )r   rx  rU   r   r@   rM   r   s      rJ   r   zMACField.any2i1  sD    a 	$CFFaKK88C###C||rE   c                     |                      ||          }|t          |          S | t          j        v rt          j                            |          }|S rG   )r   r   r   resolvemanufdb_resolve_MACr   s      rJ   r   zMACField.i2repr7  sL    HHS!977N4<))!,,ArE   c                     t                      S rG   )r   rN   s    rJ   r   zMACField.randval@      yyrE   N	rZ   r[   r\   rK   r   r   r   r   r   r^   rE   rJ   r  r    sn        2 2 2            rE   r  c                       e Zd Zd Zd ZdS )
LEMACFieldc                 L    t                               | ||          d d d         S Nr   )r  r   r   s      rJ   r   zLEMACField.i2mF  s#    ||D#q))$$B$//rE   c                 L    t                               | ||d d d                   S r  )r  r   r   s      rJ   r   zLEMACField.m2iJ  s"    ||D#q2w///rE   NrZ   r[   r\   r   r   r^   rE   rJ   r  r  E  s2        0 0 00 0 0 0 0rE   r  c                   D    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
S )IPFieldc                 @    t                               | ||d           d S )N4sr  r  s      rJ   rK   zIPField.__init__P  r  rE   c                     t          |t                    rt          |          }t          |t                    r|S t          |t                    rDt          |          }	 t          |           n# t          j        $ r t          |          cY S w xY wt          |t                    r+t          |          dk    rt          d          t          | S t          |t                    r fd|D             S |S )Nr  zInvalid IP formatc                 <    g | ]}                     |          S r^   r   r   nr   rI   s     rJ   r  zIPField.h2i.<locals>.<listcomp>e  s'    000DHHS!$$000rE   )r   rx  r   r/   rM   r3   r#   socketr   r2   r%  rU   r   r   r   s   `` rJ   r   zIPField.h2iT  s    a 	!Aa## 	1H3 	1A!<   1vv5!! 	11vv{{ !45557N4   	100000a0000s   #A3 3BBc                 ,    t          t          |          S rG   r@   rM   r   s      rJ   r   zIPField.i2hh      C||rE   c                     | t           j        v r0	 t          j        |          d         }|r|S n# t          $ r Y nw xY w|S Nr   )r   r  r  gethostbyaddr	Exception)rI   r   rets      rJ   r  zIPField.resolvel  sf    4<*1--a0  J    
 s   / 
<<c                 B    |dS t          t          |                    S )Ns       )r#   r   r   s      rJ   r   zIPField.i2mx  s!    9&&1&&&rE   c                      t          |          S rG   )r$   r   s      rJ   r   zIPField.m2i~  s    ||rE   c                 .    |                      ||          S rG   r   r   s      rJ   r   zIPField.any2i      xxQrE   c                     t          |t                    r|j        rt          |          S |                     |                     ||                    }t          |t                    r|nt          |          S rG   )r   r/   scoper   r  r   rM   )rI   r   r   rs       rJ   r   zIPField.i2repr  sf    a## 	 	77NLL#q))**q#&&3qqDGG3rE   c                     t                      S rG   )r   rN   s    rJ   r   zIPField.randval  s    xxrE   N)rZ   r[   r\   rK   r   r   r  r   r   r   r   r   r^   rE   rJ   r  r  O  s        2 2 2  (  
 
 
' ' '       4 4 4    rE   r  c                   4     e Zd Zd Zd Z fdZ fdZ xZS )SourceIPFieldc                 >    t                               | |d            d S rG   )r  rK   rI   r~   s     rJ   rK   zSourceIPField.__init__  s     tT*****rE   c                     t           j        dd l}|                                d         p#t           j                                        d         S rf  )r   routescapy.routerI   r   scapys      rJ   
__findaddrzSourceIPField.__findaddr  s@    :yy{{1~6!1!1!3!3A!66rE   c                     |||                      |          }t          t          |                               ||          S rG   )_SourceIPField__findaddrrc   r  r   rI   r   r   rf   s      rJ   r   zSourceIPField.i2m  =    9$$A]D))--c1555rE   c                     |||                      |          }t          t          |                               ||          S rG   )r  rc   r  r   r  s      rJ   r   zSourceIPField.i2h  r  rE   )rZ   r[   r\   rK   r  r   r   rx   ry   s   @rJ   r  r    so        + + +7 7 76 6 6 6 66 6 6 6 6 6 6 6 6rE   r  c                   >    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	S )
IP6Fieldc                 @    t                               | ||d           d S N16sr  r  s      rJ   rK   zIP6Field.__init__  s     tT7E22222rE   c                 "    t          |t                    rt          |          }t          |t                    r|S t          |t                    rXt          |          }	 t          t          |          |j                  }n# t          j	        $ r t          |          cY S w xY wt          |t                    r+t          |          dk    rt          d          t          | S t          |t                    r fd|D             }|S )N)r  r  zInvalid IPv6 formatc                 <    g | ]}                     |          S r^   r   r  s     rJ   r  z IP6Field.h2i.<locals>.<listcomp>  s'    ---a#q!!---rE   )r   rx  r   r/   rM   r3   r,   r  r  r   r-   r%  rU   r   r   r   s   `` rJ   r   zIP6Field.h2i  s   a 	!Aa## 	.H3 	.AXa[[888<   Aww5!! 	.1vv{{ !67778O4   	.-----1---As   ##B B('B(c                 ,    t          t          |          S rG   r  r   s      rJ   r   zIP6Field.i2h  r  rE   c                 X    |d}t          t          j        t          |                    S )Nz::)r"   r  AF_INET6r   r   s      rJ   r   zIP6Field.i2m  s$    9A)A,,777rE   c                 6    t          t          j        |          S rG   r!   r  r  r   s      rJ   r   zIP6Field.m2i  s    !,,,rE   c                 .    |                      ||          S rG   r   r   s      rJ   r   zIP6Field.any2i  r  rE   c                 R   ||                      ||          S t          |t                    st          |t                    st	          |          r6t          |          \  }}}}|                      ||          d|d|d|dS t          |          r+t          |          }|                      ||          d|dS t          |t                    r|j	        rt          |          S |                      ||          }t          |t                    r|nt          |          S )Nz [Teredo srv: z cli: :]z [6to4 GW: )r   r   r-   r   r+   r.   r*   r)   r/   r  r   rM   )	rI   r   r   serverrC  maddrmportvaddrr  s	            rJ   r   zIP6Field.i2repr  s1   988C###At$$ 	Z4-@-@ 	"" *?*B*B'5%;?88C;K;K;K;KVVVUZUZUZ\a\a\abb"" +A..-1XXc1-=-=-=-=uuuEEAy)) ag AwwHHS!q#&&3qqDGG3rE   c                     t                      S rG   )r   rN   s    rJ   r   zIP6Field.randval  r  rE   N)rZ   r[   r\   rK   r   r   r   r   r   r   r   r^   rE   rJ   r  r    s        3 3 3  (  8 8 8- - -     4 4 4     rE   r  c                   4     e Zd Zd Zd Z fdZ fdZ xZS )SourceIP6Fieldc                 >    t                               | |d            d S rG   )r  rK   r  s     rJ   rK   zSourceIP6Field.__init__  s     $d+++++rE   c                 V    t           j        dd l}|                                d         S rf  )r   route6scapy.route6r  r  s      rJ   r  zSourceIP6Field.__findaddr  s(    ;yy{{1~rE   c                     |||                      |          }t          t          |                               ||          S rG   )_SourceIP6Field__findaddrrc   r  r   r  s      rJ   r   zSourceIP6Field.i2m  =    9$$A^T**..sA666rE   c                     |||                      |          }t          t          |                               ||          S rG   )r  rc   r  r   r  s      rJ   r   zSourceIP6Field.i2h  r  rE   )rZ   r[   r\   rK   r  r   r   rx   ry   s   @rJ   r  r    so        , , ,  7 7 7 7 77 7 7 7 7 7 7 7 7rE   r  c                   .     e Zd Zi Zd Zd Z fdZ xZS )DestIP6Fieldc                 v    t                               | |d            t                              | ||           d S rG   )r  rK   r  r  s      rJ   rK   zDestIP6Field.__init__  s8    $d+++4w/////rE   c                 l    |||                      |          }t                              | ||          S rG   )r  r  r   r   s      rJ   r   zDestIP6Field.i2m  s4    9!!#&&A||D#q)))rE   c                     |||                      |          }t          t          |                               ||          S rG   )r  rc   r   r   r  s      rJ   r   zDestIP6Field.i2h  s?    9!!#&&A\4((,,S!444rE   )rZ   r[   r\   r  rK   r   r   rx   ry   s   @rJ   r   r     s[        H0 0 0
* * *5 5 5 5 5 5 5 5 5rE   r   c                       e Zd Zd ZdS )	ByteFieldc                 @    t                               | ||d           d S Nr   r  r  s      rJ   rK   zByteField.__init__       tT7C00000rE   NrZ   r[   r\   rK   r^   rE   rJ   r  r    #        1 1 1 1 1rE   r  c                       e Zd Zd ZdS )
XByteFieldc                 H    t          |                     ||                    S rG   r  r   s      rJ   r   zXByteField.i2repr   r  rE   NrZ   r[   r\   r   r^   rE   rJ   r  r    #        & & & & &rE   r  c                       e Zd Zd ZdS )
OByteFieldc                 4    d|                      ||          z  S )Nz%03o)r   r   s      rJ   r   zOByteField.i2repr'  s    a((((rE   Nr  r^   rE   rJ   r  r  &  s#        ) ) ) ) )rE   r  c                        e Zd Zd Zd Zd ZdS )ThreeBytesFieldc                 @    t                               | ||d           d S )N!Ir  r  s      rJ   rK   zThreeBytesField.__init__-  r  rE   c                 t    |t          j        | j        |                     ||                    dd         z   S )Nr      r   r   r   r   r  s       rJ   r   zThreeBytesField.addfield1  s2    6;tx#s););<<QqSAAArE   c                     |dd          |                      |t          j        | j        d|d d         z             d                   fS Nr  rO  r   r   r   r   r   r   s      rJ   r   zThreeBytesField.getfield5  sB    udhhsFM$(GaeO$L$LQ$OPPPPrE   NrZ   r[   r\   rK   r   r   r^   rE   rJ   r  r  ,  sI        2 2 2B B BQ Q Q Q QrE   r  c                       e Zd Zd ZdS )X3BytesFieldc                 :    t                               | ||          S rG   r  r   r   s      rJ   r   zX3BytesField.i2repr;        sA...rE   Nr  r^   rE   rJ   r  r  :  #        / / / / /rE   r  c                        e Zd Zd Zd Zd ZdS )LEThreeBytesFieldc                 @    t                               | ||d           d S Nz<Ir  r  s      rJ   rK   zLEThreeBytesField.__init__A  r  rE   c                 t    |t          j        | j        |                     ||                    d d         z   S )Nr  r  r  s       rJ   r   zLEThreeBytesField.addfieldE  s2    6;tx#s););<<RaR@@@rE   c           
          |dd          |                      |t          j        | j        |d d         dz             d                   fS r  r  r   s      rJ   r   zLEThreeBytesField.getfieldI  sB    udhhsFM$(AbqbEGO$L$LQ$OPPPPrE   Nr  r^   rE   rJ   r%  r%  @  sI        2 2 2A A AQ Q Q Q QrE   r%  c                       e Zd Zd ZdS )XLE3BytesFieldc                 :    t                               | ||          S rG   r!  r   s      rJ   r   zXLE3BytesField.i2reprO  r"  rE   Nr  r^   rE   rJ   r+  r+  N  r#  rE   r+  c                  N    t          j        dt                     t          | i |S )Nz0LEX3BytesField is deprecated. Use XLE3BytesField)r!  r"  DeprecationWarningr+  )rd   r  s     rJ   LEX3BytesFieldr/  T  s1    M:   4*6***rE   c                   B     e Zd Zd Zd Zd Z fdZd Zd Zd Z	 xZ
S )NBytesFieldc                 L    t                               | ||dd|z  z              d S )Nr   r   r  )rI   r~   r   r   s       rJ   rK   zNBytesField.__init__^  s(    tT7C#(N;;;;;rE   c                     |dg| j         z  S t                      }t          | j                   D ]}|                    |dz             |dz  } |d d d         S )Nr      r   )r   r   r   rh   )rI   r   r   x2mrC  s        rJ   r   zNBytesField.i2mb  sf    93= fftw 	 	AJJq3w#IAA44R4yrE   c                     t          |t                    r|S t          |t          t          f          r3t	          d t          t          |                    D                       S dS )Nc              3   ,   K   | ]\  }}|d |z  z  V  dS )r4  Nr^   )r   r   ds      rJ   r   z"NBytesField.m2i.<locals>.<genexpr>r  s.      II$!QqC1H~IIIIIIrE   r   )r   r   r   r%  sum	enumeratereversedr   s      rJ   r   zNBytesField.m2il  s`    a 	Ha$'' 	JII)HQKK2H2HIIIIIIqrE   c                     t          |t                    rd|z  S t          t          |                               ||          S )Nz%i)r   r   rc   r1  r   r  s      rJ   r   zNBytesField.i2repru  s>    a 	!8O[$''..sA666rE   c                 N    | | j         j        |                     ||           z   S rG   )r   r   r   r  s       rJ   r   zNBytesField.addfield{  s(    #4;#TXXc3%7%7888rE   c           	          || j         d          |                     || j                            |d | j                                      fS rG   r   r   s      rJ   r   zNBytesField.getfield  sF    $'((dk008DG8==>>@ 	@rE   c                 >    t          dd| j        dz  z  dz
            S )Nr   r     r   )r   r   rN   s    rJ   r   zNBytesField.randval  s"    q!!,q0111rE   )rZ   r[   r\   rK   r   r   r   r   r   r   rx   ry   s   @rJ   r1  r1  ]  s        < < <    7 7 7 7 79 9 9@ @ @
2 2 2 2 2 2 2rE   r1  c                        e Zd Z fdZ xZS )XNBytesFieldc                    t          |t                    rd|z  S t          |t          t          f          r"dd                    d |D                       z   S t          t          |                               ||          S )N0x%x0xr@  c              3       K   | ]	}d |z  V  
dS )z%02xNr^   r   r   s     rJ   r   z&XNBytesField.i2repr.<locals>.<genexpr>  s&      !8!8&1*!8!8!8!8!8!8rE   )r   r   r   r%  r   rc   rB  r   r  s      rJ   r   zXNBytesField.i2repr  s{    a 	A:a$'' 	9"''!8!8a!8!8!88888\4((//Q777rE   rZ   r[   r\   r   rx   ry   s   @rJ   rB  rB    s8        8 8 8 8 8 8 8 8 8rE   rB  c                       e Zd Zd ZdS )SignedByteFieldc                 @    t                               | ||d           d S )Nr   r  r  s      rJ   rK   zSignedByteField.__init__  r  rE   Nr	  r^   rE   rJ   rJ  rJ    r
  rE   rJ  c                       e Zd ZdS )FieldValueRangeExceptionNrZ   r[   r\   r^   rE   rJ   rM  rM            DrE   rM  c                       e Zd ZdS )MaximumItemsCountNrN  r^   rE   rJ   rQ  rQ    rO  rE   rQ  c                       e Zd ZdS )FieldAttributeExceptionNrN  r^   rE   rJ   rS  rS    rO  rE   rS  c                   ,    e Zd ZdZdgZd ZddZd ZdS )YesNoByteFielda  
    A byte based flag field that shows representation of its number
    based on a given association

    In its default configuration the following representation is generated:
        x == 0 : 'no'
        x != 0 : 'yes'

    In more sophisticated use-cases (e.g. yes/no/invalid) one can use the
    config attribute to configure.
    Key-value, key-range and key-value-set associations that will be used to
    generate the values representation.

    - A range is given by a tuple (<first-val>, <last-value>) including the
      last value.
    - A single-value tuple is treated as scalar.
    - A list defines a set of (probably non consecutive) values that should be
      associated to a given key.

    All values not associated with a key will be shown as number of type
    unsigned byte.

    **For instance**::

        config = {
            'no' : 0,
            'foo' : (1,22),
            'yes' : 23,
            'bar' : [24,25, 42, 48, 87, 253]
        }

    Generates the following representations::

        x == 0 : 'no'
        x == 15: 'foo'
        x == 23: 'yes'
        x == 42: 'bar'
        x == 43: 43

    Another example, using the config attribute one could also revert
    the stock-yes-no-behavior::

        config = {
                'yes' : 0,
                'no' : (1,255)
        }

    Will generate the following value representation::

        x == 0 : 'yes'
        x != 0 : 'no'

    eval_fnc                   	 t                      	|D ]a}||         }t          |          }|t          u r4|dk     s|dk    r"t          d                    |                    |	|<   W|t
          u r9|D ]5}|dk     s|dk    r"t          d                    |                    |	|<   6|t          u rt          |          }|dk    r#t          d                    ||                    |d         }|dk     s|dk    r"t          d                    |                    |d         }|dk     s|dk    r"t          d                    |                    t          ||dz             D ]}|	|<   c	fd| _
        d S )Nr      z8given field value {} invalid - must be in range [0..255]r  zWinvalid length {} of given config item tuple {} - must be (<start-range>, <end-range>).r   c                      | v r|          n| S rG   r^   )r   assoc_tables    rJ   <lambda>z=YesNoByteField._build_config_representation.<locals>.<lambda>  s    13C3CQ rE   )dictr
  r   rM  formatr   r%  rU   rS  r   rV  )
rI   configrn   
value_specvalue_spec_typero   value_spec_lenvalue_range_startvalue_range_endrZ  s
            @rJ   _build_config_representationz+YesNoByteField._build_config_representation  s   ff $	- $	-CJ":..O#%%>>Z#%5%52 4OOUvV`OaOac c c*-J'' D((' - -EqyyECKK6 8SSYSYZ_S`S`b b b),K&&	- !E))!$Z!Q&&1 3RRXRXYgisRtRtv v v %/qM!$q((,=,C,C2 4OOUvVgOhOhj j j #-Q-"Q&&/C*?*?2 4OOUvVeOfOfh h h ##4o6IJJ - -E),K&&JJJJrE   Nc                 ~    |s	d | _         n|                     |           t                              | ||           d S )Nc                     | dk    rdndS )Nr   noyesr^   r   s    rJ   r[  z)YesNoByteField.__init__.<locals>.<lambda>  s    Q!VVTT rE   )rV  rd  r  rK   )rI   r~   r   r^  s       rJ   rK   zYesNoByteField.__init__	  sJ      	6>>DLL--f5554w/////rE   c                 ,    |                      |          S rG   )rV  r   s      rJ   r   zYesNoByteField.i2repr  s    ||ArE   rG   )rZ   r[   r\   r]   r   rd  rK   r   r^   rE   rJ   rU  rU    s^        4 4j I)K )K )KV0 0 0 0    rE   rU  c                       e Zd Zd ZdS )
ShortFieldc                 @    t                               | ||d           d S Nr   r  r  s      rJ   rK   zShortField.__init__  r  rE   Nr	  r^   rE   rJ   rl  rl    r
  rE   rl  c                       e Zd Zd ZdS )SignedShortFieldc                 @    t                               | ||d           d S )Nr   r  r  s      rJ   rK   zSignedShortField.__init__  r  rE   Nr	  r^   rE   rJ   rp  rp    r
  rE   rp  c                       e Zd Zd ZdS )LEShortFieldc                 @    t                               | ||d           d S N<Hr  r  s      rJ   rK   zLEShortField.__init__%  r  rE   Nr	  r^   rE   rJ   rs  rs  $  #        2 2 2 2 2rE   rs  c                       e Zd Zd ZdS )LESignedShortFieldc                 @    t                               | ||d           d S )Nz<hr  r  s      rJ   rK   zLESignedShortField.__init__+  r  rE   Nr	  r^   rE   rJ   ry  ry  *  rw  rE   ry  c                       e Zd Zd ZdS )XShortFieldc                 H    t          |                     ||                    S rG   r  r   s      rJ   r   zXShortField.i2repr1  r  rE   Nr  r^   rE   rJ   r|  r|  0  r  rE   r|  c                       e Zd Zd ZdS )IntFieldc                 @    t                               | ||d           d S Nrz   r  r  s      rJ   rK   zIntField.__init__7  r  rE   Nr	  r^   rE   rJ   r  r  6  r
  rE   r  c                       e Zd Zd ZdS )SignedIntFieldc                 @    t                               | ||d           d S Nr   r  r  s      rJ   rK   zSignedIntField.__init__=  r  rE   Nr	  r^   rE   rJ   r  r  <  r
  rE   r  c                       e Zd Zd ZdS )
LEIntFieldc                 @    t                               | ||d           d S r'  r  r  s      rJ   rK   zLEIntField.__init__C  r  rE   Nr	  r^   rE   rJ   r  r  B  rw  rE   r  c                       e Zd Zd ZdS )LESignedIntFieldc                 @    t                               | ||d           d S )Nz<ir  r  s      rJ   rK   zLESignedIntField.__init__I  r  rE   Nr	  r^   rE   rJ   r  r  H  rw  rE   r  c                       e Zd Zd ZdS )	XIntFieldc                 H    t          |                     ||                    S rG   r  r   s      rJ   r   zXIntField.i2reprO  r  rE   Nr  r^   rE   rJ   r  r  N  r  rE   r  c                       e Zd Zd ZdS )XLEIntFieldc                 :    t                               | ||          S rG   )r  r   r   s      rJ   r   zXLEIntField.i2reprU  s    c1---rE   Nr  r^   rE   rJ   r  r  T  s#        . . . . .rE   r  c                       e Zd Zd ZdS )XLEShortFieldc                 :    t                               | ||          S rG   )r|  r   r   s      rJ   r   zXLEShortField.i2repr[  s    !!$Q///rE   Nr  r^   rE   rJ   r  r  Z  s#        0 0 0 0 0rE   r  c                       e Zd Zd ZdS )	LongFieldc                 @    t                               | ||d           d S Nr   r  r  s      rJ   rK   zLongField.__init__a  r  rE   Nr	  r^   rE   rJ   r  r  `  r
  rE   r  c                       e Zd Zd ZdS )SignedLongFieldc                 @    t                               | ||d           d S )Nr   r  r  s      rJ   rK   zSignedLongField.__init__g  r  rE   Nr	  r^   rE   rJ   r  r  f  r
  rE   r  c                       e Zd Zd ZdS )LELongFieldc                 @    t                               | ||d           d S Nz<Qr  r  s      rJ   rK   zLELongField.__init__m  r  rE   Nr	  r^   rE   rJ   r  r  l  rw  rE   r  c                       e Zd Zd ZdS )LESignedLongFieldc                 @    t                               | ||d           d S )Nz<qr  r  s      rJ   rK   zLESignedLongField.__init__s  r  rE   Nr	  r^   rE   rJ   r  r  r  rw  rE   r  c                       e Zd Zd ZdS )
XLongFieldc                 H    t          |                     ||                    S rG   r  r   s      rJ   r   zXLongField.i2repry  r  rE   Nr  r^   rE   rJ   r  r  x  r  rE   r  c                       e Zd Zd ZdS )XLELongFieldc                 :    t                               | ||          S rG   )r  r   r   s      rJ   r   zXLELongField.i2repr  r"  rE   Nr  r^   rE   rJ   r  r  ~  r#  rE   r  c                       e Zd Zd ZdS )IEEEFloatFieldc                 @    t                               | ||d           d S )Nfr  r  s      rJ   rK   zIEEEFloatField.__init__  r  rE   Nr	  r^   rE   rJ   r  r    r
  rE   r  c                       e Zd Zd ZdS )IEEEDoubleFieldc                 @    t                               | ||d           d S )Nr8  r  r  s      rJ   rK   zIEEEDoubleField.__init__  r  rE   Nr	  r^   rE   rJ   r  r    r
  rE   r  c                   T     e Zd ZdgZddZd Z fdZ fdZd Zd	 Z	d
 Z
d Z xZS )	_StrFieldrV  r   r   c                 N    t                               | |||           || _        d S rG   )r}   rK   rV  )rI   r~   r   r   rV  s        rJ   rK   z_StrField.__init__  %    tT7C000rE   c                 (    |dS t          |          S r  r  r   s      rJ   r   z_StrField.i2len  s    911vvrE   c                     t          |t                    rt          |          }t          t          |                               ||          S rG   )r   rM   r    rc   r  r   r  s      rJ   r   z_StrField.any2i  s@    a 	 QAY%%++C333rE   c                     |r$t          |t                    rt          |          S t          t          |                               ||          S rG   )r   rx  r   rc   r  r   r  s      rJ   r   z_StrField.i2repr  sG     	Au%% 	77NY%%,,S!444rE   c                 V    |dS t          |t                    st          |          S |S rX  )r   rx  r    r   s      rJ   r   z_StrField.i2m  s/    93!U## 	#??"rE   c                 4    ||                      ||          z   S rG   r   r  s       rJ   r   z_StrField.addfield      488C%%%%rE   c                     | j         dk    rd|                     ||          fS || j          d          |                     ||d | j                             fS Nr   rE   )rV  r   r   s      rJ   r   z_StrField.getfield  s[    ;!a((((dk\]]#TXXc1]t{l]3C%D%DDDrE   c                 <    t          t          dd                    S Nr   i  )r   r   rN   s    rJ   r   z_StrField.randval  s    wq$''(((rE   )r   r   )rZ   r[   r\   r   rK   r   r   r   r   r   r   r   rx   ry   s   @rJ   r  r    s        
I   
  4 4 4 4 45 5 5 5 5  & & &E E E) ) ) ) ) ) )rE   r  c                       e Zd ZdS )StrFieldNrN  r^   rE   rJ   r  r    rO  rE   r  c                   0     e Zd Z fdZd Zd Zd Z xZS )StrFieldUtf16c                     t          |t                    r|                     ||          S t          t          |                               ||          S rG   )r   rM   r   rc   r  r   r  s      rJ   r   zStrFieldUtf16.any2i  sI    a 	$88C###]D))//Q777rE   c                 H    t          |                     ||                    S rG   )r   r   r   s      rJ   r   zStrFieldUtf16.i2repr  s    #q))***rE   c                 J    t          |                              dd          S Nz	utf-16-lereplace)errors)r   encoder   s      rJ   r   zStrFieldUtf16.h2i  s!    ||"";y"AAArE   c                 J    t          |                              dd          S r  )r    decoder   s      rJ   r   zStrFieldUtf16.i2h  s!    A%%k)%DDDrE   )rZ   r[   r\   r   r   r   r   rx   ry   s   @rJ   r  r    so        8 8 8 8 8+ + +B B BE E E E E E ErE   r  c                       e Zd Zd Zd ZdS )_StrEnumFieldc                 <    |                     di           | _        d S )Nenum)popr  )rI   r  s     rJ   rK   z_StrEnumField.__init__  s    JJvr**			rE   c                     |                     d          }t          |          }| j        r9|| j        v r|d| j        |         d}n|| j        v r|d| j        |         d}|S )NrO  r   ))rstripr   r  )rI   r   vr  rrs        rJ   r   z_StrEnumField.i2repr  ss    HHUOO!WW9 	4DI~~"$""dilll3di"$""dilll3	rE   N)rZ   r[   r\   rK   r   r^   rE   rJ   r  r    s2        + + +	 	 	 	 	rE   r  c                       e Zd ZdgZ	 ddZdS )StrEnumFieldr  Nc                 <    t          j        | ||fi | || _        d S rG   )r  rK   r  rI   r~   r   r  r  s        rJ   rK   zStrEnumField.__init__  s,     	$g88888			rE   rG   rZ   r[   r\   r   rK   r^   rE   rJ   r  r    4        I 		 	 	 	 	 	rE   r  Kc                   4     e Zd ZdgZdZ fdZd Zd Z xZS )_PacketFieldr   r   c                 h    t          t          |                               ||           || _        d S rG   )rc   r  rK   r   )rI   r~   r   pkt_clsrf   s       rJ   rK   z_PacketField.__init__  s0     	lD!!**4999rE   c                 (    |dS t          |          S rX  )r   rI   r   r   s      rJ   r   z_PacketField.i2m
  s    
 931vvrE   c                 |    	 |                      ||          S # t          $ r |                      |          cY S w xY w)N_parent)r   	TypeError)rI   r   ms      rJ   r   z_PacketField.m2i  sN    	88As8+++ 	 	 	88A;;	s    ;;)	rZ   r[   r\   r   r   rK   r   r   rx   ry   s   @rJ   r  r    sb        IM            rE   r  c                   $     e Zd Z fdZd Z xZS )_PacketFieldSinglec                     |r5|r3t          |d          r#t          d|                              |           t          t          |                               ||          S )N
add_parentrB   )r   r@   r  rc   r  r   r  s      rJ   r   z_PacketFieldSingle.any2i  sb     	. 	.L11 	.1((---'..44S!<<<rE   c                     |                      ||          }d}t          j        |v r |t          j                 }|j        `|j        }||fS rX  )r   r   padding_layer
underlayerr  load)rI   r   r   r   rV  r  s         rJ   r   z_PacketFieldSingle.getfield#  sP    
 HHS!""$$%A$VFqyrE   )rZ   r[   r\   r   r   rx   ry   s   @rJ   r  r    sG        = = = = =      rE   r  c                       e Zd Zd ZdS )PacketFieldc                 H    ddl m}  ||                                           S )Nr   )fuzz)scapy.packetr  r   )rI   r  s     rJ   r   zPacketField.randval2  s,    %%%%%%tDHHJJrE   N)rZ   r[   r\   r   r^   rE   rJ   r  r  1  s#                 rE   r  c                   .     e Zd ZdgZ	 d fd	Zd Z xZS )PacketLenFieldlength_fromNc                 p    t          t          |                               |||           |pd | _        d S )Nc                     dS r  r^   ri  s    rJ   r[  z)PacketLenField.__init__.<locals>.<lambda>C      Q rE   )rc   r  rK   r  )rI   r~   r   r   r  rf   s        rJ   rK   zPacketLenField.__init__;  s<     	nd##,,T7C@@@&7;;rE   c                     |                      |          }d }|rZ	 |                     ||d |                   }n:# t          $ r- t          j        r t          j        |d |                   }Y nw xY w||d          |fS )Nr  )r  r   r  r   debug_dissector	raw_layer)rI   r   r   len_pktr   s        rJ   r   zPacketLenField.getfieldE  s    
 ""3'' 	55HHS!HWH+.. 5 5 5' N(7(4445 {A~s   : 4A10A1rG   )rZ   r[   r\   r   rK   r   rx   ry   s   @rJ   r  r  8  sX        I "	8 8 8 8 8 8      rE   r  c                   ^     e Zd ZdZg dZdZ	 	 	 	 	 d fd	Zd Zd Zd Z	d	 Z
d
 Zd Z xZS )PacketListFielda  PacketListField represents a list containing a series of Packet instances
    that might occur right in the middle of another Packet field.
    This field type may also be used to indicate that a series of Packet
    instances have a sibling semantic instead of a parent/child relationship
    (i.e. a stack of layers). All elements in PacketListField have current
    packet referenced in parent field.
    )
count_fromr  next_cls_cb	max_countr   Nc                     |g }t          t          |                               |||           || _        || _        || _        || _        dS )a*  
        The number of Packet instances that are dissected by this field can
        be parametrized using one of three different mechanisms/parameters:

            * count_from: a callback that returns the number of Packet
              instances to dissect. The callback prototype is::

                count_from(pkt:Packet) -> int

            * length_from: a callback that returns the number of bytes that
              must be dissected by this field. The callback prototype is::

                length_from(pkt:Packet) -> int

            * next_cls_cb: a callback that enables a Scapy developer to
              dynamically discover if another Packet instance should be
              dissected or not. See below for this callback prototype.

        The bytes that are not consumed during the dissection of this field
        are passed to the next field of the current packet.

        For the serialization of such a field, the list of Packets that are
        contained in a PacketListField can be heterogeneous and is
        unrestricted.

        The type of the Packet instances that are dissected with this field is
        specified or discovered using one of the following mechanism:

            * the pkt_cls parameter may contain a callable that returns an
              instance of the dissected Packet. This may either be a
              reference of a Packet subclass (e.g. DNSRROPT in layers/dns.py)
              to generate an homogeneous PacketListField or a function
              deciding the type of the Packet instance
              (e.g. _CDPGuessAddrRecord in contrib/cdp.py)

            * the pkt_cls parameter may contain a class object with a defined
              ``dispatch_hook`` classmethod. That method must return a Packet
              instance. The ``dispatch_hook`` callmethod must implement the
                following prototype::

                dispatch_hook(cls,
                              _pkt:Optional[Packet],
                              *args, **kargs
                ) -> Type[Packet]

                The _pkt parameter may contain a reference to the packet
                instance containing the PacketListField that is being
                dissected.

            * the ``next_cls_cb`` parameter may contain a callable whose
              prototype is::

                cbk(pkt:Packet,
                    lst:List[Packet],
                    cur:Optional[Packet],
                    remain:str
                ) -> Optional[Type[Packet]]

              The pkt argument contains a reference to the Packet instance
              containing the PacketListField that is being dissected.
              The lst argument is the list of all Packet instances that were
              previously parsed during the current ``PacketListField``
              dissection, saved for the very last Packet instance.
              The cur argument contains a reference to that very last parsed
              ``Packet`` instance. The remain argument contains the bytes
              that may still be consumed by the current PacketListField
              dissection operation.

              This callback returns either the type of the next Packet to
              dissect or None to indicate that no more Packet are to be
              dissected.

              These four arguments allows a variety of dynamic discovery of
              the number of Packet to dissect and of the type of each one of
              these Packets, including: type determination based on current
              Packet instances or its underlayers, continuation based on the
              previously parsed Packet instances within that PacketListField,
              continuation based on a look-ahead on the bytes to be
              dissected...

        The pkt_cls and next_cls_cb parameters are semantically exclusive,
        although one could specify both. If both are specified, pkt_cls is
        silently ignored. The same is true for count_from and next_cls_cb.

        length_from and next_cls_cb are compatible and the dissection will
        end, whichever of the two stop conditions comes first.

        :param name: the name of the field
        :param default: the default value of this field; generally an empty
            Python list
        :param pkt_cls: either a callable returning a Packet instance or a
            class object defining a ``dispatch_hook`` class method
        :param count_from: a callback returning the number of Packet
            instances to dissect.
        :param length_from: a callback returning the number of bytes to dissect
        :param next_cls_cb: a callback returning either None or the type of
            the next Packet to dissect.
        :param max_count: an int containing the max amount of results. This is
            a safety mechanism, exceeding this value will raise a Scapy_Exception.
        N)rc   r  rK   r  r  r  r  )	rI   r~   r   r  r  r  r  r  rf   s	           rJ   rK   zPacketListField.__init__a  s_    ^ ?Got$$--	
 	
 	

 %&&"rE   c                     t          |t                    s,|r'|r%t          |d          r|                    |           |gS |r-|D ]*}|rt          |d          s|                    |           +|S )Nr  )r   r   r   r  )rI   r   r   r   s       rJ   r   zPacketListField.any2i  s    !T"" 	" "S "WQ55 "S!!!3J 	" " " < 8 8 S!!!!rE   c                 N    t          |t                    rt          |          S dS Nr   r   r   rU   r  s      rJ   r   zPacketListField.i2count  s&    
 c4   	s88OqrE   c                 >     t           fd|D                       S )Nc              3   ^   K   | ]'}t                              |                    V  (d S rG   )rU   r   )r   r|  r   rI   s     rJ   r   z(PacketListField.i2len.<locals>.<genexpr>  s9      66Q3txxQ''((666666rE   )r9  r  s   `` rJ   r   zPacketListField.i2len  s,    
 66666#666666rE   c                    d x}x}}| j         |                      |          }n| j        |                     |          }| j        |                     |g d |          }d}|d}g }d}|}||d |         ||d          }}|rC||dk    rn9|dz  }	 |*	  |||          }	n1# t          $ r  ||          }	Y nw xY w|                     ||          }	t
          j        |	v rM|	t
          j                 }
|
j        }|
j        `	| j        %|                     |||	|          }||dn|}|dz  }n7d}n4# t          $ r' t
          j        r t          j        |          }	d}Y nw xY w|                    |	           t          |          | j        pt
          j        k    r#t#          d| j        pt
          j        z            |Ct%          |t&                    r|\  }}||z   |f|fS ||z   |fS )Nr   r   rE   r  r  zXMaximum amount of items reached in PacketListField: %s (defaults to conf.max_list_count))r  r  r  r  r   r   r  r  r  r  r  r  r  rh   rU   r  max_list_countrQ  r   r%  )rI   r   r   cr  r   lstr  rV  r|  padnbs               rJ   r   zPacketListField.getfield  s      Gc'&&s++GG_($$A'""3D!44CA{HWH+q{CF %	}66Q!?(C444$ ( ( (CKK( f--A %**D./C XF.'3"..sCFCC?%&YAAFA FF!    ' N///	" JJqMMM3xx4>@T-@AA'8~<)<>  C  %	N fe$$ 	%JFBSL"%s**C<$$s6   D4 B% $D4 %B=:D4 <B==D4 4.E%$E%c                      t          |          S rG   )r    r  s      rJ   r   zPacketListField.i2m8  s    
 ArE   c                 P     |d                      fd|D                       z   S )NrE   c              3   D   K   | ]}                     |          V  d S rG   r  r   r  r   rI   s     rJ   r   z+PacketListField.addfield.<locals>.<genexpr>A  s1      ::DHHS!,,::::::rE   r   r  s   ``  rJ   r   zPacketListField.addfield?  s3    388:::::c:::::::rE   )NNNNN)rZ   r[   r\   r]   r   r   rK   r   r   r   r   r   r   rx   ry   s   @rJ   r  r  V  s          JIIIF y# y# y# y# y# y#v    7 7 7=% =% =%~  ; ; ; ; ; ; ;rE   r  c                   F     e Zd ZdgZ	 	 d fd	Z fdZd Zd Zd Z xZ	S )	StrFixedLenFieldr  Nc                     t          t          |                               ||           |pd | _        ||| _        |fd| _        d S d S )Nc                     dS r  r^   ri  s    rJ   r[  z+StrFixedLenField.__init__.<locals>.<lambda>P  r  rE   c                     |S rG   r^   )r   lengths     rJ   r[  z+StrFixedLenField.__init__.<locals>.<lambda>S  s     rE   )rc   r  rK   r  r   )rI   r~   r   r  r  rf   s        rJ   rK   zStrFixedLenField.__init__G  sa     	%%..tW===&7;;DG06>>>D rE   c                     t          |t                    r|                    d          }t          t          |                               ||          S rN  )r   rx  r  rc   r  r   )rI   r   r  rf   s      rJ   r   zStrFixedLenField.i2reprU  sG    
 a 	 A%t,,33C;;;rE   c                     |                      |          }|dk    r|dfS ||d          |                     ||d |                   fS r  )r  r   rI   r   r   r  s       rJ   r   zStrFixedLenField.getfield^  sP    ""3''a<<c6M{DHHS!HWH+6666rE   c                     |                      |          }|||                     ||          z   S |t          j        d|z  |                     ||                    z   S )Nrb  )r  r   r   r   )rI   r   r   rH   r  s        rJ   r   zStrFixedLenField.addfielde  s\    ""3''?txxS))))6;uwc0B0BCCCCrE   c                     	 t          |                     d                     S # t          $ r  t          t          dd                    cY S w xY w)Nr      )r   r  r  r   rN   s    rJ   r   zStrFixedLenField.randvall  sZ    	,4++D11222 	, 	, 	,71c??+++++	,s   !$ 'AANN)
rZ   r[   r\   r   rK   r   r   r   r   rx   ry   s   @rJ   r  r  D  s        I ? ? ? ? ? ?< < < < <7 7 7D D D, , , , , , ,rE   r  c                       e Zd ZdS )StrFixedLenFieldUtf16NrN  r^   rE   rJ   r%  r%  t  rO  rE   r%  c                   "    e Zd ZdgZ	 	 	 ddZdS )StrFixedLenEnumFieldr  Nc                 R    t                               | ||||           || _        d S )N)r  r  )r  rK   r  )rI   r~   r   r  r  r  s         rJ   rK   zStrFixedLenEnumField.__init__{  s/     	!!$gfR]!^^^			rE   NNNr  r^   rE   rJ   r'  r'  x  s:        I 
 
 
 
 
 
rE   r'  c                   (    e Zd ZddZd Zd Zd ZdS )NetBIOSNameField   c                 @    t                               | |||           d S rG   )r  rK   )rI   r~   r   r  s       rJ   rK   zNetBIOSNameField.__init__  s"    !!$gv>>>>>rE   c                 D    |rt          |          dk    r
|d d         }|S )N   r  r   s      rJ   r   zNetBIOSNameField.h2i  s*     	Q"#2#ArE   c                     |r|                      |          dz  }nd}t          |pd          }|d|z  z  }|d |         }d                    d |D                       }d|z   S )Nr  r   rE       c              3   Z   K   | ]&}t          j        d d|dz	  z   d|dz  z             V  'dS )z!BBA   r  r/  Nr   r   rG  s     rJ   r   z'NetBIOSNameField.i2m.<locals>.<genexpr>  s^       
 
  KQC  
 
 
 
 
 
rE   )r  r    r   )rI   r   r  r  r   s        rJ   r   zNetBIOSNameField.i2m  s     	&&s++q0GGGc""	TG^hwhKHH 
 
 
 
 
 
 
 axrE   c           
          |dd                               d          }d                    t          d |d d d         |dd d                                                 d          S )Nr   rO  rE   c                 P    t          j        d| dz
  dz  dz  |dz
  dz  z             S )N!Br   r/  r  r4  )r   r  s     rJ   r[  z&NetBIOSNameField.m2i.<locals>.<lambda>  s2    q5C-A%1q5C-8  rE   r  r1  )stripr   mapr  r   s      rJ   r   zNetBIOSNameField.m2i  so    abbEKK  xx  cccFAaddG
 
   6$<<	rE   N)r,  )rZ   r[   r\   rK   r   r   r   r^   rE   rJ   r+  r+    sU        ? ? ? ?    &	 	 	 	 	rE   r+  c                   @     e Zd ZdZddgZdZ	 	 d	 fd	Zd Zd Z xZ	S )
StrLenFieldz
    StrField with a length

    :param length_from: a function that returns the size of the string
    :param max_length: max size to use as randval
    r  
max_lengthTNc                 v    t          t          |                               ||           || _        || _        d S rG   )rc   r;  rK   r  r<  )rI   r~   r   r  r<  rf   s        rJ   rK   zStrLenField.__init__  s8     	k4  ))$888&$rE   c                      | j         pd |          }| j        s|dz  }|dk    r|dfS ||d          |                     ||d |                   fS )Nc                     dS r  r^   ri  s    rJ   r[  z&StrLenField.getfield.<locals>.<lambda>  s    ! rE   r  r   rE   )r  ON_WIRE_SIZE_UTF16r   r  s       rJ   r   zStrLenField.getfield  sj    44#4c::& 	qLGa<<c6M{DHHS!HWH+6666rE   c                 J    t          t          d| j        pd                    S r  )r   r   r<  rN   s    rJ   r   zStrLenField.randval  s!    wq$/"9T::;;;rE   r#  )
rZ   r[   r\   r]   r   r@  rK   r   r   rx   ry   s   @rJ   r;  r;    s          -I 
% 
% 
% 
% 
% 
%7 7 7< < < < < < <rE   r;  c                        e Zd Z fdZ xZS )
_XStrFieldc                     t          |t                    r!t          |                                          S t	          t
          |                               ||          S rG   )r   rx  r   r  rc   rC  r   r  s      rJ   r   z_XStrField.i2repr  sM    a 	)Q<<&&(((Z&&--c1555rE   rH  ry   s   @rJ   rC  rC    s8        6 6 6 6 6 6 6 6 6rE   rC  c                       e Zd ZdZdS )	XStrFieldz9
    StrField which value is printed as hexadecimal.
    NrZ   r[   r\   r]   r^   rE   rJ   rF  rF               rE   rF  c                       e Zd ZdZdS )XStrLenFieldz<
    StrLenField which value is printed as hexadecimal.
    NrG  r^   rE   rJ   rJ  rJ    rH  rE   rJ  c                       e Zd ZdZdS )XStrFixedLenFieldzA
    StrFixedLenField which value is printed as hexadecimal.
    NrG  r^   rE   rJ   rL  rL    rH  rE   rL  c                       e Zd Zd Zd ZdS )XLEStrLenFieldc                      |sdS |d d d         S )NrE   r   r^   r   s      rJ   r   zXLEStrLenField.i2m  s     	3BxrE   c                     |d d d         S r  r^   r   s      rJ   r   zXLEStrLenField.m2i  s    BxrE   Nr  r^   rE   rJ   rN  rN    s2              rE   rN  c                       e Zd ZdS )StrLenFieldUtf16NrN  r^   rE   rJ   rR  rR    rO  rE   rR  c                       e Zd ZdgZ	 ddZdS )StrLenEnumFieldr  Nc                 <    t          j        | ||fi | || _        d S rG   )r;  rK   r  r  s        rJ   rK   zStrLenEnumField.__init__  s,     	T4;;F;;;			rE   rG   r  r^   rE   rJ   rT  rT     r  rE   rT  c                   *    e Zd ZddgZ	 	 	 ddZd ZdS )	BoundStrLenFieldminlenmaxlenr   rX  Nc                 ^    t                               | |||           || _        || _        d S )N)r  )r;  rK   rX  rY  )rI   r~   r   rX  rY  r  s         rJ   rK   zBoundStrLenField.__init__  s3     	T4kJJJrE   c                 P    t          t          | j        | j                            S rG   )r   r   rX  rY  rN   s    rJ   r   zBoundStrLenField.randval  s    wt{DK88999rE   )r   rX  N)rZ   r[   r\   r   rK   r   r^   rE   rJ   rW  rW    sL        8$I    : : : : :rE   rW  c                   L    e Zd Zg dZdZ	 	 	 ddZd Zd Zd Zd Z	d	 Z
d
 ZdS )FieldListField)r  r  r  r  r   Nc                 ~    |g }|| _         t                              | ||           || _        || _        || _        d S rG   )r  r}   rK   r  r  r  )rI   r~   r   r  r  r  r  s          rJ   rK   zFieldListField.__init__(  sE     ?G
tT7+++$&"rE   c                 N    t          |t                    rt          |          S dS r  r	  r  s      rJ   r   zFieldListField.i2count:  s$    c4   	s88OqrE   c                 X     t          t           fd|D                                 S )Nc              3   N   K   | ]}j                             |          V   d S rG   )r  r   r  s     rJ   r   z'FieldListField.i2len.<locals>.<genexpr>B  s5      ==Atz''Q//======rE   )r   r9  r  s   `` rJ   r   zFieldListField.i2len@  s2    3==========>>>rE   c                      t          |t                    s j                            |          gS  fd|D             S )Nc                 F    g | ]}j                             |          S r^   )r  r   )r   er   rI   s     rJ   r  z(FieldListField.any2i.<locals>.<listcomp>I  s+    888DJ$$S!,,888rE   )r   r   r  r   r   s   `` rJ   r   zFieldListField.any2iD  sN    !T"" 	9J$$S!,,--88888a8888rE   c                 P     dd                      fd|D                       z  S )Nz[%s]z, c              3   N   K   | ]}j                             |          V   d S rG   )r  r   r  s     rJ   r   z(FieldListField.i2repr.<locals>.<genexpr>P  s5      !G!G$*"3"3C";";!G!G!G!G!G!GrE   r  r   s   `` rJ   r   zFieldListField.i2reprK  s5    
 		!G!G!G!G!GQ!G!G!GGGGGrE   c                 t    |                      ||          }|D ]}| j                            |||          }|S rG   )r   r  r   )rI   r   r   rH   r  s        rJ   r   zFieldListField.addfieldR  sF     hhsC   	/ 	/A
##CA..AArE   c                    d x}}| j         |                      |          }n| j        |                     |          }g }d}||d |         ||d          }}|r||dk    rn|dz  }| j                            ||          \  }}|                    |           t          |          | j        pt          j        k    r#t          d| j        pt          j        z            |t          |t                    r|\  }}||z   |f|fS ||z   |fS )NrE   r   r   zWMaximum amount of items reached in FieldListField: %s (defaults to conf.max_list_count))r  r  r  r   rh   rU   r  r   r  rQ  r   r%  )	rI   r   r   r  r  rH   r  r  bns	            rJ   r   zFieldListField.getfield]  sF   
 G'&&s++GG_($$Axx[!GHH+sA 	}66Q:&&sA..DAqJJqMMM3xx4>@T-@AA'8~<)<>    	 a 	 EArGR=#%%s7C<rE   r)  )rZ   r[   r\   r   r   rK   r   r   r   r   r   r   r^   rE   rJ   r]  r]  $  s        CCCIF # # # #$  ? ? ?9 9 9H H H	 	 	"  "  "  "  " rE   r]  c                   .    e Zd Zg dZdddd fdZd ZdS )FieldLenField)	length_ofcount_ofadjustNr   c                     |S rG   r^   r   r   s     rJ   r[  zFieldLenField.<lambda>      ! rE   c                 j    t                               | |||           || _        || _        || _        d S rG   )r}   rK   rl  rm  rn  rI   r~   r   rl  r   rm  rn  s          rJ   rK   zFieldLenField.__init__  s5     	tT7C000" rE   c                 N   ||| j         4|                    | j                   \  }}|                    ||          }nJ| j        4|                    | j                  \  }}|                    ||          }nt          d          |                     ||          }n|d}|S )Nz.Field should have either length_of or count_ofr   )rl  getfield_and_valr   rm  r   r   rn  )rI   r   r   r   fvalr  s         rJ   r   zFieldLenField.i2m  s    9~)00@@	TIIc4((*00??	TKKT** D   C##AAYArE   )rZ   r[   r\   r   rK   r   r^   rE   rJ   rk  rk    sS        333I ##       rE   rk  c                   4     e Zd ZdZd Zd Zd Z fdZ xZS )StrNullFieldrO  c                 D    ||                      ||          z   | j        z   S rG   )r   	DELIMITERr  s       rJ   r   zStrNullField.addfield  s"    488C%%%66rE   c                 
   d}	 |                     | j        |          }|dk     rd|fS |t          | j                  z  r|dz  }nnD||t          | j                  z   d          |                     ||d |                   fS )Nr   TrE   r   )findrz  rU   r   rI   r   r   len_strs       rJ   r   zStrNullField.getfield  s    
 	ffT^W55G{{AvT^,,, 1	 3t~...//0$((3(7(2L2LLLrE   c                 H    t          t          dd          | j                  S r  )r   r   rz  rN   s    rJ   r   zStrNullField.randval  s    ga..???rE   c                 \    t          t          |                               ||          dz   S r  )rc   rx  r   r  s      rJ   r   zStrNullField.i2len  s(    \4((..sA66::rE   )	rZ   r[   r\   rz  r   r   r   r   rx   ry   s   @rJ   rx  rx    sp        I7 7 7M M M"@ @ @; ; ; ; ; ; ; ; ;rE   rx  c                       e Zd ZdZdS )StrNullFieldUtf16s     N)rZ   r[   r\   rz  r^   rE   rJ   r  r    s        IIIrE   r  c                   *    e Zd ZddgZddZd Zd ZdS )	StrStopFieldri  
additionalr   c                 Z    t                               | ||           || _        || _        d S rG   )r}   rK   ri  r  )rI   r~   r   ri  r  s        rJ   rK   zStrStopField.__init__  s*    tT7+++	$rE   c                     |                     | j                  }|dk     rd|fS |t          | j                  | j        z   z  }||d          |d |         fS r  )r|  ri  rU   r  r}  s       rJ   r   zStrStopField.getfield  s[    &&##Q;;6M3ty>>DO33{AhwhK''rE   c                 H    t          t          dd          | j                  S r  )r   r   ri  rN   s    rJ   r   zStrStopField.randval  s    ga..	:::rE   Nr   )rZ   r[   r\   r   rK   r   r   r^   rE   rJ   r  r    sP        &I% % % %( ( (; ; ; ; ;rE   r  c                   ,    e Zd ZdZdgZdd fdZd ZdS )LenFieldz>
    If None, will be filled with the size of the payload
    rn  r   c                     | S rG   r^   ri  s    rJ   r[  zLenField.<lambda>  s     rE   c                 N    t                               | |||           || _        d S rG   )r}   rK   rn  )rI   r~   r   r   rn  s        rJ   rK   zLenField.__init__  r  rE   c                 `    |+d}|'|                      t          |j                            }|S r  )rn  rU   r  r   s      rJ   r   zLenField.i2m  s3    
 9AKKCK 0 011rE   N)rZ   r[   r\   r]   r   rK   r   r^   rE   rJ   r  r    sQ          
I*-kk    
	 	 	 	 	rE   r  c                       e Zd Zd Zd ZdS )BCDFloatFieldc                 .    |dS t          d|z            S )Nr   r4  r   r   s      rJ   r   zBCDFloatField.i2m  s    9137||rE   c                     |dz  S )Ng      p@r^   r   s      rJ   r   zBCDFloatField.m2i 	  s    5yrE   Nr  r^   rE   rJ   r  r    s2              rE   r  c                   <    e Zd ZdZg dZ	 d
dZd Zd Zd Zd Z	d	S )	_BitFielda  
    Field to handle bits.

    :param name: name of the field
    :param default: default value
    :param size: size (in bits). If negative, Low endian
    :param tot_size: size of the total group of bits (in bytes) the bitfield
                     is in. If negative, Low endian.
    :param end_tot_size: same but for the BitField ending a group.

    Example - normal usage::

         0                   1                   2                   3
         0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        |             A             |               B               | C |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                                 Fig. TestPacket

        class TestPacket(Packet):
            fields_desc = [
                BitField("a", 0, 14),
                BitField("b", 0, 16),
                BitField("c", 0, 2),
            ]

    Example - Low endian stored as 16 bits on the network::

        x x x x x x x x x x x x x x x x
        a [b] [   c   ] [      a      ]

        Will first get reversed during dissecion:

        x x x x x x x x x x x x x x x x
        [      a        ] [b] [   c   ]

        class TestPacket(Packet):
            fields_desc = [
                BitField("a", 0, 9, tot_size=-2),
                BitField("b", 0, 2),
                BitField("c", 0, 5, end_tot_size=-2)
            ]

    )revsizetot_sizeend_tot_sizer   c                 f   t                               | ||           t          |          r ||           }|dk     p|dk     p|dk     | _        t	          |          | _        |s
| j        dz  }t	          |          | _        |s
| j        dz  }t	          |          | _        | j        dz  | _        d S )Nr   r@         @)	r}   rK   callabler  absr  r  r  r   )rI   r~   r   r  r  r  s         rJ   rK   z_BitField.__init__5	  s     	tT7+++D>> 	4::D!8?x!|?|a/?II	 	&yA~HH 	*9>L-- )b.rE   c                    |                      ||          }t          |t                    r|\  }}}nd}d}|| j        z  }||d| j        z  dz
  z  z  }|| j        z  }|dk    r1|dz  }|t	          j        d||z	            z   }|d|z  dz
  z  }|dk    1|r|||fS | j        r5| j        dk    r*|d | j                  || j         d          d d d         z   }|S )Nr   r   r@  r7  r   )r   r   r%  r  r   r   r  r  )rI   r   r   ivalrH   bitsdoner  s          rJ   r   z_BitField.addfieldI	  s'    hhsD!!a 	NAxHA	di	SQ$)^q())DI!mmMHFKa8m444A!x-1$$A !mm  	h>! x JD-11))))*Q0A/A/B/B-CDDbD-IIHrE   c                 N   t          |t                    r|\  }}n<d}| j        r3| j        dk    r(|d | j                 d d d         || j        d          z   }| j        |z   dz
  dz  dz   }|d |         }t          j        d|z  |          }d}t          |          D ]&}|t          ||                   ||z
  dz
  dz  z  z  }'|d|dz  |z
  z  dz
  z  }||dz  | j        z
  |z
  z	  }|| j        z  }||dz  d          }|dz  }| 	                    ||          }	|r||f|	fS ||	fS )Nr   r   r   r@  z!%dB)
r   r%  r  r  r  r   r   r   r   r   )
rI   r   r   ri  nb_bytesw_bytesr   r  b2s
             rJ   r   z_BitField.getfieldd	  s   
 a 	@EArrBx @DMA--nt}n%ddd+a.?? INQ&1,q0ixiL v0!44x 	: 	:AVAYHqL1$4#999AA 	
aHqL2%&!++ (Q,*R/0
dibAghhK!VXXc1 	r7B;b5LrE   c                 8    t          dd| j        z  dz
            S )Nr   r  r   )r   r  rN   s    rJ   r   z_BitField.randval	  s    q!TY,*+++rE   c                 0    t          | j                  dz  S )Nr@  )floatr  r   s      rJ   r   z_BitField.i2len	  s    TY!##rE   N)r   r   )
rZ   r[   r\   r]   r   rK   r   r   r   r   r^   rE   rJ   r  r  	  s        , ,Z <;;I +,! ! ! !(  6% % %N, , ,$ $ $ $ $rE   r  c                       e Zd Zej        ZdS )BitFieldN)rZ   r[   r\   r  r]   r^   rE   rJ   r  r  	  s        GGGrE   r  c                   8     e Zd ZdgZ fdZ fdZ fdZ xZS )BitLenFieldr  c                 j    || _         t          t          |                               ||d           d S r  )r  rc   r  rK   )rI   r~   r   r  rf   s       rJ   rK   zBitLenField.__init__	  s5     'k4  ))$;;;;;rE   c                     |                      |          | _        t          t          |                               ||          S rG   )r  r  rc   r  r   )rI   r   r   rf   s      rJ   r   zBitLenField.getfield	  s:    
 $$S))	[$''00a888rE   c                     |                      |          | _        t          t          |                               |||          S rG   )r  r  rc   r  r   )rI   r   r   rH   rf   s       rJ   r   zBitLenField.addfield	  s<     $$S))	[$''00a===rE   )rZ   r[   r\   r   rK   r   r   rx   ry   s   @rJ   r  r  	  sq        I< < < < <9 9 9 9 9> > > > > > > > >rE   r  c                   :     e Zd Zg dZddd ddf fd	Zd Z xZS )BitFieldLenField)rl  rm  rn  r  r  Nc                     |S rG   r^   rp  s     rJ   r[  zBitFieldLenField.<lambda>	  s    q rE   r   c	                     t          t          |                               |||||           || _        || _        || _        d S rG   )rc   r  rK   rl  rm  rn  )
rI   r~   r   r  rl  rm  rn  r  r  rf   s
            rJ   rK   zBitFieldLenField.__init__	  sO     	%%..tWd/7	G 	G 	G" rE   c                 :    t                               | ||          S rG   )rk  r   r   s      rJ   r   zBitFieldLenField.i2m	  s      sA...rE   )rZ   r[   r\   r   rK   r   rx   ry   s   @rJ   r  r  	  sk        OOOI  ((     "/ / / / / / /rE   r  c                       e Zd Zd ZdS )	XBitFieldc                 H    t          |                     ||                    S rG   r  r   s      rJ   r   zXBitField.i2repr	  r  rE   Nr  r^   rE   rJ   r  r  	  r  rE   r  c                   B    e Zd Z	 ddZd Zd Zd Zd Zd Zd Z	d	 Z
d
S )
_EnumFieldr   c                    t          |t                    r(t          t          |                              |            t          |t                    r*|d         | _        |d         | _        d| _        d| _        nTt          |t                    r^t          |t                    rIi x}| _        i x}| _        d| _        d| _        d |D             }|D ]}||         j        }	|||	<   |	||<   ni x}| _        i x}| _        d| _        d| _        g }
t          |t                    r*t          t          t          |                              }
nVt          |t                     r|                                }
n,t          |          }
t%          d |
D                       r||}}|
D ]'}t          t&          ||                   }	|	||<   |||	<   (t(                              | |||           dS )au   Initializes enum fields.

        @param name:    name of this field
        @param default: default value of this field
        @param enum:    either an enum, a dict or a tuple of two callables.
                        Dict keys are the internal values, while the dict
                        values are the user-friendly representations. If the
                        tuple is provided, the first callable receives the
                        internal value as parameter and returns the
                        user-friendly representation and the second callable
                        does the converse. The first callable may return None
                        to default to a literal string (repr()) representation.
        @param fmt:     struct.pack format used to parse and serialize the
                        internal value from and to machine representation.
        r   r   Nc                     g | ]	}|j         
S r^   r  r   s     rJ   r  z'_EnumField.__init__.<locals>.<listcomp>	  s    ***QV***rE   c              3   @   K   | ]}t          |t                    V  d S rG   )r   rM   r   s     rJ   r   z&_EnumField.__init__.<locals>.<genexpr>
  s,      88az!S))888888rE   )r   r`   r@   rj   r%  i2s_cbs2i_cbi2ss2ir
  
issubclassr   ro   r   r   rU   r   keysr   rM   r}   rK   )rI   r~   r   r  r   r  r  namesr  ro   r  rv   s               rJ   rK   z_EnumField.__init__	  s   , dN++ 	5&&..t444dE"" !	q'DKq'DKDHDHHd## 	
4(>(> 	C$(C$(DKDK**T***E  QE
A
  C$(C$(DKDKD$%% (E#d)),,--D&)) (yy{{Dzz88488888 ("CC  S$q'**AE

tT7C00000rE   c                    t          |t                    rt          t          |j                  S t          |t
                    r1| j        r| j        |         }n| j        r|                     |          }t          t          |          S rG   )r   r   r@   rz   ro   rM   r  r  r   s      rJ   	any2i_onez_EnumField.any2i_one
  sv    a 	#17###3 	#x #HQK #KKNNAqzzrE   c                      t          |          S rG   )r   r   s      rJ   _i2reprz_EnumField._i2repr
      AwwrE   c                     | t           j        vrZt          |t                    sE| j        r	 | j        |         S # t
          $ r Y n$w xY w| j        r|                     |          }||S |                     ||          S rG   )r   noenumr   r   r  r3  r  r  rI   r   r   r  s       rJ   
i2repr_onez_EnumField.i2repr_one"
  s    t{"":a+G+G"x 8A;&   D kk!nn?J||C###   9 
AAc                 z     t          |t                    r fd|D             S                      |          S )Nc                 <    g | ]}                     |          S r^   )r  r   zr   rI   s     rJ   r  z$_EnumField.any2i.<locals>.<listcomp>3
  s'    666qDNN3**666rE   )r   r   r  r   s   `` rJ   r   z_EnumField.any2i0
  sG    a 	*66666A6666>>#q)))rE   c                 z     t          |t                    r fd|D             S                      |          S )Nc                 <    g | ]}                     |          S r^   )r  r  s     rJ   r  z%_EnumField.i2repr.<locals>.<listcomp>:
  s'    777DOOC++777rE   )r   r   r  r   s   `` rJ   r   z_EnumField.i2repr7
  sG    a 	+77777Q7777??3***rE   c                     t          |t                    rdnd}t          j        d|z   | ||           | j        | j        || j        |<   || j        |<   d S d S d S )NrD  %szAt %s: Change to %s at r   r   r   debugr  r  )rI   r  rn   ro   kss        rJ   rl   z_EnumField.notify_set>
  sv    !#s++5VV%*D%	
 	
 	
 8DH$8!DHSM!DHUOOO  $8$8rE   c                     t          |t                    rdnd}t          j        d|z   | |           | j        &| j        !| j        |         }| j        |= | j        |= d S d S d S )NrD  r  zAt %s: Delete value at r  )rI   r  rn   r  ro   s        rJ   rr   z_EnumField.notify_delH
  ss    !#s++5VV3b8$DDD8DH$8HSME  $8$8rE   Nr   )rZ   r[   r\   rK   r  r  r  r   r   rl   rr   r^   rE   rJ   r  r  	  s        
 	;1 ;1 ;1 ;1z	 	 	  $ $ $* * *+ + +" " "         rE   r  c                       e Zd Zg dZdS )	EnumField)r  r  r  r  NrZ   r[   r\   r   r^   rE   rJ   r  r  R
  s        222IIIrE   r  c                   (     e Zd Z	 d fd	Zd Z xZS )CharEnumField1sc                    t          t          |                               ||||           | j        Jt	          | j                  }|r6t          |d                   dk    r| j        | j        c| _        | _        d S d S d S d S rf  )rc   r  rK   r  r   rU   r  )rI   r~   r   r  r   rv   rf   s         rJ   rK   zCharEnumField.__init__W
  s     	mT""++D'4EEE8TXA 8S1YY!^^%)Xtx"$(((  8 8^^rE   c                     t          |          dk    r1| j        r| j        |         }n| j        r|                     |          }|S r  )rU   r  r  r   s      rJ   r  zCharEnumField.any2i_oned
  sF    q66Q;;x #HQK #KKNNrE   )r  )rZ   r[   r\   rK   r  rx   ry   s   @rJ   r  r  V
  sQ        
 	8 8 8 8 8 8      rE   r  c                   .    e Zd Zej        Zd Zd Zd ZdS )BitEnumFieldc                 j    t                               | |||           t          j        | |||fi | d S rG   )r  rK   r  )rI   r~   r   r  r  r  s         rJ   rK   zBitEnumField.__init__q
  sA    D$6664w???????rE   c                 :    t                               | ||          S rG   r  r   r   s      rJ   r   zBitEnumField.any2iv
      c1---rE   c                 :    t                               | ||          S rG   r  r   r   s      rJ   r   zBitEnumField.i2reprz
      
   sA...rE   NrZ   r[   r\   r  r   rK   r   r   r^   rE   rJ   r  r  n
  sL        #I@ @ @
. . ./ / / / /rE   r  c                   .    e Zd Zej        Zd Zd Zd ZdS )BitLenEnumFieldc                 j    t                               | |||           t          j        | |||fi | d S rG   )r  rK   r  )rI   r~   r   r  r  r  s         rJ   rK   zBitLenEnumField.__init__
  sC     	D$666T4+HHHHHHHrE   c                 :    t                               | ||          S rG   r  r   s      rJ   r   zBitLenEnumField.any2i
  r  rE   c                 :    t                               | ||          S rG   r  r   s      rJ   r   zBitLenEnumField.i2repr
  r  rE   Nr  r^   rE   rJ   r  r  
  sL        #I	I 	I 	I. . ./ / / / /rE   r  c                   ,     e Zd Zej        Z fdZ xZS )ShortEnumFieldc                 ^    t          t          |                               |||d           d S rn  )rc   r  rK   rI   r~   r   r  rf   s       rJ   rK   zShortEnumField.__init__
  s/     	nd##,,T7D#FFFFFrE   )rZ   r[   r\   r  r   rK   rx   ry   s   @rJ   r  r  
  sI        #IG G G G G G G G GrE   r  c                        e Zd Z fdZ xZS )LEShortEnumFieldc                 ^    t          t          |                               |||d           d S ru  )rc   r  rK   r  s       rJ   rK   zLEShortEnumField.__init__
  s.    %%..tWdDIIIIIrE   rZ   r[   r\   rK   rx   ry   s   @rJ   r  r  
  sA        J J J J J J J J JrE   r  c                        e Zd Z fdZ xZS )LongEnumFieldc                 ^    t          t          |                               |||d           d S r  )rc   r  rK   r  s       rJ   rK   zLongEnumField.__init__
  -    mT""++D'4EEEEErE   r  ry   s   @rJ   r  r  
  A        F F F F F F F F FrE   r  c                        e Zd Z fdZ xZS )LELongEnumFieldc                 ^    t          t          |                               |||d           d S r  )rc   r  rK   r  s       rJ   rK   zLELongEnumField.__init__
  s-    ot$$--dGT4HHHHHrE   r  ry   s   @rJ   r  r  
  sA        I I I I I I I I IrE   r  c                        e Zd Z fdZ xZS )ByteEnumFieldc                 ^    t          t          |                               |||d           d S r  )rc   r  rK   r  s       rJ   rK   zByteEnumField.__init__
  r  rE   r  ry   s   @rJ   r  r  
  r  rE   r  c                       e Zd Zd ZdS )XByteEnumFieldc                     | t           j        vrZt          |t                    sE| j        r	 | j        |         S # t
          $ r Y n$w xY w| j        r|                     |          }||S t          |          S rG   )r   r  r   r   r  r3  r  r%   r  s       rJ   r  zXByteEnumField.i2repr_one
  s    t{"":a+G+G"x 8A;&   D kk!nn?JAwwr  N)rZ   r[   r\   r  r^   rE   rJ   r  r  
  s#            rE   r  c                        e Zd Z fdZ xZS )IntEnumFieldc                 ^    t          t          |                               |||d           d S r  )rc   r  rK   r  s       rJ   rK   zIntEnumField.__init__
  s-    lD!!**4$DDDDDrE   r  ry   s   @rJ   r  r  
  sA        E E E E E E E E ErE   r  c                        e Zd Z fdZ xZS )SignedIntEnumFieldc                 ^    t          t          |                               |||d           d S r  )rc   r  rK   r  s       rJ   rK   zSignedIntEnumField.__init__
  s.     $''00wcJJJJJrE   r  ry   s   @rJ   r  r  
  sA        K K K K K K K K KrE   r  c                        e Zd Z fdZ xZS )LEIntEnumFieldc                 ^    t          t          |                               |||d           d S r'  )rc   r  rK   r  s       rJ   rK   zLEIntEnumField.__init__
  s-    nd##,,T7D$GGGGGrE   r  ry   s   @rJ   r  r  
  sA        H H H H H H H H HrE   r  c                       e Zd Zd ZdS )XShortEnumFieldc                      t          |          S rG   r%   r   s      rJ   r  zXShortEnumField._i2repr
  r  rE   NrZ   r[   r\   r  r^   rE   rJ   r  r  
  #            rE   r  c                   .    e Zd Zej        Zd Zd Zd ZdS )LE3BytesEnumFieldc                 x    t                               | |||           t                              | ||           d S rG   )r  rK   r%  )rI   r~   r   r  s       rJ   rK   zLE3BytesEnumField.__init__
  s:    D$666""4w77777rE   c                 :    t                               | ||          S rG   r  r   s      rJ   r   zLE3BytesEnumField.any2i
  r  rE   c                 :    t                               | ||          S rG   r  r   s      rJ   r   zLE3BytesEnumField.i2repr
  r"  rE   Nr  r^   rE   rJ   r  r  
  sI        #I8 8 8
. . ./ / / / /rE   r  c                       e Zd Zd ZdS )XLE3BytesEnumFieldc                      t          |          S rG   r  r   s      rJ   r  zXLE3BytesEnumField._i2repr
  r  rE   Nr  r^   rE   rJ   r  r  
  r  rE   r  c                   $    e Zd Z	 ddZd Zd ZdS )_MultiEnumFieldr   c                     || _         || _        i | _        i | _        |D ]=}i }|| j        |<   ||                                         D ]\  }}	|||	<   || j        |	<   >t
                              | |||           d S rG   )
depends_on	i2s_multi	s2i_multis2i_allr  r}   rK   )
rI   r~   r   r  r!  r   r  r  rv   r  s
             rJ   rK   z_MultiEnumField.__init__   s     % 	$ 	$AC #DN1Q $ $1A"#Q$ 	tT7C00000rE   c                     t          |t                    rD|                     |          }|| j        v r| j        |         }||v r||         S | j        |         S t          t          |          S rG   )r   rM   r!  r#  r$  r@   rz   )rI   r   r   r  r  s        rJ   r  z_MultiEnumField.any2i_one  sj    a 	#$$ADN""nQ'88q6M<?"AqzzrE   c                     |                      |          }t          |t                    rt          |          S || j        v r.t          | j        |                             ||                    S t          |          S rG   )r!  r   r   r   r"  rM   r  )rI   r   r   r  s       rJ   r  z_MultiEnumField.i2repr_one   sm    OOC  a'' 	77Nt~a(,,Q223331vvrE   Nr   )rZ   r[   r\   rK   r  r  r^   rE   rJ   r  r  
  sK         1 1 1 1*	 	 	    rE   r  c                       e Zd Zg dZdS )MultiEnumField)r!  r"  r#  r$  Nr  r^   rE   rJ   r(  r(  *  s        CCCIIIrE   r(  c                   >    e Zd Zej        ej        z   Zd Zd Zd ZdS )BitMultiEnumFieldc                     t                               | ||||           |dk     | _        t          |          | _        | j        dz  | _        d S )Nr   r  )r  rK   r  r  r  r   )rI   r~   r   r  r  r!  s         rJ   rK   zBitMultiEnumField.__init__2  sI     	  tWdJGGG!8II	)b.rE   c                 P    t           t                                       | ||          S rG   )r  r   r   r   s      rJ   r   zBitMultiEnumField.any2i@  s(    s#))
 
 	
rE   c                 P    t           t                                       | ||          S rG   )r  r   r   r   s      rJ   r   zBitMultiEnumField.i2reprH  s*     s#**
 
 	
rE   N)	rZ   r[   r\   r  r   r(  rK   r   r   r^   rE   rJ   r*  r*  .  sQ        #n&>>I! ! !
 
 


 

 

 

 

rE   r*  c                       e Zd ZdZd ZdS )ByteEnumKeysFieldz3ByteEnumField that picks valid values when fuzzed. c                 .    t          | j        pi           S rG   r
   r  rN   s    rJ   r   zByteEnumKeysField.randvalX      DHN+++rE   NrZ   r[   r\   r]   r   r^   rE   rJ   r/  r/  U  s)        ==, , , , ,rE   r/  c                       e Zd ZdZd ZdS )ShortEnumKeysFieldz4ShortEnumField that picks valid values when fuzzed. c                 .    t          | j        pi           S rG   r1  rN   s    rJ   r   zShortEnumKeysField.randval`  r2  rE   Nr3  r^   rE   rJ   r5  r5  ]  s)        >>, , , , ,rE   r5  c                       e Zd ZdZd ZdS )IntEnumKeysFieldz2IntEnumField that picks valid values when fuzzed. c                 .    t          | j        pi           S rG   r1  rN   s    rJ   r   zIntEnumKeysField.randvalh  r2  rE   Nr3  r^   rE   rJ   r8  r8  e  s)        <<, , , , ,rE   r8  c                        e Zd Zdddd fdZdS )LEFieldLenFieldNrv  c                     |S rG   r^   rp  s     rJ   r[  zLEFieldLenField.<lambda>x  rq  rE   c           	      H    t                               | ||||||           d S )N)rl  r   rm  rn  )rk  rK   rs  s          rJ   rK   zLEFieldLenField.__init__q  s>     	$ 	 	
 	
 	
 	
 	
rE   r	  r^   rE   rJ   r;  r;  p  s9        
 ##
 
 
 
 
 
rE   r;  c                   ,    e Zd ZddgZd Zd Zd ZeZdS )FlagValueIter	flagvaluecursorc                 "    || _         d| _        d S r  )r@  rA  )rI   r@  s     rJ   rK   zFlagValueIter.__init__  s    "rE   c                     | S rG   r^   rN   s    rJ   __iter__zFlagValueIter.__iter__  s    rE   c                     t          | j                  }|| j        z  }|r6| xj        dz  c_        |dz  r| j        j        | j        dz
           S |dz  }|6t          r  )r   r@  rA  r  StopIterationrI   r   s     rJ   __next__zFlagValueIter.__next__  sr    	dk 	KK1KK1u =~+DK!O<<!GA	  	
 rE   N)rZ   r[   r\   r   rK   rD  rH  nextr^   rE   rJ   r?  r?    sL        h'I  
  	 	 	 DDDrE   r?  c                        e Zd Zg dZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd ZeZd ZeZeZd Zd Zd Zd Zd ZeZd Zd Zd Zd Zd Z fdZ fdZd Z  xZ!S )	FlagValue)ro   r  multic                 $   |sdS t          |t                    r+| j        r|                    d          nt	          |          }t          |t                    r)d}|D ]"}|d| j                            |          z  z  }#|}t          |          S )Nr   +r   )r   rM   rL  splitr   r  indexr   )rI   ro   r  r   s       rJ   	_fixvaluezFlagValue._fixvalue  s     	1eS!! 	D(,
CEKK$$$UEeT"" 	A . .Q$***1----E5zzrE   c                 |    t          |t                    | _        || _        |                     |          | _        d S rG   )r   r   rL  r  rQ  ro   )rI   ro   r  s      rJ   rK   zFlagValue.__init__  s1    t,,

^^E**


rE   c                 *    t          | j                  S rG   )r   ro   rN   s    rJ   r   zFlagValue.__hash__      DJrE   c                     | j         S rG   )ro   rN   s    rJ   __int__zFlagValue.__int__  s
    zrE   c                 >    | j         |                     |          k    S rG   ro   rQ  r   s     rJ   r   zFlagValue.__eq__      zT^^E2222rE   c                 >    | j         |                     |          k     S rG   rX  r   s     rJ   __lt__zFlagValue.__lt__      zDNN51111rE   c                 >    | j         |                     |          k    S rG   rX  r   s     rJ   __le__zFlagValue.__le__  rY  rE   c                 >    | j         |                     |          k    S rG   rX  r   s     rJ   __gt__zFlagValue.__gt__  r\  rE   c                 >    | j         |                     |          k    S rG   rX  r   s     rJ   __ge__zFlagValue.__ge__  rY  rE   c                 >    | j         |                     |          k    S rG   rX  r   s     rJ   __ne__zFlagValue.__ne__  rY  rE   c                 n    |                      | j        |                     |          z  | j                  S rG   rf   ro   rQ  r  r   s     rJ   __and__zFlagValue.__and__  +    ~~dj4>>%+@+@@$*MMMrE   c                 n    |                      | j        |                     |          z  | j                  S rG   rf  r   s     rJ   __or__zFlagValue.__or__  rh  rE   c                     |                      | j        dt          | j                  z  dz
  |                     |          z
  z  | j                  S Nr  r   )rf   ro   rU   r  rQ  r   s     rJ   __sub__zFlagValue.__sub__  sJ    ~~J!s4:.2T^^E5J5JJKJ
 
 	
rE   c                 n    |                      | j        |                     |          z  | j                  S rG   rf  r   s     rJ   __xor__zFlagValue.__xor__  rh  rE   c                 <    | j         |                     |          z  S rG   rX  r   s     rJ   
__lshift__zFlagValue.__lshift__      zT^^E2222rE   c                 <    | j         |                     |          z	  S rG   rX  r   s     rJ   
__rshift__zFlagValue.__rshift__  rr  rE   c                 *    t          | j                  S rG   )r   ro   rN   s    rJ   __nonzero__zFlagValue.__nonzero__  rT  rE   c                 T    t          j        dt                     t          |           S )Nz1obj.flagrepr() is obsolete. Use str(obj) instead.)r!  r"  r.  rM   rN   s    rJ   flagreprzFlagValue.flagrepr  s*    ?	
 	
 	
 4yyrE   c                     d}g }t          |           }|rG|dz  r6	 | j        |         }n# t          $ r d}Y nw xY w|                    |           |dz  }|dz  }|G| j        rdnd                    |          S )Nr   r   ?rN  r@  )r   r  
IndexErrorrh   rL  r   )rI   r   r  r   r~   s        rJ   rO   zFlagValue.__str__   s    II 	1u :a=DD!   DDDFA!GA  	 z)r//222s   * 99c                      t          |           S rG   )r?  rN   s    rJ   rD  zFlagValue.__iter__  s    T"""rE   c                     d| | fz  S )Nz<Flag %d (%s)>r^   rN   s    rJ   rX   zFlagValue.__repr__  s    4,..rE   c                 R    |                      t          |           | j                  S rG   )rf   r   r  )rI   memos     rJ   __deepcopy__zFlagValue.__deepcopy__  s    ~~c$ii444rE   c                     | j         v r(t          t                                         |          S 	  j        r:t          d j                            |          z  t                     z            S t           fd|D                       S # t          $ rk d|v r<	                      |                    dd                    cY S # t          $ r Y nw xY wt          t                                         |          cY S w xY w)Nr  c              3      K   | ]>}t          d j                            |          z  t                    z            V  ?dS )r  N)r   r  rP  r   )r   flagrI   s     rJ   r   z(FlagValue.__getattr__.<locals>.<genexpr>#  s_       ) ) Q$*"2"24"8"88CIIEFF ) ) ) ) ) )rE   rC  -)r   rc   rK  __getattribute__rL  r   r  rP  r   r  r   r   r  r  )rI   r   rf   s   ` rJ   r   zFlagValue.__getattr__  s?   4>!!D))::4@@@	Az GQ$*"2"24"8"88CIIEFFF ) ) ) )#') ) ) ) ) ) 	A 	A 	Ad{{++DLLc,B,BCCCCC%   DD))::4@@@@@	As<   A B 6B D (CD
CDC+DDc                    |dk    r$t          |t                    st          |          || j        v r)t	          t
          |                               ||          S || j        v r]|r-| xj        d| j        	                    |          z  z  c_        d S | xj        d| j        	                    |          z   z  c_        d S t	          t
          |                               ||          S )Nro   r  )
r   r   r   r   rc   rK  __setattr__r  ro   rP  )rI   r   ro   rf   s      rJ   r  zFlagValue.__setattr__-  s    7??:eS#9#9?U###4>!!D))55dEBBB4: =

qDJ$4$4T$:$::;





TZ%5%5d%;%; ;<<



D))55dEBBBrE   c                 B    |                      | j        | j                  S rG   )rf   ro   r  rN   s    rJ   r   zFlagValue.copy;  s    ~~dj$*555rE   )"rZ   r[   r\   r   rQ  rK   r   rV  r   r[  r^  r`  rb  rd  rg  __rand__rj  __ror____add__rm  ro  rq  rt  rv  __bool__rx  rO   rD  rX   r  r   r  r   rx   ry   s   @rJ   rK  rK    s       +++I  + + +       3 3 32 2 23 3 32 2 23 3 33 3 3N N N HN N N GG
 
 
N N N3 3 33 3 3      H  3 3 3 # # #/ / /5 5 5A A A A A"C C C C C6 6 6 6 6 6 6rE   rK  c                   V     e Zd ZdZdZdgZ fdZd Z fdZ fdZ	 fdZ
d	 Z xZS )

FlagsFielda9   Handle Flag type field

   Make sure all your flags have a label

   Example (list):
       >>> from scapy.packet import Packet
       >>> class FlagsTest(Packet):
               fields_desc = [FlagsField("flags", 0, 8, ["f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7"])]  # noqa: E501
       >>> FlagsTest(flags=9).show2()
       ###[ FlagsTest ]###
         flags     = f0+f3

    Example (str):
       >>> from scapy.packet import Packet
       >>> class TCPTest(Packet):
               fields_desc = [
                   BitField("reserved", 0, 7),
                   FlagsField("flags", 0x2, 9, "FSRPAUECN")
               ]
       >>> TCPTest(flags=3).show2()
       ###[ FlagsTest ]###
         reserved  = 0
         flags     = FS

    Example (dict):
       >>> from scapy.packet import Packet
       >>> class FlagsTest2(Packet):
               fields_desc = [
                   FlagsField("flags", 0x2, 16, {
                       0x0001: "A",
                       0x0008: "B",
                   })
               ]

   :param name: field's name
   :param default: default value for the field
   :param size: number of bits in the field (in bits). if negative, LE
   :param names: (list or str or dict) label for each flag
       If it's a str or a list, the least Significant Bit tag's name
       is written first.
   Tr  c                 x   t          |t                    ryd t          t          |                    D             }|                                D ]<\  }}||t          t          j        t          j        |d                              <   =|}|| _	         t          t          |           j        |||fi | d S )Nc                     g | ]}d |z  S )zbit_%dr^   )r   r   s     rJ   r  z'FlagsField.__init__.<locals>.<listcomp>w  s    :::A8a<:::rE   r  )r   r\  r   r  r  r   mathfloorlogr  rc   r  rK   )
rI   r~   r   r  r  r  tmpr   r  rf   s
            rJ   rK   zFlagsField.__init__m  s     eT"" 	::s4yy)9)9:::C 9 9178C
48Aq>>223344E
(j$(wGGGGGGGrE   c                 p    t          |t          t          f          r|S |dS t          || j                  S )zkReturns a FlagValue instance when needed. Internal method, to be
used in *2i() and i2*() methods.

        N)r   rK  r   r  rG  s     rJ   
_fixup_valzFlagsField._fixup_val  s<     a)]344 	H94DJ'''rE   c                 |    |                      t          t          |                               ||                    S rG   )r  rc   r  r   r  s      rJ   r   zFlagsField.any2i  s/    uZ66<<S!DDEEErE   c                 |    |                      t          t          |                               ||                    S rG   )r  rc   r  r   r  s      rJ   r   zFlagsField.m2i  /    uZ66::3BBCCCrE   c                 |    |                      t          t          |                               ||                    S rG   )r  rc   r  r   r  s      rJ   r   zFlagsField.i2h  r  rE   c                      t          |t          t          f          r1t           t	          |           fd|D                                 S |dn!t                               |                    S )Nc              3   d   K   | ]*}|dn!t                              |                    V  +d S )NNone)rM   r  )r   r  rI   s     rJ   r   z$FlagsField.i2repr.<locals>.<genexpr>  sP          EF!)T__Q-?-?)@)@           rE   r  )r   r   r%  r   r
  rM   r  r   s   `  rJ   r   zFlagsField.i2repr  s    
 a$'' 	Q        JK           vvDOOA,>,>(?(??rE   )rZ   r[   r\   r]   r   r   rK   r  r   r   r   r   rx   ry   s   @rJ   r  r  @  s        ( (R I	IH H H H H$
( 
( 
(F F F F FD D D D DD D D D D	@ 	@ 	@ 	@ 	@ 	@ 	@rE   r  MultiFlagsEntryshortlongc                   L     e Zd Zej        dgz   Z fdZd Zd Zd Zd Z	 xZ
S )MultiFlagsFieldr!  c                 x    || _         || _        t          t          |                               |||           d S rG   )r  r!  rc   r  rK   )rI   r~   r   r  r  r!  rf   s         rJ   rK   zMultiFlagsField.__init__  s;     
$ot$$--dGTBBBBBrE   c                 @   t          |t          t          f          st          d          |t          |t                    r|                     ||          S |                     |          }||| j        v s
J d            | j        |         }t                      }|D ]X}|                                D ]$}|j        |k    r|	                    |            n%J d
                    |                      Y|S t          |t                    rt                      S |S )Nzset expectedzinvalid dependencyFz&Unknown flag "{}" with this dependency)r   setr   r   r   r!  r  valuesr  addr]  )rI   r   r   r  these_namesr   r   rH   s           rJ   r   zMultiFlagsField.any2i  s,   !c3Z(( 	-^,,,?!S!! xxQ'''OOC((=
???,@???"&*Q-KA % %#.#5#5#7#7 % %C"yA~~ !a %  . ]*R*Y*YZ[*\*\\\\ !& Ha 	55LrE   c           	      .   |                      |          }| j                            |i           }d}||S |D ][}|                                D ]\  }}|j        |k    r
|d|z  z  } n+|dt          |t          d          d                    z  z  }\|S )Nr   r   zbit )r!  r  r  r  r  r   rU   )	rI   r   r   r  r  r  flag_setr   rH   s	            rJ   r   zMultiFlagsField.i2m  s    OOC  jnnQ++9H 	6 	6H%++-- 6 639((aKAE ) Q#hs6{{||45555rE   c                 F   |                      |          }| j                            |i           }t                      }d}|r^|dz  rM||v r!|                    ||         j                   n(|                    d                    |                     |dz  }|dz  }|^|S )Nr   r   zbit {})r!  r  r  r  r  r  r]  )rI   r   r   r  r  r  r   s          rJ   r   zMultiFlagsField.m2i  s    OOC  jnnQ++EE 	1u .##EE+a..////EE(//!,,---!GAFA  	 rE   c                 ~   |                      |          }| j                            |i           }t                      }|D ]n}|                                D ]B}|j        |k    r5|                    d                    |j        |j                              nC|                    |           ot          |          S )Nz{} ({}))
r!  r  r  r  r  r  r  r]  r  r   )rI   r   r   r  r  r  r  r   s           rJ   r   zMultiFlagsField.i2repr  s    OOC  jnnQ++EE 	  	 H ''))    7h&&EE)**1617;;<<<E ' hAwwrE   )rZ   r[   r\   r  r   rK   r   r   r   r   rx   ry   s   @rJ   r  r    s        $~5I
C 
C 
C 
C 
C  6  "  "      rE   r  c                   8     e Zd ZdgZd fd	Zd Zd Zd Z xZS )FixedPointField	frac_bits   c                 j    || _         t          t          |                               |||           d S rG   )r  rc   r  rK   )rI   r~   r   r  r  rf   s        rJ   rK   zFixedPointField.__init__  s2    "ot$$--dGTBBBBBrE   c                 |    ||S t          |          }t          ||z
  d| j        z  z            }|| j        z  |z  S )Nr  )r   r  )rI   r   rH   r  fracts        rJ   r   zFixedPointField.any2i
  sF    ;J3xxS4Z1dn#4455&%//rE   c                     ||S || j         z	  }d| j         z  }t          |d| j         z  dz
  z            }||z  }||                    t          t	          j        |                              z   S )Ng       @r   )r  r(   	normalizer   r  log10)rI   r   rH   int_partpw	frac_parts         rJ   r   zFixedPointField.i2h  sv     ;J$.($. SA$71#<<==	R	)--c$*R...A.ABBBBrE   c                 H    t          |                     ||                    S rG   )rM   r   r  s      rJ   r   zFixedPointField.i2repr  s    488C%%&&&rE   )r  )	rZ   r[   r\   r   rK   r   r   r   rx   ry   s   @rJ   r  r    sz        IC C C C C C
0 0 0	C 	C 	C' ' ' ' ' ' 'rE   r  c                   V    e Zd Zg dZ	 ddZd Zd Zd Zd Zd Z	d	 Z
d
 Zd Zd ZdS )_IPPrefixFieldBase)	wordbytesmaxbytesatonntoar  Nc                     || _         || _        || _        || _        t                              | ||d| j        z             |d }|| _        d S )Nrb  c                     dS r  r^   ri  s    rJ   r[  z-_IPPrefixFieldBase.__init__.<locals>.<lambda>8  s    A rE   )r  r  r  r  r}   rK   r  )rI   r~   r   r  r  r  r  r  s           rJ   rK   z_IPPrefixFieldBase.__init__'  sZ     # 		tT7EDM,ABBB%+K&rE   c                 <    | j         dz  }||dz
  z   |z  | j         z  S )Nr@  r   )r  )rI   pfxlenwbitss      rJ   	_numbytesz_IPPrefixFieldBase._numbytes;  s)    "519%%/4>AArE   c                 ~    |                     d          \  }}|                     |           |t          |          fS )N/)rO  r  r   rI   r   r   pfxr  s        rJ   r   z_IPPrefixFieldBase.h2i@  s7     f		#S[[!!rE   c                     |\  }}d||fz  S )Nz%s/%ir^   r  s        rJ   r   z_IPPrefixFieldBase.i2hG  s     f#v&&rE   c                     |d\  }}n|\  }}|                      |          }|d |                     |                   |fS )N)r@  r   )r  r  )rI   r   r   r  r  r   s         rJ   r   z_IPPrefixFieldBase.i2mM  sN     9KCMS&IIcNN)4>>&)))*F33rE   c                     |\  }}t          |          | j        k     r|d| j        t          |          z
  z  z   }|                     |          |fS rN  )rU   r  r  )rI   r   r   r   r  s        rJ   r   z_IPPrefixFieldBase.m2iZ  sQ     Fq66DM!!Udmc!ff456A		!f%%rE   c                 p    ||                      d| j        z            dfS |                     ||          S )NrO  r   )r  r  r   r   s      rJ   r   z_IPPrefixFieldBase.any2ic  s9    9IIedm344a88xxQrE   c                     |\  }}|S rG   r^   )rI   r   r   rC  r  s        rJ   r   z_IPPrefixFieldBase.i2lenj  s    FrE   c                     |                      ||          \  }}d|                     |          z  }|t          j        ||          z   S )N!%is)r   r  r   r   )rI   r   r   rH   rawpfxr  r   s          rJ   r   z_IPPrefixFieldBase.addfieldo  sG    88C--t~~f---6;sF++++rE   c           
          |                      |          }|                     |          }d|z  }||d          |                     |t          j        ||d |                   d         |f          fS )Nr  r   )r  r  r   r   r   )rI   r   r   r  numbytesr   s         rJ   r   z_IPPrefixFieldBase.getfieldu  sp    !!#&&>>&))x|TXXcFM#q(|,L,LQ,OQW+XYYYYrE   rG   )rZ   r[   r\   r   rK   r  r   r   r   r   r   r   r   r   r^   rE   rJ   r  r  $  s        HHHI ' ' ' '(B B B
" " "' ' '4 4 4& & &       
, , ,Z Z Z Z ZrE   r  c                       e Zd Z	 	 ddZdS )IPPrefixFieldr   Nc           
      \    t                               | |||dt          t          |           d S )Nr  )r  rK   r#   r$   rI   r~   r   r  r  s        rJ   rK   zIPPrefixField.__init__~  s>     	##		
 		
 		
 		
 		
rE   r   Nr	  r^   rE   rJ   r  r  }  s0        
 
 
 
 
 
 
rE   r  c                       e Zd Z	 	 ddZdS )IP6PrefixFieldr   Nc           
      L    t                               | |||dd d |           d S )Nr  c                 6    t          t          j        |           S rG   )r"   r  r  )as    rJ   r[  z)IP6PrefixField.__init__.<locals>.<lambda>      i33 rE   c                 6    t          t          j        |           S rG   r  )r  s    rJ   r[  z)IP6PrefixField.__init__.<locals>.<lambda>  r  rE   )r  rK   r  s        rJ   rK   zIP6PrefixField.__init__  sD     	##3333		
 		
 		
 		
 		
rE   r  r	  r^   rE   rJ   r  r    s0        
 
 
 
 
 
 
rE   r  c                   8    e Zd Zg dZ	 	 	 	 	 	 	 d	dZd Zd ZdS )
UTCTimeField)epochdeltastrfuse_msec	use_microuse_nanocustom_scalingFN%a, %d %b %Y %H:%M:%S %zrz   c
                     t                               | |||	           |t          nt          j        |          }
|
| _        |
t          z
  | _        || _        || _        || _	        || _
        || _        d S )N)r   )r}   rK   r   calendartimegmr  r  r  r  r  r  r  )rI   r~   r   r  r  r  r  r  r  r   mk_epochs              rJ   rK   zUTCTimeField.__init__  sr     	tT7444!M55xu/E/E
%
	 " ,rE   c                 r   |t          j                     | j        z
  }n8| j        r|dz  }n+| j        r|dz  }n| j        r|dz  }n| j        r
|| j        z  }|| j        z  }t          j        ddd          t          j        |          z                       | j	                  }d|t          |          fz  S )N     @@    .A    eAi  r   )secondsz%s (%d))timer  r  r  r  r  datetime	timedeltastrftimer  r   )rI   r   r   ts       rJ   r   zUTCTimeField.i2repr  s    9	dj(AA] 	(CAA^ 	(CAA] 	(CAA  	(D''A	TZ dAq))q)))*
(49

 	
 As1vv;&&rE   c                     |bt          j                     | j        z
  }| j        r|dz  }n+| j        r|dz  }n| j        r|dz  }n| j        r
|| j        z  }t          |          S t          |          S )Nr  r  r  )r  r  r  r  r  r  r   r   s      rJ   r   zUTCTimeField.i2m  s    9	dj(A} ,G ,G ,G$ ,++q66M1vvrE   )FFFNr  Nrz   )rZ   r[   r\   r   rK   r   r   r^   rE   rJ   r  r    sq        H H HI   0 $- - - -,' ' '*    rE   r  c                   *    e Zd Zg dZ	 	 	 ddZd ZdS )SecondsIntFieldr  r  r  Fc                 j    t                               | ||d           || _        || _        || _        d S r  )r}   rK   r  r  r  )rI   r~   r   r  r  r  s         rJ   rK   zSecondsIntField.__init__  s5    
 	tT7C000 " rE   c                 h    |d}n)| j         r|dz  }n| j        r|dz  }n| j        r|dz  }n|}d|z  S )Nr   r  r  r  z%s secr  r  s       rJ   r   zSecondsIntField.i2repr  s\    9AA] 	CAA^ 	CAA] 	CAAA!|rE   N)FFF)rZ   r[   r\   r   rK   r   r^   rE   rJ   r  r    sM        555I   ! ! ! !    rE   r  c                   >    e Zd Z	 	 	 	 	 ddZd Zd Zd	 Zd
 Zd ZdS )_ScalingFieldr   r@  r   r  r   c                 x    || _         || _        || _        || _        t                              | |||           d S rG   )scalingunitoffsetndigitsr}   rK   )rI   r~   r   r  r  r  r  r   s           rJ   rK   z_ScalingField.__init__  s>     	tT7C00000rE   c                     |d}|| j         z
  | j        z  }t          |t                    r-| j        d         dk    rt          t          |                    }|S )Nr   r   r  )r  r  r   r  r   r   roundr   s      rJ   r   z_ScalingField.i2m  sX    
 9A_,a 	DHRLC$7$7E!HHArE   c                     || j         z  | j        z   }t          |t                    r&| j        d         dk    rt          || j                  }|S )Nr   r  )r  r  r   r  r   r  r  r   s      rJ   r   z_ScalingField.m2i  sM    t{*a 	'DHRLC$7$7a&&ArE   c                    t          |t          t          f          rCt          j        | j        t          |                    d         }|                     ||          }t          |t          t          f          st          d          |S )Nr   zUnknown type)r   rM   rx  r   r   r   r    r   r   r  r   r   s      rJ   r   z_ScalingField.any2i%  sr    a#u&& 	!dhQ88;Aa  A!c5\** 	-^,,,rE   c                 B    |                      ||          d| j        S )N )r   r  r   s      rJ   r   z_ScalingField.i2repr.  s,     HHS!II
 	
rE   c                 >   t                               |           }|t          |j        | j        z  | j        z   | j                  }t          |j        | j        z  | j        z   | j                  }t          t          ||          t          ||                    S d S rG   )	r}   r   r  minr  r  r  maxr   )rI   ro   min_valmax_vals       rJ   r   z_ScalingField.randval5  s    d##EI4t{B L* *GEI4t{B L* *G S'22C4I4IJJJ rE   N)r   r@  r   r  r   r  r^   rE   rJ   r   r     s         1 1 1 1 
 
 
    
 
 
	K 	K 	K 	K 	KrE   r   c                       e Zd ZdZdS )ScalingFielda   Handle physical values which are scaled and/or offset for communication

       Example:
           >>> from scapy.packet import Packet
           >>> class ScalingFieldTest(Packet):
                   fields_desc = [ScalingField('data', 0, scaling=0.1, offset=-1, unit='mV')]  # noqa: E501
           >>> ScalingFieldTest(data=10).show2()
           ###[ ScalingFieldTest ]###
             data= 10.0 mV
           >>> hexdump(ScalingFieldTest(data=10))
           0000  6E                                               n
           >>> hexdump(ScalingFieldTest(data=b"m"))
           0000  6D                                               m
           >>> ScalingFieldTest(data=b"m").show2()
           ###[ ScalingFieldTest ]###
             data= 9.9 mV

        bytes(ScalingFieldTest(...)) will produce 0x6E in this example.
        0x6E is 110 (decimal). This is calculated through the scaling factor
        and the offset. "data" was set to 10, which means, we want to transfer
        the physical value 10 mV. To calculate the value, which has to be
        sent on the bus, the offset has to subtracted and the scaling has to be
        applied by division through the scaling factor.
        bytes = (data - offset) / scaling
        bytes = ( 10  -  (-1) ) /    0.1
        bytes =  110 = 0x6E

        If you want to force a certain internal value, you can assign a byte-
        string to the field (data=b"m"). If a string of a bytes object is
        given to the field, no internal value conversion will be applied

       :param name: field's name
       :param default: default value for the field
       :param scaling: scaling factor for the internal value conversion
       :param unit: string for the unit representation of the internal value
       :param offset: value to offset the internal value during conversion
       :param ndigits: number of fractional digits for the internal conversion
       :param fmt: struct.pack format used to parse and serialize the internal value from and to machine representation # noqa: E501
       NrG  r^   rE   rJ   r  r  A  s        & & & &rE   r  c                       e Zd ZdZd ZdS )BitScalingFieldz+
    A ScalingField that is a BitField
    c                 n    t          j        | ||g|R i | t                              | |||           d S rG   )r   rK   r  )rI   r~   r   r  rd   r  s         rJ   rK   zBitScalingField.__init__q  sG    tT7DTDDDVDDD$gt44444rE   N)rZ   r[   r\   r]   rK   r^   rE   rJ   r  r  l  s-         5 5 5 5 5rE   r  c                       e Zd ZdZd ZdS )OUIFieldz3
    A field designed to carry a OUI (3 bytes)
    c                     t          j        d|pd          dd          }t          |dz             d d         }t          j        r-t          j                            |          }||k    r|d|dS |S )Nr  r   r   s      r@  r   r  )r   r   r'   r   r  
_get_manuf)rI   r   rH   by_valouifancys         rJ   r   zOUIField.i2repr|  s{    T38!,,QRR0fy())"1"-< 	0L++C00E||$)EE333//
rE   N)rZ   r[   r\   r]   r   r^   rE   rJ   r  r  w  s-             rE   r  c                   f    e Zd ZdZdgZdZdZdZeeefZefdZ	d Z
d Zd	 Zd
 Zed             ZdS )	UUIDFielda  Field for UUID storage, wrapping Python's uuid.UUID type.

    The internal storage format of this field is ``uuid.UUID`` from the Python
    standard library.

    There are three formats (``uuid_fmt``) for this field type:

    * ``FORMAT_BE`` (default): the UUID is six fields in big-endian byte order,
      per RFC 4122.

      This format is used by DHCPv6 (RFC 6355) and most network protocols.

    * ``FORMAT_LE``: the UUID is six fields, with ``time_low``, ``time_mid``
      and ``time_high_version`` in little-endian byte order. This *doesn't*
      change the arrangement of the fields from RFC 4122.

      This format is used by Microsoft's COM/OLE libraries.

    * ``FORMAT_REV``: the UUID is a single 128-bit integer in little-endian
      byte order. This *changes the arrangement* of the fields.

      This format is used by Bluetooth Low Energy.

    Note: You should use the constants here.

    The "human encoding" of this field supports a number of different input
    formats, and wraps Python's ``uuid.UUID`` library appropriately:

    * Given a bytearray, bytes or str of 16 bytes, this class decodes UUIDs in
      wire format.

    * Given a bytearray, bytes or str of other lengths, this delegates to
      ``uuid.UUID`` the Python standard library. This supports a number of
      different encoding options -- see the Python standard library
      documentation for more details.

    * Given an int or long, presumed to be a 128-bit integer to pass to
      ``uuid.UUID``.

    * Given a tuple:

      * Tuples of 11 integers are treated as having the last 6 integers forming
        the ``node`` field, and are merged before being passed as a tuple of 6
        integers to ``uuid.UUID``.

      * Otherwise, the tuple is passed as the ``fields`` parameter to
        ``uuid.UUID`` directly without modification.

        ``uuid.UUID`` expects a tuple of 6 integers.

    Other types (such as ``uuid.UUID``) are passed through.
    uuid_fmtr   r   r  c                 v    || _         |                                  t                              | ||d           d S r  )r  _check_uuid_fmtr}   rK   )rI   r~   r   r  s       rJ   rK   zUUIDField.__init__  s9     tT7E22222rE   c                 z    | j         t          j        vr't          d                    | j                             dS )z=Checks .uuid_fmt, and raises an exception if it is not valid.zUnsupported uuid_fmt ({})N)r  r  FORMATSrM  r]  rN   s    rJ   r!  zUUIDField._check_uuid_fmt  sD     =	 111*+224=AAC C C 21rE   c                 
   |                                   |dS | j        t          j        k    r|j        S | j        t          j        k    r|j        S | j        t          j        k    r|j        d d d         S t          d          )Ns                   r   Unknown fmt)	r!  r  r  	FORMAT_BErx  	FORMAT_LEbytes_le
FORMAT_REVrS  r   s      rJ   r   zUUIDField.i2m  s}    9:=I///7N]i111:]i222744R4= )-888rE   c                 8   |                                   | j        t          j        k    rt	          |          S | j        t          j        k    rt	          |          S | j        t          j        k    rt	          |d d d                   S t          d          )N)rx  )r(  r   r%  )r!  r  r  r&  r   r'  r)  rS  r   s      rJ   r   zUUIDField.m2i  s    
 	=I///a=== ]i111####]i222a"g&&&&)-888rE   c                    t          |t                    rt          |          }t          |t                    rt	          |          }nt          |t
                    rat          |          dk    r=d}|dd          D ]
}|dz  |z  }|d         |d         |d         |d         |d	         |f}t	          |
          }nt          |t          t          f          rTt          |          dk    r$| 	                    |t          |                    }nQt	          t          |                    }n4t          |t          t          f          rt          t          |          }nd S |S )Nr     r      r@  r   r  r  r  )fieldsr  )r   	bytearrayr    r   r   r%  rU   rM   rx  r   r   r   r@   )rI   r   r   unoder   s         rJ   r   zUUIDField.any2i  sJ    a## 	 QAa 	AA5!! 	1vv|| 122 + +A AI?DDqT1Q41qtQqT48AAAC<(( 		1vv||HHS,q//221&&D(+,, 	T1AA4rE   c                      t                      S rG   )r   r^   rE   rJ   r   zUUIDField.randval  s     zzrE   N)rZ   r[   r\   r]   r   r&  r'  r)  r#  rK   r!  r   r   r   staticmethodr   r^   rE   rJ   r  r    s        3 3j IIIJ )Z0G/8 3 3 3 3C C C9 9 99 9 9! ! !F   \  rE   r  c                   0    e Zd Zej        ZddZd Zd ZdS )UUIDEnumFieldr   c                 ~    t                               | |||d           t                              | |||           d S )Nr  )r  )r  rK   r  )rI   r~   r   r  r  s        rJ   rK   zUUIDEnumField.__init__  sA    D$u===4wBBBBBrE   c                 :    t                               | ||          S rG   r  r   s      rJ   r   zUUIDEnumField.any2i!  r  rE   c                 :    t                               | ||          S rG   r  r   s      rJ   r   zUUIDEnumField.i2repr%  r  rE   Nr  r  r^   rE   rJ   r5  r5    sR        #IC C C C
. . ./ / / / /rE   r5  c                   J    e Zd ZdZdgZd ZddZd Zd Zd Z	d	 Z
d
 Zd ZdS )BitExtendedFielda  
    Bit Extended Field

    This type of field has a variable number of bytes. Each byte is defined
    as follows:
    - 7 bits of data
    - 1 bit an an extension bit:

      + 0 means it is last byte of the field ("stopping bit")
      + 1 means there is another byte after this one ("forwarding bit")

    To get the actual data, it is necessary to hop the binary data byte per
    byte and to check the extension bit until 0
    extension_bitc                     t          |          }|d| j        z  z  | j        z	  }|d| j        z  dz
  z  }|| j        dz   z	  }|| j        dz   z  |dz  z   |z   }|S rl  )r   r;  )rI   r   fx_bitlsb_bitsmsb_bitss        rJ   prepare_bytezBitExtendedField.prepare_byte?  sw     FFa+++0BBq$,,q00+a/0$,q01h!mDvMrE   rE   c                     d}d }d}t          |          D ]U}|                     |          }|dz  t          |          dz	  z  }t          |          dz  s||dz   d          } n|dz   }V|dS ||fS )Nr      r   )rE   N)r/  r@  r   )rI   r   bitsendr   r  s         rJ   str2extendedzBitExtendedField.str2extendedI  s      1 	 	A!!!$$A19A!,Dq66C< AiAAA; 99rE   c                    |dS t          |          }g }d}d}d}d}|dk    s|re|dk    rd}|                    |           d}d}n;|dz  | j        k    r|r|d|z  z  }d}n|d|z  z  }d}n||dz  |z  z  }|dz	  }|dz   }|dk    c|e|                    |           d                                }|d d d         D ]}|t	          j        d	|          z   }|S )
NrE   Tr   r@  Fr   r@  r   z>B)r   rh   r;  r  r   r   )rI   r   r   LSByte
FX_MissingrC  r   results           rJ   extended2strzBitExtendedField.extended2strd  s/   93FF
1uu
uAvv!

q5D... /#cQh!&#cQh!&JJ1s7q.0DQAE) 1uu
u* 	
55b5 	3 	3Afk$222FFrE   c                 N    t                               | ||d           || _        d S r  )r}   rK   r;  )rI   r~   r   r;  s       rJ   rK   zBitExtendedField.__init__  s(    tT7C000*rE   c                 ,    |                      |          S rG   )rJ  r   s      rJ   r   zBitExtendedField.i2m        ###rE   c                 8    |                      |          d         S r  rE  r   s      rJ   r   zBitExtendedField.m2i  s      ##A&&rE   c                 4    ||                      ||          z   S rG   r  r  s       rJ   r   zBitExtendedField.addfield  r  rE   c                 ,    |                      |          S rG   rO  r   s      rJ   r   zBitExtendedField.getfield  rM  rE   NrY   )rZ   r[   r\   r]   r   r@  rE  rJ  rK   r   r   r   r   r^   rE   rJ   r:  r:  -  s          !!I     6$ $ $L+ + +
$ $ $' ' '& & &$ $ $ $ $rE   r:  c                       e Zd Zd ZdS )LSBExtendedFieldc                 B    t                               | ||d           d S )Nr   r;  r:  rK   r  s      rJ   rK   zLSBExtendedField.__init__  %    !!$gQ!GGGGGrE   Nr	  r^   rE   rJ   rS  rS    (        H H H H HrE   rS  c                       e Zd Zd ZdS )MSBExtendedFieldc                 B    t                               | ||d           d S )NrB  rU  rV  r  s      rJ   rK   zMSBExtendedField.__init__  rW  rE   Nr	  r^   rE   rJ   rZ  rZ    rX  rE   rZ  )r]   r  collectionsr   r  r.  r  r  r   r  r!  typesr   uuidr   r  r   scapy.configr   scapy.dadictr   scapy.volatiler   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   
scapy.datar   scapy.errorr   r   scapy.compatr   r   r   r    scapy.pton_ntopr!   r"   scapy.utilsr#   r$   r%   r&   r'   r(   scapy.utils6r)   r*   r+   r,   r-   r.   scapy.base_classesr/   r0   r1   r2   r3   typingr4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   r  rB   rD   r   rM   r`   rz   r{   r}   objectr   AnyFieldr   r   r   r  r  rI  r\  rx  rd  rp  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r%  r+  r/  r1  rB  rJ  rM  rQ  rS  rU  rl  rp  rs  ry  r|  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r%  r'  r+  r;  rC  rF  rJ  rL  rN  rR  rT  rW  r]  rk  rx  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r(  r*  r/  r5  r8  r;  r?  rK  r  
namedtupler  r  r  r  r  r  r  r  r   r  r  r  r  r5  r:  rS  rZ  r^   rE   rJ   <module>rm     s                                                                                            4 4 4 4 4 4 4 4 @ @ @ @ @ @ @ @ @ @ @ @ 0 0 0 0 0 0 0 0 N N N N N N N N N N N N N N N N< < < < < < < < < < < < < < < <                                            $  $######* * * * * * * *D% % % % %T#s(^ % % %F GCLLGCLLa a a a aGAqDM_ a a a aH' ' ' ' 'f ' ' ' sCx/12    ?   "    _   44 4 4 4 4/ 4 4 44' 4' 4' 4' 4' 4' 4' 4'nz  z  z  z  z  z  z  z z!
 !
 !
 !
 !
 !
 !
 !
H! ! ! ! !h ! ! !:= = = = =5 = = =** * * * *? * * *Z& & & & &| & & &
 
 
 
 
c5j! 
 
 
8$ $ $ $ $uXc]E)* $ $ $N0 0 0 0 0 0 0 0@ @ @ @ @eE#s(OU*+ @ @ @F6 6 6 6 6G 6 6 62= = = = =uXeCI./67 = = =@7 7 7 7 7X 7 7 725 5 5 5 58Y 5 5 5*1 1 1 1 1c3h 1 1 1& & & & & & & &) ) ) ) ) ) ) )Q Q Q Q QeCHo Q Q Q/ / / / /?J / / /Q Q Q Q Q	 Q Q Q/ / / / /&
 / / /+ + +)2 )2 )2 )2 )2%T#Y' )2 )2 )2X8 8 8 8 8; 8 8 81 1 1 1 1eCHo 1 1 1	 	 	 	 	 	 	 		 	 	 	 	 	 	 		 	 	 	 	o 	 	 	o o o o oY o o od1 1 1 1 1sCx 1 1 11 1 1 1 1uS#X 1 1 12 2 2 2 25c? 2 2 22 2 2 2 2sCx 2 2 2& & & & &* & & &1 1 1 1 1uS#X 1 1 11 1 1 1 1U38_ 1 1 12 2 2 2 2sCx 2 2 22 2 2 2 2uS#X 2 2 2& & & & & & & &. . . . .*i . . .0 0 0 0 0L+ 0 0 01 1 1 1 1c3h 1 1 11 1 1 1 1eCHo 1 1 12 2 2 2 2) 2 2 22 2 2 2 2c3h 2 2 2& & & & & & & &/ / / / /;
 / / /1 1 1 1 1U38_ 1 1 11 1 1 1 1eCHo 1 1 1/) /) /) /) /)ah /) /) /)d	 	 	 	 	y 	 	 	E E E E EH E E E(       "    =(    GCj!:x
/CDD    9Q<   >    a   *         $Z0          '(<=   <k; k; k; k; k;l4
#34 k; k; k;\-, -, -, -, -,x -, -, -,`	 	 	 	 	,m 	 	 	    =*:    ' ' ' ' '' ' ' 'T!< !< !< !< !<( !< !< !<H6 6 6 6 6ue|$ 6 6 6    
H       :{       
$4   	 	 	 	 	\ 	 	 		 	 	 	 	{M 	 	 	    m[   : : : : :{ : : :*[  [  [  [  [ U49d3i/0 [  [  [ |" " " " "E#s(O " " "J; ; ; ; ;8 ; ; ;B    m   ; ; ; ; ;8 ; ; ;,    uS#X   .	 	 	 	 	E%*% 	 	 	L$ L$ L$ L$ L$af L$ L$ L$^         y~      > > > > >( > > ></ / / / /x / / /2& & & & & & & &z  z  z  z  z uT!WaZ(!+, z  z  z z3 3 3 3 3
1 3 3 3    IcN   0/ / / / /9U49c>23Z_ / / /(/ / / / /k:c? / / /4	G 	G 	G 	G 	GYs^ 	G 	G 	GJ J J J Jy~ J J JF F F F FIcN F F FI I I I Iin I I IF F F F FIcN F F F    ]    E E E E E9S> E E EK K K K K3 K K KH H H H HYs^ H H H    n   / / / / /):c? / / /"    *   ( ( ( ( (jm ( ( (VD D D D D_S)9S> D D D$
 $
 $
 $
 $
	%S	3"78',$
 $
 $
N, , , , , , , ,, , , , , , , ,, , , , ,| , , ,
 
 
 
 
m 
 
 
(    F   6^6 ^6 ^6 ^6 ^6 ^6 ^6 ^6B`@ `@ `@ `@ `@8E#y.$9:; `@ `@ `@F )+():Wf<MNNY Y Y Y YiC) Y Y Yx' ' ' ' 'h ' ' 'DVZ VZ VZ VZ VZuS#XeSj0AAB VZ VZ VZr
 
 
 
 
& 
 
 
(
 
 
 
 
' 
 
 
*< < < < <5$ < < <~    eE3J'   8=K =K =K =K =KF =K =K =K@( ( ( ( (=sEz*E#u*,==>( ( (V5 5 5 5 5mX 5 5 5    |    O O O O OdEk" O O Od/ / / / /Iz$/ / / /(p$ p$ p$ p$ p$uXc]E12 p$ p$ p$fH H H H H' H H HH H H H H' H H H H HrE   