
    gDo                     B   S SK Jr  S SKrS SKJrJr  SrS rS.S jrS/S jr	  S0S jr
            S1S
 jr\R                  \R                  4\R                  \R                  \R                   \R"                  \R$                  S.\R                  \R                  4\R&                  \R(                  \R*                  \R"                  \R$                  S.\R,                  " S5      \R,                  " S5      4\R,                  " SS	S9\R,                  " S5      \R,                  " S5      \R,                  " S5      \R,                  " S5      \R,                  " S5      \R,                  " S5      \R,                  " S5      4\R"                  \R$                  S.\R,                  " S5      \R,                  " S5      4\R,                  " SS	S9\R,                  " SS	S9\R,                  " SS	S9\R,                  " SS	S9\R,                  " SS	S9\R,                  " SS	S9\R,                  " SS	S9\R,                  " SS	S94\R"                  \R$                  S.SSSSSSS.S.rSSSSS S!S".S#S S$S%S S&S".S'.rS( rS) r      S2S* jrS3S+ jrS, r           S4S- jrg)5    )colourN)cyclegroupby
   c                    [        U 5      S:  a  U $ U R                  SS5      n / nU R                  S5       H  n[        U5      S:  ag  SUSS ;   a  UR                  SS5      u  p2O$[        U5      S-  n[        U5      U-  nUS	U X%S	 p#UR                  US-   5        [        U5      S:  a  Mg  U(       d  M  UR                  U5        M     S
R	                  U5      $ )zBreak DNs over multiple lines, for better shaped and arguably more
readable nodes. We try to split after commas, and if necessary
after hyphens or failing that in arbitrary places.   ,z,

   -      Nz\n)lenreplacesplitappendjoin)spiecespqnbs         -/usr/lib/python3/dist-packages/samba/graph.pyreformat_graph_labelr      s     1v{			#uAFWWT]!frka"g~wwsA1FbLFaK!uae1MM!c'" !frk 1MM!  ::f    c                 T    U R                  SS5      n U(       a  [        U 5      n SU -  $ )z%Escape a string as graphvis requires."z%s)r   r   )r   reformats     r   quote_graph_labelr    4   s*     	
		#tA #!8Or   c                   ^
 [        S U  5       5      n/ n[        U5      S:  a  Sm
[        UR                  5       5      n  [	        U
4S jU 5       5      n[        U5      S:  d  SU;   a  OT
S-  m
M2  T
S-  m
US   nT
[        U5      :  a(  UT
   S:w  a  T
S-  m
T
[        U5      :  a  UT
   S:w  a  M  T
[        U5      * :  a  X44$ UR                  XT
S 45        UR                  5        H  u  pU	ST
 U-   X8'   M     U(       a  UR                  5        H  n	S	U	;  d  M    O3   [        S
 UR                  5        5       5      nUR                  S5        UR                  5        H  n	U	R                  S5      (       a  M    X44$    [        S UR                  5        5       5      nUR                  S5        X44$ ! [
         a    X44s $ f = f)aR  Replace the common suffix (in practice, the base DN) of a number of
vertices with a short string (default ",..."). If this seems
pointless because the replaced string is very short or the results
seem strange, the original vertices are retained.

:param vertices: a sequence of vertices to shorten
:param suffix: the replacement string [",..."]
:param aggressive: replace certain common non-suffix strings

:return: tuple of (rename map, replacements)

The rename map is a dictionary mapping the old vertex names to
their shortened versions. If no changes are made, replacements
will be empty.
c              3   (   #    U  H  oU4v   M
     g 7fN .0vs     r   	<genexpr>'shorten_vertex_names.<locals>.<genexpr>N   s     )1As   r   c              3   ,   >#    U  H	  oT   v   M     g 7fr#   r$   )r&   xis     r   r(   r)   X   s     ,e!es   *r   r	   N,CN=Servers,c              3   N   #    U  H  u  pXR                  S SS5      4v   M     g7f)r/   z,**,r   Nr   r&   kr'   s      r   r(   r)   y   s)      2$0DA IInfa@A$0   #%)z**z
CN=ServersCN=NTDS Settings,c              3   N   #    U  H  u  pXR                  S SS5      4v   M     g7f)r5   z*,r   Nr1   r2   s      r   r(   r)      s*      2$0DA II&94CD$0r4   )r.   zCN=NTDS Settings)	dictr   listvaluesset
IndexErrorr   items
startswith)verticessuffix
aggressivevmapreplacementsvlistcr,   r3   r'   r-   s             @r   shorten_vertex_namesrE   >   s     )))DL
4y1} T[[]#		&,e,,q6A:Q	  	
Q !H#a&jQqTS[FA #a&jQqTS[ V%%VqrUO,JJLDAefnDG ! AQ&   2$(JJL2 2D 45A<< 344    2$(JJL2 2D 9:S  	& %%	&s   +F< -F< <GGc                 z   Uc  / n/ n/ n/ n/ n/ n	[        U 5       GH  u  pUu  pnSX:4-  n[        U5      nSU-  nU(       aA  U	R                  U5        UR                  U5        UR                  U< SU< SU< S35        Mi  UR                  U5        SU-  nSU-  nU	R                  U5        UR                  S	U-  5        UR                  U< S
U< S35        UR                  U< SU< S35        UR                  U< SU< SU< S35        UR                  SUXN4-  5        UR                  S5        GM"     SnU(       a^  [        [        U5      5       HF  u  n
nU	R                  SU
-  5        Uu  nnUS   S:X  a  US   S:X  a
  USS nUSS nUSU
UU4-  -  nMH     / nU	(       a&  U H   nUR                  SU< SU	S   < S35        M"     SSR	                  U5      < SSR	                  U5      < SSR	                  U5      < S U< S!SR	                  U5      < SSR	                  U	5      < S"3nU$ )#ak  Generate a dot file snippet that acts as a legend for a graph.

:param key_items: sequence of items (is_vertex, style, label)
:param nodes_above: list of vertices (pushes key into right position)
:param elision: tuple (short, full) indicating suffix replacement
:param prefix: string used to generate key node names ["key_"]
:param width: default width of node lines

Each item in key_items is a tuple of (is_vertex, style, label).
is_vertex is a boolean indicating whether the item is a vertex
(True) or edge (False). Style is a dot style string for the edge
or vertex. label is the text associated with the key item.
Nz%s%d_z%s_labelz[label="z"; ]z%se1z%se2zsubgraph cluster_%s {z$[label=src; color="#000000"; group="z_g"]z%[label=dest; color="#000000"; group="z -> z [constraint = false; z8%s[shape=plaintext; style=solid; width=%f; label="%s\r"]} z	elision%dr   r	   r   uO   
elision%d[shape=plaintext; style=solid; label="\“%s”  means  “%s”\r"]
r   z" -> z [style=invis]z\subgraph cluster_key {
label="Key";
subgraph cluster_key_nodes {
label="";
color = "invis";
z;
z;
}
subgraph cluster_key_edges {
label="";
color = "invis";
r
   z
{ z}
}
z
}
z [style=invis; weight=9]
)	enumerater    r   reversedr   )	key_itemsnodes_aboveelisionsprefixwidth
edge_lines
edge_namesvertex_linesvertex_namesorder_linesr-   item	is_vertexstylelabeltagnamee1e2elision_strelisionshortlongabove_linesr   r   s                             r   compile_graph_keyrd      sc    JJLLKY'"&	%#!%(Ct$%!%ue!5 6 d##B#Bt$5;<!3( )!3( )REJL M  0#U23 4 c"5 (8 K#HX$67JAw{Q/!KE4Qx347c>ab	ABx H !5$/1 2K 8 KA !;q> 3 4 , JJ|$IIj!HHZ JJ{#KK$/
A4 Hr   Tc                    / nUR                   nU c%  [        S U 5       5      [        S U 5       5      -  n U(       a}  [        [        S U 5       5      [        S U 5       5      -  [        U 5      -  5      n[        U5      u  nnU  Vs/ s H  nUU   PM
     n nU VVs/ s H  u  nnUU   UU   4PM     nnnOSnU
c  Sn
U(       a  SnSnOS	nS
nU" S5        U" U< SU
< S35        Ub  U" SU< S35        U" S[        -  5        U" S[        -  5        SnSn/ n[        U 5       GH  u  nn[        UU5      nUR                  U5        / nU(       a_  UU   (       aU  UU   nUU:w  aJ  Ub  U" S5        Un[        U5      nU(       a+  U" SU-  5        US-  nU" S5        U" S5        U" SU-  5        U(       a  UU   (       a  UR                  UU   5        U(       a*  UU   (       a   UR                  S[        UU   5      -  5        U(       a#  U" SU< SSR                  U5      < S35        GM  U" SU< S35        GM     U(       a  U" S5        [        U5       H  u  nn U u  nnUc  SnUc  Sn[        UU5      n[        UU5      n/ nU(       a"  [        UU   5      n!UR                  S U!-  5        U(       a   UR                  S[        UU   5      -  5        U	(       a  UR                  U	U   5        U(       a*  U" SU< S!U< S"U< SSR                  U5      < S3	5        M  U" SU< S!U< S"U< S35        M     U(       a  [        UUUS#9n"U" U"5        U" S$5        S%R                  U5      $ s  snf s  snnf )&aO  Generate a Graphviz representation of a list of vertices and edges.

:param vertices: list of vertex names (optional).
:param edges:    list of (vertex, vertex) pairs
:param directed: bool: whether the graph is directed
:param title: optional title for the graph
:param reformat_labels: whether to wrap long vertex labels
:param vertex_colors: if not None, a sequence of colours for the vertices
:param edge_colors: if not None, colours for the edges
:param edge_labels: if not None, labels for the edges
:param vertex_styles: if not None, DOT style strings for vertices
:param edge_styles: if not None, DOT style strings for edges
:param graph_name: if not None, name of graph
:param shorten_names: if True, remove common DN suffixes
:param key: (is_vertex, style, description) tuples
:param vertex_clusters: list of subgraph cluster names

Colour, style, and label lists must be the same length as the
corresponding list of edges or vertices (or None).

Colours can be HTML RGB strings ("#FF0000") or common names
("red"), or some other formats you don't want to think about.

If `vertices` is None, only the vertices mentioned in the edges
are shown, and their appearance can be modified using the
vertex_colors and vertex_styles arguments. Vertices appearing in
the edges but not in the `vertices` list will be shown but their
styles can not be modified.
Nc              3   *   #    U  H	  oS    v   M     g7fr   Nr$   r&   r,   s     r   r(   dot_graph.<locals>.<genexpr>  s     +UtU   c              3   *   #    U  H	  oS    v   M     g7fr   Nr$   rh   s     r   r(   ri     s     1F1A$rj   c              3   *   #    U  H	  oS    v   M     g7frg   r$   rh   s     r   r(   ri          -u!1urj   c              3   *   #    U  H	  oS    v   M     g7frl   r$   rh   s     r   r(   ri     rn   rj   A_samba_tool_productiondigraphz->graphz--z/* generated by samba */rJ   z {zlabel="z";zfontsize=%s;
z'node[fontname=Helvetica; fontsize=%s];
r   rH   zsubgraph cluster_%d {r   zstyle = "rounded,dotted";z'node [style="filled"; fillcolor=white];zlabel = "%s";z
color="%s"r   z" [z, z];zMissing source valuezMissing destination valuez
label="%s"z" z ")rN   rO   z}
r
   )	r   r:   r8   rE   	FONT_SIZErK   r    r   rd   )#r>   edgesdirectedtitlereformat_labelsvertex_colorsedge_colorsedge_labelsvertex_stylesedge_styles
graph_nameshorten_namesrM   vertex_clustersoutwriterC   rA   rO   r,   ar   
graph_type	connectorprev_cluster	cluster_nquoted_verticesr-   r'   attrsclusterr   edgerZ   keys#                                      r   	dot_graphr      sV   T CJJE+U++c1F1F.FFS-u---u--.]# $ .e4h%-.XDGX.0561$q'47#6 .

	
		
$%	z:
./u&'	
i
()	
4	
BCLIO(#1a1q!q1%a(G,&+#J&%g.1I=>NI56CD/A-.]1-LLq)*]1-LL(9-:J(KKL!TYYu%567Q.!3 $6 c
U#419&A9+Aa1a1%k!n5ELL-.LL(9+a.(IIJLLQ(!Y499U;KLMQ	156+ $. 	)13c
	%L99S>k /6s   
M8 M=)alternate rowsdisconnected	connected
transitiveheaderreset'   -   |   )bgp                  )r   r   r   r   transitive scaler   r         rI   rI   )ansizansi-heatmapzxterm-256colorzxterm-256color-heatmapNu   │u   ─u   ╭   ·r   u   ←)vertical
horizontalcornerdiagonalmissingright_arrow|r	   0z<-)utf8asciic                    [        U 5      [        S U 5       5      -  [        S U 5       5      -  nU[        U 5      :w  a'  [        SU[        U 5      -
  -  [        R                  S9  [	        U5      n0 nU H	  nUS0XE'   M     U H  u  pgXF   R                  US5      XF   U'   M      [        U5       H  nSn	0 n
UR                  5        Hp  u  p[UR                  5       nXU'   UR                  5        HC  u  p}XG   R                  5        H(  u  pX-   nUR                  X5      nUU:  d  M"  UX'   Sn	M*     ME     Mr     U
nU	(       a  M    O   0 nU  H5  n0 UU'   U  H'  nXE   R                  UU5      nUU:  d  M  UUU   U'   M)     M7     U$ )	Nc              3   *   #    U  H	  oS    v   M     g7frg   r$   r&   es     r   r(   +find_transitive_distance.<locals>.<genexpr>       ,e!erj   c              3   *   #    U  H	  oS    v   M     g7frl   r$   r   s     r   r(   r     r   rj   zthere are unknown vertices: %s)filer   r   FT)	r:   printsysstderrr   getranger<   copy)r>   rt   all_verticesinf	distancesr'   srcdestr-   changednew_distancesdnew_dcostleafcost2new_costold_costanswerv2r   s                        r   find_transitive_distancer     s   M,e,,-,e,,-L s8}$.c(m+-::	 l
CI1v	  	(~11$:	t 
 3ZOO%DAFFHE$!ggi
#,?#8#8#:KD#|H uuT/H(*&."& $; ( & "	w! & Fq	B  S)A3w !q	"   Mr   c                 |   ^ ^^^ ST ;   a+  T S   m[        T5      mS[        US-  5      -   mUUU4S jnU$ U 4S jnU$ )Nr   r   g      ?c                 `   > [        U [        5      (       d  gT[        U T-  T-  TS-
  5         $ )NrI   r   )
isinstanceintmin)linkmr   scales    r   f"get_transitive_colourer.<locals>.f  s1    dC((TAX]AE233r   c                    > TS   $ )Nr   r$   )r   colourss    r   r   r   	  s    <((r   )r   r   )r   
n_verticesr   r   r   r   s   `  @@@r   get_transitive_colourerr     sK    W$*+JJ#%&&	4 H	) Hr   c                 	  ^0 / nUR                   n	[        U(       a  SOS   n
U
S   nU
S   nU
S   nU
S   nU
S   nU
S   n[        U   n[        UR	                  S	S
5      5      nU c.  [        [        S U 5       5      [        S U 5       5      -  5      n UbE  [        XS9n / n[        XS9 H,  u  nn[        U5      m0UR                  U04S jU 5       5        M.     OU  Vs/ s H  n[        U5      PM     nnU(       a|  [        [        S U 5       5      [        S U 5       5      -  [        U 5      -  5      n[        USSS9u  nnU  Vs/ s H  nUU   PM
     n nU VVs/ s H  u  nnUU   UU   4PM     nnn[        S[        S U  5       5      5      nUR	                  SS5      nUR	                  SS5      nUR	                  SS5      nUR	                  SS5      n [        U[        U 5      5      n!SU-  n"Sn#U	" SUSS[        U 5      -  UU 4-  5        [        U 5       H^  u  n$n[        U 5      U$-
  n%UU$   m0U%S:X  a  U"S S < U< SU < 3n&OU"n&U	" U&< SU#< U < T0< U< UU%-  < SU< U < 3
5        U#T0U-   -  n#M`     [!        X5      n'[        U 5       GH  u  n$nUU$   m0U'U   n(/ n)U  H  n*U(R	                  U*5      n+U+c  U)R                  U< U< 35        M0  U+S :X  a  U)R                  U < T0< U< U < 35        MU  U+S:X  a  U)R                  U< S!U < 35        Mu  U!" U+5      n,U+S":  a  S#n+U)R                  U,< U+< U < 35        M     Ub)  UU$   (       a  U)R                  U < SU< SUU$   < 35        U	" S$T0UUU SR#                  U)5      U 4-  5        GM     [        U5      n-U(       a:  U	" S5        [%        W5       H#  u  n.n/U	" S%U-< U.< U < S&U-< U/< U < S%3	5        M%     U(       ak  U	" S5        U	" S'U< SU < S(U< S)U < S*3	5        U	" U-< U< U < S+35        U	" U< S!U < S,35        U	" U!" S-5      < S.U < S/35        U	" U< U< U < S035        S1R#                  U5      $ s  snf s  snf s  snnf )2Nr   r   r   r   r   r   r   r   r   r   c              3   *   #    U  H	  oS    v   M     g7frg   r$   rh   s     r   r(   "distance_matrix.<locals>.<genexpr>&  s     2EqdErj   c              3   *   #    U  H	  oS    v   M     g7frl   r$   rh   s     r   r(   r   &  s     8Mu!1urj   r   c              3   (   >#    U  H  nTv   M	     g 7fr#   r$   r&   r,   rD   s     r   r(   r   /       n!Qq!   c              3   *   #    U  H	  oS    v   M     g7frg   r$   rh   s     r   r(   r   4  rn   rj   c              3   *   #    U  H	  oS    v   M     g7frl   r$   rh   s     r   r(   r   5  rn   rj   +Tr@      c              3   8   #    U  H  n[        U5      v   M     g 7fr#   r   r%   s     r   r(   r   <  s     /hc!ffh   r   rI   r   r   r   rJ   z%*s %s  %sdestination%sr   isourcer   1	   >%s%*s%s %s%s'' stands for 'zData can get from z to destinationz" in the indicated number of steps.z% means zero steps (it is the same DC)z means a direct linkr   2zG means a transitive link involving two steps (i.e. one intermediate DC)z5 means there is no connection, even through other DCsr
   )r   CHARSETSCOLOUR_SETSr   r   sortedr:   r   nextextendr8   rE   maxr   r   rK   r   r   rL   )1r>   rt   r   r   r~   generate_keygrouping_functionrow_commentslinesr   charsetr   r   r   r   r   r   r   colour_cyclecolour_listr3   r'   rC   rA   rB   r,   r   r   vlenc_header	c_disconnc_connc_resetcolour_transitivevspace	verticalsr-   jstartconnectionslinksrowr   r   ct	example_c
substituteoriginalrD   s1                                                   @r   distance_matrixr    s    ELLEv73Gz"H&JXFz"Hi G-(K&!G%5u=>L#2E22S8Mu8M5MMN$ (:H<DAq\"An!n, = 4<<8atL)8<S-u---u--.]# $ 2%=ACl%-.XDGX.0561$q'47#6q#/h//0D {{8R(HNB/I[[b)Fkk'2&G/XG4ZFI	
#tR'*S]':'/'.'0 0 1 (#1MAN6&,Sbk8WEEEe&/&-&'&,&01n&'&-( 	) 	Q\!	! $$ +8;K(#1NAB99R=D|

Y89qy

!XwGH

fg67&t,!8D

r49:  #QJJWk<?KLn4G "g 7 7 	8- $2 \"Ib	$,\$: JI4>4;4=4<4;= > %; b	.6.6A 	B 	(G- 	.VW=> #W. 	/ 	'7, 	- 99UA = /6s   !Q2Q7!Q<c                 .    US:X  a  SnSUS-
  -  U -   U-   $ )Nr   rI   rJ   r$   )chardigitspaddings      r   pad_charr    s'    {&1*$w..r   c                     0 nU R                  5        H2  u  p#UR                  5        H  u  pEXQR                  U0 5      U'   M     M4     U$ r#   )r<   
setdefault)r   m2k1r  k2dists         r   transpose_dict_matrixr    sE    	B779		HB(,MM"b!"% $  Ir   c                 \	  ^7^8 / nUR                   nU(       a  [        U 5      n US:  n[        U(       a  SOS   n[        US   U5      nUS   X-   -  n[        US   UUS   5      n[        US   U5      n[        US   U5      n[        S	U5      nUS
   n[        SU5      n[        U   n[        UR                  SS5      5      n[        U R                  5       5      nUbL  UR                  US9  / n[        UUS9 H,  u  nn[        U5      m7UR                  U74S jU 5       5        M.     OU Vs/ s H  n[        U5      PM     nnU(       an  [        USSS9u  m8n0 nU R                  5        H/  u  n n![        U84S jU!R                  5        5       5      UT8U    '   M1     Un [        U R                  5       5      n[!        S[#        U
5      [!        S U 5       5      5      n"UR                  SS5      n#UR                  SS5      n$UR                  SS5      n%UR                  SS5      n&Uc  [#        U 5      n[%        UU5      n'SU"-  n(Sn)U" U(< SU[#        U 5      S-   -  < SU#< U
< U&< 35        ['        U5       Hm  u  n*n[#        U 5      U*-
  n+UU*   m7U+S:X  a  U(S [#        U	5      *  < U#< U	< U&< 3n,OU(n,U" U,< SU)< U&< T7< U< UU+-  < SU< U&< 3
5        U)T7< U< 3-  n)Mo     SU-  < U&< 3n-Sn.['        U5       GH  u  n*nU U   n/UU*   m7/ n0U H  n1U1U/;  a  U0R                  U$< U< U&< 35        M%  UU1:X  a  U0R                  U&< T7< U< U&< 35        MJ  U/U1   n2U2SU-  :  a&  U'" U25      n3U0R                  U3< U< U&< 35        Sn.M~  U2S:X  a  U%n3OU'" U25      n3U0R                  SU3UU2U-4-  5        M     Ub)  UU*   (       a  U0R                  U&< SU< SUU*   < 35        U" ST7U"UU&SR)                  U05      U&4-  5        GM     U.(       d  U(       a  U" S5        U.(       a  U" S U'" SU-  5      UU&SU-  S-
  4-  5        U(       a=  [        U5      n4[+        W5       H#  u  n5n6U" S!U4< U5< U&< S"U4< U6< U&< S!3	5        M%     S#R)                  U5      $ s  snf )$Nr   r   r   r   r   r   r   r   r   r   rJ   r   r   r   c              3   (   >#    U  H  nTv   M	     g 7fr#   r$   r   s     r   r(   full_matrix.<locals>.<genexpr>  r   r   r   Tr   c              3   6   >#    U  H  u  pTU   U4v   M     g 7fr#   r$   )r&   r3   r'   rA   s      r   r(   r!    s     $Hidad1gq\is   r   c              3   8   #    U  H  n[        U5      v   M     g 7fr#   r   r%   s     r   r(   r!    s     "<8a3q668r   r   rI   r   r   r   Fr   r   z%s%*s%sr   z'%s%s%s' means greater than %d r   r   r
   )r   r  r   r  r   r   r   r8   keyssortr   r   r   rE   r<   r7   r   r   r   rK   r   rL   )9rowsr   r   r~   r   r   r   colour_scaler  ylabelxlabel	transposer   r   use_paddingr   r   r   r   r   r   toobigr   emptyr   r   r>   r   r3   r'   rB   rows2vertrr  r  r  r  r  r  r  r  r-   r	  r
  end_celloverflowr  r  r   r   r  r  r  r  rD   rA   s9                                                          @@r   full_matrixr3    s    ELLE$T*1*Kv73G
+V4H&&*>?Jgh'l+-F
+V4Hwy)62Gc6"F-(KS&!E&!G%5u=>LDIIK H$ 	+,H*;<DAq\"An!n, = 4<<8atL)8<1(C=AClzz|GD! $$Haggi$H HE$t* $ 		$q#f+s"<8"<<=D {{8R(HNB/I[[b)Fkk'2&G4y/F4ZFI	F!SY]3$"#	% &
 (#1IMN6"(3v;,"7"*"(")+E
 Ee&/&-&'&,&01n&'&-( 	) 	q(++	' $* {*G4HH(#1QNB

y'7CDb

!XwGHRy2<'*40BJJ2vw?@#H19B*40B

9FD('CCD! $ #QJJWk<?KLn4G "g 7 7 	83 $8 =b	3$R6\2<!#%% & &	$,\$: JI4>4;4=4<4;= > %; 99UM =s   1R))F)z,...F)NNkey_r   )FNTNNNNNNFNN)FNFFNN)rJ   )FNFFNNNr   r   r   T)sambar   r   	itertoolsr   r   rs   r   r    rE   rd   r   
DARK_WHITEBLACKREDGREENDARK_YELLOW	UNDERLINEC_NORMALREV_RED	REV_GREENREV_DARK_YELLOWxterm_256_colourr   r   r   r   r  r  r  r3  r$   r   r   <module>rB     s  *  
 $	0GT =A+,^D "  !"J^ ",,fll;

\\(("" ",,fll;%%,,"" "2226!22268 //=,,S1--c2#44S9#44S9#44S9#44S9#44S9	 ""$ "2237!22379 //=,,ST:--cd;#44STB#44STB#44STB#44STB#44STB	 ""$  g;~ 	 ,1h& "'!&&*!%BJ/ #""&!!$Rr   