+
    4SsiCS ã                   óÀ  € ^ RI t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIHtH	t	 ^ RI
HtHtHtHt ^ RIHt ^ RIHt ^ RIHt ^ RIt^ RIHt ^ RIHt ^ R	IHtHtHt ^ R
IHt ^ RIHt ^ RIH t  ^ RIH!t! ^ RI"H#t# ^ RI$t$^ RI%H&t&H't'H(t( ^ RI)H*t* ^ RI+H,t,H-t-H.t.H/t/ ^ RI0H1t1 ^ RI2H3t3 ^ RI2H4t4 ^ RI5H6t6 ^ RI7H8t8 ^ RI9t9^t:^t;Rt<Rt=R¼RR½RR¾RR¿RRÀRRÁRRÂRRÃRRÄR/	t>RÅRRÆRRÇRRÈRRÉRRÊRRËRRÌR/t?0 RÍmt@R$tAR]A,          tBRÎtC^ tD]8! ]ER%7      tFR& tGR' tHR( tI ! R) R*]J4      tK ! R+ R,]L4      tMR- tNR. tO ! R/ R0]L4      tP ! R1 R2]L4      tQ ! R3 R4]L4      tR ! R5 R6]R4      tSRÏR7 ltTR8 tUR9 tVR: tW ! R; R<]L4      tXRÐR= ltY/ RRbR>R?bR@R?bRR?bR!R?bRR?bRRbRAR?bRBR?bRR?bRCR?bRDR?bR"RbR#RbRER?bR RbtZ/ RÑRFbRÒRGbRÓRHbRÔRIbRÕRJbRÖRKbRÁRLbRÉRMbR×RNbRÂRObRÊRPbRËRQbRÃRRbRÌRSbRØRTbRÙRUbR¼RVb/ RÅRWbRÚRXbRÛRYbRÜRZbRÝR[bRÞR\bRßR]bRàR^bRáR_bRâR`bR¾RabRÆRbbRÀRcbR¿RLbRÇRdbRÈRMbRãRebC/ RäRfbRåRgbRæRhbRçRibRèRjbRéRkbRêRlbRÄRVbRëRWbRìRmbRíRnbRîRobRïRpbRðRqbRñRrbRòRsbRóRtbC/ RôRubRõRvbRöRwbR÷RxbRøRybRùRzbRúR{bRûR|bRüR}bRýR~bRþRbRÿR€bER R�bERR‚bERRƒbERR„bERR…bC/ ERR†bERR‡bERRˆbERR‰bR½RŠbER	R‹bER
RŒbERR�bERRŽbERR�bERR�bERR‘bERR’bERR“bERR”bERR•bERR–bCERR—ERR˜ERRzERR™ERRšERR›ERRœERR�/Ct[Rž t\RŸ t]ERR  lt^ERR¡ lt_ERR¢ lt`R£ taR¤ tbR¥ tc]! R¦ER 4      tdR§ teER!R¨ ltfR© tgRª thR« tiER"R¬ ltjR­ tkER!R® ltlER!R¯ ltmR° tnR± toR² tpER!R³ ltq ! R´ Rµ]L4      trR¶ tsR· ttR¸ tuR¹ tvRº twR» txR# (#  é    N)ÚECHILDÚESRCH)ÚOrderedDictÚCounterÚdefaultdictÚ
namedtuple)Úquery)Útraffic_packets)ÚSamDB)ÚLdbError)ÚClientConnection)ÚsecurityÚdrsuapiÚlsa)Únetlogon)Únetr_Authenticator)Úsrvsvc)Úsamr)Ú
drs_DsBind)ÚCredentialsÚDONT_USE_KERBEROSÚMUST_USE_KERBEROS)Úsystem_session)ÚUF_NORMAL_ACCOUNTÚUF_SERVER_TRUST_ACCOUNTÚUF_TRUSTED_FOR_DELEGATIONÚUF_WORKSTATION_TRUST_ACCOUNT)ÚSEC_CHAN_BDC)Úgensec)Úsd_utils)Ú
get_string)Úget_samba_loggerga2U0*©3?Ú-Údnsç      ð?ÚsmbÚldapÚcldapÚdcerpcÚ11ÚnbnsÚsmb2ÚbrowserÚsmb_netlogong      $@)Únamec                óÀ   € V \         8:  dS   V'       g   \        V\        P                  R7       R# \        V\	        V4      ,          \        P                  R7       R# R# )a}  Print a formatted debug message to standard error.


:param level: The debug level, message will be printed if it is <= the
              currently set debug level. The debug level can be set with
              the -d option.
:param msg:   The message to be logged, can contain C-Style format
              specifiers
:param args:  The parameters required by the format specifiers
©ÚfileN)ÚDEBUG_LEVELÚprintÚsysÚstderrÚtuple)ÚlevelÚmsgÚargss   &&*Ú7/usr/lib/python3/dist-packages/samba/emulate/traffic.pyÚdebugr<   e   s9   € ð ”ÔßÜ�#œCŸJ™J×'ä�#œ˜d›Õ#¬#¯*©*×5ñ	 ó    c                 ón  € \         P                  ! ^R7      p\        RV^ ,          ^,          : RV^ ,          ^,          : R2R\        P                  R7       V  F  p\        V\        P                  R7       K   	  \        \        P                  R7       \        P                  P                  4        R# )zKPrint an unformatted log message to stderr, containing the line number
    )ÚlimitÚ z	:[01;33mz [00m)Úendr2   r1   N)Ú	tracebackÚextract_stackr4   r5   r6   Úflush)r:   ÚtbÚas   *  r;   Údebug_linenorG   w   sz   € ô 
×	 Ò	  qÔ	)€BÝ	Ø! !�u QŸx˜x¨¨A­¨q¯¨ð3Ø9<Ü�z‰zõó ˆÜˆa”c—j‘j×!ñ ä	Œs�z‰zÕÜ‡J�J×ÑÖr=   c                ó˜   a€ V '       d>   ^ÖpV  F  pV^,          pW,          pV^Ö,          pK  	  R^V,           ,          oV3R lpV# R pV# )zƒReturn a function that prints a coloured line to stderr. The colour
of the line depends on a sort of hash of the integer arguments.z
[38;5;%dmc                  óx   <€ \         ^ 8”  d.   V  F%  p\        S: V: R2\        P                  R7       K'  	  R# R# )r   z[00mr1   N©r3   r4   r5   r6   )r:   rF   Úprefixs   * €r;   ÚpÚrandom_colour_print.<locals>.p�   s,   ø€ Ü˜QŒÛ�AÜªF³AÐ6¼S¿Z¹Z×Hó ñ r=   c                  óh   € \         ^ 8”  d'   V  F  p\        V\        P                  R7       K   	  R# R# )r   r1   NrJ   )r:   rF   s   * r;   rL   rM   ”   s&   € Ü˜QŒÛ�AÜ˜!¤#§*¡*×-ó ñ r=   © )ÚseedsÚsÚxrL   rK   s   &   @r;   Úrandom_colour_printrS   „   sY   ø€ ÷ ØˆÛˆAØ��GˆAØ�FˆAØ��HŠAñ ð ! B¨¥FÕ+ˆõ	Ið €Hò	.ð
 €Hr=   c                   ó   € ] tR t^œtRtR# )ÚFakePacketErrorrO   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__static_attributes__rO   r=   r;   rU   rU   œ   s   † Ûr=   rU   c                   ó|   a € ] tR t^ t o RtRtR t]R 4       tRR lt	R t
R tR tR tR	 tR
 tR tRR ltRtV tR# )ÚPacketzDetails of a network packetc
                ó   € Wn         W n        W0n        W@n        WPn        W`n        Wpn        W€n        W�n        V P                  V P                  8  d    V P                  V P                  3V n	        R # V P                  V P                  3V n	        R # ©N©
Ú	timestampÚip_protocolÚstream_numberÚsrcÚdestÚprotocolÚopcodeÚdescÚextraÚ	endpoints)
Úselfr`   ra   rb   rc   rd   re   rf   rg   rh   s
   &&&&&&&&&&r;   Ú__init__ÚPacket.__init__¬   si   € à"ŒØ&ÔØ*ÔØŒØŒ	Ø ŒØŒØŒ	ØŒ
Ø�8‰8�d—i‘iÔØ"Ÿh™h¨¯	©	Ð2ˆDŽNà"Ÿi™i¨¯©Ð2ˆDŽNr=   c                óÒ   € VP                  R 4      P                  R4      pVR,          w  ppppppp	p
VR,          p\        V4      p\        V4      p\        V4      pV ! W4WVVW‰W«4	      # )Ú
Ú	:Né   N:rp   NN)ÚrstripÚsplitÚfloatÚint)ÚclsÚlineÚfieldsr`   ra   rb   rc   rd   re   rf   rg   rh   s   &&          r;   Ú	from_lineÚPacket.from_line¼   s}   € à—‘˜TÓ"×(Ñ(¨Ó.ˆð ˜•ñ	ˆØ	Ø	Ø	Ø	Ø	Ø	Ø	Ø�r•
ˆä˜)Ó$ˆ	Ü�#‹hˆÜ�4‹yˆá�9¨=¸tØ Tó2ð 	2r=   c                ó&  € RP                  V P                  4      pV P                  V,           pTRTV P                  V P                  ;'       g    RV P
                  V P                  V P                  V P                  V P                  V3	,          3# )z5Format the packet as a traffic_summary line.
        ro   z%f	%s	%s	%d	%d	%s	%s	%s	%sÚ )
Újoinrh   r`   ra   rb   rc   rd   re   rf   rg   )rj   Útime_offsetrh   Úts   &&  r;   Ú
as_summaryÚPacket.as_summaryÐ   s�   € ð —	‘	˜$Ÿ*™*Ó%ˆØ�N‰N˜[Õ(ˆØÐ7ØØ×!Ñ!Ø×#Ñ#×)Ð) rØ—‘Ø—‘Ø—‘Ø—‘Ø—‘Øðõ	ð 	ð 		r=   c                ó^  € R V P                   V P                  V P                  V P                  ;'       g    RV P                  V P
                  V P                  V P                  V P                  '       d1   RRP                  V P                  4      ,           R,           3	,          # R3	,          # )z:%.3f: %d -> %d; ip %s; strm %s; prot %s; op %s; desc %s %sr#   ô   Â«r@   ô   Â»r{   )
r`   rc   rd   ra   rb   re   rf   rg   rh   r|   ©rj   s   &r;   Ú__str__ÚPacket.__str__à   s�   € ØLØ—‘ §¡¨4¯9©9°d×6FÑ6F×6MÐ6MÈ#Ø×#Ñ# T§]¡]°D·K±KÀÇÁØ8<¿
¿
¸
�$˜Ÿ™ $§*¡*Ó-Õ-°Õ4ðMõMð 	Nð IKðMõMð 	Nr=   c                ó   € R V ,          # )z<Packet @%s>rO   r„   s   &r;   Ú__repr__ÚPacket.__repr__æ   s   € Ø Õ$Ð$r=   c                óè   € V P                  V P                  V P                  V P                  V P                  V P
                  V P                  V P                  V P                  V P                  4	      # r^   )
Ú	__class__r`   ra   rb   rc   rd   re   rf   rg   rh   r„   s   &r;   ÚcopyÚPacket.copyé   sU   € Ø�~‰~˜dŸn™nØ"×.Ñ.Ø"×0Ñ0Ø"Ÿh™hØ"Ÿi™iØ"Ÿm™mØ"Ÿk™kØ"Ÿi™iØ"Ÿj™jó*ð 	*r=   c                ó@   € V P                   : R V P                  : 2pV# )Ú:©re   rf   )rj   r~   s   & r;   Úas_packet_typeÚPacket.as_packet_typeô   s   € Ø—}”} d§k£kÐ2ˆØˆr=   c                ó˜   € V P                   V P                  3pV\        9   d   \        V,          # V\        9   d   \        V,          ) # R# )z†A positive number means we think it is a client; a negative number
means we think it is a server. Zero means no idea. range: -1 to 1.
ç        )re   rf   ÚCLIENT_CLUESÚSERVER_CLUES)rj   Úkeys   & r;   Úclient_scoreÚPacket.client_scoreø   sB   € ð �}‰}˜dŸk™kÐ*ˆØ”,ÔÜ Õ$Ð$Ø”,ÔÜ  Õ%Ð%Ð%Ùr=   c           
     ó  € RV P                   : RV P                  : 2p \        \        V4      pT P                   R8w  d   \        ^RTP                  : RT: 24       \        P                  ! 4       p T! YT4      '       dT   \        P                  ! 4       pYv,
          p\        R	YqP                  T P                   T P                  T3,          4       R# R#   \         d9   p\        RTP                  : RT: 2\        P                  R7        Rp?R# Rp?ii ; i  \         d]   p\        P                  ! 4       pYv,
          p\        R
YqP                  T P                   T P                  Y…3,          4        Rp?R# Rp?ii ; i)zÙSend the packet over the network, if required.

Some packets are ignored, i.e. for  protocols not handled,
server response messages, or messages that are generated by the
protocol layer associated with other packets.
Úpacket_Ú_zConversation(z) Missing handler r1   NÚkerberosz) Calling handler z%f	%s	%s	%s	%f	True	z%f	%s	%s	%s	%f	False	%s)re   rf   Úgetattrr
   ÚAttributeErrorr4   Úconversation_idr5   r6   r<   ÚtimeÚ	Exception)	rj   ÚconversationÚcontextÚfn_nameÚfnÚeÚstartrA   Údurations	   &&&      r;   ÚplayÚPacket.play  s?  � ð %)§M¤M°4·;³;Ð?ˆð	Üœ¨'Ó2ˆBð �=‰=˜JÔ&Ü‘!Ø"×2Ô2²Gð=ô >ô —	’	“ˆð	.Ù�$ g×.Ò.ô —i’i“k�Ø�;�ÜÐ2Ø×8Ñ8¸$¿-¹-Ø—{‘{ Hð.õ.ö /ñ /øô ô 	ÝØ×/Ô/²ð:ä—z‘zõ#õ ûð		ûô, ô 	.Ü—)’)“+ˆCØ•{ˆHÜÐ1Ø×4Ñ4°d·m±mØ—;‘; ð-õ-÷ .ò .ûð	.ús1    C Á5A D ÃDÃ$-DÄDÄFÄ*AFÆFc                ó<   € V P                   VP                   ,
          # r^   ©r`   ©rj   Úothers   &&r;   Ú__cmp__ÚPacket.__cmp__+  s   € Ø�~‰~ §¡Õ/Ð/r=   Nc                óB   € \        V P                  V P                  4      # r^   )Úis_a_real_packetre   rf   )rj   Úmissing_packet_statss   &&r;   Úis_really_a_packetÚPacket.is_really_a_packet.  s   € Ü §¡¨t¯{©{Ó;Ð;r=   )
rg   rd   ri   rh   ra   rf   re   rc   rb   r`   r_   )r”   r^   )rV   rW   rX   rY   Ú__doc__Ú	__slots__rk   Úclassmethodrx   r   r…   rˆ   rŒ   r‘   r˜   rª   r°   rµ   rZ   Ú__classdictcell__©Ú__classdict__s   @r;   r\   r\       s\   ø‡ € Ù%ð	€Iò3ð  ñ2ó ð2ô&ò Nò%ò	*òò	ò&.òP0÷<ò <r=   r\   c                ó  € V \         9   d   R# V R8X  d
   VR8X  d   R# RV : RV: 2p\        \        VR4      pVf/   \        P	                  RV,          \
        P                  R7       R# V\        P                  J d   R# R	# )
z\Is the packet one that can be ignored?

If so removing it will have no effect on the replay
Fr'   r{   r›   rœ   Nzmissing packet %sr1   T)ÚSKIPPED_PROTOCOLSrž   r
   ÚLOGGERr<   r5   r6   Únull_packet)re   rf   r¥   r¦   s   &&  r;   r³   r³   2  sp   € ð
 Ô$Ô$áØ�6Ô˜f¨œláøã (ª&Ð1€GÜ	” '¨4Ó	0€BØ	‚zÜ�‰Ð(¨7Õ2¼¿¹ˆÔDÙØ	Œ_×(Ñ(Ó(ÙÙr=   c                ó>   € V R8X  d   R# W3R9   d   R# \        W4      # )zÐReturn true if a packet generates traffic in its own right. Some of
these will generate traffic in certain contexts (e.g. ldap unbind
after a bind) but not if the conversation consists only of these packets.
ÚwaitF)©r�   r{   ©r'   Ú2©r)   Ú15©r)   Ú16)r³   r�   s   &&r;   Úis_a_traffic_generating_packetrÊ   H  s/   € ð
 �6ÔÙàÐð ô ñ
 ä˜HÓ-Ð-r=   c                   ó  a € ] tR tRt o RtRRRRRRRRRR]P                  P                  R4      RR3R ltR t	R t
R tR	 tR
 tR tRR ltRR ltRR ltRR ltRR ltRR ltRR ltRR ltR tR tR tR tRtV tR# )ÚReplayContextiZ  a7  State/Context for a conversation between an simulated client and a
server. Some of the context is shared amongst all conversations
and should be generated before the fork, while other context is
specific to a particular conversation and should be generated
*after* the fork, in generate_process_local_config().
NÚDOMAINc                óž  € Wn         R V n        W0n        W n        V'       d   \        V n        M\        V n        W�n        W n        W°n	        W€n
        Wpn        WÀn        VP                  R4      V n        WÐn        WPn        RV n        RV n        RV n        RV n        RV n        RV n        RV n        RV n        W@n        V P5                  4        R # )NÚrealmF)ÚserverÚnetlogon_connectionÚcredsÚlpr   Úkerberos_stater   ÚouÚbase_dnÚdomainÚstatsdirÚglobal_tempdirÚ
domain_sidÚgetrÏ   Úinstance_idÚbadpassword_frequencyÚlast_lsarpc_badÚlast_lsarpc_named_badÚlast_simple_bind_badÚlast_bind_badÚlast_srvsvc_badÚlast_drsuapi_badÚlast_netlogon_badÚlast_samlogon_badÚtotal_conversationsÚgenerate_ldap_search_tables)rj   rÐ   rÓ   rÒ   ræ   rÝ   Úprefer_kerberosÚtempdirrØ   rÕ   rÖ   r×   rÚ   rÜ   s   &&&&&&&&&&&&&&r;   rk   ÚReplayContext.__init__a  s¼   € ð )/ŒØ(,ˆÔ Ø(-Œ
Ø(*ŒßÜ"3ˆDÕä"3ˆDÔØ(*ŒØ(/ŒØ(.ŒØ(0ŒØ(/ÔØ(2ŒØ(*¯©¨w«ˆŒ
Ø(3Ôð )>Ô"Ø(-ˆÔØ(-ˆÔ"Ø(-ˆÔ!Ø(-ˆÔØ(-ˆÔØ(-ˆÔØ(-ˆÔØ(-ˆÔØ(;Ô Ø×(Ñ(Ö*r=   c                óÂ  € \        4       p\        R V P                  ,          VV P                  V P                  R7      pVP                  VP                  4       \        P                  R.R.R7      p/ pR. /pV F¡  p\        VP                  4      pRP                  R VP                  R4       4       4      P                  4       pVP                  V. 4      p	V	P                  V4       VP!                  R4      '       g   K‰  VR,          P                  V4       K£  	  \#        VP%                  4       4       F{  p
V
RR	 R
8w  d   K  V
R	R pVRR	 R
8X  d   VR	R pK  \'        ^4       FG  pVR
,          pWº8w  d,   W´9   d&   \)        RV
: RV: 2\*        P,                  R7       K=  WJ,          WK&   KI  	  K}  	  W@n        WPn        / V n        VP                  VP                  4       \        P                  R.RR7      pRP                  R V 4       4      pRP5                  V4      V P2                  R&   RpR F)  pVRP5                  WòP                  4       4      ,          pK+  	  RP5                  V4      V P2                  R&   RV P2                  R&   VP                  R\        P6                  R.R7      pRP5                  V^ ,          R,          4      V P2                  R&   R	# )ú	ldap://%s)ÚurlÚsession_infoÚcredentialsrÓ   zpaged_results:1:1000Údn)ÚscopeÚcontrolsÚattrsÚinvocationIdÚ,c              3   óN   "  € T F  qP                  4       R ,          x € K  	  R# 5i):Né   NN)Úlstrip©Ú.0rR   s   & r;   Ú	<genexpr>Ú<ReplayContext.generate_ldap_search_tables.<locals>.<genexpr>£  s   é € ÐE±}°!Ÿx™x›z¨"Ÿ~š~³}ùs   ‚#%zCN=NTDS Settings,Nz,DCzdn_map collision r@   r1   z"(objectclass=groupPolicyContainer))rñ   ró   Ú
expressionr{   c              3   óR   "  € T F  pR P                  VR,          4      x € K  	  R# 5i)z(distinguishedName={0})rð   N)Úformat)rú   r9   s   & r;   rû   rü   Ç  s%   é € ÐXÑTWÈSÐ6×=Ñ=¸cÀ$½i×HÐHÓTWùs   ‚%'z(|{0})ÚgPCFileSysPathz(distinguishedName={0}{1})ÚgpLinkz'(objectCategory=pKICertificateTemplate)ÚpKIExtendedKeyUsageÚhighestCommittedUSN)rñ   ró   z(usnChanged>={0})Ú
usnChangedéýÿÿÿ)zDomain Controllers,ztraffic_replay,r{   )r   r   rÐ   rÒ   rÓ   ÚsearchÚ	domain_dnÚldbÚSCOPE_SUBTREEÚstrrð   r|   rr   ÚupperÚ
setdefaultÚappendÚ
startswithÚlistÚkeysÚranger4   r5   r6   Údn_mapÚattribute_clue_mapÚsearch_filtersrÿ   Ú
SCOPE_BASE)rj   ÚsessionÚdbÚresr  r  Úrrð   Úpatternr$   ÚkrL   ÚiÚ
gpos_by_dnÚou_strrÕ   s   &               r;   rç   Ú)ReplayContext.generate_ldap_search_tables�  s—  € Ü Ó"ˆä�{ T§[¡[Õ0Ø 'Ø#Ÿz™zØ—g‘gôˆð
 �i‰i˜Ÿ™›Ü!×/Ñ/Ø"8Ð!9Ø#˜fð ó &ˆð ˆà˜Bð
Ðó ˆAÜ�Q—T‘T“ˆBØ—h‘hÑE°r·x±xÀ´}ÓEÓE×KÑKÓMˆGØ×#Ñ# G¨RÓ0ˆCØ�J‰J�rŒNØ�}‰}Ð0×1Ô1Ø" >Õ2×9Ñ9¸"Ö=ñ ô �f—k‘k“mÖ$ˆAØ��ˆv˜ŒÙØ�#�2�ˆAØ�B�C�&˜E”/Ø�c�r�F’Ü˜1–X�Ø�U•
�Ø”6˜aœkÝ³aºÐ;Ü"Ÿz™zõ+áØ"�I�“	ó ñ %ð ŒØ"4Ôð
 !ˆÔð �i‰i˜Ÿ™›¬c×.?Ñ.?ÈÀvØ#Gð ó Iˆà—W‘WÑXÑTWÓXÓXˆ
ð 19·±À
Ó0Kˆ×ÑÐ,Ñ-ð ˆÛ@ˆBØÐ2×9Ñ9¸"¿l¹l»nÓMÕMŠFñ Aà(0¯©¸Ó(?ˆ×Ñ˜HÑ%ð
 6ð 	×ÑÐ1Ñ2ð
 �i‰i˜¤#§.¡.Ð9NÐ8OˆiÓPˆà×&Ñ& s¨1¥vÐ.CÕ'DÓEð 	×Ñ˜LÓ)r=   c                ó  € V P                   P                  4        F  pWA9   g   K  V P                   V,          u # 	  VR 8X  dF   \        P                  ! 4       V P                  ,          p\	        V P
                  V4      pRV,          # R# )zDC,DCz((&(sAMAccountName=%s)(objectClass=user))z(objectClass=*))r  r  Úrandomræ   Ú	user_namerÜ   )rj   ró   Údn_sigrð   r—   Úrandom_user_idÚaccount_names   &&&&   r;   Úguess_search_filterÚ!ReplayContext.guess_search_filterä  su   € ð ×&Ñ&×+Ñ+Ö-ˆCØŽ|Ø×*Ñ*¨3Õ/Ò/ñ .ð �WÔÜ#Ÿ]š]›_¨t×/GÑ/GÕGˆNÜ$ T×%5Ñ%5°~ÓFˆLØ=ÀÕLÐLñ !r=   c                ó>  € . V n         . V n        . V n        . V n        . V n        . V n        . V n        VP                  V n        VP                  V n        VP                  V n	        VP                  V n
        \        V P                  R VP                  ,          4      V n        V P                  P!                  RV P                  4       V P                  P!                  RV P                  4       V P                  P!                  RV P                  4       V P                  P!                  RR4       RV n        RV P                  : RV P$                  : 2V n        RV P                  : RV P$                  : 2V n        V P+                  4        V P-                  4        R	# )
zconversation-%dzprivate dirzlock dirzstate directoryztls verify peerÚno_checkz/root/ncalrpc_as_systemúcn=rõ   N)Úldap_connectionsÚdcerpc_connectionsÚlsarpc_connectionsÚlsarpc_connections_namedÚdrsuapi_connectionsÚsrvsvc_connectionsÚsamr_contextsÚnetbios_nameÚmachinepassÚusernameÚuserpassÚmk_masked_dirrÙ   r    ré   rÓ   ÚsetÚremoteAddressrÕ   Úsamlogon_dnÚuser_dnÚgenerate_machine_credsÚgenerate_user_creds)rj   Úaccountr£   s   &&&r;   Úgenerate_process_local_configÚ+ReplayContext.generate_process_local_configö  sB  € Ø(*ˆÔØ(*ˆÔØ(*ˆÔØ(*ˆÔ%Ø(*ˆÔ Ø(*ˆÔØ(*ˆÔØ(/×(<Ñ(<ˆÔØ(/×(;Ñ(;ˆÔØ(/×(8Ñ(8ˆŒØ(/×(8Ñ(8ˆŒä$ T×%8Ñ%8Ø%6Ø%1×%AÑ%Aõ&BóCˆŒð 	�‰�‰�M 4§<¡<Ô0Ø�‰�‰�J §¡Ô-Ø�‰�‰Ð% t§|¡|Ô4Ø�‰�‰Ð% zÔ2à6ˆÕà#×0Ô0°$·'³'ð;ˆÕð  $Ÿ}œ}¨d¯g«gð7ˆŒð 	×#Ñ#Ô%Ø× Ñ Ö"r=   c                óÒ   € V'       gE   V P                   '       d1   \        P                  ! 4       V P                   8  d    V! V4       RpMRpV! V4      pWT3#   \         d     Li ; i)a¹  Execute the supplied logon function, randomly choosing the
bad credentials.

Based on the frequency in badpassword_frequency randomly perform the
function with the supplied bad credentials.
If run with bad credentials, the function is re-run with the good
credentials.
failed_last_time is used to prevent consecutive bad credential
attempts. So the over all bad credential frequency will be lower
than that requested, but not significantly.
TF)rÝ   r!  r¢   )rj   ÚfÚgoodÚbadÚfailed_last_timeÚresults   &&&&& r;   Úwith_random_bad_credentialsÚ)ReplayContext.with_random_bad_credentials  si   € ÷  Ø×*×*Ð*Ü—’“ $×"<Ñ"<Ô<ðÙ�c”Fð
 $(Ñ à#(Ð á�4“ˆØÐ)Ð)øô !ô ñ ðús   Á A ÁA&Á%A&c                óP  € \        4       V n        V P                  P                  V P                  4       V P                  P	                  V P
                  4       V P                  P                  V P                  4       V P                  P                  V P                  4       V P                  P                  V P                  4       V P                  P                  V P                  4       \        4       V n        V P                  P                  V P                  4       V P                  P	                  V P
                  4       V P                  P                  V P                  RR 4       V P                  P                  V P                  4       V P                  P                  V P                  4       \        4       V n        V P                  P                  V P                  4       V P                  P	                  V P
                  4       V P                  P                  V P                  4       V P                  P                  V P                  4       V P                  P!                  V P                  P#                  4       \$        P&                  ,          4       V P                  P                  V P                  4       V P                  P)                  V P*                  4       \        4       V n        V P,                  P                  V P                  4       V P,                  P	                  V P
                  4       V P,                  P                  V P                  RR 4       V P,                  P                  V P                  4       V P,                  P!                  V P,                  P#                  4       \$        P&                  ,          4       V P,                  P                  V P                  4       V P,                  P)                  V P*                  4       R# )a  Generate the conversation specific user Credentials.

Each Conversation has an associated user account used to simulate
any non Administrative user traffic.

Generates user credentials with good and bad passwords and ldap
simple bind credentials with good and bad passwords.
Néüÿÿÿ)r   Ú
user_credsÚguessrÓ   Úset_workstationr2  Úset_passwordr5  Úset_usernamer4  Ú
set_domainr×   Úset_kerberos_staterÔ   Úuser_creds_badÚsimple_bind_credsÚset_gensec_featuresÚget_gensec_featuresr   ÚFEATURE_SEALÚset_bind_dnr:  Úsimple_bind_creds_badr„   s   &r;   r<  Ú!ReplayContext.generate_user_creds1  sÏ  € ô &›-ˆŒØ�‰×Ñ˜dŸg™gÔ&Ø�‰×'Ñ'¨×(9Ñ(9Ô:Ø�‰×$Ñ$ T§]¡]Ô3Ø�‰×$Ñ$ T§]¡]Ô3Ø�‰×"Ñ" 4§;¡;Ô/Ø�‰×*Ñ*¨4×+>Ñ+>Ô?ä)›mˆÔØ×Ñ×!Ñ! $§'¡'Ô*Ø×Ñ×+Ñ+¨D×,=Ñ,=Ô>Ø×Ñ×(Ñ(¨¯©°s¸Ð);Ô<Ø×Ñ×(Ñ(¨¯©Ô7Ø×Ñ×.Ñ.¨t×/BÑ/BÔCô "-£ˆÔØ×Ñ×$Ñ$ T§W¡WÔ-Ø×Ñ×.Ñ.¨t×/@Ñ/@ÔAØ×Ñ×+Ñ+¨D¯M©MÔ:Ø×Ñ×+Ñ+¨D¯M©MÔ:Ø×Ñ×2Ñ2Ø×"Ñ"×6Ñ6Ó8¼6×;NÑ;NÕNô	Pà×Ñ×1Ñ1°$×2EÑ2EÔFØ×Ñ×*Ñ*¨4¯<©<Ô8ä%0£]ˆÔ"Ø×"Ñ"×(Ñ(¨¯©Ô1Ø×"Ñ"×2Ñ2°4×3DÑ3DÔEØ×"Ñ"×/Ñ/°·±¸c¸rÐ0BÔCØ×"Ñ"×/Ñ/°·±Ô>Ø×"Ñ"×6Ñ6Ø×&Ñ&×:Ñ:Ó<Ü×Ñõ ô	!ð 	×"Ñ"×5Ñ5°d×6IÑ6IÔJØ×"Ñ"×.Ñ.¨t¯|©|Ö<r=   c                ó  € \        4       V n        V P                  P                  V P                  4       V P                  P	                  V P
                  4       V P                  P                  \        4       V P                  P                  V P                  4       V P                  P                  V P
                  R,           4       V P                  P                  V P                  4       V P                  P                  V P                  4       \        4       V n        V P                  P                  V P                  4       V P                  P	                  V P
                  4       V P                  P                  \        4       V P                  P                  V P                  RR 4       V P                  P                  V P
                  R,           4       V P                  P                  V P                  4       R# )zªGenerate the conversation specific machine Credentials.

Each Conversation has an associated machine account.

Generates machine credentials with good and bad passwords.
Ú$NrI  )r   Úmachine_credsrK  rÓ   rL  r2  Úset_secure_channel_typer   rM  r3  rN  rO  r×   rP  rÔ   Úmachine_creds_badr„   s   &r;   r;  Ú$ReplayContext.generate_machine_creds_  si  € ô )›]ˆÔØ×Ñ× Ñ  §¡Ô)Ø×Ñ×*Ñ*¨4×+<Ñ+<Ô=Ø×Ñ×2Ñ2´<Ô@Ø×Ñ×'Ñ'¨×(8Ñ(8Ô9Ø×Ñ×'Ñ'¨×(9Ñ(9¸CÕ(?Ô@Ø×Ñ×%Ñ% d§k¡kÔ2Ø×Ñ×-Ñ-¨d×.AÑ.AÔBä!,£ˆÔØ×Ñ×$Ñ$ T§W¡WÔ-Ø×Ñ×.Ñ.¨t×/@Ñ/@ÔAØ×Ñ×6Ñ6´|ÔDØ×Ñ×+Ñ+¨D×,<Ñ,<¸S¸bÐ,AÔBØ×Ñ×+Ñ+¨D×,=Ñ,=ÀÕ,CÔDØ×Ñ×1Ñ1°$×2EÑ2EÖFr=   c                ó@  € V P                   P                  V4      pV'       d   \        P                  ! V4      # VP	                  4       pV'       dC   WP
                  9   d(   \        P                  ! V P
                  V,          4      # VR ,          pKJ  V P                  # ):é   NN)r  rÛ   r!  Úchoicer  r  rÖ   )rj   r  Ú
attributesÚ	attr_clues   &&& r;   Úget_matching_dnÚReplayContext.get_matching_dnx  so   € ð ×+Ñ+×/Ñ/°
Ó;ˆ	ßÜ—=’= Ó+Ð+à—-‘-“/ˆßØŸ+™+Ô%Ü—}’} T§[¡[°Õ%9Ó:Ð:à˜b•kŠGà�|‰|Ðr=   c                óî   € R pV P                   '       d   V'       g   V P                   R,          # \        RV P                  ,          V^3V P                  4      pV P                   P	                  V4       V# )z$12345678-1234-abcd-ef00-01234567cffbzncacn_ip_tcp:%séÿÿÿÿ)r,  r   rÐ   rÓ   r  )rj   ÚnewÚguidÚcs   &&  r;   Úget_dcerpc_connectionÚ#ReplayContext.get_dcerpc_connectionŽ  sb   € Ø5ˆØ×"×"Ð"¯3Ø×*Ñ*¨2Õ.Ð.ÜÐ.°·±Õ<Ø" A˜Y¨¯©ó1ˆà×Ñ×&Ñ& qÔ)Øˆr=   c                ó  a € S P                   '       d   V'       g   S P                   R,          # V 3R lpS P                  VS P                  S P                  S P                  4      w  pS n        S P                   P                  V4       V# )é   c                 ój   <€ \         P                   ! R SP                  ,          SP                  V 4      # ©zncacn_np:%s)r   rÐ   rÓ   ©rÒ   rj   s   &€r;   ÚconnectÚ4ReplayContext.get_srvsvc_connection.<locals>.connect›  s)   ø€ Ü—=’= °$·+±+Õ!>Ø!%§¡Ø!&ó(ð (r=   rg  )r0  rF  rJ  rQ  râ   r  ©rj   rh  rr  rj  s   f&  r;   Úget_srvsvc_connectionÚ#ReplayContext.get_srvsvc_connection—  sz   ø€ Ø×"×"Ð"¯3Ø×*Ñ*¨2Õ.Ð.õ	(ð ×,Ñ,¨WØ-1¯_©_Ø-1×-@Ñ-@Ø-1×-AÑ-AóCñ 	"ˆˆDÔ ð 	×Ñ×&Ñ& qÔ)Øˆr=   c                ó  a € S P                   '       d   V'       g   S P                   R,          # V 3R lpS P                  VS P                  S P                  S P                  4      w  pS n        S P                   P                  V4       V# )rn  c                 ór   <€ R p\         P                  ! RSP                  : RV: R2SP                  V 4      # )zschannel,seal,signúncacn_ip_tcp:Ú[Ú]©r   ÚlsarpcrÐ   rÓ   )rÒ   Úbinding_optionsrj   s   & €r;   rr  Ú4ReplayContext.get_lsarpc_connection.<locals>.connect­  s1   ø€ Ø2ˆOÜ—:“:Ø#Ÿ{œ{«Oð=à"Ÿg™gØ#ó%ð %r=   rg  )r-  rF  r[  r]  rÞ   r  rt  s   f&  r;   Úget_lsarpc_connectionÚ#ReplayContext.get_lsarpc_connection©  s|   ø€ Ø×"×"Ð"¯3Ø×*Ñ*¨2Õ.Ð.õ	%ð ×,Ñ,¨WØ-1×-?Ñ-?Ø-1×-CÑ-CØ-1×-AÑ-AóCñ 	"ˆˆDÔ ð 	×Ñ×&Ñ& qÔ)Øˆr=   c                ó  a € S P                   '       d   V'       g   S P                   R,          # V 3R lpS P                  VS P                  S P                  S P                  4      w  pS n        S P                   P                  V4       V# )rn  c                 ój   <€ \         P                  ! R SP                  ,          SP                  V 4      # rp  r|  rq  s   &€r;   rr  Ú?ReplayContext.get_lsarpc_named_pipe_connection.<locals>.connectÁ  s)   ø€ Ü—:’:˜m¨t¯{©{Õ;Ø"Ÿg™gØ#ó%ð %r=   rg  )r.  rF  r[  r]  rß   r  rt  s   f&  r;   Ú get_lsarpc_named_pipe_connectionÚ.ReplayContext.get_lsarpc_named_pipe_connection½  s|   ø€ Ø×(×(Ð(·Ø×0Ñ0°Õ4Ð4õ	%ð ×,Ñ,¨WØ-1×-?Ñ-?Ø-1×-CÑ-CØ-1×-GÑ-GóIñ 	(ˆˆDÔ&ð 	×%Ñ%×,Ñ,¨QÔ/Øˆr=   c                ó<  a € S P                   '       d   V'       g   S P                   R,          pV# V 3R lpS P                  VS P                  S P                  S P                  4      w  pS n        \        V4      w  rgWV3pS P                   P                  V4       V# )zget a (drs, drs_handle) tuplec                 óv   <€ R pRSP                   : RV: R2p\        P                  ! VSP                  V 4      # )Úsealry  rz  r{  )rÐ   r   rÓ   )rÒ   r~  Úbinding_stringrj   s   &  €r;   rr  Ú:ReplayContext.get_drsuapi_connection_pair.<locals>.connectÕ  s/   ø€ Ø$‰Oà"Ÿkœk«?ð<ˆNä—?’? >°4·7±7¸EÓBÐBr=   rg  )r/  rF  rJ  rQ  rã   r   r  )rj   rh  Úunbindrj  rr  ÚdrsÚ
drs_handleÚsupported_extensionss   f&&     r;   Úget_drsuapi_connection_pairÚ)ReplayContext.get_drsuapi_connection_pairÏ  s“   ø€ à×#×#Ð#¯CØ×(Ñ(¨Õ,ˆAØˆHõ	Cð ×,Ñ,¨WØ-1¯_©_Ø-1×-@Ñ-@Ø-1×-BÑ-BóDñ 	%ˆˆdÔ#ô .8¸«_Ñ*ˆØÐˆØ× Ñ ×'Ñ'¨Ô*Øˆr=   c                óª  a € S P                   '       d   V'       g   S P                   R,          # V 3R lpV 3R lpV'       d<   S P                  VS P                  S P                  S P                  4      w  pS n        M:S P                  VS P
                  S P                  S P                  4      w  pS n        S P                   P                  V4       V# )rn  c                óV   <€ \        RSP                  ,          V SP                  R7      # )zÜ
To run simple bind against Windows, we need to run
following commands in PowerShell:

    Install-windowsfeature ADCS-Cert-Authority
    Install-AdcsCertificationAuthority -CAType EnterpriseRootCA
    Restart-Computer

z
ldaps://%s©rï   rÓ   ©r   rÐ   rÓ   rq  s   &€r;   Úsimple_bindÚ6ReplayContext.get_ldap_connection.<locals>.simple_bindê  s'   ø€ ô ˜¨¯©Õ3Ø%*Ø ŸG™Gô%ð %r=   c                 óV   <€ \        R SP                  ,          V SP                  R7      # )rì   r”  r•  rq  s   &€r;   Ú	sasl_bindÚ4ReplayContext.get_ldap_connection.<locals>.sasl_bindø  s%   ø€ Ü˜ t§{¡{Õ2Ø%*Ø ŸG™Gô%ð %r=   rg  )	r+  rF  rR  rW  rà   rJ  rQ  rá   r  )rj   rh  Úsimpler–  r™  Úsamdbs   f&&   r;   Úget_ldap_connectionÚ!ReplayContext.get_ldap_connectionæ  s¼   ø€ Ø× × Ð ¯Ø×(Ñ(¨Õ,Ð,õ	%õ	%÷ à×0Ñ0°Ø15×1GÑ1GØ15×1KÑ1KØ15×1JÑ1JóLñ /ˆU�DÕ-ð ×0Ñ0°Ø15·±Ø15×1DÑ1DØ15×1CÑ1CóEñ (ˆU�DÔ&ð 	×Ñ×$Ñ$ UÔ+Øˆr=   c                óæ   € V P                   '       d	   V'       dF   V P                   P                  \        V P                  V P                  V P
                  R 7      4       V P                   R,          # ))rÓ   rÒ   rg  )r1  r  ÚSamrContextrÐ   rÓ   rÒ   )rj   rh  s   &&r;   Úget_samr_contextÚReplayContext.get_samr_context  sN   € Ø×!×!Ð!§SØ×Ñ×%Ñ%Ü˜DŸK™K¨D¯G©G¸4¿:¹:ÔFôHà×!Ñ! "Õ%Ð%r=   c                óÒ   a € S P                   '       d   S P                   # V 3R  lpS P                  VS P                  S P                  S P                  4      w  pS n        VS n         V# )c                 ój   <€ \         P                   ! R SP                  ,          SP                  V 4      # )zncacn_ip_tcp:%s[schannel,seal])r   rÐ   rÓ   rq  s   &€r;   rr  Ú6ReplayContext.get_netlogon_connection.<locals>.connect  s/   ø€ Ü×$Ò$Ð%EØ&*§k¡kõ&3à%)§W¡WØ%*ó,ð ,r=   )rÑ   rF  r[  r]  rä   )rj   rr  rj  s   f  r;   Úget_netlogon_connectionÚ%ReplayContext.get_netlogon_connection  si   ø€ à×#×#Ð#Ø×+Ñ+Ð+õ	,ð ×,Ñ,¨WØ-1×-?Ñ-?Ø-1×-CÑ-CØ-1×-CÑ-CóEñ 	$ˆˆDÔ"ð
 $%ˆÔ Øˆr=   c                ó   € V P                   R 3# )ÚA©rÏ   r„   s   &r;   Úguess_a_dns_lookupÚ ReplayContext.guess_a_dns_lookup$  s   € Ø—
‘
˜CÐ Ð r=   c                óÂ   € V P                   P                  4       p\        4       p\        VR ,          4      VP                  n        VR,          Vn        \        4       pW#3# )Ú
credentialr`   )r[  Únew_client_authenticatorr   r  ÚcredÚdatar`   )rj   ÚauthÚcurrentÚ
subsequents   &   r;   Úget_authenticatorÚReplayContext.get_authenticator'  sR   € Ø×!Ñ!×:Ñ:Ó<ˆÜ%Ó'ˆÜ   lÕ!3Ó4ˆ�‰ÔØ  Õ-ˆÔä'Ó)ˆ
ØÐ$Ð$r=   c                óì   € \         P                  P                  V P                  V4      p\	        VR4      pVP                  4        F  w  rE\        V: RV: 2VR7       K  	  VP                  4        R# )z“Write arbitrary key/value pairs to a file in our stats directory in
order for them to be picked up later by another process working out
statistics.Úwz: r1   N)ÚosÚpathr|   rØ   ÚopenÚitemsr4   Úclose)rj   ÚfilenameÚkwargsrA  r  Úvs   &&,   r;   Úwrite_statsÚReplayContext.write_stats0  sR   € ô —7‘7—<‘< §¡¨xÓ8ˆÜ�˜3ÓˆØ—L‘L–N‰DˆAÜ›a¢Ð#¨!×,ñ #à	�‰Ž	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]  r3  r2  rÑ   rÕ   rÏ   r8  r9  r1  r  rÐ   rR  rW  r0  rØ   ré   ræ   rJ  rQ  r:  r4  r5  r^   )F)FF)rV   rW   rX   rY   r·   r¹  ÚenvironrÛ   rk   rç   r&  r>  rF  r<  r;  rd  rk  ru  r€  r…  r�  r�  r¡  r¦  r«  rµ  rÁ  rZ   rº   r»   s   @r;   rÌ   rÌ   Z  s«   ø‡ € ñð ØØØ%)Ø'+Ø!%ØØØØØŸ
™
Ÿ™ xÓ0Ø Ø!ô*+òXPFòn!ò$#ò>*ò8,=ò\Gô2ô,ôô$ô(ô$ô.$ôL&òò$!ò%÷ð r=   rÌ   c                   ó:   a € ] tR tRt o RtRR ltR tR tRtV t	R# )	r   i;  z5State/Context associated with a samr connection.
    Nc                óŒ   € R V n         R V n        R V n        R V n        R V n        R V n        R V n        Wn        W n        W0n	        R # r^   )
Ú
connectionÚhandleÚdomain_handlerÚ   Úgroup_handleÚuser_handleÚridsrÐ   rÓ   rÒ   )rj   rÐ   rÓ   rÒ   s   &&&&r;   rk   ÚSamrContext.__init__>  sE   € Ø!ˆŒØ!ˆŒØ!ˆÔØ!ˆŒØ!ˆÔØ!ˆÔØ!ˆŒ	Ø#ŒØŒØ"Ž
r=   c                óÄ   € V P                   '       gD   \        P                  ! R V P                  ,          V P                  V P                  R7      V n         V P                   # )zncacn_ip_tcp:%s[seal])Úlp_ctxrï   )rÆ  r   rÐ   rÓ   rÒ   r„   s   &r;   Úget_connectionÚSamrContext.get_connectionJ  sA   € Ø��ˆÜ"ŸišiØ'¨4¯;©;Õ7Ø—w‘wØ ŸJ™Jô(ˆDŒOð
 �‰Ðr=   c                ó¨   € V P                   '       g6   V P                  4       pVP                  R \        P                  4      V n         V P                   # r^   )rÇ  rÏ  ÚConnect2r   ÚSEC_FLAG_MAXIMUM_ALLOWED)rj   rj  s   & r;   Ú
get_handleÚSamrContext.get_handleS  s;   € Ø�{�{ˆ{Ø×#Ñ#Ó%ˆAØŸ*™* T¬8×+LÑ+LÓMˆDŒKØ�{‰{Ðr=   )
rÆ  rÒ   rÈ  rÚ   rÉ  rÇ  rÓ   rË  rÐ   rÊ  ©NN)
rV   rW   rX   rY   r·   rk   rÏ  rÔ  rZ   rº   r»   s   @r;   r   r   ;  s   ø‡ € ñô
#ò÷ð r=   r   c                   ó†   a € ] tR tRt o RtRR ltR tR tRR ltR t	]	t
R	 tR
 tR tR tRR ltRR ltR tR tRtV tR# )ÚConversationiZ  zADetails of a converation between a simulated client and a server.Nc                ó˜   € Wn         W n        . V n        \        V4      V n        R V n        W@n        V F  pV P                  ! V!   K  	  R# ©r”   N)Ú
start_timeri   ÚpacketsrS   r9   Úclient_balancer    Úadd_short_packet)rj   rÛ  ri   Úseqr    rL   s   &&&&& r;   rk   ÚConversation.__init__\  sE   € à$ŒØ"ŒØˆŒÜ& yÓ1ˆŒØ!ˆÔØ.ÔÛˆAØ×!Ò! 1Ô%ó r=   c                óœ   € V P                   f   VP                   f   ^ # R# VP                   f   ^# V P                   VP                   ,
          # )Nrg  )rÛ  r®   s   &&r;   r°   ÚConversation.__cmp__g  sD   € Ø�?‰?Ò"Ø×ÑÒ'ÙØˆIØ×ÑÒ#ÙØ�‰ ×!1Ñ!1Õ1Ð1r=   c                ó´  € VP                  4       pV P                  f   VP                  V n        V P                  f   VP                  V n        VP                  V P                  8w  d(   \	        RV P                  : RVP                  : 24      hV;P                  V P                  ,          un        VP
                  VP                  ^ ,          8X  d)   V ;P                  VP                  4       ,          un        M'V ;P                  VP                  4       ,          un        VP                  4       '       d   V P                  P                  V4       R# R# )zeAdd a packet object to this conversation, making a local copy with
a conversation-relative timestamp.NzConversation endpoints z don't matchpacket endpoints )rŒ   rÛ  r`   ri   rU   rc   rÝ  r˜   rµ   rÜ  r  )rj   ÚpacketrL   s   && r;   Ú
add_packetÚConversation.add_packetp  sé   € ð �K‰K‹Mˆà�?‰?Ò"ØŸk™kˆDŒOà�>‰>Ò!ØŸ[™[ˆDŒNà�;‰;˜$Ÿ.™.Ô(Ý!à#'§>¤>°1·;³;ð#@ó Að Að 	
�Š�t—‘Õ&�à�5‰5�A—K‘K •NÔ"Ø×Ò 1§>¡>Ó#3Õ3Öà×Ò 1§>¡>Ó#3Õ3Õà×Ñ×!Ò!Ø�L‰L×Ñ Ö"ñ "r=   c                óZ  € V'       d   \        W#4      '       g   R# V P                  4       w  rxV'       g   Y‡r‡W#3p	\        P                  V	R4      p
\        P                  VR4      p\        WP                  ,
          VRWxW#W¤4	      pVP                  VP                  ^ ,          8X  d)   V ;P                  VP                  4       ,          un	        M'V ;P                  VP                  4       ,          un	        VP                  4       '       d   V P                  P                  V4       R# R# )z±Create a packet from a timestamp, and 'protocol:opcode' pair, and a
(possibly empty) list of extra data. If client is True, assume
this packet is from the client to the server.
Nr{   Ú06)r³   Úguess_client_serverÚOP_DESCRIPTIONSrÛ   ÚIP_PROTOCOLSr\   rÛ  rc   ri   rÝ  r˜   rµ   rÜ  r  )rj   r`   re   rf   rh   ÚclientÚskip_unused_packetsrc   rd   r—   rg   ra   rä  s   &&&&&&&      r;   rÞ  ÚConversation.add_short_packetŠ  së   € ÷ Ô'7¸×'IÒ'IÙà×,Ñ,Ó.‰	ˆßØ�ØÐ ˆÜ×"Ñ" 3¨Ó+ˆÜ"×&Ñ& x°Ó6ˆÜ˜	§O¡OÕ3°[Ø˜CØ ¨$ó7ˆð �:‰:˜×)Ñ)¨!Õ,Ô,Ø×Ò 6×#6Ñ#6Ó#8Õ8Öà×Ò 6×#6Ñ#6Ó#8Õ8ÕØ×$Ñ$×&Ò&Ø�L‰L×Ñ Ö'ñ 'r=   c                ó~   € R V P                   V P                  V P                  \        V P                  4      3,          # )z-<Conversation %s %s starting %.3f %d packets>)r    ri   rÛ  ÚlenrÜ  r„   s   &r;   r…   ÚConversation.__str__¦  s5   € Ø?Ø×%Ñ% t§~¡~°t·±Ü�T—\‘\Ó"ð$õ$ð 	%r=   c                ó,   € \        V P                  4      # r^   )ÚiterrÜ  r„   s   &r;   Ú__iter__ÚConversation.__iter__­  s   € Ü�D—L‘LÓ!Ð!r=   c                ó,   € \        V P                  4      # r^   )rð  rÜ  r„   s   &r;   Ú__len__ÚConversation.__len__°  s   € Ü�4—<‘<Ó Ð r=   c                ó¸   € \        V P                  4      ^8  d   ^ # V P                  R,          P                  V P                  ^ ,          P                  ,
          # )r÷   rg  )rð  rÜ  r`   r„   s   &r;   Úget_durationÚConversation.get_duration³  s>   € Üˆt�|‰|Ó˜qÔ ÙØ�|‰|˜BÕ×)Ñ)¨D¯L©L¸­O×,EÑ,EÕEÐEr=   c                ót   € V P                    Uu. uF  qP                  V P                  4      NK  	  up# u upi r^   )rÜ  r   rÛ  )rj   rL   s   & r;   Úreplay_as_summary_linesÚ$Conversation.replay_as_summary_lines¸  s)   € Ø7;·|²|ÓD±|°!—‘˜TŸ_™_Ö-±|ÑDÐDùÒDs   �#5c                ó
  € V P                   p\        P                  ! 4       V,
          pWE,
          pV\        ,
          pV^ 8”  d   \        P                  ! V4       \        P                  ! 4       V,
          V,
          pV P	                  RW3,          4       Rp	Rp
\        P                  ! 4       pV P
                   FÁ  p\        P                  ! 4       V,
          pW\P                  ,
          pWi8”  d   Tp	V^ 8  dq   V) \        ,
          pV^ 8”  d\   \        P                  ! V4       \        P                  ! 4       V,
          pWLP                  ,
          V
8”  d   WLP                  ,
          p
VP                  W4       KÃ  	  W˜V
3# )zEReplay the conversation at the right time.
(We're already in a fork).zstarting %s [miss %.3f]r”   )rÛ  r¡   ÚSLEEP_OVERHEADÚsleepr9   rÜ  r`   rª   )rj   r¨   r¤   r=  r~   ÚnowÚgapÚ
sleep_timeÚmissÚmax_gapÚmax_sleep_missÚp_startrL   s   &&&&         r;   Úreplay_with_delayÚConversation.replay_with_delay»  s  € ð �O‰OˆÜ�iŠi‹k˜EÕ!ˆØ�gˆØœ>Õ)ˆ
Ø˜Œ>Ü�JŠJ�zÔ"ä—	’	“˜eÕ# qÕ(ˆØ�‰Ð*¨d¨\Õ9Ô:àˆØˆä—)’)“+ˆØ—”ˆAÜ—)’)“+ Õ'ˆCØŸ™Õ#ˆCØŒ}Ø�Ø�QŒwØ!˜T¤NÕ2�
Ø ”>Ü—J’J˜zÔ*ÜŸ	š	› gÕ-�AØŸ;™;•¨Ô7Ø)*¯[©[­˜à�F‰F�4Ö!ñ ð ˜nÐ,Ð,r=   c                ó€   € V P                   w  r#V P                  ^ 8  d   W#3# V P                  ^ 8X  d
   W8X  d   W#3# W23# )zXHave a go at deciding who is the server and who is the client.
returns (client, server)
)ri   rÝ  )rj   Úserver_cluerF   Úbs   &&  r;   ré  Ú Conversation.guess_client_serverÞ  sG   € ð �~‰~‰ˆà×Ñ Ô"Ø�6ˆMð
 ×Ñ !Ô#¨Ô(8Ø�6ˆMàˆvˆr=   c                ó  € V P                    Uu. uF#  q1VP                  u;8:  d
   V8:  g   K  M K!  VNK%  	  upV n         V P                   '       d%   V P                   ^ ,          P                  V n        R# RV n        R# u upi )zyPrune any packets outside the time window we're interested in

:param s: start of the window
:param e: end of the window
N©rÜ  r`   rÛ  )rj   rQ   r§   rL   s   &&& r;   Úforget_packets_outside_windowÚ*Conversation.forget_packets_outside_windowï  sZ   € ð $(§<¢<ÓI¡<˜a¸¿¹Ö3HÀqÑ3HœÑ3H�¡<ÑIˆŒØ7;·|·|°|˜$Ÿ,™, q�/×3Ñ3ˆŽÈˆŽùò Js   �A?®A?²A?c                ó°   € V P                    F  pV;P                  V,          un        K  	  V P                  e   V ;P                  V,          un        R# R# )z=Adjust the packet start times relative to the new start time.Nr  )rj   rÛ  rL   s   && r;   Úrenormalise_timesÚConversation.renormalise_timesø  s=   € à—”ˆAØ�KŠK˜:Õ%�Kñ ð �?‰?Ò&Ø�OŠO˜zÕ)�Oñ 'r=   )rÝ  r    ri   r9   rÜ  rÛ  )NNrO   N)TTrÖ  r^   )rV   rW   rX   rY   r·   rk   r°   rå  rÞ  r…   rˆ   rô  r÷  rú  rý  r	  ré  r  r  rZ   rº   r»   s   @r;   rØ  rØ  Z  sY   ø‡ € ÙKô	&ò2ò#ô4(ò8%ð
 €Hò"ò!òFò
Eô!-ôFò"N÷*ð *r=   rØ  c                   óH   a € ] tR tRt o RtR	R ltR tR	R ltR	R ltRt	V t
R# )
Ú	DnsHammeri  zKA lightweight conversation that generates a lot of dns:0 packets on
the flyNc                ó$  € \        W,          4      p\        V4       Uu. uF  p\        P                  ! ^ V4      NK  	  upV n        V P                  P                  4        Wn        W n        ^ V n        V P                  VR7      V n
        R# u upi )r   ©Ú
query_fileN)rt   r  r!  ÚuniformÚtimesÚsortÚrater©   rÛ  Ú_get_query_choicesÚquery_choices)rj   Údns_rater©   r  Únr  s   &&&&  r;   rk   ÚDnsHammer.__init__  so   € Ü�Õ#Ó$ˆÜ;@À¼8ÓD¹8°a”f—n’n Q¨Ö1¹8ÑDˆŒ
Ø�
‰
�‰ÔØŒ	Ø ŒØˆŒØ!×4Ñ4À
Ð4ÓKˆÖùò Es   Ÿ Bc                óh   € R \        V P                  4      V P                  V P                  3,          # )z-<DnsHammer %d packets over %.1fs (rate %.2f)>)rð  r  r©   r  r„   s   &r;   r…   ÚDnsHammer.__str__  s)   € Ø?Ü�T—Z‘Z“ $§-¡-°·±Ð;õ<ð 	=r=   c                óž  € V'       d°   \        VR4      ;_uu_ 4       pVP                  4       pRRR4       . pXP                  4        Fj  pVP                  4       pV'       g   K  VP	                  R4      '       d   K6  VP                  R4      p\        V4      ^8X  g   Q hVP                  V4       Kl  	  V# . RO#   + '       g   i     L–; i)z�
Read dns query choices from a file, or return default

rname may contain format string like `{realm}`
realm can be fetched from context.realm
r  NÚ#rõ   )
)r   ú{realm}r©  Úyes)rn  r(  ÚNSr)  )r÷   ú	*.{realm}r©  Úno)r`  r+  r*  r,  )é
   ú_msdcs.{realm}r©  r)  )é   r.  r*  r)  )é   únx.realm.comr©  r,  )é   r1  r*  r,  )é   ú*.nx.realm.comr©  r,  )é   r4  r*  r,  )r»  ÚreadÚ
splitlinesÚstripr  rr   rð  r  )rj   r  rA  ÚtextÚchoicesrv   r:   s   &&     r;   r  ÚDnsHammer._get_query_choices  s�   € ÷ Ü�j #×&Ô&¨!Ø—v‘v“x�÷ 'àˆGØŸ™Ö)�Ø—z‘z“|�ß‘4 §¡°× 4Ô 4ØŸ:™: c›?�DÜ˜t›9¨œ>Ð)˜>Ø—N‘N 4Ö(ñ *ð ˆNòð ÷ '×&ús   �B<Â<C	c           
     ó  € V'       g   Q hVP                   '       g   Q h\        P                  ! 4       pV P                   Fÿ  p\        P                  ! 4       V,
          pW4,
          pV\        ,
          pV^ 8”  d   \        P                  ! V4       \
        P                  ! V P                  4      w  rxršVP                  VP                   R7      pRp\        P                  ! 4       p \        W‰4      pV
R8X  d   \        V4      '       g   Rp\        P                  ! 4       pYì,
          p\        RYçYû3,          4       EK  	  R#   \         d    Rp LGi ; i  \        P                  ! 4       pYì,
          p\        RYçYû3,          4       i ; i)r   rª  Tr)  Fz%f	DNS	dns	%s	%f	%s	N)rÏ   r¡   r  r   r  r!  ra  r   rÿ   Ú	dns_queryrð  r¢   r4   )rj   r¤   r¨   r~   r  r  r  rf   ÚrnameÚrtypeÚexistÚsuccessÚpacket_startÚanswersrA   r©   s   &&              r;   ÚreplayÚDnsHammer.replay3  s,  € ßˆˆwØ�}�}ˆ}Ðˆ}Ü—	’	“ˆØ—”ˆAÜ—)’)“+ Õ%ˆCØ•'ˆCØœ~Õ-ˆJØ˜AŒ~Ü—
’
˜:Ô&ä*0¯-ª-¸×8JÑ8JÓ*KÑ'ˆF˜5Ø—L‘L w§}¡}�LÓ5ˆEØˆGÜŸ9š9›;ˆLð
WÜ# EÓ1�Ø˜E”>¬#¨g¯,ª,à#�Gô —i’i“k�ØÕ-�ÜÐ2°cÀ8Ð5UÕU×Vó+ øô  ô  Ø’ð ûô —i’i“k�ØÕ-�ÜÐ2°cÀ8Ð5UÕUÕVús$   Ã(%EÅEÅEÅEÅEÅ3F)r©   r   r  rÛ  r  r^   )rV   rW   rX   rY   r·   rk   r…   r  rD  rZ   rº   r»   s   @r;   r  r    s'   ø‡ € ñôLò=ô÷BWò Wr=   r  c                ó$  € \        \        4      p. pV  FÄ  p\        V\        4      '       d   \	        V4      p\        RVP                  : 2\        P                  R7       V Fa  p\        P                  V4      pVP                  R8X  d(   VR8w  d!   W&P                  ;;,          ^,          uu&   KP  VP                  V4       Kc  	  VP                  4        KÆ  	  V'       g   . ^ 3# \        R V 4       4      p\!        R V 4       4      p\        R\        P                  R7       \#        4       p	\%        V4       Fo  w  r¦V;P&                  V,          un        V	P)                  VP*                  4      pVf"   \-        V
^,           R7      pW¹VP*                  &   VP/                  V4       Kq  	  . pV	P1                  4        F&  p\3        V4      ^ 8w  g   K  VP                  V4       K(  	  \5        W‡,
          4      p\3        V	4      V,          pWÎWÒ3# )	zLLoad a summary traffic summary file and generated Converations from it.
    z
Ingesting r1   r$   Úincludec              3   ó8   "  € T F  qP                   x € K  	  R # 5ir^   r­   ©rú   rL   s   & r;   rû   Ú#ingest_summaries.<locals>.<genexpr>e  s   é € Ð2©' Q—[–[«'ùó   ‚c              3   ó8   "  € T F  qP                   x € K  	  R # 5ir^   r­   rI  s   & r;   rû   rJ  f  s   é € Ð3©7 a—k–k«7ùrK  z$gathering packets into conversations)r    )r   rt   Ú
isinstancer
  r»  r4   r/   r5   r6   r\   rx   re   rf   r  r½  ÚminÚmaxr   Ú	enumerater`   rÛ   ri   rØ  rå  Úvaluesrð  rs   )ÚfilesÚdns_modeÚ
dns_countsrÜ  rA  rv   rL   rÛ  Úlast_packetÚconversationsr  rj  Úconversation_listr©   Úmean_intervals   &&             r;   Úingest_summariesrY  O  sœ  € ô œSÓ!€JØ€GÛˆÜ�aœ×ÒÜ�Q“ˆAÝ §£Ð(¬s¯z©zÕ:ÛˆDÜ× Ñ  Ó&ˆAØ�z‰z˜UÔ" x°9Ô'<ØŸ8™8×$¨Õ)Õ$à—‘˜qÖ!ñ ð 	
�‰Ž	ñ ÷ Ø�1ˆuˆäÑ2©'Ó2Ó2€JÜÑ3©7Ó3Ó3€Kä	Ð
0´s·z±zÕBÜ“M€MÜ˜'Ö"‰ˆØ	�Š�zÕ!�Ø×Ñ˜aŸk™kÓ*ˆØŠ9Ü¨a°!­eÔ5ˆAØ)*˜!Ÿ+™+Ñ&Ø	�‰�QŽñ #ð ÐØ×!Ñ!Ö#ˆÜˆq‹6�QŽ;Ø×$Ñ$ QÖ'ñ $ô �[Õ-Ó.€HÜ˜Ó&¨Õ1€Mà¨XÐAÐAr=   c                 ó¢   € \        4       pV  F  pVP                  VP                  4       K   	  V'       d   VP                  ^4      ^ ,          # R# ©rn  N)r   Úupdateri   Úmost_common)rV  Ú	addressesrj  s   &  r;   Úguess_server_addressr_  „  sC   € ä“	€IÛˆØ×Ñ˜Ÿ™Ö%ñ çØ×$Ñ$ QÓ'¨Õ*Ð*ñ r=   c                 óf   € / pV P                  4        F  w  r#R P                  V4      pW1V&   K  	  V# ©ro   )r¼  r|   )rR   Úyr  rÀ  Úk2s   &    r;   Ústringify_keysrd  �  s4   € Ø
€AØ—‘–	‰ˆØ�Y‰Y�q‹\ˆØˆ"‹ñ ð €Hr=   c                 óŠ   € / pV P                  4        F,  w  r#\        \        V4      P                  R 4      4      pW1V&   K.  	  V# ra  )r¼  r7   r
  rr   )rR   rb  r  rÀ  r~   s   &    r;   Úunstringify_keysrf  •  s>   € Ø
€AØ—‘–	‰ˆÜ”#�a“&—,‘,˜tÓ$Ó%ˆØˆ!‹ñ ð €Hr=   c                   ó`   a € ] tR tRt o RR ltRR ltR tR tRR ltR t	R	 t
RR
 ltRtV tR# )ÚTrafficModeli�  c                óv   € / V n         / V n        Wn        \        \        4      V n        R V n        ^ ^.V n        R# rÚ  )ÚngramsÚquery_detailsr"  r   rt   Údns_opcountsÚcumulative_durationÚpacket_rate)rj   r"  s   &&r;   rk   ÚTrafficModel.__init__ž  s7   € ØˆŒØˆÔØŒÜ'¬Ó,ˆÔØ#&ˆÔ Ø˜q˜6ˆÖr=   Nc           
     ó¸  € Vf   / pRpRp\         3V P                  ^,
          ,          p\        V4      pVP                  4        F$  w  rxV P                  V;;,          V,          uu&   K&  	  \        V4      ^8”  dƒ   V^ ,          P                  p	^ p
V	R,           pV F;  pV
\        V4      ,          p
\        W¼P                  R,          P                  4      pK=  	  W P                  ^ &   W¹,
          V P                  ^&   V EFŒ  pVP                  V4      w  rÖWLP                  4       ,          p\         3V P                  ^,
          ,          pV EF9  pVP                  V8w  d   K  VP                  V,
          pVP                  pV\        8”  do   R\        P                   ! \        RV\"        ,          4      4      ,          pV P$                  P'                  V. 4      P)                  V4       VR,          V3,           pVP+                  4       pV P,                  P'                  V. 4      P)                  \/        VP0                  4      4       V P$                  P'                  V. 4      P)                  V4       VR,          V3,           pEK<  	  EK�  	  V ;P2                  V,          un        V P$                  P'                  V. 4      P)                  \         4       R # )Nr”   gš™™™™™¹?úwait:%dr%   ºrn  NNrg  )Ú
NON_PACKETr"  r_  r¼  rl  rð  rÛ  rO  rÜ  r`   rn  ré  rú  rc   ÚWAIT_THRESHOLDÚmathÚlogÚ
WAIT_SCALErj  r  r  r‘   rk  r7   rh   rm  )rj   rV  rl  ÚprevÚcum_durationr—   rÐ   r  rÀ  ÚfirstÚtotalÚlastrj  rì  rL   ÚelapsedrÂ   Úshort_ps   &&&               r;   ÚlearnÚTrafficModel.learn¦  sF  € ØÒØˆLØˆØˆÜˆm˜tŸv™v¨�zÕ*ˆä% mÓ4ˆà ×&Ñ&Ö(‰DˆAØ×Ñ˜a×  AÕ%Õ ñ )ô ˆ}Ó Ô!Ø! !Õ$×/Ñ/ˆEØˆEØ˜3•;ˆDÛ"�Øœ˜Q›•�Ü˜4§¡¨2¥×!8Ñ!8Ó9’ñ #ð #(×Ñ˜QÑØ"&¥,ˆD×Ñ˜QÑäˆAØ×2Ñ2°6Ó:‰NˆFØŸN™NÓ,Õ,ˆLÜ�- 4§6¡6¨A¥:Õ.ˆCÜ�Ø—5‘5˜F”?ÙàŸ+™+¨Õ,�Ø—{‘{�Øœ^Ô+à$¬¯ª´°SØ5<¼zÕ5Ió2Kó )Lõ M�Dà—K‘K×*Ñ*¨3°Ó3×:Ñ:¸4Ô@Ø˜b�' T GÕ+�Cà×*Ñ*Ó,�Ø×"Ñ"×-Ñ-¨gØ.0ó2ß28±&¼¸q¿w¹w»Ô2HØ—‘×&Ñ& s¨BÓ/×6Ñ6°wÔ?Ø˜"•g  
Õ*“ô# ñ	 ð. 	× Ò  LÕ0Õ à�‰×Ñ˜s BÓ'×.Ñ.¬zÖ:r=   c           
     óü  € / pV P                   P                  4        F,  w  r4R P                  V4      p\        \	        V4      4      W#&   K.  	  / pV P
                  P                  4        F"  w  r4\        \	        R V 4       4      4      WS&   K$  	  RVRVRV P                  RV P                  R\        /pV P                  VR&   \        V\        4      '       d   \        VR4      p\        P                  ! Wa^R	7       R
# )ro   c              3   óX   "  € T F   pV'       d   R P                  V4      MRx € K"  	  R# 5i)ro   r#   N)r|   rù   s   & r;   rû   Ú$TrafficModel.save.<locals>.<genexpr>à  s&   é € ð ,8Ù56°÷ =>¨D¯I©I°a¬LÀ3Ô,FÛ56ùs   ‚*�*rj  rk  rm  rn  Úversionr$   r¸  )ÚindentN)rj  r¼  r|   Údictr   rk  rm  rn  ÚCURRENT_MODEL_VERSIONrl  rM  r
  r»  ÚjsonÚdump)rj   rA  rj  r  rÀ  rk  Úds   &&     r;   ÚsaveÚTrafficModel.saveØ  sæ   € ØˆØ—K‘K×%Ñ%Ö'‰DˆAØ—	‘	˜!“ˆAÜœW Q›ZÓ(ˆF‹Iñ (ð ˆØ×&Ñ&×,Ñ,Ö.‰DˆAÜ#¤Gñ ,8Ù56ó,8ó %8ó  9ˆMÓñ /ð
 �fØ˜]Ø! 4×#;Ñ#;Ø˜4×+Ñ+ØÔ,ð
ˆð ×$Ñ$ˆˆ%‰ä�aœ×ÒÜ�Q˜“ˆAä�	Š	�!˜q×!r=   c           	     óÆ  € \        V\        4      '       d   \        V4      p\        P                  ! V4      p VR ,          pV\
        8  d   \        RV\
        3,          4      h TR,          P                  4        F�  w  rE\        \        T4      P                  R4      4      pT P                  P                  T. 4      pTP                  4        F'  w  rxTP                  \        T4      .T,          4       K)  	  TP                  4        K‘  	  TR,          P                  4        F¯  w  rET P                  P                  \        T4      . 4      pTP                  4        Fa  w  rxTR8X  d   TP                  R.T,          4       K'  TP                  \        \        T4      P                  R4      4      .T,          4       Kc  	  TP                  4        K±  	  RT9   d@   TR,          P                  4        F$  w  rET P                   T;;,          T,          uu&   K&  	  TR,          T n        TR	,          T n        R
#   \         d    \        R\
        ,          4      hi ; i)r„  z4the model file is version %d; version %d is requiredz=the model file lacks a version number; version %d is requiredrj  ro   rk  r#   r$   rm  rn  NrO   )rM  r
  r»  rˆ  ÚloadÚREQUIRED_MODEL_VERSIONÚ
ValueErrorÚKeyErrorr¼  r7   rr   rj  r  Úextendr  rk  rl  rm  rn  )	rj   rA  rŠ  r„  r  rÀ  rQ  rL   Úcounts	   &&       r;   rŽ  ÚTrafficModel.loadñ  sð  € Ü�aœ×ÒÜ�Q“ˆAä�IŠI�a‹Lˆð		;Ø˜	•lˆGØÔ/Ô/Ü ð ":à")Ô+AÐ!Bõ"Có Dð Dð 0ð �h•K×%Ñ%Ö'‰DˆAÜ”c˜!“f—l‘l 4Ó(Ó)ˆAØ—[‘[×+Ñ+¨A¨rÓ2ˆFØŸG™GžI‘�Ø—‘œs 1›v˜h¨Õ.Ö/ñ &à�K‰KŽMñ (ð �oÕ&×,Ñ,Ö.‰DˆAØ×'Ñ'×2Ñ2´3°q³6¸2Ó>ˆFØŸG™GžI‘�Ø˜”8Ø—M‘M 2 $¨¥,Ö/à—M‘M¤5¬¨Q«¯©°dÓ);Ó#<Ð"=ÀÕ"EÖFñ	 &ð
 �K‰KŽMñ /ð �AŒ:Ø˜%�Ÿ™Ö(‘�Ø×!Ñ! !×$¨Õ)Õ$ñ )ð $%Ð%:Õ#;ˆÔ Ø˜]Õ+ˆÖøô5 ô 	;Ü ð ":ä"8õ":ó ;ð ;ð	;ús   ¹,H> È>"I c                óÒ  € . p\         3V P                  ^,
          ,          pVf
   V^,
          p \        P                  ! V P                  P                  V\         34      4      pV\         8X  dŠ   W8  d    V# \        P                  ! 4       V8”  d'   \        RWu3,          \        P                  R7        V# R\        P                  ! ^^4      ,          p\        RV,          \        P                  R7       W€P                  9   d)   \        P                  ! V P                  V,          4      p	M. p	VP                  R^4      w  r«V
R8X  dW   \        V4      \        P                  ! 4       ,           p\        P                  ! V4      \        V,          ,          pW,          pMb\        P                   ! \#         p\        P                  ! V4      V,          pW,          pVe
   W8”  d    V# W8¼  d   VP%                  WW¹34       VR,          V3,           pVR
,          R,          R	8X  g   EK   VR,          R,          R	8X  g   EK  \         3V P                  ^,
          ,          pEK:  )zEConstruct an individual conversation packet sequence from the
model.
z"ending after %s (persistence %.1f)r1   rq  ztrying %s instead of endr�   rÂ   rr  :Né   Nzwait:éþÿÿÿrg  )rs  r"  r!  ra  rj  rÛ   r4   r5   r6   Ú	randrangerk  rr   rt   ru  Úexprw  r  ÚNO_WAIT_LOG_TIME_RANGEr  )rj   r`   Ú	hard_stopÚreplay_speedÚignore_beforeÚpersistencerj  r—   rL   rh   re   rf   Úlog_wait_timerÂ   Úlog_waits   &&&&&&         r;   Úconstruct_conversation_sequenceÚ,TrafficModel.construct_conversation_sequence  sÜ  € ð ˆÜˆm˜tŸv™v¨�zÕ*ˆØÒ Ø%¨�MˆMàÜ—’˜dŸk™kŸo™o¨c´J°=ÓAÓBˆAØ”JŒØÔ,ØðF ˆôE —=’=“? [Ô0ÜÐ>À#ÐASÕSÜ"Ÿz™zõ+àð> ˆð; ¤× 0Ò 0°°BÓ 7Õ7�ÜÐ0°1Õ4¼3¿:¹:ÕFà×&Ñ&Ô&ÜŸš d×&8Ñ&8¸Õ&;Ó<‘à�à Ÿw™w s¨A›ÑˆHØ˜6Ô!Ü # F£¬f¯mªm«oÕ =�Ü—x’x Ó.´*¸|Õ2KÕL�ØÕ!‘	ä!Ÿ>š>Ô+AÐB�Ü—x’x Ó)¨LÕ8�ØÕ!�	ØÒ(¨YÔ-BØð ˆð Ô-Ø—H‘H˜i°6ÐAÔBà�b•'˜Q˜D•.ˆCØ�2�w�r�{˜g×%¨#¨b­'°"­+¸×*@ô "�m t§v¡v°¥zÕ2“r=   c                ó<   € V P                   w  r#W,          V,          # r^   ©rn  )rj   ÚscaleÚrate_nÚrate_ts   &&  r;   Úscale_to_packet_rateÚ!TrafficModel.scale_to_packet_rateO  s   € Ø×*Ñ*‰ˆØ�~ Õ&Ð&r=   c                ó<   € V P                   w  r#W,          V,          # r^   r¤  )rj   Úppsr¦  r§  s   &&  r;   Úpacket_rate_to_scaleÚ!TrafficModel.packet_rate_to_scaleS  s   € Ø×*Ñ*‰ˆØ•˜vÕ%Ð%r=   c                óÔ  € ^	V,          p\        W,          4      p. p^ pW†8  du   \        P                  ! V) V4      p	V P                  V	VV^ VR7      p
V
 F  w  r¼rÞ\	        WÍ4      '       g   K   M	  KU  VP                  V
4       V\        V
4      ,          pKz  V P                  V4      p\        RW†\        V4      W3,          \        P                  R7       VP                  4        V# )z<Generate a list of conversation descriptions from the model.)r›  rœ  r�  rž  zGwe have %d packets (target %d) in %d conversations at %.1f/s (scale %f)r1   )rt   r!  r  r¡  rÊ   r  rð  r¬  r4   r5   r6   r  )rj   rn  r©   rœ  rž  Úlead_inÚtarget_packetsrV  Ú	n_packetsr¨   rj  r`   re   rf   rh   r¥  s   &&&&&           r;   Úgenerate_conversation_sequencesÚ,TrafficModel.generate_conversation_sequencesW  sñ   € ð �h•,ˆÜ˜[Õ3Ó4ˆØˆØˆ	àÔ(Ü—N’N G 8¨XÓ6ˆEØ×4Ñ4°UØ?GØBNØCDØALð	 5ó NˆAó 78Ñ2�	 VÜ1°(×CÔCÙñ 78ñ à× Ñ  Ô#Øœ˜Q›ÕŠIà×)Ñ)¨+Ó6ˆÜð Ø(¼#¸mÓ:LØ*ð3õ3ô —:‘:õ	ð 	×ÑÔØÐr=   )rm  rl  r"  rj  rn  rk  )r`  r^   )r”   Nrn  r   r   )rn  r   )rV   rW   rX   rY   rk   r  r‹  rŽ  r¡  r¨  r¬  r²  rZ   rº   r»   s   @r;   rh  rh  �  s5   ø‡ € ô"ô0;òd"ò2&,ôP4òl'ò&÷%ò %r=   rh  c                 óœ   € . pV  FC  pV'       g   K  \        V^ ,          ^ ,          W3V4      pV^,          pVP                  V4       KE  	  V# )r   )rØ  r  )rß  rÐ   rì  rV  rQ   rj  s   &&&   r;   Úseq_to_conversationsrµ    sN   € Ø€MÛˆß‰1Ü˜Q˜q�T !�W vÐ&6¸Ó:ˆAØ�a�KˆFØ× Ñ  Ö#ñ	 ð
 Ðr=   Úrpc_netlogonrè  r�   r}  r   Úepmr   r   zHost Announcement (0x01)zRequest Announcement (0x02)zBrowser Election Request (0x08)zGet Backup List Request (0x09)z$Domain/Workgroup Announcement (0x0c)z Local Master Announcement (0x0f)ÚsearchRequestÚsearchResDoneÚRequestÚBindÚBind_ackÚBind_nakÚAlter_contextÚAlter_context_respÚAUTH3ÚResponser	   ÚresponseÚDsBindÚDsCrackNamesÚDsWriteAccountSpnÚDsUnbindÚDsReplicaSyncÚDsGetNCChangesÚDsReplicaUpdateRefsÚMapr{   ÚbindRequestÚbindResponseÚunbindRequestÚsearchResEntryz*** Unknown ***Úlsa_LookupNamesÚlsa_LookupSidsÚlsa_QueryTrustedDomainInfoBySidÚlsa_SetTrustedDomainInfoÚlsa_OpenPolicyÚlsa_LookupSids3Úlsa_LookupNames4ÚNetrLogonDummyRoutine1ÚNetrServerAuthenticate3ÚNetrLogonGetDomainInfoÚNetrServerPasswordSet2ÚNetrLogonSamLogonExÚDsrEnumerateDomainTrustsÚNetrLogonSamLogonWithFlagsÚNetrServerReqChallengeÚConnectÚGetAliasMembershipÚLookupNamesÚ
LookupRidsÚ	OpenGroupÚCloseÚQueryGroupMemberÚOpenUserÚQueryUserInfoÚGetGroupsForUserÚQuerySecurityÚLookupDomainÚConnect5ÚEnumDomainsÚ
OpenDomainÚQueryDomainInfozClose (0x04)zLocking AndX (0x24)zRead AndX (0x2e)zTrans2 (0x32)zTree Disconnect (0x71)zNegotiate Protocol (0x72)zSession Setup AndX (0x73)zLogoff AndX (0x74)zTree Connect AndX (0x75)zNT Create AndX (0xa2)ÚNegotiateProtocolÚIoctlÚFindÚGetInfoÚBreakÚSessionSetupÚSessionLogoffÚTreeConnectÚTreeDisconnectÚCreateÚReadz$SAM LOGON request from client (0x12)z3SAM Active Directory Response - user unknown (0x17)ÚNetShareGetInfoÚNetSrvGetInfoc                 óÖ   € V P                  R ^4      w  rV\        P                  WV3R4      p\        P                  VR4      pWRW#WVV.p	V	P	                  V4       RP                  V	4      # )r�   r{   rè  ro   )rr   rê  rÛ   rë  r’  r|   )
rL   r`   rc   rd   rh   re   rf   rg   ra   rv   s
   &&&&&     r;   Úexpand_short_packetrü  þ  se   € Ø—w‘w˜s A“Ñ€HÜ×Ñ Ð1°2Ó6€DÜ×"Ñ" 8¨TÓ2€Kà B¨°8ÀTÐJ€DØ‡K�K�ÔØ�9‰9�T‹?Ðr=   c                óª   € \         P                  P                  4        \         P                  P                  4        \        P
                  ! ^ 4       R# )z‡Signal handler closes standard out and error.

Triggered by a sigterm, ensures that the log messages are flushed
to disk and not lost.
N)r5   r6   r½  Ústdoutr¹  Ú_exit)ÚsignalÚframes   &&r;   Úflushing_signal_handlerr    s/   € ô ‡J�J×ÑÔÜ‡J�J×ÑÔÜ‡H‚HˆQ†Kr=   c                ól  € VR,          \         P                  ! ^ R4      ,           p\        P                  P	                  4        \        P
                  P	                  4        \        P                  ! 4       pV^ 8w  d   V#  \         P                  ! V4       WT3p^ p	V ^ ,          ^ ,          p
\        W¨WR7      p\        P                  ! \        P                  \        4       VP                  W;4       \        P                  P                  4        \        P                  ! ^ 4       \        P                   P#                  VP$                  RVP&                  ,          4      p\)        VR4      p \        P                  P                  4        \        P                  ! ^4       V\        n        \0        P0                  ! 4       V,
          pW¯,
          pV\2        ,
          pV^ 8”  d   \0        P4                  ! V4       VP7                  VVR7      w  ppp\9        R	V,          4       \9        R
V,          4       \9        RV,          4       \        P
                  P                  4        \        P                  P                  4        \        PB                  ! V	4       R#   \*         d(   p\,        P/                  RT,          4        Rp?EL'Rp?ii ; i  \:         d€    ^p	\9        R\        P<                  ! 4       X3,          \        P
                  R7       \>        P@                  ! \        P
                  4       \        P
                  P	                  4         ELi ; i  \        P
                  P                  4        \        P                  P                  4        \        PB                  ! X	4       i ; i)z8Fork a new process and replay the conversation sequence.éè  iç  )rß  r    zstats-conversation-%dr¸  ústdout closing failed with %sN)r¨   r¤   zMaximum lag: %fzStart lag: %fzMax sleep miss: %fz*EXCEPTION in child PID %d, conversation %sr1   )"r!  Úrandintr5   rþ  rD   r6   r¹  ÚforkÚseedrØ  r   ÚSIGTERMr  r>  Ústdinr½  rº  r|   rØ   r    r»  ÚIOErrorr¿   Úinfor¡   r   r  r	  r4   r¢   ÚgetpidrB   Ú	print_excrÿ  )Úcsr¨   r¤   r=  Ú	client_idÚ	server_idr  Úpidri   Ústatusr~   rj  r¾  rA  r§   r  r  r  Úmax_lagÚ	start_lagr  s   &&&&&&               r;   Úreplay_seq_in_forkr    s…  € ð �tÕœfŸnšn¨Q°Ó4Õ4€Dô ‡J�J×ÑÔÜ‡J�J×ÑÔÜ
�'Š'‹)€CØ
ˆa„xØˆ
ð
*Ü�Š�DÔØÐ*ˆ	ØˆØˆq�E�!�HˆÜ˜¨2ÔIˆÜ�Š”f—n‘nÔ&=Ô>à×-Ñ-¨gÔ9Ü�	‰	�‰ÔÜ
�Š�ŒÜ—7‘7—<‘< × 0Ñ 0Ð2IØ !× 1Ñ 1õ32ó 3ˆä�˜3Óˆð	=Ü�J‰J×ÑÔÜ�HŠH�QŒKð ŒŒ
Ü�iŠi‹k˜EÕ!ˆØ�gˆØœ>Õ)ˆ
Ø˜Œ>Ü�JŠJ�zÔ"à-.×-@Ñ-@ÀuØIPð .Aó .RÑ*ˆ�˜NäÐ 'Õ)Ô*Üˆo 	Õ)Ô*ÜÐ" ^Õ3Ô4ô 	�
‰
×ÑÔÜ�
‰
×ÑÔÜ
�Š�Öøô3 ô 	=Ü�K‰KÐ7¸!Õ;×<Ò<ûð	=ûô  ô ØˆÜÐ;¼r¿yºy»{ÈAÐ>NÕNÜ—:‘:õ	ä×ÒœCŸJ™JÔ'Ü�
‰
×Ñ×ðûô 	�
‰
×ÑÔÜ�
‰
×ÑÔÜ
�Š�ÕúsR   ÂC-K Å/4J Æ#B&K ÊKÊ(K
ËK Ë
KËK ËBMÍM ÍMÍM ÍAN3c                 ó4  € \         P                  P                  4        \         P                  P                  4        \        P
                  ! 4       pV^ 8w  d   V# \         P                  P                  4        \        P                  ! ^ 4        \         P                  P                  4        \        P                  ! ^4       \        P                  P                  VP                  R4      p\        VR4      \         n         ^ p\        P                  ! \        P                   \"        4       \%        WVR7      pVP'                  VR7       \         P                  P                  4        \         P                  P                  4        \        P2                  ! V4       R#   \         d(   p\        P                  RT,          4        Rp?ELRp?ii ; i  \(         d_    ^p\+        R\        P,                  ! 4       ,          \         P                  R7       \.        P0                  ! \         P                  4        Lñi ; i  \         P                  P                  4        \         P                  P                  4        \        P2                  ! X4       i ; i)	r   r  Nz	stats-dnsr¸  r  )r¤   z)EXCEPTION in child PID %d, the DNS hammerr1   )r5   rþ  rD   r6   r¹  r  r
  r½  r  r¿   Úwarnrº  r|   rØ   r»  r   r	  r  r  rD  r¢   r4   r  rB   r  rÿ  )	r!  r©   r¤   r  r  r§   r¾  r  Úhammers	   &&&&     r;   Údnshammer_in_forkr  R  s›  € Ü‡J�J×ÑÔÜ‡J�J×ÑÔÜ
�'Š'‹)€CØ
ˆa„xØˆ
ä‡I�I‡O�OÔÜ‡H‚HˆQ„Kð9Ü�
‰
×ÑÔÜ
�Š�Œô �w‰w�|‰|˜G×,Ñ,¨kÓ:€HÜ�h Ó$„C„JðØˆÜ�Š”f—n‘nÔ&=Ô>Ü˜8¸*ÔEˆØ�‰˜gˆÔ&ô 	�
‰
×ÑÔÜ�
‰
×ÑÔÜ
�Š�Öøô% ô 9Ü�‰Ð3°aÕ7×8Ò8ûð9ûô ô (ØˆÜÐ:¼b¿iºi»kÕJÜ—:‘:õ	ä×ÒœCŸJ™JÖ'ð	(ûô 	�
‰
×ÑÔÜ�
‰
×ÑÔÜ
�Š�Õús?   Â4F" ÄA
G Æ"GÆ-GÇGÇA&I È=I È?I É I ÉAJc
                 ó^  € \        RR VRVRVR\        V 4      /V
B p\        V4      \        V 4      8  d'   \        R\        V4      \        V 4      3,          4      h\        P                  ! 4        \        V 4      R,          p\
        P
                  ! 4       V,           pVf   V R,          R,          ^ ,          V,           p\        RV,          \        P                  R7       \        R	W|,           ,          \        P                  R7       \        R
V,          \        P                  R7       W×,           R,           p\        P                  R\        V 4      V3,          4       VP                  R\        V 4      \        R V  4       4      R7       / p V'       d   \        WWVVR7      p^VV&   \        V 4       F+  w  ppVV,          pV^,           p\        VWÛVV4      pVVV&   K-  	  \
        P
                  ! 4       p\        RVV,
          V,           VV,
          3,          \        P                  R7       \
        P
                  ! 4       V8  d±   V'       d©   \
        P                   ! R4        \        P"                  ! R\        P$                  4      w  ppT'       g   Kk  TP-                  TR4      p\.        ^ 8”  d/   \        RTT\        T4      3,          \        P                  R7       T	'       g   KÀ  T^ 8w  g   KÉ   TP                  R\        T4      R7       R EF¡  p\        R\        T4      T3,          \        P                  R7       T F  p \        P6                  ! TT4       K  	  \
        P                   ! R4       \
        P
                  ! 4       ^,           pT'       dö    \        P"                  ! R\        P$                  4      w  ppX^ 8w  d©   TP-                  TR4      pTfe   \        RT,          4       \        P                  P;                  4        \        P<                  P;                  4        \        P>                  ! ^4       \        RTT\        T4      3,          \        P                  R7       \
        P
                  ! 4       T8¼  g   Kü   T'       g    M\
        P                   ! ^4       EK¤  	  T'       d,   \        R\        T4      ,          \        P                  R7        \        P@                  ! ^ ^4       R#   \&         d#   pTP(                  \*        8w  d   h  Rp?EK9  Rp?ii ; i  \0         d5    \        R\        P                  R7       \2        P4                  ! 4         ELi ; i  \&         d#   pTP(                  \8        8w  d   h  Rp?EKZ  Rp?ii ; i  \&         d"   pTP(                  \*        8w  d   h  Rp?ELRp?ii ; i  \B         d     \        R\        P                  R7        R# i ; i  TP                  R\        T4      R7       R EF  p\        R\        T4      T3,          \        P                  R7       T FJ  p \        P6                  ! TT4       K    \&         d"   pTP(                  \8        8w  d   h  Rp?KD  Rp?ii ; i	  \
        P                   ! R4       \
        P
                  ! 4       ^,           pT'       Ed&    \        P"                  ! R\        P$                  4      w  ppM.  \&         d!   pTP(                  \*        8w  d   h  Rp?MRp?ii ; iX^ 8w  d©   TP-                  TR4      pTfe   \        RT,          4       \        P                  P;                  4        \        P<                  P;                  4        \        P>                  ! ^4       \        RTT\        T4      3,          \        P                  R7       \
        P
                  ! 4       T8¼  g   EK-   T'       g    M\
        P                   ! ^4       EK  	  T'       d,   \        R\        T4      ,          \        P                  R7        \        P@                  ! ^ ^4       i   \B         d    \        R\        P                  R7        i i ; i; i) rÐ   rÒ   rÓ   ræ   z(we have %d accounts but %d conversationsg{®Gáz”?NzWe will start in %.1f secondsr1   zWe will stop after %.1f secondszruntime %.1f secondsr%   z6Replaying traffic for %u conversations over %d secondsÚ
intentionsc              3   ó8   "  € T F  p\        V4      x € K  	  R # 5ir^   )rð  rù   s   & r;   rû   Úreplay.<locals>.<genexpr>¨  s   é € Ð+MÑ<L°q¬C°¯F¨FÓ<LùrK  )ÚPlanned_conversationsÚPlanned_packetsr  z,all forks done in %.1f seconds, waiting %.1fgú~j¼t“h?z-process %d finished conversation %d; %d to gozEXCEPTION in parentÚ
unfinished)ÚUnfinished_conversationszkilling %d children with -%dç      à?zchildren is %s, no pid foundz)kill -%d %d KILLED conversation; %d to goz%d children are missingzignoring fake ^CrO   rg  )é   r$  é	   )"rÌ   rð  r�  r¹  Úsetpgrpr¡   r4   r5   r6   r¿   r  rÁ  Úsumr  rP  r  r  ÚwaitpidÚWNOHANGÚOSErrorÚerrnor   Úpopr3   r¢   rB   r  Úkillr   rD   rþ  rÿ  ÚkillpgÚKeyboardInterrupt)Úconversation_seqÚhostrÒ   rÓ   Úaccountsr!  Údns_query_filer©   Úlatency_timeoutÚstop_on_any_errorr¿  r¤   Údelayr¨   rA   Úchildrenr  r  r  r=  r  r~   r  r§   rj  rQ   s   &&&&&&&&&&,               r;   rD  rD  t  sÊ  € ô ñ & 4ð &Ø"'ð&à!ð&ô 14Ð4DÓ0Eð&ð %ñ	&€Gô ˆ8ƒ}”sÐ+Ó,Ô,ÜÐDÜ˜x›=¬#Ð.>Ó*?Ð@õAó Cð 	Cô
 ‡J‚J„Lô Ð Ó! DÕ(€EÜ�IŠI‹K˜%Õ€EàÒð $ BÕ'¨Õ+¨AÕ.°Õ@ˆä	Ð
)¨EÕ
1Ü�z‰zõä	Ð
+¨xÕ/?Õ
@Ü�z‰zõä	Ð
  8Õ
+Ü�z‰zõð Õ
˜SÕ
 €Cä
‡K�KÐHÜÐ!Ó" HÐ-õ.ô /ð ×Ñ˜Ü.1Ð2BÓ.CÜ(+Ñ+MÑ<LÓ+MÓ(Mð ô Oð €HðY7ßÜ# H¸Ø/=ô?ˆCàˆH�S‰MäÐ/Ö0‰EˆAˆrØ˜q•kˆGØ˜A�ˆIÜ$ R¨¸À)ÓLˆCØ%ˆH�S‹Mñ	 1ô �IŠI‹KˆÜÐ<Ø�5�y˜5Õ  ! e¥)Ð,õ-ä—:‘:õ	ô �iŠi‹k˜CÔ§HÜ�JŠJ�uÔðÜ Ÿjšj¨¬R¯Z©ZÓ8‘��V÷
 ‰sØ—L‘L  dÓ+�Ü ”?Üð 'à ¤C¨£MÐ2õ3ä:=¿*¹*õF÷ %Ñ$¨°1®Øð 	×Ñ˜LÜ58¸³]ð 	ô 	Dô ˆAÜÐ1Ü˜“M 1Ð%õ&Ü-0¯Z©Zõ9ã�ðÜ—G’G˜C –Oñ  ô �JŠJ�sŒOÜ—)’)“+ •/ˆCßðÜ"$§*¢*¨R´·±Ó"<‘K�C˜ð ˜!”8Ø Ÿ™ S¨$Ó/�AØ’yÜÐ<¸xÕGÔHÜŸ
™
×(Ñ(Ô*ÜŸ
™
×(Ñ(Ô*ÜŸš œÜð &à˜s¤C¨£MÐ2õ3ô  #Ÿz™zõ+ô —9’9“; #Ö%ØçÙÜ�JŠJ�q�MñC ÷F ÜÐ+¬c°(«mÕ;Ü—z‘zõ#ð	7Ü�IŠI�a˜ŽOøôC ô Ø—7‘7œfÔ$ØÞûðûô ô ÜÐ#¬#¯*©*Õ5Ü×Ò×ðûô ô Ø—w‘w¤%Ô'Øö (ûðûô ô Ø—w‘w¤&Ô(Øõ )ûðûô@ !ô 	7ÜÐ$¬3¯:©:×6Ð6ð	7ûðc 	×Ñ˜LÜ58¸³]ð 	ô 	Dô ˆAÜÐ1Ü˜“M 1Ð%õ&Ü-0¯Z©Zõ9ã�ðÜ—G’G˜C –OøÜô Ø—w‘w¤%Ô'Øõ (ûðúñ  ô �JŠJ�sŒOÜ—)’)“+ •/ˆCß�(ðÜ"$§*¢*¨R´·±Ó"<‘K�C™øÜô Ø—w‘w¤&Ô(Øô )ûðúð ˜!”8Ø Ÿ™ S¨$Ó/�AØ’yÜÐ<¸xÕGÔHÜŸ
™
×(Ñ(Ô*ÜŸ
™
×(Ñ(Ô*ÜŸš œÜð &à˜s¤C¨£MÐ2õ3ô  #Ÿz™zõ+ô —9’9“; #×%ØçÙÜ�JŠJ�q�MñC ÷F ÜÐ+¬c°(«mÕ;Ü—z‘zõ#ð	7Ü�IŠI�a˜�OøÜ ô 	7ÜÐ$¬3¯:©:×6ð	7ýs<  ÆCU ÉU É/(T ÊU Ê!AU Ë6U Ë?X ÍVÎ+(V3Ó8W" ÔT>ÔT9Ô2U Ô6X Ô9T>Ô>U Õ;V Õ<X Õ?V Ö X ÖV0ÖV+Ö+V0Ö3WÖ>W×W×"&XØXØAb,Ù%Y>Ù<b,Ù>Z*Ú	Z%Úb,Ú%Z*Ú*?b,Û+(\Üb,Ü\?	Ü\:	Ü5b,Ü:\?	Ü?C	b,àb,à$b,à<+b,á(b á?b,â &b)â&b,â(b)â)b,c                 óJ   € \        4       p\        R V ,          VR.VVR7      pV# )rì   zmodules:paged_searches)rí   rî   Úoptionsrï   rÓ   )r   r   )r1  rÒ   rÓ   r  r  s   &&&  r;   ÚopenLdbr:    s1   € ÜÓ€GÜ
�K $Õ&Ø$Ø1Ð2Ø!Øô	€Cð
 €Jr=   c                ó6   € RVV P                   ! 4       3,          # )z(Generate an ou name from the instance idz#ou=instance-%d,ou=traffic_replay,%s)r  )r  rÜ   s   &&r;   Úou_namer<    s"   € à0°KØ47·M²M³Oð4Eõ Eð Er=   c                ó`  € \        W4      p V P                  ! RVP                  R^4      ^,          RR/4        V P                  ! RVRR/4       V#   \         d!   pTP                  w  rET^D8w  d   h  Rp?L?Rp?ii ; i  \         d"   pTP                  w  rET^D8w  d   h  Rp?T# Rp?ii ; i)z‡Create an ou, all created user and machine accounts will belong to it.

This allows all the created resources to be cleaned up easily.
rð   rõ   ÚobjectclassÚorganizationalunitN)r<  Úaddrr   r   r:   ©r  rÜ   rÕ   r§   r  rœ   s   &&    r;   Ú	create_ourB    sÁ   € ô
 
�Ó	"€BðØ�Š��r—x‘x  QÓ'¨Õ*ØÐ 4ð6ô 	7ðØ�Š��rØÐ 4ð6ô 	7ð €Iøô ô Ø—f‘f‰ˆà�RŒ<Øô ûðûô ô Ø—f‘f‰ˆà�RŒ<Øó à€Iûðús.   �-A »B ÁA>ÁA9Á9A>ÂB-ÂB(Â(B-ÚConversationAccountsc                ó¦   € . p\        ^V^,           4       F7  p\        W4      p\        W4      p\        WcVV4      pVP	                  V4       K9  	  V# )z;Generate a series of unique machine and user account names.)r  Úmachine_namer"  rC  r  )	r  rÜ   ÚnumberÚpasswordr2  r  r2  r4  r=  s	   &&&&     r;   Úgenerate_replay_accountsrH  ;  sV   € ð €HÜ�1�f˜q•jÖ!ˆÜ# KÓ3ˆÜ˜[Ó,ˆä& |¸xØ'/ó1ˆà�‰˜Ö ñ "ð €Or=   c                ó  € \        W4      pRV: RV: 2pR\        V4      ,          P                  R4      pV'       d   \        \        \
        ,          4      pM\        \        4      pV P                  ! RVRRRR	V,          R
VRV/4       R# )z"Create a machine account via ldap.r*  rõ   ú"%s"ú	utf-16-lerð   r>  ÚcomputerÚsAMAccountNamez%s$ÚuserAccountControlÚ
unicodePwdN)r<  r!   Úencoder
  r   r   r   r@  )	r  rÜ   r2  r3  Útraffic_accountrÕ   rð   Úutf16pwÚaccount_controlss	   &&&&&    r;   Úcreate_machine_accountrT  I  s‹   € ô 
�Ó	"�BÛ#¢RÐ	(€BØœ
 ;Ó/Õ/×7Ñ7¸ÓD€Gçô Ô8Ü6õ 7ó 8Ñô Ô;Ó<Ðà‡G‚GØˆbØ�zØ˜% ,Õ.ØÐ.Ø�gðö  r=   c                ó  € \        W4      pRV: RV: 2pR\        V4      ,          P                  R4      pV P                  ! RVRRRVR	\	        \
        4      R
V/4       \        P                  ! V 4      pVP                  VR4       R# )zCreate a user account via ldap.r*  rõ   rJ  rK  rð   r>  ÚuserrM  rN  rO  z(A;;WP;;;PS)N)	r<  r!   rP  r@  r
  r   r    ÚSDUtilsÚdacl_add_ace)r  rÜ   r4  r5  rÕ   r:  rR  Úsdutilss   &&&&    r;   Úcreate_user_accountrZ  b  s‚   € ä	�Ó	"�BÛ$¢bÐ)€GØœ
 8Ó,Õ,×4Ñ4°[ÓA€GØ‡G‚GØˆgØ�vØ˜(ØœcÔ"3Ó4Ø�gðô ô ×Ò˜sÓ#€GØ×Ñ˜ .Ö1r=   c                ó`   € \        W4      pRV: RV: 2pV P                  ! RVRRRV/4       R# )zCreate a group via ldap.r*  rõ   rð   r>  ÚgrouprM  N)r<  r@  )r  rÜ   r/   rÕ   rð   s   &&&  r;   Úcreate_groupr]  t  s8   € ô 
�Ó	"�BÛšRÐ	 €BØ‡G‚GØˆbØ�wØ˜$ðö r=   c                ó   € RW3,          # )z-Generate a user name based in the instance idz
STGU-%d-%drO   ©rÜ   r  s   &&r;   r"  r"  €  ó   € à˜;Ð*Õ*Ð*r=   c                ó–   € V P                   ! RP                  V4      V.R7      pV Uu0 uF  p\        WB,          4      kK  	  up# u upi )z(Search objectclass, return attr in a setz(objectClass={}))rý   ró   )r  rÿ   r
  )r  r>  ÚattrÚobjsÚobjs   &&&  r;   Úsearch_objectclassre  …  sC   € à�:Š:Ø%×,Ñ,¨[Ó9Øˆfô€Dñ '+Ó+¡d˜sŒC�•	ŽN¡dÑ+Ð+ùÒ+s   ©Ac                óö   € \        V RR7      p^ p\        V^ R4       FX  p\        W4      pWt9  g   K  \        WWs4       V^,          pV^2,          ^ 8X  g   K;  \        P                  RWR3,          4       KZ  	  V# )zAdd users to the serverrV  ©r>  zCreated %u/%u usersrg  )re  r  r"  rZ  r¿   r  )r  rÜ   rF  rG  Úexisting_objectsÚusersr  r/   s   &&&&    r;   Úgenerate_usersrj  Ž  sp   € ä)¨#¸6ÔBÐØ€EÜ�6˜1˜bÖ!ˆÜ˜Ó(ˆØÖ'Ü °$ÔAØ�Q�JˆEØ�r�z˜QŽÜ—‘Ð1°U°OÕCÖDñ "ð €Lr=   c                ó:   € V'       d   RW3,          # RW3,          # )z1Generate a machine account name from instance id.z
STGM-%d-%dzPC-%d-%drO   )rÜ   r  rQ  s   &&&r;   rE  rE  �  s%   € çð ˜{Ð.Õ.Ð.ð ˜[Ð,Õ,Ð,r=   c                ó
  € \        V RR7      p^ p\        V^ R4       Fb  p\        WV4      pVR,           V9  g   K  \        WWƒV4       V^,          pV^2,          ^ 8X  g   KE  \        P                  RWb3,          4       Kd  	  V# )z"Add machine accounts to the serverrL  rg  rZ  zCreated %u/%u machine accountsrg  )re  r  rE  rT  r¿   r  )	r  rÜ   rF  rG  rQ  rh  Úaddedr  r/   s	   &&&&&    r;   Úgenerate_machine_accountsrn  ¬  s€   € ô *¨#¸:ÔFÐØ€EÜ�6˜1˜bÖ!ˆÜ˜K¨OÓ<ˆØ�#�:Ð-Ö-Ü" 3°TØ#2ô4à�Q�JˆEØ�r�z˜QŽÜ—‘Ð<À¸ÕNÖOñ "ð €Lr=   c                ó   € RW3,          # )z'Generate a group name from instance id.z
STGG-%d-%drO   r_  s   &&r;   Ú
group_namerp  ½  r`  r=   c                óö   € \        V RR7      p^ p\        V^ R4       FX  p\        W4      pWc9  g   K  \        WV4       V^,          pVR,          ^ 8X  g   K;  \        P                  RWB3,          4       KZ  	  V# )z3Create the required number of groups on the server.r\  rg  r  zCreated %u/%u groupsrg  )re  r  rp  r]  r¿   r  )r  rÜ   rF  rh  Úgroupsr  r/   s   &&&    r;   Úgenerate_groupsrs  Â  sr   € ä)¨#¸7ÔCÐØ€FÜ�6˜1˜bÖ!ˆÜ˜+Ó)ˆØÖ'Ü˜¨4Ô0Ø�a�KˆFØ˜�} Ö!Ü—‘Ð2°fÐ5EÕEÖFñ "ð €Mr=   c                ó¤   € \        W4      p V P                  ! VR.4       R#   \         d"   pTP                  w  rET^ 8w  d   h  Rp?R# Rp?ii ; i)z7Remove the created accounts and groups from the server.ztree_delete:1N)r<  Údeleter   r:   rA  s   &&    r;   Úclean_up_accountsrv  Ñ  sL   € ä	�Ó	"€BðØ�
Š
�2˜Ð(Ö)øÜô Ø—f‘f‰ˆà�RŒ<Øõ ûðús   �# £A®A
Á
Ac	                óH  € ^ p	^ p
^ p\        W4       \        P                  R4       \        WW24      p\        P                  R4       \	        WWrV4      pV^ 8”  d"   \        P                  R4       \        WV4      p
V^ 8”  dW   \        P                  R4       \        VV
VVVV4      p\        P                  R4       \        WV4       VP                  4       p	V
^ 8”  d#   V^ 8X  d   WJ8w  d   \        P                  R4       \        P                  RWËV
V	3,          4       R# )	zMGenerate the required users and groups, allocating the users to
those groups.zGenerating dummy user accountsz!Generating dummy machine accountszGenerating dummy groupszAssigning users to groupszAdding users to groupsz(The added groups will contain no membersz:Added %d users (%d machines), %d groups and %d membershipsN)
rB  r¿   r  rj  rn  rs  ÚGroupAssignmentsÚadd_users_to_groupsr{  Úwarning)r  rÜ   rG  Únumber_of_usersÚnumber_of_groupsÚgroup_membershipsÚmax_membersÚmachine_accountsÚtraffic_accountsÚmemberships_addedÚgroups_addedÚcomputers_addedÚusers_addedÚassignmentss   &&&&&&&&&     r;   Úgenerate_users_and_groupsr†  Ý  s  € ð ÐØ€LØ€OäˆcÔä
‡K�KÐ0Ô1Ü  °?ÓM€Kä
‡K�KÐ3Ô4Ü/°Ø0@Ø0@óB€Oð ˜!ÔÜ�‰Ð-Ô.Ü& sÐ9IÓJˆà˜1ÔÜ�‰Ð/Ô0Ü&Ð'7Ø'3Ø'6Ø'2Ø'8Ø'2ó4ˆô 	�‰Ð,Ô-Ü˜C¨kÔ:Ø'×-Ñ-Ó/Ðà�qÔ˜[¨AÔ-ØÔ'Ü�‰ÐAÔBä
‡K�KÐLØ¨|Ø"ð$õ$ö %r=   c                   ób   a € ] tR tRt o R tR tR tR tR tR t	R t
R	 tR
 tR tR tRtV tR# )rx  i
  c                ó²   € ^ V n         V P                  V4       V P                  W54       W`n        \	        \
        4      V n        V P                  WVWE4       R# )r   N)r“  Úgenerate_group_distributionÚgenerate_user_distributionr~  r   r  r…  Úassign_groups)rj   r|  r‚  r{  r„  r}  r~  s   &&&&&&&r;   rk   ÚGroupAssignments.__init__  sQ   € ð ˆŒ
Ø×(Ñ(Ð)9Ô:Ø×'Ñ'¨ÔKØ&ÔÜ&¤tÓ,ˆÔØ×ÑÐ+¸?Ø&ö	;r=   c                ó†   € . p\        V4      pV^ 8X  d   R# RpV F"  pWE,          pVP                  WC,          4       K$  	  V# )r   Nr”   )r'  r  )rj   ÚweightsÚdistr{  Ú
cumulativeÚprobabilitys   &&    r;   Úcumulative_distributionÚ(GroupAssignments.cumulative_distribution  sI   € ð ˆÜ�G“ˆØ�AŒ:Ùàˆ
Û"ˆKØÕ%ˆJØ�K‰K˜
Õ*Ö+ñ #ð ˆr=   c                óø   € VR8”  d   RpMVR8”  d   RpMVR8”  d   RpMRp. p\        ^V^,           4       F*  p\        P                  ! V4      pVP                  V4       K,  	  V P	                  V4      V n        R# )	zAProbability distribution of a user belonging to a group.
        i@KL g      @i€„ g      @ià“ g      @g      ü?N)r  r!  Úparetovariater  r’  Ú	user_dist)rj   Ú	num_usersÚnum_membershipsÚshaperŽ  rR   rL   s   &&&    r;   rŠ  Ú+GroupAssignments.generate_user_distribution'  sz   € ð ˜WÔ$Ø‰EØ˜wÔ&Ø‰EØ˜vÔ%Ø‰EàˆEàˆÜ�q˜) a�-Ö(ˆAÜ×$Ò$ UÓ+ˆAØ�N‰N˜1Öñ )ð
 ×5Ñ5°gÓ>ˆŽr=   c                ó¸   € . p\        ^V^,           4       F$  p^VR,          ,          pVP                  V4       K&  	  W n        V P                  V4      V n        R# )z6Probability distribution of a group containing a user.gÍÌÌÌÌÌô?N)r  r  Úgroup_weightsr’  Ú
group_dist)rj   r"  rŽ  rR   rL   s   &&   r;   r‰  Ú,GroupAssignments.generate_group_distributionA  sP   € ð
 ˆÜ�q˜!˜a�%–ˆAØ�Q˜•V•ˆAØ�N‰N˜1Öñ !ð
 %ÔØ×6Ñ6°wÓ?ˆŽr=   c                óØ   € \         P                   ! V P                  \        P                  ! 4       4      p\         P                   ! V P                  \        P                  ! 4       4      pW3# )z2Returns a randomly generated user-group membership)Úbisectr–  r!  r�  ©rj   rV  r\  s   &  r;   Úgenerate_random_membershipÚ+GroupAssignments.generate_random_membershipO  s@   € ô �}Š}˜TŸ^™^¬V¯]ª]«_Ó=ˆÜ—’˜dŸo™o¬v¯}ª}«Ó?ˆàˆ{Ðr=   c                ó(   € V P                   V,          # r^   )r…  )rj   r\  s   &&r;   Úusers_in_groupÚGroupAssignments.users_in_group[  s   € Ø×Ñ Õ&Ð&r=   c                ó6   € V P                   P                  4       # r^   )r…  r  r„   s   &r;   Ú
get_groupsÚGroupAssignments.get_groups^  s   € Ø×Ñ×$Ñ$Ó&Ð&r=   c                ó  € \        V P                  V,          4      pW28¼  d^   \        P                  RP	                  W4      4       ^ V P
                  V^,
          &   V P                  V P
                  4      pW@n        R# R# )z?Prevent the group's membership from exceeding the max specifiedzGroup {0} has {1} membersN)rð  r…  r¿   r  rÿ   rœ  r’  r�  )rj   r\  r~  Únum_membersÚnew_dists   &&&  r;   Úcap_group_membershipÚ%GroupAssignments.cap_group_membershipa  sk   € ä˜$×*Ñ*¨5Õ1Ó2ˆØÔ%Ü�K‰KÐ3×:Ñ:¸5ÓNÔOð -.ˆD×Ñ˜u q�yÑ)Ø×3Ñ3°D×4FÑ4FÓGˆHØ&ŽOñ &r=   c                ó  € WP                   V,          9  d<   V P                   V,          P                  V4       V ;P                  ^,          un        V P                  '       d   V P	                  W P                  4       R# R# r[  )r…  r  r“  r~  r­  r¡  s   &&&r;   Úadd_assignmentÚGroupAssignments.add_assignmentm  sb   € ð ×'Ñ'¨Õ.Ô.Ø×Ñ˜UÕ#×*Ñ*¨4Ô0Ø�JŠJ˜!�O�Jð ××ÐØ×%Ñ% e×-=Ñ-=Ö>ñ r=   c                óÞ  € V^ 8:  d   R# \         P                  ! \        V4      \        V4      \        V4      ,          ,          4      pV P                  '       d   \	        VV P                  V,          4      pW4,
          ^,
          pW,
          ^,
          pV P                  4       V8  dC   V P                  4       w  r‰W—8”  g	   W†8”  g   K5  V P                  V^,           V	^,           4       KW  R# )zãAllocate users to groups.

The intention is to have a few users that belong to most groups, while
the majority of users belong to a few groups.

A few groups will contain most users, with the remaining only having a
few users.
N)ru  Úceilrs   r~  rN  r{  r¢  r°  )
rj   r|  r‚  r{  r„  r}  Úexisting_usersÚexisting_groupsrV  r\  s
   &&&&&&    r;   r‹  ÚGroupAssignments.assign_groupsy  sÑ   € ð  Ô!Ùô !ŸIšIÜÐ#Ó$Ü�;Ó¤%¨Ó"8Õ8õ:ó;Ðð ××ÐÜ #Ð$5Ø$(×$4Ñ$4Ð7GÕ$Gó!IÐð *Õ8¸AÕ=ˆØ*Õ9¸AÕ=ˆØ�j‰j‹lÐ.Ô.Ø×9Ñ9Ó;‰KˆDàÔ&¨$Ö*?ð ×#Ñ# D¨1¥H¨e°a­iÖ8ñ /r=   c                ó   € V P                   # r^   ©r“  r„   s   &r;   r{  ÚGroupAssignments.totalš  s   € Ø�z‰zÐr=   )r…  r“  r�  rœ  r~  r–  N)rV   rW   rX   rY   rk   r’  rŠ  r‰  r¢  r¥  r¨  r­  r°  r‹  r{  rZ   rº   r»   s   @r;   rx  rx  
  sC   ø‡ € ò	;òò"?ò4@ò
ò'ò'ò
'ò
?ò9÷Bð r=   rx  c                óš  € VP                  4       p^ p^ pVP                  4        F¢  pVP                  V4      p\        V4      ^ 8X  d   K&  \	        ^ \        V4      R4       Fb  pWxVR,            p	\        WWi4       V\        V	4      ,          pV^,          pV^2,          ^ 8X  g   KE  \        P                  RWS3,          4       Kd  	  K¤  	  R# )zDTakes the assignments of users to groups and applies them to the DB.r  zAdded %u/%u membershipsN)r{  r¨  r¥  rð  r  Úadd_group_membersr¿   r  )
r  rÜ   r…  r{  r“  rm  r\  r¥  ÚchunkÚchunk_of_userss
   &&&       r;   ry  ry  ž  s¸   € ð ×ÑÓ€EØ€EØ€Eà×'Ñ'Ö)ˆØ$×3Ñ3°EÓ:ˆÜˆ~Ó !Ô#Ùô
 ˜1œc .Ó1°4Ö8ˆEØ+°%¸$µ,Ð?ˆNÜ˜b¨uÔEà”S˜Ó(Õ(ˆEØ�Q�JˆEØ�r�z˜QŽÜ—‘Ð5¸¸ÕFÖGó 9ó *r=   c                óv  a
€ \        W4      o
V
3R lpV! \        W4      4      p\        P                  ! 4       p\        P                  ! W4      Vn        V FN  pV! \        W4      4      pR\        V4      ,           p	\        P                  ! V\        P                  R4      Wi&   KP  	  V P                  V4       R# )z(Adds the given users to group specified.c                 ó   <€ R V : RS: 2# )r*  rõ   rO   )r/   rÕ   s   &€r;   Úbuild_dnÚ#add_group_members.<locals>.build_dn»  s   ø� Û!¢2Ð&Ð'r=   zmember-ÚmemberN)r<  rp  r  ÚMessageÚDnrð   r"  r
  ÚMessageElementÚFLAG_MOD_ADDÚmodify)r  rÜ   r\  r¥  rÀ  Úgroup_dnÚmrV  r:  ÚidxrÕ   s   &&&&      @r;   r»  r»  ¶  s�   ø€ ô 
�Ó	!€Bõ(ñ œ
 ;Ó6Ó7€HÜ�Š‹€AÜ�6Š6�"Ó€A„DãˆÙœ9 [Ó7Ó8ˆØœ#˜d›)Õ#ˆÜ×#Ò# G¬S×-=Ñ-=¸xÓHˆ‹ñ ð
 ‡I�Iˆa†Lr=   c                ó¦	  € \         P                  P                  p^ p^ p^ p/ p\        4       p\	        4       pVe   VP
                  p	MR p	V	! R4       R^ R^ R^ /p
R^ R^ R	^ /p\        P                  ! V 4       EF<  p\        P                  P                  W4      p\        VR
4      ;_uu_ 4       pV Fö  p VP                  R4      P                  R4      pV^,          pV^,          pV^,          p\        V^,          4      p\        V^ ,          4      p\        VV,
          V4      p\        VV4      pVV3pVP                  V. 4      P!                  V4       V^,          R8X  d   V^,          pMV^,          pVV;;,          ^,          uu&   VP#                  V4       V	! V4       Kø  	  RRR4       EK?  	  W2,
          pV^ 8X  d   ^ pM	VV,          pV^ 8X  d   ^ pM	VV,          p\/        V4      p\+        RV,          4       \+        RVV3,          4       \+        RVV3,          4       \1        V
P3                  4       4       F1  w  pp\+        RVP5                  RR4      R,           V3,          4       K3  	  \1        VP3                  4       4       F1  w  pp\+        RVP5                  RR4      R,           V3,          4       K3  	  \+        R4       / pV F2  w  ppVV9  d   \	        4       VV&   VV,          P#                  V4       K4  	  \1        VP7                  4       4      p V  FÌ  p\1        VV,          \8        R7      p!V! F«  pVV3pVV,          p"\1        V"4      p"\/        V"4      p#VV,          p\;        V"4      V#,          p$\=        V"R4      p%\=        V"R4      p&V"R,          V"^ ,          ,
          p'V"R,          p(\>        PA                  VR4      p)\+        RVVV)V#VV$V%V&V'V(3
,          4       K­  	  KÎ  	  R#   \$        \&        3 d°    RT9   d‰   TP                  R^4      w  ppTT
9   d$   \        \        T4      T
T,          4      T
T&    EKŸ  TT9   d$   \        \)        T4      TT,          4      TT&    EKÉ  \+        T\         P,                  R7        EKè  \+        T\         P,                  R7        EK  i ; i  + '       g   i     EKW  ; i)z/Generate and print the summary stats for a run.Nc                 ó   € R # r^   rO   )rR   s   &r;   ÚtwÚgenerate_stats.<locals>.twÖ  s   € Ùr=   z2time	conv	protocol	type	duration	successful	error
zMaximum lagz	Start lagzMax sleep missr  r   r"  r  rn   ro   ÚTruer�   r1   zTotal conversations:   %10dz-Successful operations: %10d (%.3f per second)z-Failed operations:     %10d (%.3f per second)z%-28s %frœ   r@   z%-28s %dz“Protocol    Op Code  Description                                Count       Failed         Mean       Median          95%        Range          Max)r—   r#  gffffffî?r{   z?%-12s   %4s  %-35s %12d %12d %12.6f %12.6f %12.6f %12.6f %12.6frg  )!r5   Ú
float_inforO  r   r7  Úwriter¹  Úlistdirrº  r|   r»  rq   rr   rs   rN  r  r  r@  r�  Ú
IndexErrorrt   r4   r6   rð  Úsortedr¼  Úreplacer  Ú
opcode_keyr'  Úcalc_percentilerê  rÛ   )*rØ   Útiming_filerz  r|  Ú
successfulÚfailedÚ	latenciesÚfailuresÚunique_conversationsrÍ  Úfloat_valuesÚ
int_valuesr¾  rº  rA  rv   rw   r£   re   Úpacket_typeÚlatencyr~   Úopr  rÀ  r©   Úsuccess_rateÚfailure_raterV  ÚopsÚprotorä  Ú	protocolsÚpacket_typesrQ  r“  ÚmeanÚmedianÚ
percentileÚrngÚmaxvrg   s*   &&                                        r;   Úgenerate_statsrî  Ê  sx  € ä—‘×#Ñ#€EØ€DØ€JØ€FØ€IÜ“€HÜ›5ÐØÒØ×Ñ‰ò	ñ ÐBÔCð 	�qØ�QØ˜!ð€Lð 	  Ø˜1Ø" Að€Jô —J’J˜x×(ˆÜ�w‰w�|‰|˜HÓ/ˆÜ�$˜�_Œ_ Û�ð"5Ø#'§;¡;¨tÓ#4×#:Ñ#:¸4Ó#@�FØ#)¨!¥9�LØ#)¨!¥9�HØ#)¨!¥9�KÜ#(¨°­Ó#3�GÜ˜f Q�iÓ(�AÜ#& q¨7¥{°EÓ#:�EÜ#& q¨$£<�Dà" KÐ0�BØ×(Ñ(¨¨RÓ0×7Ñ7¸Ô@Ø˜a•y FÔ*Ø" a�™
à !�˜Ø  Ÿ¨Õ)›à(×,Ñ,¨\Ô:á�t–Hñ+ ÷ Š_ñ )ðP �|€HØ�Q„Ø‰à! HÕ,ˆØ�„{Ø‰à Õ(ˆäÐ,Ó-€Mä	Ð
'¨-Õ
7Ô8Ü	Ð
9Ø˜Ð&õ'ô (ä	Ð
9Ø�\Ð"õ#ô $ô �|×)Ñ)Ó+Ö,‰ˆˆ1Üˆj˜AŸI™I c¨3Ó/°#Õ5°qÐ9Õ9Ö:ñ -ä�z×'Ñ'Ó)Ö*‰ˆˆ1Üˆj˜AŸI™I c¨3Ó/°#Õ5°qÐ9Õ9Ö:ñ +ô 
ð *ô +ð €CÛ"‰ˆˆvØ˜ÔÜ›ˆC�‰JØˆE�
�‰�vÖñ #ô �s—x‘x“zÓ"€IãˆÜ˜c (�m´Ô<ˆÛ'ˆKØ˜KÐ(ˆBØ" 2�ˆFÜ ›ˆFÜ˜V›ˆEØ! "�ˆFÜ˜V› uÕ,ˆDÜ(¨°Ó6ˆFÜ(¨°Ó6ˆJØ � f¨Q¥iÕ/ˆCØ �ˆDÜ(×,Ñ,¨R°Ó4ˆDÜð 0àØ ØØØØØØØØð	õö ó (ó øôc #¤JÐ/ô 5Ø˜d”{Ø#Ÿz™z¨#¨qÓ1™˜˜1Ø Ô,Ü.1´%¸³(Ø2>¸qµ/ó/C˜L¨�Oà *œ_Ü,/´°A³Ø0:¸1µó-?˜J q�Mô " $¬S¯Z©Z×8Ñ8ô ˜d¬¯©×4Ñ4ð5ú÷/ �_‰_úsV   Â0R>Â7C2O;Æ)R>Ï;AR;ÑR>Ñ&R;Ñ8R>Ñ<R;ÒR>ÒR;Ò6R>Ò:R;Ò;R>Ò>Sc                óN   €  R\        V 4      ,          #   \         d    T u # i ; i)zCSort key for the operation code to ensure that it sorts numericallyz%03d)rt   r�  )rÀ  s   &r;   rÖ  rÖ  L	  s)   € ðØœ˜A›�ÐøÜô ØŠðús   ‚ ”$£$c                ó\  € V '       g   ^ # \        V 4      ^,
          V,          p\        P                  ! V4      p\        P                  ! V4      pW48X  d   V \	        V4      ,          # V \	        V4      ,          WB,
          ,          pV \	        V4      ,          W#,
          ,          pWV,           # )zlCalculate the specified percentile from the list of values.

Assumes the list is sorted in ascending order.
)rð  ru  Úfloorr³  rt   )rQ  rë  r  rA  rj  Úd0Úd1s   &&     r;   r×  r×  T	  sx   € ÷ ÙÜ	ˆV‹�q�˜JÕ&€AÜ�
Š
�1‹€AÜ�	Š	�!‹€AØ„vØ”c˜!“f�~ÐØ	”�A“�˜1�5Õ	!€BØ	”�A“�˜1�5Õ	!€BØ�7€Nr=   c                 óÆ   € \         P                  P                  ! V !  p\         P                  ! ^?4      p\         P                  ! V4       \         P                  ! V4       V# )zqIn a testenv we end up with 0777 directories that look an alarming
green colour with ls. Use umask to avoid that.)r¹  rº  r|   ÚumaskÚmkdir)rº  rŠ  Úmasks   *  r;   r6  r6  f	  s>   € ô 	�‰�Š�dÑ€AÜ�8Š8�E‹?€DÜ‡H‚HˆQ„KÜ‡H‚HˆT„NØ€Hr=   )r$   Ú0)r&   Ú0x72)r'   rø  )r'   Ú3rÄ   )r(   rú  )r)   r*   )r)   Ú14)r+   rø  )r$   Ú1)r'   rü  )r'   Ú4)r'   Ú5)r(   rþ  )r)   Ú12)r)   Ú13rÆ   >   r&   r,   r-   r.   )iöÿÿÿr  r¸  )rn  r÷   )r-   Ú0x01)r-   Ú0x02)r-   Ú0x08)r-   Ú0x09)r-   Ú0x0c)r-   Ú0x0f)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}  Ú39)r}  Ú40)r}  Ú6)r}  Ú76)r}  Ú77)r+   rü  )r¶  Ú21)r¶  Ú26)r¶  Ú29)r¶  Ú30)r¶  r  )r¶  r  )r¶  Ú45)r¶  rý  )r   rø  )r   rÉ   )r   Ú17)r   Ú18)r   Ú19)r   rü  )r   Ú25)r   Ú34)r   Ú36)r   r  )r   rú  )r   rþ  )r   Ú64)r   r	  )r   Ú7)r   Ú8)r&   Ú0x04)r&   Ú0x24)r&   Ú0x2e)r&   Ú0x32)r&   Ú0x71)r&   Ú0x73)r&   Ú0x74)r&   Ú0x75)r&   Ú0xa2)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.   Ú0x12)r.   Ú0x17)r   rÉ   )r   r  )rn  r^   )	NNNNr   NNr%   F)r2  r3  r4  r5  )T)rV  rM  )yr¡   r¹  r!  rˆ  ru  r5   r   r+  r   r   Úcollectionsr   r   r   r   Údns.resolverr	   r=  Úsamba.emulater
   Úsamba.samdbr   r  r   Úsamba.dcerpcr   r   r   r   r   Úsamba.dcerpc.netlogonr   r   r   Úsamba.drs_utilsr   rB   Úsamba.credentialsr   r   r   Ú
samba.authr   Ú
samba.dsdbr   r   r   r   Úsamba.dcerpc.miscr   Úsambar   r    Úsamba.commonr!   Úsamba.loggerr"   r   r‡  r�  r   rs  r•   r–   r¾   rw  rt  rš  r3   rV   r¿   r<   rG   rS   r¢   rU   Úobjectr\   r³   rÊ   rÌ   r   rØ  r  rY  r_  rd  rf  rh  rµ  rë  rê  rü  r  r  r  rD  r:  r<  rB  rC  rH  rT  rZ  r]  r"  re  rj  rE  rn  rp  rs  rv  r†  rx  ry  r»  rî  rÖ  r×  r6  rO   r=   r;   Ú<module>r4     sU  ðó( Û 	Û Û Û Û 
Û ß ç EÓ EÝ +å )Ý Û 
Ý Ý )ß /Ñ /Ý !Ý 4Ý Ý Ý &Û ß OÑ OÝ %÷ó õ +Ý Ý Ý #Ý )Û àÐ ØÐ Ø€ð €
ð �#Ø�SØ�3Ø�3Ø�3Ø�CØ�cØ�cØ�3ð
€ð �#Ø�3Ø�3Ø�3Ø�CØ�cØ�cØ�cð	€ò ?Ð à€
Ø˜
Õ"€Ø"Ð ð €á	˜xÔ	(€ò6ò$
òô0	�iô 	ôO<ˆVô O<òdò,.ô$^�Fô ^ôB�&ô ô>d*�6ô d*ôNKW�ô KWô\2Bòj+òòô_�6ô _ôDðØ	ˆ4ðà�Dðð �ðð 
ˆ4ð	ð
 ˆDðð ˆDðð ˆTðð ˆdðð ˆDðð ˆdðð 
ˆ4ðð ˆtðð ˆtðð �Dðð ˆdðð  ˆDð!€ð&_ØÐ3ð_àÐ6ð_ð Ð:ð_ð Ð9ð	_ð
 Ð?ð_ð Ð;ð_ð �Oð_ð �Oð_ð �Yð_ð �fð_ð �jð_ð �jð_ð �oð_ð Ð*ð_ð �gð_ð  �Zð!_ð" �'ñ#_ð$ �*ð%_ð& �hð'_ð( �~ð)_ð* Ð*ð+_ð, �jð-_ð. �oð/_ð0 Ð&ð1_ð2 Ð+ð3_ð4 �%ð5_ð6 �bð7_ð8 �=ð9_ð: �>ð;_ð< �?ð=_ð> �?ð?_ð@ Ð#ðA_ðB �?ðC_ðD Ð#òE_ðF Ð'ðG_ðH Ð&ðI_ðJ Ð7ðK_ðL Ð0ðM_ðN Ð%ðO_ðP Ð'ðQ_ðR Ð(ðS_ðT �7ðU_ðV �:ðW_ðX Ð4ðY_ðZ Ð5ð[_ð\ Ð4ð]_ð^ Ð4ð__ð` Ð1ða_ðb Ð6ðc_ðd Ð8ðe_ðf Ð3òg_ðh �Iði_ðj Ð(ðk_ðl �Mðm_ðn �Lðo_ðp �Kðq_ðr �7ðs_ðt Ð&ðu_ðv �Jðw_ðx �Oðy_ðz Ð&ð{_ð| �?ð}_ð~ �>ð_ñ@ �JðA_ñB �=ðC_ñD �<ðE_ñF Ð$ðG_ñH �^òI_ñJ Ð*ðK_ñL Ð'ðM_ñN �_ðO_ñP Ð-ðQ_ðR Ð0ðS_ñT Ð0ðU_ñV Ð)ðW_ñX Ð/ðY_ñZ Ð,ð[_ñ\ Ð&ð]_ñ^ �Gð__ñ` �Fða_ñb �Iðc_ñd �Gðe_ñf �>ðg_ñh �?ði_ñj �=ñk_ñl Ð#Ù�8Ù�7Ù�6ÙÐDÙð  5áÐ'Ù�oñ}_€òDòõ<õ~õDP7òfòEòñ: "Ð"8ñ#/ó0Ð òõ ò22ò$	ò+õ
,òõ-õò"+ò
ò	õ*%ôZQ�vô QòhHò0ò(òDòô$r=   