
    жvg-]                        d dl Z d dlZd dlZd dlZd dlmZ d dlmZmZm	Z	m
Z
mZmZmZmZmZ d dlmZmZ d dlmZmZ d dlmZ d dlmZ d dlmZ d d	lmZmZ d d
lm Z m!Z!m"Z"m#Z# d dl$m%Z%m&Z& d dl'm(Z(  ee)          Z*de+de+de,de
e+ddf         fdZ-dede
eddf         f         dede
eddf         f         fdZ.e.dede
e+ddf         fd            Z/dee+         dee+         fdZ0dee+         dee+         fdZ1dee+         deee+         ee+         f         fdZ2 G d d          Z3 G d d          Z4 G d d           Z5dS )!    N)cache_from_source)	AnyCallableDict	GeneratorIterableListOptionalSetTuple)LegacyDistutilsInstallUninstallMissingRecord)get_bin_prefixget_bin_user)BaseDistribution)WINDOWS)egg_link_path_from_location)	getLogger
indent_log)asknormalize_pathrenamesrmtree)AdjacentTempDirectoryTempDirectory)running_under_virtualenvbin_dirscript_nameis_guireturnc              #      K   t           j                            | |          }|V  t          sdS | dV  | dV  |r	| dV  dS | dV  dS )zCreate the fully qualified name of the files created by
    {console,gui}_scripts for the given ``dist``.
    Returns the list of file names
    Nz.exez.exe.manifestz-script.pywz
-script.py)ospathjoinr   )r   r   r   exe_names       \/var/www/pixelcanvas.ch/venv/lib/python3.11/site-packages/pip/_internal/req/req_uninstall.py_script_namesr'      s       w||G[11H
NNN 



$
$
$$$$ &&&&&&&&&%%%%%%%%    fn.c           
           t          j                   dt          dt          dt          t          d d f         f fd            }|S )Nargskwr    c               ?   x   K   t                      } | i |D ]}||vr|                    |           |V   d S N)setadd)r+   r,   seenitemr)   s       r&   uniquez_unique.<locals>.unique+   sY      BOOO 	 	D4


	 	r(   )	functoolswrapsr   r   )r)   r3   s   ` r&   _uniquer6   (   s_     _Rc  3d?)C       Mr(   distc              #     K   | j         }|
J d            |                                 }|t          |           |D ]}t          j                            ||          }|V  |                    d          rzt          j                            |          \  }}|dd         }t          j                            ||dz             }|V  t          j                            ||dz             }|V  dS )a  
    Yield all the uninstallation paths for dist based on RECORD-without-.py[co]

    Yield paths to all the files in RECORD. For each .py file in RECORD, add
    the .pyc and .pyo in the same directory.

    UninstallPathSet.add() takes care of the __pycache__ .py[co].

    If RECORD is not found, raises an error,
    with possible information from the INSTALLER file.

    https://packaging.python.org/specifications/recording-installed-packages/
    Nznot installeddistribution.py.pyc.pyo)locationiter_declared_entriesr   r"   r#   r$   endswithsplit)r7   r?   entriesentryr#   dnr)   bases           r&   uninstallation_pathsrG   6   s       }H((**G$$7777 	 	w||He,,


== 	W]]4((FBcrc7D7<<D6M22DJJJ7<<D6M22DJJJ	 	r(   pathsc                     t           j        j        t                      }t	          | t
                    D ]5t          fd|D                       }|s|                               6|S )zCompact a path set to contain the minimal number of paths
    necessary to contain all paths in the set. If /a/path/ and
    /a/path/to/a/file.txt are both in the set, leave only the
    shorter path.keyc              3      K   | ]k}                     |                    d                     o>t          |                    d                                                            k    V  ldS )*N)
startswithrstriplen).0	shortpathr#   seps     r&   	<genexpr>zcompact.<locals>.<genexpr>a   s       
 
  OOI,,S1122 DS))#..55c::;;<C
 
 
 
 
 
r(   )r"   r#   rS   r/   sortedrP   anyr0   )rH   short_pathsshould_skipr#   rS   s      @@r&   compactrY   X   s     '+CEEKu#&&& " " 
 
 
 
 
 )
 
 
 
 

  	"OOD!!!r(   c                   	
 d | D             }t          |          }t          d |                                D             t                    }t                      }dt          dt          fd
|D ]׊t          fd|D                       rt                      }t                      }t          j                  D ]L\  	}}|                    	
fd|D                        |                    	
fd	|D                        M||z
  s7|	                    |           |
                    t          j        z              t          t          |j        |                    |z  S )
zReturns a set containing the paths that need to be renamed.

    This set may include directories when the original sequence of paths
    included every file on disk.
    c                 N    i | ]"}t           j                            |          |#S  )r"   r#   normcaserQ   ps     r&   
<dictcomp>z'compress_for_rename.<locals>.<dictcomp>q   s*    6661  ##Q666r(   c                 X    h | ]'}t           j                            |          d          (S )r   )r"   r#   rB   r^   s     r&   	<setcomp>z&compress_for_rename.<locals>.<setcomp>s   s+    GGGa((+GGGr(   rJ   ar    c                  b    t           j                            t          j        j        |            S r.   )r"   r#   r]   r$   )rc   s    r&   	norm_joinz&compress_for_rename.<locals>.norm_joinv   s!    wa 0111r(   c              3   |   K   | ]6}t           j                                                          |          V  7d S r.   )r"   r#   r]   rN   )rQ   wroots     r&   rT   z&compress_for_rename.<locals>.<genexpr>z   sA      GGrw%%0033GGGGGGr(   c              3   2   K   | ]} |          V  d S r.   r\   )rQ   ddirnamere   rh   s     r&   rT   z&compress_for_rename.<locals>.<genexpr>   s1      LLqyyw::LLLLLLr(   c              3   2   K   | ]} |          V  d S r.   r\   )rQ   frk   re   rh   s     r&   rT   z&compress_for_rename.<locals>.<genexpr>   s1      HHQYYtWa88HHHHHHr(   )r/   rU   valuesrP   strrV   r"   walkupdatedifference_updater0   rS   map__getitem__)rH   case_map	remaining	unchecked	wildcards	all_filesall_subdirssubdirsfilesrk   re   rh   s            @@@r&   compress_for_renamer}   k   s    76666HHIGGX__5F5FGGGSQQQI%%I2c 2c 2 2 2 2  ) )GGGGYGGGGG 	!ee	 #')wt}} 	I 	I#GWeLLLLLLGLLLLLLHHHHHH%HHHHHHH I% 	)''	222MM$-(((s8'3344y@@r(   c                 f   t          |           }t                      }t                      }t                      }|D ]x}|                    d          r|                    d          sd|v r2|                    t          j                            |                     |                    |           yt          t          t          j        j        |                    }t          |          }|D ]}t          j	        |          D ]\  }}	}
|
D ]}|                    d          rt          j        
                    ||          }t          j                            |          r6t          j                            |          |vr|                    |           |d |D             z  }||fS )as  Returns a tuple of 2 sets of which paths to display to user

    The first set contains paths that would be deleted. Files of a package
    are not added and the top-level directory of the package has a '*' added
    at the end - to signify that all it's contents are removed.

    The second set contains files that would have been skipped in the above
    folders.
    r=   z__init__.pyz
.dist-infoc                 N    h | ]"}t           j                            |d           #S )rM   )r"   r#   r$   )rQ   folders     r&   rb   z.compress_for_output_listing.<locals>.<setcomp>   s(    KKK27<<44KKKr(   )r/   rA   r0   r"   r#   rk   rs   r]   rY   rp   r$   isfile)rH   will_remove	will_skipfoldersr|   r#   _normcased_filesr   dirpath_dirfilesfnamefile_s                r&   compress_for_output_listingr      s    e**KI eeGEEE  ==   	=='' 	/<4+?+?KK--...		$3rw/7788gG  ) )$&GFOO 	) 	) GQ! 
) 
)>>&)) We44GNN5)))((//7GGG MM%(((
)	) KK7KKKKK	!!r(   c                   v    e Zd ZdZddZdedefdZdedefdZdedefdZdd	Z	dd
Z
edefd            ZdS )StashedUninstallPathSetzWA set of file rename operations to stash files while
    tentatively uninstalling them.r    Nc                 "    i | _         g | _        d S r.   )
_save_dirs_movesselfs    r&   __init__z StashedUninstallPathSet.__init__   s     57 .0r(   r#   c                     	 t          |          }n # t          $ r t          d          }Y nw xY w|| j        t          j                            |          <   |j        S )zStashes a directory.

        Directories are stashed adjacent to their original location if
        possible, or else moved/copied into the user's temp dir.	uninstallkind)r   OSErrorr   r   r"   r#   r]   )r   r#   save_dirs      r&   _get_directory_stashz,StashedUninstallPathSet._get_directory_stash   si    	7&;D&A&AHH 	7 	7 	7$+666HHH	72:((../}s    //c                 V   t           j                            |          }t           j                            |          d}}d}||k    rF	 | j        |         }np# t
          $ r Y nw xY wt           j                            |          |}}||k    Ft           j                            |          }t          d          }|| j        |<   t           j                            ||          }|r:|t           j        j        k    r%t           j        	                    |j        |          S |j        S )zStashes a file.

        If no root has been provided, one will be created for the directory
        in the user's temp directory.Nr   r   )
r"   r#   r]   rk   r   KeyErrorr   relpathcurdirr$   )r   r#   headold_headr   r   s         r&   _get_file_stashz'StashedUninstallPathSet._get_file_stash   s   
 w%%..hh?40   W__T22D(D h 7??4((D$+666H$,DOD!'//$-- 	8w"'.007<<w777}s   
A 
A%$A%c                    t           j                            |          ot           j                            |           }|r|                     |          }n|                     |          }| j                            ||f           |r3t           j                            |          rt          j        |           t          ||           |S )zStashes the directory or file and returns its new location.
        Handle symlinks as files to avoid modifying the symlink targets.
        )
r"   r#   isdirislinkr   r   r   appendrmdirr   )r   r#   path_is_dirnew_paths       r&   stashzStashedUninstallPathSet.stash   s     gmmD))F"'..2F2F.F 	20066HH++D11HD(+,,, 	27==22 	 HXhr(   c                     | j                                         D ]}|                                 g | _        i | _         dS )z0Commits the uninstall by removing stashed files.N)r   rn   cleanupr   )r   r   s     r&   commitzStashedUninstallPathSet.commit  sF    ..00 	 	Hr(   c                 x   | j         D ]}t          j        dg|R   | j         D ] \  }}	 t                              d||           t          j                            |          st          j                            |          rt	          j        |           n.t          j        	                    |          rt          |           t          ||           # t          $ r@}t                              d|           t                              d|           Y d}~d}~ww xY w|                                  dS )z2Undoes the uninstall by moving stashed files back.zMoving to %s
 from %szReplacing %s from %szFailed to restore %szException: %sN)r   loggerinfodebugr"   r#   r   r   unlinkr   r   r   r   errorr   )r   r_   r   r#   exs        r&   rollbackz StashedUninstallPathSet.rollback  s?    	6 	6AK05155555"k 
	2 
	2NHd	23XtDDD7>>(++ %rw~~h/G/G %Ih''''W]]8,, %8$$$h'''' 2 2 23X>>>_b111111112 	s   B-C
D##6DD#c                 *    t          | j                  S r.   )boolr   r   s    r&   can_rollbackz$StashedUninstallPathSet.can_rollback"  s    DK   r(   r    N)__name__
__module____qualname____doc__r   ro   r   r   r   r   r   propertyr   r   r\   r(   r&   r   r      s        & &0 0 0 0     C C    6# #    *      & !d ! ! ! X! ! !r(   r   c                       e Zd ZdZdeddfdZdedefdZdeddfdZ	d	ed
eddfdZ
ddededdfdZdedefdZddZddZededd fd            ZdS )UninstallPathSetzMA set of file paths to be removed in the uninstallation of a
    requirement.r7   r    Nc                     t                      | _        t                      | _        i | _        || _        t                      | _        t          j        t                    | _
        d S r.   )r/   _paths_refuse_pth_distr   _moved_pathsr4   	lru_cacher   _normalize_path_cached)r   r7   s     r&   r   zUninstallPathSet.__init__+  sO     #!$46	
355 '0&9.&I&I###r(   r#   c                     t                      sdS |                    |                     t          j                            S )zs
        Return True if the given path is one we are permitted to
        remove/modify, False otherwise.

        T)r   rN   r   sysprefix)r   r#   s     r&   
_permittedzUninstallPathSet._permitted6  s9     ()) 	4t::3:FFGGGr(   c                 Z   t           j                            |          \  }}t           j                            |                     |          t           j                            |                    }t           j                            |          sd S |                     |          r| j        	                    |           n| j
        	                    |           t           j                            |          d         dk    r$| 	                    t          |                     d S d S )N   r;   )r"   r#   rB   r$   r   r]   existsr   r   r0   r   splitextr   )r   r#   r   tails       r&   r0   zUninstallPathSet.addA  s    W]]4((
d w||D77==rw?O?OPT?U?UVVw~~d## 	F??4   	#KOOD!!!!LT""" 7D!!!$--HH&t,,----- .-r(   pth_filerD   c                    |                      |          }|                     |          rB|| j        vrt          |          | j        |<   | j        |                             |           d S | j                            |           d S r.   )r   r   r   UninstallPthEntriesr0   r   )r   r   rD   s      r&   add_pthzUninstallPathSet.add_pthT  s    ..x88??8$$ 	'ty((&9(&C&C	(#Ih##E*****LX&&&&&r(   Fauto_confirmverbosec                    | j         s't                              d| j        j                   dS | j        j         d| j        j         }t                              d|           t                      5  |s|                     |          r| j        }t          | j                   }t          t          |                    D ]2}|                    |           t                              d|           3| j                                        D ]}|                                 t                              d|           ddd           dS # 1 swxY w Y   dS )z\Remove paths in ``self._paths`` with confirmation (unless
        ``auto_confirm`` is True).z7Can't uninstall '%s'. No files were found to uninstall.N-zUninstalling %s:zRemoving file or directory %szSuccessfully uninstalled %s)r   r   r   r   raw_nameraw_versionr   _allowed_to_proceedr   r}   rU   rY   r   r   r   rn   remove)r   r   r   dist_name_versionmoved
for_renamer#   pths           r&   r   zUninstallPathSet.remove]  s    { 	KKI
#   F#z2MMTZ5KMM&(9:::\\ 	N 	N Nt77@@ N)0==
"7:#6#677 J JDKK%%%NN#BDIIII9++-- ! !CJJLLLL9;LMMM	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	Ns   3CEEEc                 r   dt           dt          t                    ddfd}|st          | j                  \  }}n"t	          | j                  }t	                      } |d|            |d|            |d| j                   |r |d	t          | j                             t          d
d          dk    S )z@Display which files would be deleted and prompt for confirmationmsgrH   r    Nc                    |sd S t                               |            t                      5  t          t	          |                    D ]}t                               |           	 d d d            d S # 1 swxY w Y   d S r.   )r   r   r   rU   rY   )r   rH   r#   s      r&   _displayz6UninstallPathSet._allowed_to_proceed.<locals>._display}  s     KK & &"75>>22 & &DKK%%%%&& & & & & & & & & & & & & & & & & &s   :A55A9<A9zWould remove:z+Would not remove (might be manually added):z%Would not remove (outside of prefix):zWill actually move:zProceed (Y/n)? )yn r   )ro   r   r   r   r/   r   r}   r   )r   r   r   r   r   s        r&   r   z$UninstallPathSet._allowed_to_proceedz  s    	&# 	&hsm 	& 	& 	& 	& 	&  	%@%M%M"K dk**KI+...>	JJJ8$,GGG 	NH*,?,L,LMMM$n55<<r(   c                 H   | j         j        s't                              d| j        j                   dS t                              d| j        j                   | j                                          | j        	                                D ]}|                                 dS )z1Rollback the changes previously made by remove().z'Can't roll back %s; was not uninstalledNzRolling back uninstall of %s)
r   r   r   r   r   r   r   r   r   rn   )r   r   s     r&   r   zUninstallPathSet.rollback  s     - 	LL9
#   F2DJ4GHHH""$$$9##%% 	 	CLLNNNN	 	r(   c                 8    | j                                          dS )z?Remove temporary save dir: rollback will no longer be possible.N)r   r   r   s    r&   r   zUninstallPathSet.commit  s      """""r(   c           
         |j         }|j        }|+t                              d|j                    | |          S t          |          }|j        s7t                              d|j        |t          j                    | |          S |d t          j
        d          t          j
        d          hD             v r,t                              d|j        |            | |          S  | |          }t          |j                  }|j        o@|d uo<t          j                            |          o|                    |j         d           }|rp||                    |           |                                }|:|D ]5}	|                    t          j                            ||	                     6n,|                    d          r	 |                    d	          }
|
                    d
          n# t2          $ r g Y nw xY wfd|                    d                                          D             D ]}t          j                            ||          }|                    |           |                    | d           |                    | d           |                    | d           n#|j        rt7          |          |j        r|                    |           t          j                            |          d         }t          j                            t          j                            |          d          }|                    |d|z              ns|j         r)tC          |          D ]}|                    |           nC|r$tE          |          5 }t          j        #                    |$                                %                                          }|&                    |          }d d d            n# 1 swxY w Y   t          j        '                    ||          sJ d| d| d|j         d| d	            |                    |           t          j                            t          j                            |          d          }|                    ||           nt          (                    d||           |j)        rtU                      }ntW                      }	 |,                                D ]r}|                    t          j                            ||                     tZ          r6|                    t          j                            || d                     sn# t2          t\          f$ r Y nw xY wdt^          dt`          dtb          t`          d d f         fd} |||          D ]}|                    |           |S )Nz-Not uninstalling %s since it is not installedz1Not uninstalling %s at %s, outside environment %sc                     h | ]}||S r\   r\   r^   s     r&   rb   z-UninstallPathSet.from_dist.<locals>.<setcomp>  s.     (
 (
 (
(
(
 (
 (
r(   stdlib
platstdlibz<Not uninstalling %s at %s, as it is in the standard library.z	.egg-infoztop_level.txtznamespace_packages.txtF)keependsc                      g | ]
}|r|v|S r\   r\   )rQ   r_   
namespacess     r&   
<listcomp>z.UninstallPathSet.from_dist.<locals>.<listcomp>  s8     & & && j00 000r(   r;   r=   r>   r9   r   zeasy-install.pthz./z	Egg-link z (to z') does not match installed location of z (at )z)Not sure how to uninstall: %s - Check: %sz.batr7   r   r    c              3      K   |                                  D ]Q}|j        dk    rt          ||j        d          E d {V  *|j        dk    rt          ||j        d          E d {V  Rd S )Nconsole_scriptsFgui_scriptsT)iter_entry_pointsgroupr'   name)r7   r   entry_points      r&   iter_scripts_to_removez:UninstallPathSet.from_dist.<locals>.iter_scripts_to_remove2  s        $5577 N N$(999,Wk6FNNNNNNNNNN &-77,Wk6FMMMMMMMMM	N Nr(   )2r?   info_locationr   r   canonical_namer   localr   r   	sysconfigget_pathr   r   "installed_with_setuptools_egg_infor"   r#   r   rA   setuptools_filenamer0   r@   r$   is_file	read_text
splitlinesFileNotFoundErrorinstalled_by_distutilsr   installed_as_eggrB   rk   r   installed_with_dist_inforG   openr]   readlinestripr   samefiler   in_usersiter   r   iter_distutils_script_namesr   NotADirectoryErrorr   ro   r   )clsr7   dist_locationr   normalized_dist_locationpaths_to_removedevelop_egg_linksetuptools_flat_installationinstalled_filesinstalled_filenamespace_packagestop_level_pkgr#   easy_install_eggeasy_install_pthfhlink_pointernormalized_link_pointerr   scriptr   sr   s                         @r&   	from_distzUninstallPathSet.from_dist  s   * KK?#   3t99#1-#@#@ z 	KKC#(
	   3t99# (
 (
(22I4F|4T4TU(
 (
 (
 
 

 KKN#(  
 3t99#d))6t}EE 3 ST)S}--S
 "**d.F+Q+Q+QRRR 	% ( H	(##M222"88::O*&5 U UN#'']N(S(STTTTU
 o.. 7O)-8P)Q)Q& "4!>!>!>!N!NJJ ) $ $ $!#JJJ$& & & &!^^O<<GGII& & & 	7 	7M
 7<<}EED#''---#''4555#''4666#''46666( ,	(d;;;;" )	 ...!w}}];;A>!w||.."    ##$4d=M6MNNNN* 	,T22 * *##D))))*  	 &'' 2!w//0C0C0E0EFF*9*P*P + +'              
 7##')A   N, N N< N N)-N N=JN N N    0111!w|| 0113E    ##$4mDDDD LL;    	'"nnGG$&&G	::<< P P##BGLL&$A$ABBB P#''Wooo(N(NOOOP "#56 	 	 	D		N"	N	N sD$'	N 	N 	N 	N ('g66 	# 	#A""""s8   G= =HH6APP"PBV V('V()FFr   )r   r   r   r   r   r   ro   r   r   r0   r   r   r   r   r   classmethodr!  r\   r(   r&   r   r   '  sr        	J- 	J$ 	J 	J 	J 	J	Hs 	Ht 	H 	H 	H 	H. . . . . .&' 'C 'D ' ' ' 'N N4 N$ N4 N N N N:=4 =D = = = =8   # # # # W- W2D W W W [W W Wr(   r   c                   B    e Zd ZdeddfdZdeddfdZd	dZdefdZdS )
r   r   r    Nc                 H    || _         t                      | _        d | _        d S r.   )filer/   rC   _saved_lines)r   r   s     r&   r   zUninstallPthEntries.__init__C  s"    	!$37r(   rD   c                     t           j                            |          }t          r;t           j                            |          d         s|                    dd          }| j                            |           d S )Nr   \/)r"   r#   r]   r   
splitdrivereplacerC   r0   )r   rD   s     r&   r0   zUninstallPthEntries.addH  sl      ''  	-27--e44Q7 	-MM$,,Er(   c                    t                               d| j                   t          j                            | j                  s"t                               d| j                   d S t          | j        d          5 }|                                }|| _	        d d d            n# 1 swxY w Y   t          d |D                       rd}nd}|rO|d                             |                    d                    s!|d         |                    d          z   |d<   | j        D ]Y}	 t                               d	|           |                    ||z                       d                     J# t          $ r Y Vw xY wt          | j        d
          5 }|                    |           d d d            d S # 1 swxY w Y   d S )NzRemoving pth entries from %s:z.Cannot remove entries from nonexistent file %srbc              3      K   | ]}d |v V  	dS )s   
Nr\   )rQ   lines     r&   rT   z-UninstallPthEntries.remove.<locals>.<genexpr>b  s&      114w$111111r(   z

zutf-8zRemoving entry: %swb)r   r   r%  r"   r#   r   warningr	  	readlinesr&  rV   rA   encoderC   r   
ValueError
writelines)r   r  linesendlinerD   s        r&   r   zUninstallPthEntries.removeW  s7   6	BBB w~~di(( 	NNKTYWWWF$)T"" 	&bLLNNE %D	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 11511111 	GGG 	<r++GNN7,C,CDD 	<b	GNN7$;$;;E"I\ 	 	E3U;;;ego55g>>????   $)T"" 	!bMM%   	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	!s7   <B$$B(+B((AE//
E<;E<F77F;>F;c                 &   | j         "t                              d| j                   dS t                              d| j                   t          | j        d          5 }|                    | j                    d d d            n# 1 swxY w Y   dS )Nz.Cannot roll back changes to %s, none were madeFz!Rolling %s back to previous stater2  T)r&  r   r   r%  r   r	  r7  )r   r  s     r&   r   zUninstallPthEntries.rollbackr  s    $LLI49UUU58$)DDD$)T"" 	-bMM$+,,,	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	-ts   BB
B
r   )	r   r   r   ro   r   r0   r   r   r   r\   r(   r&   r   r   B  s        8 8 8 8 8 8
           ! ! ! !6$      r(   r   )6r4   r"   r   r   importlib.utilr   typingr   r   r   r   r   r	   r
   r   r   pip._internal.exceptionsr   r   pip._internal.locationsr   r   pip._internal.metadatar   pip._internal.utils.compatr   pip._internal.utils.egg_linkr   pip._internal.utils.loggingr   r   pip._internal.utils.miscr   r   r   r   pip._internal.utils.temp_dirr   r   pip._internal.utils.virtualenvr   r   r   ro   r   r'   r6   rG   rY   r}   r   r   r   r   r\   r(   r&   <module>rF     sN       				 



     , , , , , , W W W W W W W W W W W W W W W W W W W W W W S S S S S S S S @ @ @ @ @ @ @ @ 3 3 3 3 3 3 . . . . . . D D D D D D = = = = = = = = I I I I I I I I I I I I M M M M M M M M C C C C C C	8		&&"&,0&sD$& & & &&iT4001c9S$_--.    	/ Ic4o4N    	B8C= SX    &Ax} AS A A A AD."x} ."s3xS?Q9R ." ." ." ."bf! f! f! f! f! f! f! f!RX X X X X X X Xv7 7 7 7 7 7 7 7 7 7r(   