
    ;e^<                        d Z ddlmZ ddlZddlmZ ddlmZmZ ddl	Z	ddlm
Z
 ddlmZ  G d d	ej                  Z G d
 dej                  Z G d dej                  Z G d dej                  Z G d dej                  Z G d dej                  Z G d dej                  Z G d dej                  Z G d dej                  Z G d dej                  Z G d dej                  Z G d dej                  Z G d  d!ej                  Z G d" d#ej                  Z G d$ d%ej                  Zed&k    r ej        d'd()           dS dS )*a  Test query, coverage 93%.

Non-gui tests for Query, SectionName, ModuleName, and HelpSource use
dummy versions that extract the non-gui methods and add other needed
attributes.  GUI tests create an instance of each class and simulate
entries and button clicks.  Subclass tests only target the new code in
the subclass definition.

The appearance of the widgets is checked by the Query and
HelpSource htests.  These are run by running query.py.
    )queryNrequires)TkEND)mock)Varc                   J    e Zd ZdZ G d d          Zd Zd Zd Zd Zd Z	d	S )
	QueryTestzTest Query base class.c                   h    e Zd Zej        j        Zej        j        Zej        j        Zd Zd Z	d Z
dS )QueryTest.Dummy_Queryc                 ^    t          |          | _        ddi| _        d | _        d| _        d S )Nvaluetext F)r	   entryentry_errorresult	destroyedselfdummy_entrys     3/usr/lib/python3.11/idlelib/idle_test/test_query.py__init__zQueryTest.Dummy_Query.__init__!   s2    ;///DJ &|DDK"DNNN    c                     || j         d<   d S Nr   r   r   messages     r   	showerrorzQueryTest.Dummy_Query.showerror&       '.DV$$$r   c                     d| _         d S NT)r   r   s    r   destroyzQueryTest.Dummy_Query.destroy(   s    !DNNNr   N)__name__
__module____qualname__r   Queryentry_okokcancelr   r"   r'    r   r   Dummy_Queryr      s^        ;'[^#	# 	# 	#
	/ 	/ 	/	" 	" 	" 	" 	"r   r0   c                    |                      d          }|                     |                                d            |                     |j        |j        fd           |                     d|j        d                    d S )N NFz
blank liner   )r0   assertEqualr,   r   r   assertInr   r   dialogs     r   test_entry_ok_blankzQueryTest.test_entry_ok_blank+   sw    !!#&&**D111&-)9:MJJJlF$6v$>?????r   c                     |                      d          }| j        } ||                                d            ||j        |j        fd            ||j        d         d           d S )N  good goodr3   r   r   )r0   r4   r,   r   r   r   )r   r7   Equals      r   test_entry_ok_goodzQueryTest.test_entry_ok_good1   su    !!),, foo(((v}f./???f ("-----r   c                 T   |                      d          }t          j                    |j        _        |                     |                                d            |                     |j        j        j                   |j        `|                     |j	        |j
        fd           d S )Nr   r3   )r0   r   Mockr   	focus_setr4   r-   
assertTruecalledr   r   r6   s     r   test_ok_blankzQueryTest.test_ok_blank8   s    !!"%%!%d+++.5666L"&-)9:MJJJJJr   c                     |                      d          }|                     |                                d            |                     |j        |j        fd           d S )Nr;   )r;   T)r0   r4   r-   r   r   r6   s     r   test_ok_goodzQueryTest.test_ok_good@   sY    !!&))d+++&-)9:NKKKKKr   c                     |                      d          }|                     |                                d            |                     |j        |j        fd           d S )Nzdoes not matterr%   )r0   r4   r.   r   r   r6   s     r   test_cancelzQueryTest.test_cancelE   sZ    !!"344$///&-)9:LIIIIIr   N)
r(   r)   r*   __doc__r0   r8   r=   rC   rE   rG   r/   r   r   r   r      s        " " " " " " " " @ @ @. . .K K KL L L
J J J J Jr   r   c                   D    e Zd ZdZ G d d          Zd Zd Zd Zd ZdS )	SectionNameTestz#Test SectionName subclass of Query.c                   8    e Zd Zej        j        ZdgZd Zd ZdS )!SectionNameTest.Dummy_SectionNameusedc                 B    t          |          | _        ddi| _        d S Nr   r   r   r	   r   r   r   s     r   r   z*SectionNameTest.Dummy_SectionName.__init__Q   &    ;///DJ &|Dr   c                     || j         d<   d S r   r   r    s     r   r"   z+SectionNameTest.Dummy_SectionName.showerrorT   r#   r   N)	r(   r)   r*   r   SectionNamer,   
used_namesr   r"   r/   r   r   Dummy_SectionNamerL   N   sD        $-X
	, 	, 	,	/ 	/ 	/ 	/ 	/r   rU   c                     |                      d          }|                     |                                d            |                     d|j        d                    d S Nr2   zno namer   rU   r4   r,   r5   r   r6   s     r   test_blank_section_namez'SectionNameTest.test_blank_section_nameW   sW    '',,**D111i!3F!;<<<<<r   c                     |                      d          }|                     |                                d            |                     d|j        d                    d S )NrM   user   rX   r6   s     r   test_used_section_namez&SectionNameTest.test_used_section_name\   sW    ''//**D111eV/788888r   c                     |                      d          }|                     |                                d            |                     d|j        d                    d S )N goodgoodgoodgoodgoodgoodgoodgoodzlonger than 30r   rX   r6   s     r   test_long_section_namez&SectionNameTest.test_long_section_namea   sX    ''11**D111&(:6(BCCCCCr   c                     |                      d          }|                     |                                d           |                     |j        d         d           d S )Nr:   r;   r   r   )rU   r4   r,   r   r6   s     r   test_good_section_namez&SectionNameTest.test_good_section_namef   sY    ''	22**F333+F3R88888r   N)	r(   r)   r*   rH   rU   rY   r\   r_   ra   r/   r   r   rJ   rJ   K   s        ))/ / / / / / / /= = =
9 9 9
D D D
9 9 9 9 9r   rJ   c                   D    e Zd ZdZ G d d          Zd Zd Zd Zd ZdS )	ModuleNameTestz"Test ModuleName subclass of Query.c                   6    e Zd Zej        j        ZdZd Zd ZdS )ModuleNameTest.Dummy_ModuleNamer   c                 B    t          |          | _        ddi| _        d S rO   rP   r   s     r   r   z(ModuleNameTest.Dummy_ModuleName.__init__r   rQ   r   c                     || j         d<   d S r   r   r    s     r   r"   z)ModuleNameTest.Dummy_ModuleName.showerroru   r#   r   N)	r(   r)   r*   r   
ModuleNamer,   text0r   r"   r/   r   r   Dummy_ModuleNamere   o   sB        #,	, 	, 	,	/ 	/ 	/ 	/ 	/r   rj   c                     |                      d          }|                     |                                d            |                     d|j        d                    d S rW   rj   r4   r,   r5   r   r6   s     r   test_blank_module_namez%ModuleNameTest.test_blank_module_namex   sW    &&s++**D111i!3F!;<<<<<r   c                     |                      d          }|                     |                                d            |                     d|j        d                    d S )N __name_xyz123_should_not_exist__z	not foundr   rl   r6   s     r   test_bogus_module_namez%ModuleNameTest.test_bogus_module_name}   sX    &&'IJJ**D111k6#5f#=>>>>>r   c                     |                      d          }|                     |                                d            |                     d|j        d                    d S )N	itertoolszsource-basedr   rl   r6   s     r   test_c_source_namez!ModuleNameTest.test_c_source_name   sW    &&{33**D111nf&8&@AAAAAr   c                    |                      d          }|                     |                                                    d                     |                     |j        d         d           |                      d          }|                     |                                                    d                     |                     |j        d         d           d S )Nidlelib__init__.pyr   r   zidlelib.idlezidle.py)rj   rA   r,   endswithr4   r   r6   s     r   test_good_module_namez$ModuleNameTest.test_good_module_name   s    &&y11))22=AABBB+F3R888&&~66))229==>>>+F3R88888r   N)	r(   r)   r*   rH   rj   rm   rp   rs   rx   r/   r   r   rc   rc   l   s        ((/ / / / / / / /= = =
? ? ?
B B B
9 9 9 9 9r   rc   c                   >    e Zd ZdZ G d d          Zd Zd Zd ZdS )GotoTestzTest Goto subclass of Query.c                   2    e Zd Zej        j        Zd Zd ZdS )GotoTest.Dummy_ModuleNamec                 B    t          |          | _        ddi| _        d S rO   rP   r   s     r   r   z"GotoTest.Dummy_ModuleName.__init__   rQ   r   c                     || j         d<   d S r   r   r    s     r   r"   z#GotoTest.Dummy_ModuleName.showerror   r#   r   N)r(   r)   r*   r   Gotor,   r   r"   r/   r   r   rj   r|      s<        :&	, 	, 	,	/ 	/ 	/ 	/ 	/r   rj   c                     |                      d          }|                     |                                d            |                     d|j        d                    d S )Naznot a base 10 integerr   rl   r6   s     r   test_bogus_gotozGotoTest.test_bogus_goto   sX    &&s++**D111-v/A&/IJJJJJr   c                     |                      d          }|                     |                                d            |                     d|j        d                    d S )N0znot a positive integerr   rl   r6   s     r   test_bad_gotozGotoTest.test_bad_goto   sX    &&s++**D111.0B60JKKKKKr   c                     |                      d          }|                     |                                d           |                     |j        d         d           d S )N1   r   r   )rj   r4   r,   r   r6   s     r   test_good_gotozGotoTest.test_good_goto   sY    &&s++**A...+F3R88888r   N)r(   r)   r*   rH   rj   r   r   r   r/   r   r   rz   rz      su        ""/ / / / / / / /K K K
L L L
9 9 9 9 9r   rz   c                   2    e Zd ZdZ G d d          Zd ZdS )HelpsourceBrowsefileTestz8Test browse_file method of ModuleName subclass of Query.c                   :    e Zd Zej        j        Z e            ZdS ))HelpsourceBrowsefileTest.Dummy_HelpSourceN)r(   r)   r*   r   
HelpSourcebrowse_filer	   pathvarr/   r   r   Dummy_HelpSourcer      s$        &2#%%r   r   c                    |                                  }dd dfdd t          fdd dfdd t          ffD ]\  }}}|                                 5  |j                            |           ||_        |                                 |                     |j                                        |           d d d            n# 1 swxY w Y   d S )Nr   c                     dS Nr   r/   r   bcs      r   <lambda>zBHelpsourceBrowsefileTest.test_file_replaces_path.<locals>.<lambda>   s    " r   c                     t           S N__file__r   s      r   r   zBHelpsourceBrowsefileTest.test_file_replaces_path.<locals>.<lambda>   s    8 r   htestc                     dS r   r/   r   s      r   r   zBHelpsourceBrowsefileTest.test_file_replaces_path.<locals>.<lambda>   s    r r   c                     t           S r   r   r   s      r   r   zBHelpsourceBrowsefileTest.test_file_replaces_path.<locals>.<lambda>   s     r   )	r   r   subTestr   setaskfilenamer   r4   get)r   r7   pathfuncr   s        r   test_file_replaces_pathz0HelpsourceBrowsefileTest.test_file_replaces_path   s%   &&(( __b)++X6//7300(;	#= 		? 		?D$
  ? ?""4(((%)"""$$$  !3!3!5!5v>>>	? ? ? ? ? ? ? ? ? ? ? ? ? ? ?		? 		?s   A#B>>C	C	N)r(   r)   r*   rH   r   r   r/   r   r   r   r      sQ        >>       ? ? ? ? ?r   r   c                   h    e Zd ZdZ G d d          Zej        Zed             Z	d Z
d Zd Zd Zd	S )
HelpsourcePathokTestz4Test path_ok method of HelpSource subclass of Query.c                   4    e Zd Zej        j        Zd ZddZdS )%HelpsourcePathokTest.Dummy_HelpSourcec                 B    t          |          | _        ddi| _        d S rO   )r	   r   
path_error)r   
dummy_paths     r   r   z.HelpsourcePathokTest.Dummy_HelpSource.__init__   s#    *---DI%rlDOOOr   Nc                     || j         d<   d S r   )r   )r   r!   widgets      r   r"   z/HelpsourcePathokTest.Dummy_HelpSource.showerror   s    &-DOF###r   r   )r(   r)   r*   r   r   path_okr   r"   r/   r   r   r   r      sB        "*	+ 	+ 	+	. 	. 	. 	. 	. 	.r   r   c                 (    | j         t          _        d S r   )orig_platformr   platformclss    r   tearDownClassz"HelpsourcePathokTest.tearDownClass   s    *r   c                     |                      d          }|                     |                                d            |                     d|j        d                    d S )Nr2   zno help filer   )r   r4   r   r5   r   r6   s     r   test_path_ok_blankz'HelpsourcePathokTest.test_path_ok_blank   sW    &&s++))4000nf&7&?@@@@@r   c                     |                      t          dz             }|                     |                                d            |                     d|j        d                    d S )Nzbad-bad-badz	not existr   )r   r   r4   r   r5   r   r6   s     r   test_path_ok_badz%HelpsourcePathokTest.test_path_ok_bad   s\    &&x-'?@@))4000k6#4V#<=====r   c                 f   |                      d          }| j        }dD ]}|                                 5  |j                            |           |                     |                                |           |                     |j        d         d           d d d            n# 1 swxY w Y   d S )Nr   )z
www.py.orgzhttp://py.orgr   )r   r4   r   r   r   r   r   )r   r7   r<   urls       r   test_path_ok_webz%HelpsourcePathokTest.test_path_ok_web   s   &&r** 0 	@ 	@C @ @$$$  !1!13777  !26!:B???@ @ @ @ @ @ @ @ @ @ @ @ @ @ @	@ 	@s   A$B%%B)	,B)	c                    |                      d          }dD ]\  }}|                                 5  |t          _        |j                            t                     |                     |                                |t          z              |                     |j	        d         d           d d d            n# 1 swxY w Y   d S )Nr   ))darwinfile://)otherr   r   )
r   r   r   r   r   r   r   r4   r   r   )r   r7   r   prefixs       r   test_path_ok_filez&HelpsourcePathokTest.test_path_ok_file   s
   &&r** D 	@ 	@Hf @ @!))))  !1!16H3DEEE  !26!:B???	@ @ @ @ @ @ @ @ @ @ @ @ @ @ @	@ 	@s   A=B::B>	B>	N)r(   r)   r*   rH   r   r   r   r   classmethodr   r   r   r   r   r/   r   r   r   r      s        ::. . . . . . . . NM+ + [+A A A
> > >
@ @ @@ @ @ @ @r   r   c                   2    e Zd ZdZ G d d          Zd ZdS )HelpsourceEntryokTestz5Test entry_ok method of HelpSource subclass of Query.c                   :    e Zd Zej        j        Zi Zi Zd Zd Z	dS )&HelpsourceEntryokTest.Dummy_HelpSourcec                     | j         S r   )namer&   s    r   item_okz.HelpsourceEntryokTest.Dummy_HelpSource.item_ok   
    9r   c                     | j         S r   )r   r&   s    r   r   z.HelpsourceEntryokTest.Dummy_HelpSource.path_ok   r   r   N)
r(   r)   r*   r   r   r,   r   r   r   r   r/   r   r   r   r      sG        #,
	 	 		 	 	 	 	r   r   c                    |                                  }dD ]i\  }}}|                                 5  ||c|_        |_        |                     |                                |           d d d            n# 1 swxY w Y   jd S )N))NNN)Ndoc.txtN)docNN)r   r   )r   r   )r   r   r   r   r4   r,   )r   r7   r   r   r   s        r   test_entry_ok_helpsourcez.HelpsourceEntryokTest.test_entry_ok_helpsource   s    &&((#K 	< 	<D$  < <+/(V[  !2!2F;;;< < < < < < < < < < < < < < <		< 	<s   8A55A9	<A9	N)r(   r)   r*   rH   r   r   r/   r   r   r   r      sQ        ;;       < < < < <r   r   c                   >    e Zd ZdZ G d d          Zd Zd Zd ZdS )CustomRunCLIargsokTestz6Test cli_ok method of the CustomRun subclass of Query.c                   2    e Zd Zej        j        Zd Zd ZdS )&CustomRunCLIargsokTest.Dummy_CustomRunc                 B    t          |          | _        ddi| _        d S rO   rP   r   s     r   r   z/CustomRunCLIargsokTest.Dummy_CustomRun.__init__  rQ   r   c                     || j         d<   d S r   r   r    s     r   r"   z0CustomRunCLIargsokTest.Dummy_CustomRun.showerror  r#   r   N)r(   r)   r*   r   	CustomRuncli_args_okr   r"   r/   r   r   Dummy_CustomRunr     s<        o1	, 	, 	,	/ 	/ 	/ 	/ 	/r   r   c                     |                      d          }|                     |                                g            d S )Nr2   )r   r4   r   r6   s     r   test_blank_argsz&CustomRunCLIargsokTest.test_blank_args  s=    %%c**++--r22222r   c                     |                      d          }|                     |                                d            |                     d|j        d                    d S )Nz'no-closing-quotez
No closingr   )r   r4   r   r5   r   r6   s     r   test_invalid_argsz(CustomRunCLIargsokTest.test_invalid_args  sZ    %%&9::++--t444lF$6v$>?????r   c                     g d}|                      d                    |          dz             }|                     |                                |dgz              |                     |j        d         d           d S )N)z-n10z	--verbosez-pz/pathz--namer2   z
 "my name"zmy namer   r   )r   joinr4   r   r   )r   argsr7   s      r   test_good_argsz%CustomRunCLIargsokTest.test_good_args   s|    AAA%%chhtnn|&CDD++--tyk/ABBB+F3R88888r   N)r(   r)   r*   rH   r   r   r   r   r/   r   r   r   r     sr        <</ / / / / / / /3 3 3@ @ @
9 9 9 9 9r   r   c                   2    e Zd ZdZ G d d          Zd ZdS )CustomRunEntryokTestz8Test entry_ok method of the CustomRun subclass of Query.c                   D    e Zd Zej        j        Zi Z e            Zd Z	dS )$CustomRunEntryokTest.Dummy_CustomRunc                     | j         S r   )cli_argsr&   s    r   r   z0CustomRunEntryokTest.Dummy_CustomRun.cli_args_ok.  s
    = r   N)
r(   r)   r*   r   r   r,   r   r	   
restartvarr   r/   r   r   r   r   *  s=        ?+SUU
	! 	! 	! 	! 	!r   r   c                 H   |                                  }dD ]}|j                            |           ddgdg|fffD ]c\  }}|                     ||          5  ||_        |                     |                                |           d d d            n# 1 swxY w Y   dd S )N>   FT)NNzmy arg)restartr   )r   r   r   r   r   r4   r,   )r   r7   r   r   r   s        r   test_entry_ok_customrunz,CustomRunEntryokTest.test_entry_ok_customrun1  s   %%''$ 	@ 	@G!!'***%1'/jH:w2G%H%J @ @ &\\'H\EE @ @&.FO$$V__%6%6???@ @ @ @ @ @ @ @ @ @ @ @ @ @ @@	@ 	@s   0BBBN)r(   r)   r*   rH   r   r   r/   r   r   r   r   '  sV        >>! ! ! ! ! ! ! !@ @ @ @ @r   r   c                   R    e Zd Zed             Zed             Zd Zd Zd Zd Z	dS )QueryGuiTestc                     t          d           t                      x| _        }| j                                         t	          j        |ddd          | _        t          j                    | j        _	        d S )NguiTESTtestT_utest)
r   r   rootwithdrawr   r+   r7   r   r?   r'   )r   r   s     r   
setUpClasszQueryGuiTest.setUpClass@  sa    $$4[vvdCCC
!Y[[
r   c                 N    | j         `| ` | j                                         | `d S r   )r7   r'   r   r   s    r   r   zQueryGuiTest.tearDownClassH  s,    JJHHHr   c                     | j         j                            dd           d | j         _        | j         j                                         d S )Nr   end)r7   r   deleter   r'   
reset_mockr&   s    r   setUpzQueryGuiTest.setUpO  sD      E***!&&(((((r   c                     | j         }|j                            dd           |j                                         |                     |j        d           |                     |j        j	                   d S Nr   abc)
r7   r   insert	button_okinvoker4   r   rA   r'   rB   r6   s     r   test_click_okzQueryGuiTest.test_click_okT  sk    Au%%%!!!...-.....r   c                     | j         }|j                                         |                     |j        d            |                     |j        j                   d S r   )r7   r  r  r4   r   assertFalser'   rB   r6   s     r   test_click_blankzQueryGuiTest.test_click_blank[  sU    !!!---./////r   c                     | j         }|j                            dd           |j                                         |                     |j        d            |                     |j        j	                   d S r   )
r7   r   r  button_cancelr  r4   r   rA   r'   rB   r6   s     r   test_click_cancelzQueryGuiTest.test_click_cancela  sk    Au%%%##%%%----.....r   N)
r(   r)   r*   r   r   r   r   r  r  r  r/   r   r   r   r   >  s        ) ) [)   [) ) )
/ / /0 0 0/ / / / /r   r   c                   *    e Zd Zed             Zd ZdS )SectionnameGuiTestc                 $    t          d           d S Nr   r   r   s    r   r   zSectionnameGuiTest.setUpClassk      r   c                    t                      }|                                 t          j        |dddhd          }| j        }|                     |j        dh           |j                            dd           |j        	                                 |                     |j
        d           |                                 d S )NTtr  Tr   r   okay)r   r   r   rS   r4   rT   r   r  r  r  r   r'   )r   r   r7   r<   s       r   test_click_section_namez*SectionnameGuiTest.test_click_section_nameo  s    tt#D#sUGDIII *UG444Av&&&!!!///r   N)r(   r)   r*   r   r   r  r/   r   r   r  r  i  <          [	 	 	 	 	r   r  c                   *    e Zd Zed             Zd ZdS )ModulenameGuiTestc                 $    t          d           d S r  r   r   s    r   r   zModulenameGuiTest.setUpClass}  r  r   c                    t                      }|                                 t          j        |dddd          }|                     |j        d           |                     |j                                        d           |j        	                                 | 
                    |j                            d                     |                                 d S )Nr  r  ru   Tr   rv   )r   r   r   rh   r4   ri   r   r   r  r  rA   r   rw   r'   r   r   r7   s      r   test_click_module_namez(ModulenameGuiTest.test_click_module_name  s    tt"4c9TJJJy111))++Y777!!!..}==>>>r   Nr(   r)   r*   r   r   r  r/   r   r   r  r  {  s<          [    r   r  c                   *    e Zd Zed             Zd ZdS )GotoGuiTestc                 $    t          d           d S r  r   r   s    r   r   zGotoGuiTest.setUpClass  r  r   c                 @   t                      }|                                 t          j        |ddd          }|j                            dd           |j                                         |                     |j	        d           |
                                 d S )Nr  r  Tr   r   22   )r   r   r   r   r   r  r  r  r4   r   r'   r  s      r   r  z"GotoGuiTest.test_click_module_name  s    tt*T3D999At$$$!!!+++r   Nr  r/   r   r   r  r    s<          [    r   r  c                   *    e Zd Zed             Zd ZdS )HelpsourceGuiTestc                 $    t          d           d S r  r   r   s    r   r   zHelpsourceGuiTest.setUpClass  r  r   c                    t                      }|                                 t          j        |ddt          d          }| j        } ||j                                        d            ||j                                        t                     |j	        
                                 t          j        dk    rdnd} ||j        d|t          z   f           |                                 d S )Nr  __test__T)menuitemfilepathr   r   r   r   )r   r   r   r   r   r4   r   r   r   r  r  sysr   r   r'   )r   r   r7   r<   r   s        r   test_click_help_sourcez(HelpsourceGuiTest.test_click_help_source  s    tt"4z,4TC C C fl  *---fkoo***!!!!lh66Bfmj&8*;<===r   N)r(   r)   r*   r   r   r,  r/   r   r   r%  r%    s<          [    r   r%  c                   *    e Zd Zed             Zd ZdS )CustomRunGuiTestc                 $    t          d           d S r  r   r   s    r   r   zCustomRunGuiTest.setUpClass  r  r   c                    t                      }|                                 t          j        |dddgd          }|                     |j                                        d           |j                            t          d           |j	        
                                 |                     |j        g ddf           |                                 d S )	NTitler   b=1T)r   r   za b=1z c)r   r2  r   )r   r   r   r   r4   r   r   r  r   r  r  r   r'   r  s      r   test_click_argsz CustomRunGuiTest.test_click_args  s    tt/$,/<F F F))++W555C&&&!!!):):):D(ABBBr   N)r(   r)   r*   r   r   r3  r/   r   r   r.  r.    r  r   r.  __main__   F)	verbosityexit)rH   ru   r   unittesttest.supportr   tkinterr   r   r+  r   idlelib.idle_test.mock_tkr	   TestCaser   rJ   rc   rz   r   r   r   r   r   r   r  r  r  r%  r.  r(   mainr/   r   r   <module>r>     su  
 
        ! ! ! ! ! !         



       ) ) ) ) ) )
0J 0J 0J 0J 0J! 0J 0J 0Jf9 9 9 9 9h' 9 9 9B!9 !9 !9 !9 !9X& !9 !9 !9H9 9 9 9 9x  9 9 9:? ? ? ? ?x0 ? ? ?2*@ *@ *@ *@ *@8, *@ *@ *@Z< < < < <H- < < <29 9 9 9 9X. 9 9 96@ @ @ @ @8, @ @ @.(/ (/ (/ (/ (/8$ (/ (/ (/V    *   $    )   "    (#        )   (    x(   $ zHMAE****** r   