
    CjK                    z   S r SSKJr  SSKJr  SSKJr  SSKJr  SSK	J
r
  SSKJr  SSKJr  SS	KJr  SS
KJr  SSKJrJrJrJr  SSKJr  SSKJr  SSKJr  SSKJr  SSK J!r!J"r"  SSK#J$r$  SSK%J&r&J'r'  SSK(J)r)  SSK*J+r+J,r,J-r-J.r.J/r/J0r0  \ " S S5      5       r1Sr2Sr3Sr4\2\3\4S.r5 " S S\Rl                  5      r7 " S S\Rp                  5      r9 " S S \&5      r: " S! S"\Rl                  S#S$9r; " S% S&\Rp                  5      r< " S' S(\5      r=\>S):X  a)  SS*KJ?r?   " S+ S,\?5      r@\@" 5       rA\AR                  5         g-g-).zz
An implementation of the "Sliding Tile" puzzle.

Textual isn't a game engine exactly, but it wasn't hard to build this.

    )annotations)sleep)defaultdict)	dataclass)product)choice)	monotonic)ConsoleRenderable)Syntax)
containerseventsonwork)	loop_last)ComposeResult)Binding)
PageScreen)OffsetSize)reactive)ModalScreenScreen)Timer)ButtonDigitsFooterMarkdownSelectStaticc                  8    \ rS rSr% SrS\S'   S\S'   S\S'   Srg	)
NewGame    z,A dataclass to report the desired game type.strlanguagecodetuple[int, int]size N)__name__
__module____qualname____firstlineno____doc____annotations____static_attributes__r(       c/home/rurouni/.local/share/pipx/venvs/strix-agent/lib/python3.13/site-packages/textual/demo/game.pyr!   r!       s    6M
I
r0   r!   a  class SpatialMap(Generic[ValueType]):
    """A spatial map allows for data to be associated with rectangular regions
    in Euclidean space, and efficiently queried.

    When the SpatialMap is populated, a reference to each value is placed into one or
    more buckets associated with a regular grid that covers 2D space.

    The SpatialMap is able to quickly retrieve the values under a given "window" region
    by combining the values in the grid squares under the visible area.
    """

    def __init__(self, grid_width: int = 100, grid_height: int = 20) -> None:
        """Create a spatial map with the given grid size.

        Args:
            grid_width: Width of a grid square.
            grid_height: Height of a grid square.
        """
        self._grid_size = (grid_width, grid_height)
        self.total_region = Region()
        self._map: defaultdict[GridCoordinate, list[ValueType]] = defaultdict(list)
        self._fixed: list[ValueType] = []

    def _region_to_grid_coordinates(self, region: Region) -> Iterable[GridCoordinate]:
        """Get the grid squares under a region.

        Args:
            region: A region.

        Returns:
            Iterable of grid coordinates (tuple of 2 values).
        """
        # (x1, y1) is the coordinate of the top left cell
        # (x2, y2) is the coordinate of the bottom right cell
        x1, y1, width, height = region
        x2 = x1 + width - 1
        y2 = y1 + height - 1
        grid_width, grid_height = self._grid_size

        return product(
            range(x1 // grid_width, x2 // grid_width + 1),
            range(y1 // grid_height, y2 // grid_height + 1),
        )
aj  <?xml version="1.0" encoding="UTF-8"?>
<movies>
    <movie>
        <title>Back to the Future</title> <year>1985</year> <director>Robert Zemeckis</director>
        <genre>Science Fiction</genre> <rating>PG</rating>
        <cast>
            <actor> <name>Michael J. Fox</name> <role>Marty McFly</role> </actor>
            <actor> <name>Christopher Lloyd</name> <role>Dr. Emmett Brown</role> </actor>
        </cast>
    </movie>
    <movie>
        <title>The Breakfast Club</title> <year>1985</year> <director>John Hughes</director>
        <genre>Drama</genre> <rating>R</rating>
        <cast>
            <actor> <name>Emilio Estevez</name> <role>Andrew Clark</role> </actor>
            <actor> <name>Molly Ringwald</name> <role>Claire Standish</role> </actor>
        </cast>
    </movie>
    <movie>
        <title>Ghostbusters</title> <year>1984</year> <director>Ivan Reitman</director>
        <genre>Comedy</genre> <rating>PG</rating>
        <cast>
            <actor> <name>Bill Murray</name> <role>Dr. Peter Venkman</role> </actor>
            <actor> <name>Dan Aykroyd</name> <role>Dr. Raymond Stantz</role> </actor>
        </cast>
    </movie>
    <movie>
        <title>Die Hard</title> <year>1988</year> <director>John McTiernan</director>
        <genre>Action</genre> <rating>R</rating>
        <cast>
            <actor> <name>Bruce Willis</name> <role>John McClane</role> </actor>
            <actor> <name>Alan Rickman</name> <role>Hans Gruber</role> </actor>
        </cast>
    </movie>
    <movie>
        <title>E.T. the Extra-Terrestrial</title> <year>1982</year> <director>Steven Spielberg</director>
        <genre>Science Fiction</genre> <rating>PG</rating>
        <cast>
            <actor> <name>Henry Thomas</name> <role>Elliott</role> </actor>
            <actor> <name>Drew Barrymore</name> <role>Gertie</role> </actor>
        </cast>
    </movie>
</movies>a  [life.b -- John Horton Conway's Game of Life
(c) 2021 Daniel B. Cristofani
]

>>>->+>+++++>(++++++++++)[[>>>+<<<-]>+++++>+>>+[<<+>>>>>+<<<-]<-]>>>>[
  [>>>+>+<<<<-]+++>>+[<+>>>+>+<<<-]>>[>[[>>>+<<<-]<]<<++>+>>>>>>-]<-
]+++>+>[[-]<+<[>+++++++++++++++++<-]<+]>>[
  [+++++++++.-------->>>]+[-<<<]>>>[>>,----------[>]<]<<[
    <<<[
      >--[<->>+>-<<-]<[[>>>]+>-[+>>+>-]+[<<<]<-]>++>[<+>-]
      >[[>>>]+[<<<]>>>-]+[->>>]<-[++>]>[------<]>+++[<<<]>
    ]<
  ]>[
    -[+>>+>-]+>>+>>>+>[<<<]>->+>[
      >[->+>+++>>++[>>>]+++<<<++<<<++[>>>]>>>]<<<[>[>>>]+>>>]
      <<<<<<<[<<++<+[-<<<+]->++>>>++>>>++<<<<]<<<+[-<<<+]+>->>->>
    ]<<+<<+<<<+<<-[+<+<<-]+<+[
      ->+>[-<-<<[<<<]>[>>[>>>]<<+<[<<<]>-]]
      <[<[<[<<<]>+>>[>>>]<<-]<[<<<]]>>>->>>[>>>]+>
    ]>+[-<<[-]<]-[
      [>>>]<[<<[<<<]>>>>>+>[>>>]<-]>>>[>[>>>]<<<<+>[<<<]>>-]>
    ]<<<<<<[---<-----[-[-[<->>+++<+++++++[-]]]]<+<+]>
  ]>>
]

[This program simulates the Game of Life cellular automaton.

Type e.g. "be" to toggle the fifth cell in the second row, "q" to quit,
or a bare linefeed to advance one generation.

Grid wraps toroidally. Board size in parentheses in first line (2-166 work).

This program is licensed under a Creative Commons Attribution-ShareAlike 4.0
International License (http://creativecommons.org/licenses/by-sa/4.0/).]
)PythonXMLBFc                     ^  \ rS rSr% SrSr\" \5      rS\	S'             SU 4S jjr
SS jrSS jrSS	 jrS
rU =r$ )Tile   zAn individual tile in the puzzle.

A Tile is a container with a static inside it.
The static contains the code (as a Rich Syntax object), scrolled so the
relevant portion is visible.
z
    Tile {
        position: absolute;
        Static {
            width: auto;
            height: auto;
            &:hover { tint: $primary 30%; }
        }       
        &#blank { visibility: hidden; }
    }
    zreactive[Offset]positionc                   > Xl         X l        X0l        X@l        [        TU ]  Uc  SOSU R                   3S9  U R                  [        R                  U5        g )Nblanktileid)	
renderabler;   	tile_sizestart_positionsuper__init__set_reactiver6   r8   )selfr>   r;   r'   r8   	__class__s        r1   rB   Tile.__init__   sO     %	&t|G4		{9KL$--2r0   c              #  \  #    [        U R                  SU R                  c  SO[        U R                  5      S9nU R                  c   eU R                  R
                  R                  UR
                  l        U R                  R
                  R                  UR
                  l        Uv   g 7f)Nr;   r:   )classesname)r   r>   r;   r#   parentstyleswidthheight)rD   statics     r1   composeTile.compose   s~     OO II-3tyy>

 {{&&&"kk0066#{{1188s   B*B,c                    U R                   bR  U R                  u  pXR                  l        X R                  l        U R
                  u  p4U R                  X1-  XB-  5        U R
                  U R                  -  U l        g N)r;   r?   rK   rL   rM   r8   
set_scrolloffset)rD   rL   rM   columnrows        r1   on_mountTile.on_mount   s\    99  NNME %KK!'KK--KFOOFNCL9mmdnn4r0   c                >    U R                  SXR                  -  SS9  g)z\The 'position' is in tile coordinate.
When it changes we animate it to the cell coordinates.rT   g?)durationN)animater?   rD   r8   s     r1   watch_positionTile.watch_position   s     	Xx..83Gr0   )rT   r>   r@   r;   r?   )
r>   r
   r;   
int | Noner'   r   r8   r   returnNoner`   r   r`   ra   )r8   r   r`   ra   )r)   r*   r+   r,   r-   DEFAULT_CSSr   r   r8   r.   rB   rO   rW   r]   r/   __classcell__rE   s   @r1   r6   r6      sl    
K "*&!1H13%3 3 	3
 3 
3	5H Hr0   r6   c                  Z    \ rS rSrSrSrSS jr\" \R                  5      S	S j5       r
Srg)

GameDialog   z9A dialog to ask the user for the initial game parameters.an  
        GameDialog {
            background: $boost;
            border: thick $primary-muted;
            padding: 0 2;
            width: 50;
            #values {
                width: 1fr;
                Select { margin: 1 0;}
            }
            Button {
                margin: 0 1 1 1;
                width: 1fr;
            }
        }        
    c           	   #     #    [         R                  " SS9   [        R                  " [        R                  5       SSSSS9v   [        / SQS	S
SSS9v   S S S 5        [        SSS9v   g ! , (       d  f       N= f7f)Nvaluesr<   Languager2   r$   F)promptvaluer=   allow_blank))z
Easy (3x3))   rp   )zMedium (4x4)   rr   )z
Hard (5x5))   rs   Levelrq   levelStartprimary)variant)r   VerticalGroupr   from_valuesLEVELSkeysr   rD   s    r1   rO   GameDialog.compose   sy     %%2$$!!  
 !
 
 3& Wi00' 32s   A;>A*A;*
A84A;c                    U R                  S[        5      R                  nU R                  S[        5      R                  nUb  Uc   eU R                  R	                  [        U[        U   U5      5        g )Nz	#languagez#level)	query_oner   	selectionscreendismissr!   r{   )rD   r$   ru   s      r1   on_button_pressedGameDialog.on_button_pressed  s_    >>+v6@@x0::#(999GHfX.>FGr0   r(   Nrb   rc   )r)   r*   r+   r,   r-   rd   rO   r   r   Pressedr   r/   r(   r0   r1   rh   rh      s0    CK"1, H Hr0   rh   c                  ,    \ rS rSrSrSrS/rSS jrSrg)	GameDialogScreeni  z#Modal screen containing the dialog.zT
    GameDialogScreen {      
        align: center middle;              
    }
    )escaper   c              #  $   #    [        5       v   g 7frR   )rh   r}   s    r1   rO   GameDialogScreen.compose)  s     ls   r(   Nrb   )	r)   r*   r+   r,   r-   CSSBINDINGSrO   r/   r(   r0   r1   r   r     s    -C &&Hr0   r   c            
        ^  \ rS rSr% SrSrSr\" SSSSS9\" S	S
S	SS9\" SSSSS9\" SSSSS9/r\	" S5      r
\	" \5      rS\S'   \	" SSS9r\	" S5      r\	" \" SS5      5      r\	" S5      r\	" S5      r          S(U 4S jjrS)S jrS*S jrS+S jrS,S jrS-S jrS.S jrS/S jrS0S jrS1S jrS2S  jrS3S! jrS4S" jr\ " SS#9S5S6S$ jj5       r!\"" \#RH                  S%5      S7S& j5       r%S'r&U =r'$ )8Gamei-  zWidget for the game board.Fa  
    Game {
        visibility: hidden;
        align: center middle;
        hatch: right $panel;
        border: heavy transparent;
        &:focus {
            border: heavy $success;
        }
        #grid {
            border: heavy $primary;           
            hatch: right $panel;
            box-sizing: content-box;
        }
        Digits {
            width: auto;
            color: $foreground;
        }
    }
    upz
move('up')T)prioritydownzmove('down')leftzmove('left')rightzmove('right')waitingzreactive[float]play_start_timeg        )init rp   c                  > U R                  [        R                  U5        U R                  [        R                  U5        [	        S 5      U l        [        TU ]  5         [        U6 U l	        [        U6 U l
        S U l        g rR   )rC   r   r%   r$   r   	locationsrA   rB   r   
dimensionsr?   
play_timer)rD   r%   r$   r   r?   rE   s        r1   rB   Game.__init__U  sc     	$))T*$--2:Ed:K
+y)(,r0   c                L    [        S U R                  [        5       5       5      $ )Nc              3  R   #    U  H  oR                   UR                  :H  v   M     g 7frR   )r@   r8   ).0r;   s     r1   	<genexpr>!Game.check_win.<locals>.<genexpr>e  s     UDTD&&$--7DTs   %')allqueryr6   r}   s    r1   	check_winGame.check_wind  s    UDJJtDTUUUr0   c                    U R                   R                  5         Uu  p#[        [        SX#-  5      5       H.  u  pE[	        [        XR5      6 nU(       a  S OUU R                   U'   M0     g )Nr   )r   clearr   ranger   divmod)rD   r   
tile_widthtile_heightlasttile_nor8   s          r1   watch_dimensionsGame.watch_dimensionsg  sW    ",
&uQ
0H'IJMDvg:;H/3tDNN8$ Kr0   c              #    #    [        U R                  U R                  R                  5       SSSS9nU R                  u  p#SU l        [        S5      v   [        R                  " SS9 nX R                  S   -  UR                  l        X0R                  S	   -  UR                  l        [        [        U5      [        U5      5       H8  u  pV[        XV5      nU R                   U   n[#        XU R                  U5      v   M:     S S S 5        U R                  (       a  U R%                  U R&                  5        g g ! , (       d  f       N<= f7f)
NTmaterial)indent_guidesline_numbersthemer   r   gridr<   r      )r   r%   r$   lowerr   stater   r   HorizontalGroupr?   rK   rL   rM   r   r   r   r   r6   call_after_refreshshuffle)	rD   syntaxr   r   r   rV   rU   r8   r   s	            r1   rO   Game.composen  s    IIMM!
 #'//

Rj''62d *^^A-> >DKK!,~~a/@!@DKK&uZ'8%:LM!#...26DNNHEE  N 3 ==##DLL1  32s   A&E
(BD96E
9
EE
c                `    U R                   S:X  a  [        5       U R                  -
  nXl        g g )Nplaying)r   r	   r   	play_time)rD   elapseds     r1   update_clockGame.update_clock  s*    ::"kD$8$88G$N #r0   c                    [        US5      u  p#[        US5      u  pBU R                  [        5      R                  US SUS SUS 35        g )N<   z02,.0f:z02.0fz04.1f)r   r   r   update)rD   r   minutessecondshourss        r1   watch_play_timeGame.watch_play_time  sN    !)R0,v%%vaaPU&WXr0   c                    U R                   b  U R                   R                  5         US:X  a1  [        5       U l        U R	                  SU R
                  5      U l         g g )Nr   g?)r   stopr	   r   set_intervalr   )rD   	old_state	new_states      r1   watch_stateGame.watch_state  sM    ??&OO  "	!#,;D "//8I8IJDO "r0   c                P    U R                  Uc  S[        5      $ SU 3[        5      $ )z%Get a tile (int) or the blank (None).z#blankz#tile)r   r6   )rD   r;   s     r1   get_tileGame.get_tile  s'    ~~$,hDQQeD6NDQQr0   c                r    XR                   ;  a  [        S5      eU R                  U R                   U   5      $ )z9Get a tile at the given position, or raise an IndexError.zNo tile)r   
IndexErrorr   r\   s     r1   get_tile_atGame.get_tile_at  s/    >>)Y''}}T^^H566r0   c                X   U R                  U5      nU R                  S5      nUR                  nSU R                  UR                  '   UR                  Ul        XR                  U'   XBl        U R                  S:X  a.  U R	                  5       (       a  SU l        U R                  SSS9  ggg)zOMove a tile to the blank.
Note: this doesn't do any validation of legal moves.
Nr   wonzYou won!zSliding Tile Puzzle)title)r   r8   r   r   r   notify)rD   r   r;   r:   blank_positions        r1   	move_tileGame.move_tile  s     }}W%d#(,t}}%)0~&&::"t~~'7'7DJKK
*?K@ (8"r0   c                    U R                  S5      R                  nU R                  U5      R                  nUUS-   US-
  US-   US-
  4;   $ )zCheck if a tile may move.Nr   r   r   r   )r   r8   )rD   r;   r   tile_positions       r1   can_moveGame.can_move  s\    t,55d+44F"F"F"F"	"
 
 	
r0   c                h   U R                   S:w  a  U R                  R                  5         g U R                  S 5      R                  nUS:X  a  US-   nO#US:X  a  US-   nOUS:X  a  US-   nOUS:X  a  US	-   n U R                  W5      nU R                  UR                  5        g ! [         a     g f = f)
Nr   r   r   r   r   r   r   r   r   r   )	r   appbellr   r8   r   r   r   r;   )rD   	directionr:   r8   r;   s        r1   action_moveGame.action_move  s    ::"HHMMOd#,,wH& wH& wH'!wH	##H-D 	tyy!  		s   7B$ $
B10B1c                    U R                  S5      R                  n/ n/ SQnU Vs/ s H  nX-   U R                  ;   d  M  X-   PM     nnU Vs1 s H  oPR                  U5      R                  iM     sn$ s  snf s  snf )z-Get the positions of all tiles that can move.N)r   r   r   r   )r   r8   r   r   )rD   r:   moves
DIRECTIONSr   r8   s         r1   get_legal_movesGame.get_legal_moves  s    d#,, :
 (
'	!dnn4 E' 	 

 EJJE  *33EJJ

 Ks   A5 A5$A:)	exclusivec                :  #    SU l         U R                  b  U R                  R                  5         SU R                  S5      l        SU l        [        SS5      n[        U5       H  nU R                  5       nUR                  U5        U R                  S5      R                  n[        [        U5      5      nU R                  U5      nU R                  UR                   5        [#        S5      I Sh  vN   M     SU R                  S5      l        S	U l        g N&7f)
zA worker to do the shuffling.TNz'[reverse bold] SHUFFLING - Please Wait z#grid	shufflingr   g?r   r   )visibler   r   r   border_titler   r   r   r   discardr   r8   r   listr   r   r;   r   )rD   shufflesprevious_move_legal_movesmove_positionr   s          r1   r   Game.shuffle  s      ??&OO  "/Xw, 
 &r2xA..0K. MM$/88M"4#45M((7INN9>>*+ ! 02w,
 s   C0D2D3'Dz.tilec                   UR                   c   e[        UR                   R                  =(       d    S5      nU R                  S:w  d  U R	                  U5      (       d  U R
                  R                  5         g U R                  U5        g )Nr   r   )widgetintrI   r   r   r   r   r   )rD   eventr;   s      r1   on_tile_clickedGame.on_tile_clicked  sa    ||'''5<<$$)*::"$--*=*=HHMMOtr0   )r   r   r   r   r   r   r?   r   )
r%   r#   r$   r#   r   r&   r?   r&   r`   ra   )r`   bool)r   r   r`   ra   rb   rc   )r   floatr`   ra   )r   r#   r   r#   r`   ra   )r;   r_   r`   r6   )r8   r   r`   r6   )r   r_   r`   ra   )r;   r  r`   r
  )r   r#   r`   ra   )r`   zset[Offset])   )r   r  r`   ra   )r  zevents.Clickr`   ra   )(r)   r*   r+   r,   r-   ALLOW_MAXIMIZErd   r   r   r   r   r	   r   r.   r   r%   r   r   r$   rB   r   r   rO   r   r   r   r   r   r   r   r   r   r   r   r   r   Clickr  r/   re   rf   s   @r1   r   r   -  sU   $NK, 	lD48>>'DA	H YE'/	':O_:5)IB<D$q!*%JB<D|H-- - $	-
 #- 
-VA2*%
Y
KR7A$	
"&K 
D & g r0   r   T)	can_focusc                  &    \ rS rSrSrSrSS jrSrg)GameInstructionsi  z    GameInstructions {        
        layer: instructions;
        width: 60;
        background: $panel;
        border: thick $primary-darken-2; 
        Markdown {
            background: $panel;
        }
        
    }

am  # Instructions

This is an implementation of the *sliding tile puzzle*.

The board consists of a number of tiles and a blank space.
After shuffling, the goal is to restore the original "image" by moving a square either horizontally or vertically into the blank space.

This version is like the physical game, but rather than an image, you need to restore code.
    c              #     #    [        U R                  5      v   [        R                  " 5          [	        SSSS9v   S S S 5        g ! , (       d  f       g = f7f)NNew Gamezscreen.new_gamesuccess)actionrx   )r   INSTRUCTIONSr   Centerr   r}   s    r1   rO   GameInstructions.compose  s=     t(()) ,=yQQ !  s   -AA	A
AAr(   Nrb   )r)   r*   r+   r,   rd   r  rO   r/   r(   r0   r1   r  r    s    K	LRr0   r  c                  T    \ rS rSrSrSrS/rSS jrSS jrSS jr	SS jr
SS	 jrS
rg)
GameScreeni  zThe screen containing the game.z
    GameScreen{       
        #container {
            align: center middle;
            layers: instructions game;     
        }
    }
    )nnew_gamer  c              #     #    [         R                  " SS9   [        5       v   [        SSSSS9v   [	        5       v   S S S 5        g ! , (       d  f       g = f7f)N	containerr<   zd



































































































r   rq   )      )r   r?   )r   Verticalr  r   r   r}   s    r1   rO   GameScreen.compose'  s?       K0"$$z2&GLL(N 100s   A'A	A
AAc                J    U R                  [        5      R                  5         g rR   )r   r   r   r}   s    r1   action_shuffleGameScreen.action_shuffle-  s    t$$&r0   c                \    U R                   R                  [        5       U R                  S9  g )N)callback)r   push_screenr   r  r}   s    r1   action_new_gameGameScreen.action_new_game0  s!    -/$--Hr0   c                F  #    Uc  g SU R                  [        5      l        U R                  [        5      nSUl        UR
                  Ul        UR                  Ul        [        UR                  6 Ul	        UR                  5       I S h  vN   UR                  5         g  N7f)NFr   )r   r  displayr   r   r%   r$   r   r'   r   	recomposefocus)rD   r  games      r1   r  GameScreen.new_game3  s{     38'(0~~d#
MM	 )).nn

 	s   BB!	B
B!c                X    US:X  a$  U R                  [        5      R                  S:X  a  g g)Nr   r   T)r   r   r   )rD   r  
parameterss      r1   check_actionGameScreen.check_action?  s&    Y4>>$#7#=#=#Jr0   r(   Nrb   rc   )r  zNewGame | Noner`   ra   )r  r#   r2  ztuple[object, ...]r`   zbool | None)r)   r*   r+   r,   r-   rd   r   rO   r$  r)  r  r3  r/   r(   r0   r1   r  r    s0    )K ..H'I
r0   r  __main__)Appc                      \ rS rSrSS jrSrg)GameAppiH  c                    [        5       $ rR   )r  r}   s    r1   get_default_screenGameApp.get_default_screenI  s
    <r0   r(   N)r`   r   )r)   r*   r+   r,   r:  r/   r(   r0   r1   r8  r8  H  s    	 r0   r8  N)Cr-   
__future__r   asyncior   collectionsr   dataclassesr   	itertoolsr   randomr   timer	   rich.consoler
   rich.syntaxr   textualr   r   r   r   textual._loopr   textual.appr   textual.bindingr   textual.demo.pager   textual.geometryr   r   textual.reactiver   textual.screenr   r   textual.timerr   textual.widgetsr   r   r   r   r   r   r!   PYTHON_CODEXML_CODEBF_CODEr{   r!  r6   ry   rh   r   r   r  r  r)   r6  r8  r   runr(   r0   r1   <module>rS     s(   #  # !    *  0 0 # % # ( ) % .  L L   ,\+Z#L  	@<H: <H~/H)) /Hd{ J:$ JZRz// R>) )X z #   )CGGI r0   