
    ؄_]}                        d Z ddlZddlZddlmZ ddlmZ ddlmZ ddlmZ dd	lm	Z	 dd
l
mZ ddl
mZ ddl
mZ ddl
mZ ddl
mZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddl	mZ dxa a!d Z"d Z#d Z$d(dZ%d Z&d Z' G d d e(          Z) G d! d"e)          Z*d# Z+d$ Z,d% Z-d&e-_.        d' Z/dS ))z(Internal implementation for declarative.    N)instrumentation   )clsregistry   )event)exc)util)class_mapper)mapper)	mapperlib)synonym)QueryableAttribute)_is_mapped_class)InspectionAttr)MapperProperty)ColumnProperty)CompositeProperty)Column)Table)
expression)topologicalc                     t                               |           rt                               |           S t          |           rt	          | d          S d S )NF)	configure)_DeferredMapperConfighas_clsconfig_for_clsr   r
   clss    d/var/www/book.euthymeo.com/html/venv/lib/python3.11/site-packages/sqlalchemy/ext/declarative/base.py_declared_mapping_infor    %   sT    $$S)) $33C888	#		 C51111t    c                     | t           u rd S t          | dd          r!| j        D ]}t          |          }||c S d S t	          |           }||S | S )N__abstract__Tstrict)object_get_immediate_cls_attr	__bases__"_resolve_for_abstract_or_classical"_dive_for_classically_mapped_class)r   sup	classicals      r   r)   r)   0   s}    
f}}tsN4@@@ = 	 	C4S99C


  46s;;	 Jr!   c                     t          | d          rd S t          j        |           }|| S | j        D ]}t	          |          }||c S d S )N_decl_class_registry)hasattrr   manager_of_classr(   r*   )r   managerr+   r   s       r   r*   r*   C   sp    
 s*++ t.s33G
= 	 	C7<<F!


 " 4r!   Fc                     t          | t                    sdS | j        D ]V}t          |d          }| ot	          |          du}||j        v r'|| u s|r
|| j        v rn	 |s|st          ||          c S WdS )a  return an attribute of the class that is either present directly
    on the class, e.g. not on a superclass, or is from a superclass but
    this superclass is a non-mapped mixin, that is, not a descendant of
    the declarative base and is also not classically mapped.

    This is used to detect attributes that indicate something about
    a mapped class independently from any mapped classes that it may
    inherit from.

    Nr.   )
issubclassr&   __mro__r/   r*   __dict__r(   getattr)r   attrnamer%   base_is_declarative_inherits_is_classicial_inheritss         r   r'   r'   W   s     c6"" t  #*41G#H#H (( E2488D 	 
 t}$$CKK*0 &&&&0 '/ '
 4*****tr!   c                     t           ddlm a  t           t          j        fat          | dd          rd S t                              | ||           d S )Nr   )declared_attrr#   Tr$   )r<   apir	   classpropertydeclarative_propsr'   _MapperConfigsetup_mapping)r   	classnamedict_s      r   _as_declarativerD   y   sb    &&&&&&*D,>?sN4@@@ Y66666r!   c                     t          | t                    r.t          | dd          rt          j        d|d|d           dS dS )N
_cascadingFz1@declared_attr.cascading is not supported on the z attribute on class z5.  This attribute invokes for subclasses in any case.T)
isinstancer?   r6   r	   warn)objnamer   s      r   _check_declared_props_nocascaderK      s_    #()) 	3e,, 	II .2TT3338  
 tur!   c                   l    e Zd Zed             Zd Zd Zd Zd Zd Z	d Z
d Zd	 Zd
 Zd Zd Zd ZdS )r@   c                     t          |dd          pt          |d          }|rt          }nt          } ||||           d S )N_sa_decl_prepare_nocascadeTr$   _sa_decl_prepare)r'   r/   r   r@   )r   cls_rB   rC   	defer_mapcfg_clss         r   rA   z_MapperConfig.setup_mapping   sd    +.t
 
 
 /T-.. 	  	$+GG#Gi'''''r!   c                    || _         t          |          | _        || _        d | _        t          j                    | _        t                      | _	        i | _
        |                                  i | j         _        |                                  t          j                                         	 t#          j        | j        | j                    |                                  |                                  |                                  |                                  |                                  t          j                                         d S # t          j                                         w xY wN)r   dictrC   rB   persist_selectabler	   OrderedDict
propertiessetdeclared_columnscolumn_copies_setup_declared_events_sa_declared_attr_reg_scan_attributesr   _CONFIGURE_MUTEXacquirer   	add_class_extract_mappable_attributes_extract_declared_columns_setup_table_setup_inheritance_early_mappingrelease)selfrP   rB   rC   s       r   __init__z_MapperConfig.__init__   s<    %[[
""&*,, ###%%%
 *,&"**,,,	1!$.$(;;;--///**,,,##%%%!!!&..00000I&..0000s   /BE  E2c                 .    |                                   d S rT   )maprh   s    r   rf   z_MapperConfig._early_mapping   s    




r!   c                      t           j        d          r%t          j        t          d           fd            }t           j        d          r't          j        t          d           fd            }d S d S )N__declare_last__after_configuredc                  :     j                                          d S rT   )r   rn   rl   s   r   ro   z>_MapperConfig._setup_declared_events.<locals>.after_configured   s    ))+++++r!   __declare_first__before_configuredc                  :     j                                          d S rT   )r   rq   rl   s   r   rr   z?_MapperConfig._setup_declared_events.<locals>.before_configured   s    **,,,,,r!   )r'   r   r   listens_forr   )rh   ro   rr   s   `  r   r\   z$_MapperConfig._setup_declared_events   s    "48-?@@ 	,v'9::, , , , ;:, #48-@AA 	-v':;;- - - - <;- - -	- 	-r!   c                 N   | j         | j        }| j        }d }d x}}d }j        D ]}|uo#t	          |          d uot          |dd           }|s|ur|                     |           t          |                                          D ]y\  }	}
|	dk    rt          |
|	          }|s	|r|rfd})|	dk    rt          |
|	          }|s|r|rj
        }N|	dk    rct          |
|	          }|sO|r|rKj        }t          |t          t          t          d           f          st!          j        d          |urd}|r<t          |
t$                    r&t'          j        d	|j        d
|	d|dd
	           |urt          |
t,                    rt          |
t.                    rt!          j        d          t          |
t$                    rt          |
t&          j                  }|sX|
j        rQ|	|v rt'          j        d|	dd           |
                    |
          x||	<   x||
<   }t9          |	|           nm|rt'          j        d           t=          |	          }t          |t>                    r(|j         r!t          |j!        t.                    s|j"        }|x||	<   ||
<   t          |t,          t.          f          r|j#        |
j$        |_#        b| %                    ||	|
           {|r|sd }|| _&        || _'        || _(        d S )NrN   Tr$   __mapper_args__c                  ,    t           j                  S rT   )rU   rv   r   s   r   mapper_args_fnz6_MapperConfig._scan_attributes.<locals>.mapper_args_fn   s    #'(;#<#<<r!   __tablename____table_args__z3__table_args__ value must be a tuple, dict, or Nonez*Regular (i.e. not __special__) attribute '.z(' uses @declared_attr, but owning class z& is mapped - not applying to subclass zMapper properties (i.e. deferred,column_property(), relationship(), etc.) must be declared as @declared_attr callables on declarative mixin classes.Attribute '' on class z> cannot be processed due to @declared_attr.cascading; skippingzJUse of sqlalchemy.util.classproperty on declarative classes is deprecated.))r   rC   r[   r4   r    r'   _produce_column_copiesvarsitemsrK   ry   rz   rG   tuplerU   typer   ArgumentErrorr?   r	   rH   __name__r   r   InvalidRequestErrorr>   rF   __get__setattrwarn_deprecatedr6   r   _is_internal_proxyoriginal_property
descriptordoc__doc___warn_for_decl_attributes
table_args	tablenamerx   )rh   rC   r[   rx   r   inherited_table_argsr   r8   class_mappedrJ   rI   
check_decloldclasspropretr   s                 @r   r^   z_MapperConfig._scan_attributes   si   h
*,00
)	K |	H |	HDC *400</6t       2DOO++D111!$ZZ--// pH pH	c,,,!@T3" "J * =< =: == = = = = _,,!@T3" "J % 6l 6j 6$'$5	---!@T3" "J & 
8| 
8z 
8%(%7
)&d4jj(A     #&"3!0# #   s??370! LH!#'899 		
  $}}}dddDDD###	?   __ "#v.. ?H #C88 <H!5<   $C):;; 5H'1#t7I'J'J+ )C )C#u}} !%		 37$$%=!" !" !" '*kk#s&;&;<E$K <- #+ ##Cs3333+ " $ 4%I!" !" !"
 #*#t"4"4C !+3 ? ?5$'$:5 )3$'$9>)" )"5 '*n?BBE$K-*<&sV^,DEE2 #&)kCG
 66tT3GGGapHd   		 	J$",r!   c                 t    t          |t          j                  rt          j        d|d|d           d S d S )Nr|   r}   zk appears to be a non-schema 'sqlalchemy.sql.column()' object; this won't be part of the declarative mapping)rG   r   ColumnClauser	   rH   )rh   r   keycs       r   r   z'_MapperConfig._warn_for_decl_attributesc  sU    a011 	II 33    	 	r!   c                    | j         }| j        }| j        }t          |                                          D ]\  }}t          |t                    rt          ||          |ur-|j        rt          j
        d          ||vrUd|v r|j        p||d         j        v s;|                                x||<   }|j        |_        t          |||           |||<   d S )NzvColumns with foreign keys to other columns must be declared as @declared_attr callables on declarative mixin classes. 	__table__)r   rC   r[   r   r   rG   r   r6   foreign_keysr   r   rJ   r   copy_creation_orderr   )rh   r8   r   rC   r[   rJ   rI   copy_s           r   r~   z$_MapperConfig._produce_column_copiesl  s   h
*d))++ 	( 	(ID##v&& (3%%S00 % (19  
 &&5(()TeK.@.BBB14;M#&,/,?E)Cu---"'E$K)	( 	(r!   c                     | j         }| j        }| j        }t          |dd          }t	          |          D ]}|dv r||         }t          |t                    rIt          |t                    r#|j        rt          j
        d| j         z             t          ||          }nNt          |t                    r9|j        |ur0|j        |k    r%t          |j                  }t!          |||           t          |t"                    rNt%          |          dk    r;t          |d         t&          t(          f          rt          j
        d|z             t          |t&          t(          f          sV|                    d	          s?|                    |           |                     |||           |st!          |||           |d
k    rt1          j        d          t5          j        ||          }|||<   d S )NrN   Tr$   )r   ry   rv   zUse of @declared_attr.cascading only applies to Declarative 'mixin' and 'abstract' classes.  Currently, this flag is ignored on mapped class %sr   r   zIgnoring declarative-like tuple value of attribute '%s': possibly a copy-and-paste error with a comma accidentally placed at the end of the line?__metadatazdAttribute name 'metadata' is reserved for the MetaData instance when using a declarative base class.)r   rC   rX   r'   listrG   r?   r<   rF   r	   rH   r6   r   class_r   r   r   r   lenr   r   
startswithpopr   r   r   r   _deferred_relationship)rh   r   rC   	our_stufflate_mappedkvalueprops           r   rb   z*_MapperConfig._extract_mappable_attributes  s?   h
O	--d
 
 
 e :	  :	 AEEE!HE%!233 'e]33 8H I  $x(    Q 5"455'L++INN  	**Q&&& 5%((JJ!OOuQx&.)ABB $ 	BDEF  
 '?@@  ||D)) /IIaLLL2235AAA& /Q... j-.  
 5c5AADIaLLu:	  :	 r!   c                    | j                             fd           | j        }t          j        t
                    }t                                                    D ]\  }}t          |t          t          f          r|j        D ]x}t          |t                    ra|j        Zt          ||           t          |t                    s ||j                                     |           |                    |           yt          |t                    rSt          ||           ||j                                     |           |                    |           ||j        k    r|= |                                D ][\  }}t%          |          dk    rCt'          j        d| j        d|dd                    t/          |                    d           \d S )	Nc                     |          j         S rT   r   )r   r   s    r   <lambda>z9_MapperConfig._extract_declared_columns.<locals>.<lambda>  s    y~'E r!   r   r   z	On class z, Column object z7 named directly multiple times, only one will be used: z, z$. Consider using orm.synonym instead)rX   sortrZ   collectionsdefaultdictrY   r   r   rG   r   r   columnsr   table_undefer_column_namerJ   addr   r   r	   rH   rB   joinsorted)	rh   rZ   name_to_prop_keyr   r   colrJ   keysr   s	           @r   rc   z'_MapperConfig._extract_declared_columns  s   O	 	EEEEFFF  0&23779??,,-- 	' 	'FC!n.?@AA '9 2 2C!#v.. 2393D,S#666)!->?? @,SX6::3???(,,S1112 Av&& 
'$S!,,, (,,S111 $$Q''' !%<<!#*0022 	 	JD$4yy1}}		
 ~~~tttdiit.E.E.E.E	H  	 	r!   c                    | j         }| j        }| j        }| j        }| j        }t          |d           x}| _        d }t          |d          rt          j        |j	                  }nt          }d|vr|di }	}|r]t          |t                    r|}	nEt          |t                    r0t          |d         t                    r|dd         |d         }	}n|}|                    d          }
|
rd	|	d
<    |||j        gt          |          t          |          z   R i |	x|_        }nD|j        }|r;|D ]8}|j                            |          st'          j        d|j        z            9|| _        d S )Nc                     | j         S rT   r   )r   s    r   r   z,_MapperConfig._setup_table.<locals>.<lambda>  s	    A,= r!   r   __table_cls__r    r   __autoload__Tautoloadz8Can't add additional column %r when specifying __table__)r   r   r   rC   rZ   r   r/   r	   unbound_method_to_callabler   r   rG   rU   r   getr   r   r   contains_columnr   r   r   local_table)rh   r   r   r   rC   rZ   r   	table_clsargstable_kwr   r   s               r   rd   z_MapperConfig._setup_table  s   hN	_

039"="=4
 4
 4
 	
40 3(( 	78IJJIIIe##$!#Rh .!*d33 .#-#J66 .%jnd;; .-7"-=z"~(DD#-D 99^44 0+/HZ((1	L) ,--d;) ) ) 	) )  ME )  A 722155 !/356U;  
 !r!   c           
         | j         }| j        }| j        }| j        }g }|j        D ]K}t          |          }|t          |          	 't          |dd          s|                    |           L|r;t          |          dk    rt          j        d|d|          |d         | _        nd | _        |.| j        't          |d          st          j        d	|z            | j        rt          | j                  }|j         }|j        }	||rt          j        d
          |D ]}|j        |j        v rC|j        |j                 |u r%t          j        d|d|d|j        |j                 d          |j        rt          j        d          |                    |           |	|	|ur|	                    |           d S d S d S )NrN   Tr$   r   zClass z has multiple mapped bases: r   __no_table__zwClass %r does not have a __table__ or __tablename__ specified and does not inherit from an existing table-mapped class.z?Can't place __table_args__ on an inherited class with no table.zColumn 'r}   z! conflicts with existing column ''zDCan't place primary key columns on an inherited class with no table.)r   r   r   rZ   r(   r)   r    r'   appendr   r   r   inheritsrV   r   rJ   r   primary_keyappend_column_refresh_for_new_column)
rh   r   r   r   rZ   r   r   inherited_mapperinherited_tableinherited_persist_selectables
             r   re   z _MapperConfig._setup_inheritance'  s    h_
0  		# 		#A2155Ay% "9/# # #
 """ 	!8}}q  --@CXXN   %QKDMM DM M%+C@@ & )&(+,  
 ] !	P5dmDD.:O+;+N(}  +)  
 * P PAv!222*,QV499$!//  !qq###'8'@'@'@B  
 } !/3   $11!4444@8OO4LLQOOOC!	P !	P
 }P Pr!   c                 d  
 | j         }| j        r|                                 }ni }dD ],}||v r&||         }| j                            ||          ||<   -d|vs
J d            | j        r
| j        |d<   | j        r|                    dd          st          | j                  

j        }d|vrct          
fd|j        D                       	                    
j
        pd          x|d<   }|                    d	 | j        D                        t          |                                          D ]Y\  }}t          |t           j                  s |
j        v r0
j        |         }t          |t&                    r|g|j        z   ||<   Z|                                }	||	d
<   |	| _        d S )N)version_id_colpolymorphic_onr   z=Can't specify 'inherits' explicitly with declarative mappingsconcreteFexclude_propertiesc                 0    g | ]}|j         v|j        S r   )_columntopropertyr   ).0r   r   s     r   
<listcomp>z;_MapperConfig._prepare_mapper_arguments.<locals>.<listcomp>  s4       $4$FFF FFFr!   r   c                     g | ]	}|j         
S r   r   )r   r   s     r   r   z;_MapperConfig._prepare_mapper_arguments.<locals>.<listcomp>  s    :::qQU:::r!   rX   )rX   rx   r[   r   r   r    r   rY   r   unionr   difference_updaterZ   r   r   rG   r   ColumnElement_propsr   r   r   mapper_args)rh   rX   r   r   vr   r   r   presult_mapper_argsr   s             @r   _prepare_mapper_argumentsz'_MapperConfig._prepare_mapper_argumentsr  s'   _
 	--//KKK 6 	> 	>AKN!%!3!7!71!=!=A k)))J *)) = 	4&*mK
#= "	:U!C!C "	:
  6dmDD.:O#;66IL   !0!2  J J %(;ArBBC014F #44::D$9:::   z//1122 : :3!#z'?@@ (///(/2A!!^44 : *-	(9
1(--//+5<(-r!   c                     |                                   t          | j        d          rt          j        | j        j                  }nt          } || j        | j        fi | j        x| j        _	        }| j        `
|S )N__mapper_cls__)r   r/   r   r	   r   r   r   r   r   
__mapper__r]   )rh   
mapper_clsmp_s      r   rk   z_MapperConfig.map  s    &&(((48-.. 	 8' JJ  J$.JHd&%
 %
*.*:%
 %
 	
c H*
r!   N)r   
__module____qualname__classmethodrA   ri   rf   r\   r^   r   r~   rb   rc   rd   re   r   rk   r   r!   r   r@   r@      s        
( 
( [
("1 "1 "1H  - - -K- K- K-Z  ( ( (6D  D  D L% % %N1! 1! 1!fIP IP IPV:. :. :.x    r!   r@   c                        e Zd Z ej                    Zd Zed             Zej	        d             Ze
d             Ze
d             Ze
d             Ze
d             Ze
dd	            Z fd
Z xZS )r   c                     d S rT   r   rl   s    r   rf   z$_DeferredMapperConfig._early_mapping  s    r!   c                 *    |                                  S rT   )_clsrl   s    r   r   z_DeferredMapperConfig.cls  s    yy{{r!   c                 b    t          j        || j                  | _        | | j        | j        <   d S rT   )weakrefref_remove_config_clsr   _configs)rh   r   s     r   r   z_DeferredMapperConfig.cls  s,    K(?@@	#'di   r!   c                 <    | j                             |d            d S rT   )r   r   )r   r   s     r   r   z(_DeferredMapperConfig._remove_config_cls  s     d#####r!   c                 b    t          |t                    ot          j        |          | j        v S rT   )rG   r   r   r   r   r   r   s     r   r   z_DeferredMapperConfig.has_cls  s*     &$''OGK,?,?3<,OOr!   c                     t          |d          r|                                 t          j        |dt          j        |          z            )N_sa_raise_deferred_configzOClass %s has a deferred mapping on it.  It is not yet usable as a mapped class.)msg)r/   r   orm_excUnmappedClassError_safe_cls_namer   s     r   raise_unmapped_for_clsz,_DeferredMapperConfig.raise_unmapped_for_cls  s]    6677 	/,,...((*1*@*H*HI
 
 
 	
r!   c                 @    | j         t          j        |                   S rT   )r   r   r   r   s     r   r   z$_DeferredMapperConfig.config_for_cls  s    |GK//00r!   Tc                 @   fdd | j                                         D             D             }|s|S t          d |D                       g }D ])|                    fdj        D                        *t          t          j        ||                    S )Nc                 >    g | ]\  }}|t          |          |S rT   )r3   )r   mrP   base_clss      r   r   z:_DeferredMapperConfig.classes_for_base.<locals>.<listcomp>  s<     
 
 
4JtX$>$> r!   c                      g | ]}||j         fS r   r   r   r	  s     r   r   z:_DeferredMapperConfig.classes_for_base.<locals>.<listcomp>  s    FFF1QJFFFr!   c              3   (   K   | ]}|j         |fV  d S rT   r   r  s     r   	<genexpr>z9_DeferredMapperConfig.classes_for_base.<locals>.<genexpr>  s(      AA1QUAJAAAAAAr!   c              3   @   K   | ]}|v |                  fV  d S rT   r   )r   r
  all_m_by_clsm_clss     r   r  z9_DeferredMapperConfig.classes_for_base.<locals>.<genexpr>  sI        |++ h'e)<=++++ r!   )r   valuesrU   extendr(   r   r   r   )r   r
  r   classes_for_basetuplesr  r  s    `   @@r   r  z&_DeferredMapperConfig.classes_for_base  s    
 
 
 
FF0C0C0E0EFFF
 
 
  	$##AA0@AAAAA! 	 	EMM      %      
 K$V-=>>???r!   c                     | j                             | j        d            t          t          |                                           S rT   )r   r   r   superr   rk   )rh   	__class__s    r   rk   z_DeferredMapperConfig.map  s:    $)T****D1155777r!   )T)r   r   r   r	   rW   r   rf   propertyr   setterr   r   r   r  r   r  rk   __classcell__)r  s   @r   r   r     s"       t!!H     X 	Z( ( Z( $ $ [$ P P [P 
 
 [
 1 1 [1 @ @ @ [@*8 8 8 8 8 8 8 8 8r!   r   c                    d| j         v rt          |t                    rGt          ||           | j                            |           | j                            ||           dS t          |t                    rm|j	        D ]H}t          |t                    r1|j
        *t          ||           | j                            |           I| j                            ||           dS t          |t                    r0| j                            |t          j        | |                     dS t          |t                    rO|j        |k    rDt!          |j                  }| j                            |t          j        | |                     dS t"                              | ||           | j                                         dS t"                              | ||           dS )zadd an attribute to an existing declarative class.

    This runs through the logic to determine MapperProperty,
    adds it to the Mapper, adds a column to the mapped Table, etc.

    r   N)r5   rG   r   r   r   r   r   add_propertyr   r   r   r   r   r   r   r   r   r   __setattr___expire_memoizations)r   r   r   r   s       r   _add_attributer      s    s|##eV$$ 	2 e,,,M''...N''U33333~.. 	2} 5 5c6** 5sy/@(c222M//444N''U33333~.. 	2N''[7UCC     122 		2uyC7G7G EI&&EN''[7UCC     S#u---N//11111c5)))))r!   c                 l   d| j         v r|| j         v r| j        j        sz| j         |         }t          |t          t
          t          t          f          rt          d          t          
                    | |           | j                                         d S t          
                    | |           d S )Nr   z<Can't un-map individual mapped attributes on a mapped class.)r5   r   _dispose_calledrG   r   r   r   r   NotImplementedErrorr   __delattr__r  )r   r   r   s      r   _del_attributer%  %  s     	$$3<.   S!FNN<NO
 
 	2 &N   S#&&&N//11111c"""""r!   c                     t          |           }|D ]B}t          ||          st          |d|j                  t	          | |||                    CdS )a=  A simple constructor that allows initialization from kwargs.

    Sets attributes on the constructed instance using the names and
    values in ``kwargs``.

    Only keys that are present as
    attributes of the instance's class are allowed. These could be,
    for example, any mapped columns or relationships.
    z$ is an invalid keyword argument for N)r   r/   	TypeErrorr   r   )rh   kwargsrP   r   s       r   _declarative_constructorr)  :  sw     ::D $ $tQ 	>?aaO   	a####$ $r!   ri   c                 B    |j         | |_         |j        	| |_        d S d S rT   )r   rJ   )r   columns     r   r   r   P  s,    z
{ r!   )F)0r   r   r   sqlalchemy.ormr    r   r   r   r	   ormr
   r  r   r   r   orm.attributesr   orm.baser   r   orm.interfacesr   orm.propertiesr   r   schemar   r   sqlr   r   r<   r?   r    r)   r*   r'   rD   rK   r&   r@   r   r   r%  r)  r   r   r   r!   r   <module>r5     s   / .      * * * * * *                               ! ! ! ! ! !                   0 0 0 0 0 0 ( ( ( ( ( ( & & & & & & , , , , , , , , , , , , / / / / / /                         %) (!    &  (   D
7 
7 
7  g g g g gF g g gT?8 ?8 ?8 ?8 ?8M ?8 ?8 ?8D"* "* "*J# # #*$ $ $& %/  !    r!   