
    2VhR                     b   d dl Z d dlZd dlZd dlZd dlmc 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ZdZdZi dej                  j>                  dej                  j@                  dej                  jB                  dej                  jD                  dej                  jF                  dej                  jH                  dej                  jJ                  dej                  jL                  dej                  jN                  dej                  jP                  dej                  jR                  dej                  jT                  dej                  jV                  dej                  jX                  dej                  jZ                  dej                  j\                  Z/ej                  jT                  d ej                  j>                   ej`                  ejb                        jd                  ej                  j@                   ej`                  ejf                        jd                  ej                  jB                   ej`                  ejh                        jd                  ej                  jD                   ejj                  ejl                        jd                  ej                  jF                   ejj                  ejn                        jd                  ej                  jH                   ejj                  ejp                        jd                  ej                  jJ                   ejj                  ejr                        jd                  ej                  jL                   ejj                  ejt                        jd                  ej                  jN                   ejj                  ejv                        jd                  ej                  jP                   ejj                  ejx                        jd                  ej                  jR                   ejj                  ejz                        jd                  ej                  jV                  d!iZ>ej                  jT                  d"ej                  j>                   ej`                  ejb                        j~                  ej                  j@                   ej`                  ejf                        j~                  ej                  jB                   ej`                  ejh                        j~                  ej                  jD                   ejj                  ejl                        j~                  ej                  jF                   ejj                  ejn                        j~                  ej                  jH                   ejj                  ejp                        j~                  ej                  jJ                   ejj                  ejr                        j~                  ej                  jL                   ejj                  ejt                        j~                  ej                  jN                   ejj                  ejv                        j~                  ej                  jP                   ejj                  ejx                        j~                  ej                  jR                   ejj                  ejz                        j~                  ej                  jV                  d iZ@d# ZAdCd$ZB G d% d&      ZCd' ZDe j                  d(        ZFd) ZGd* ZH G d+ d,e      ZId- ZJd. ZKdDd/ZLd0 ZMd1 ZNd2 ZOd3 ZPd4 ZQd5 ZRd6 ZSdEd7ZTd8 ZUd9 ZVd: ZWd; ZX	 dCd<ZYd= ZZd> Z[dFd?Z\d@ Z]dA Z^dB Z_y)G    N)Model)Tensor)compile_model)Type)tree)KerasVariable)dtypes)global_state)standardize_dtype)result_type)KerasTensor)StatelessScopeFTfloat16float32float64uint8uint16uint32uint64int8int16int32int64bfloat16boolfloat8_e4m3fnfloat8_e5m2stringg:  G   g:  c                    | j                   }|j                   }|j                         s|j                         rt        d| d      t        |      }t        |      }t	        j
                  ||      }t        |   }||k7  r%t        j                  | |      j                  d      } ||k7  r%t        j                  ||      j                  d      }| |fS )N'zK' operation is not supported for dynamic operand type with openvino backendr   )
element_type
is_dynamic
ValueErrorov_to_keras_typer	   r   OPENVINO_DTYPESov_opsetconvertoutput)x1x2op_namex1_typex2_typer   s         O/home/dcms/DCMS/lib/python3.12/site-packages/keras/src/backend/openvino/core.pyalign_operand_typesr0   M   s    ooGooGw113y $ $
 	
 w'Gw'G$$Wg6K!+.K+b+.55a8+b+.55a8r6M    c                    t        | t              r9|t        j                  }t	        j
                  | |      j                  d      } | S t        | t              r9|t        j                  }t	        j
                  | |      j                  d      } | S t        | t        j                        rv| j                  t        j                  d      k(  r.t	        j
                  | t        d         j                  d      } | S t	        j
                  |       j                  d      } | S t        j                  |       r&t	        j
                  |       j                  d      } | S t        | t              rjt        | j                  t               r| j                  j                  S t	        j
                  | j                  j"                        j                  d      } | S t        | t               r| j                  } | S t        | t$              r0t	        j
                  | j"                        j                  d      } | S t'        dj)                  t+        |                   )Nr   r   z/unsupported type of `x` to create ov.Output: {})
isinstancefloatr   f32r'   constantr)   inti32npndarraydtyper&   isscalarr   valueOpenVINOKerasTensordatar   r$   formattype)xov_types     r/   get_ov_outputrD   b   s   !U?hhGa)0030 H/ 
As	?hhGa)003( H' 
Arzz	"77bhhz**!!!_Z%@AHHKA" H !!!$++A.A H 
Qa ''* H 
A}	%agg2377>>!aggll+2215 H 
A*	+HH H 
Av	aff%,,Q/
 H =DDT!WM
 	
r1   c                   z    e Zd Zd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 Zd Zd Zd Zd Zy)r>   Nc                    |j                         }|j                  j                  rd }n4t        |      D cg c]   }|j                  rd n|j	                         " }}|j                         }t        |      }|| _        t        |      | _	        || _
        d | _        || _        |j                         j                  j                  r.|j                         j                  j	                         | _        y y c c}w N)get_partial_shaperankr#   list
get_lengthget_element_typer%   r)   tupleshaper;   ndimr?   	is_static)selfrB   r?   x_shapex_keras_shapedimx_typex_keras_types           r/   __init__zOpenVINOKerasTensor.__init__   s    %%'<<"" M  = CNN,<<M  ##%'/=)
!
		 %%//++-22==?DI 0s   %C8c                     | j                   }t        |      }t        ||d      \  }}t        t	        j
                  ||      j                  d            S )NzOpenVINOKerasTensor::__add__r   r)   rD   r0   r>   r'   addrQ   otherfirsts      r/   __add__zOpenVINOKerasTensor.__add__   N    e$*58
u #8<<u#=#D#DQ#GHHr1   c                     | j                   }t        |      }t        ||d      \  }}t        t	        j
                  ||      j                  d            S )NzOpenVINOKerasTensor::__radd__r   rY   r[   s      r/   __radd__zOpenVINOKerasTensor.__radd__   sN    e$*59
u #8<<u#=#D#DQ#GHHr1   c                     | j                   }t        |      }t        ||d      \  }}t        t	        j
                  ||      j                  d            S )NzOpenVINOKerasTensor::__sub__r   r)   rD   r0   r>   r'   subtractr[   s      r/   __sub__zOpenVINOKerasTensor.__sub__   P    e$*58
u #8#4#4UE#B#I#I!#LMMr1   c                     | j                   }t        |      }t        ||d      \  }}t        t	        j
                  ||      j                  d            S )NzOpenVINOKerasTensor::__rsub__r   rc   r[   s      r/   __rsub__zOpenVINOKerasTensor.__rsub__   P    e$*59
u #8#4#4UE#B#I#I!#LMMr1   c                     | j                   }t        |      }t        ||d      \  }}t        t	        j
                  ||      j                  d            S )NzOpenVINOKerasTensor::__mul__r   r)   rD   r0   r>   r'   multiplyr[   s      r/   __mul__zOpenVINOKerasTensor.__mul__   rf   r1   c                     | j                   }t        |      }t        ||d      \  }}t        t	        j
                  ||      j                  d            S )NzOpenVINOKerasTensor::__rmul__r   rk   r[   s      r/   __rmul__zOpenVINOKerasTensor.__rmul__   ri   r1   c                     | j                   }t        |      }t        ||d      \  }}t        t	        j
                  ||      j                  d            S )Nz OpenVINOKerasTensor::__truediv__r   r)   rD   r0   r>   r'   divider[   s      r/   __truediv__zOpenVINOKerasTensor.__truediv__   sN    e$*5<
u #8??5%#@#G#G#JKKr1   c                     | j                   }t        |      }t        ||d      \  }}t        t	        j
                  ||      j                  d            S )Nz!OpenVINOKerasTensor::__rtruediv__r   rq   r[   s      r/   __rtruediv__z OpenVINOKerasTensor.__rtruediv__   N    e$*5=
u #8??5%#@#G#G#JKKr1   c                     | j                   }t        |      }t        ||d      \  }}t        t	        j
                  ||      j                  d            S )Nz!OpenVINOKerasTensor::__floordiv__r   rq   r[   s      r/   __floordiv__z OpenVINOKerasTensor.__floordiv__   rv   r1   c                     | j                   }t        |      }t        ||d      \  }}t        t	        j
                  ||      j                  d            S )Nz"OpenVINOKerasTensor::__rfloordiv__r   rq   r[   s      r/   __rfloordiv__z!OpenVINOKerasTensor.__rfloordiv__   sN    e$*5>
u #8??5%#@#G#G#JKKr1   c                 t    | j                   }t        t        j                  |      j                  d            S Nr   )r)   r>   r'   negativerQ   r]   s     r/   __neg__zOpenVINOKerasTensor.__neg__   ,    "8#4#4U#;#B#B1#EFFr1   c                 t    | j                   }t        t        j                  |      j                  d            S r|   )r)   r>   r'   absoluter~   s     r/   __abs__zOpenVINOKerasTensor.__abs__   r   r1   c                 t    | j                   }t        t        j                  |      j                  d            S r|   )r)   r>   r'   logical_notr~   s     r/   
__invert__zOpenVINOKerasTensor.__invert__   s,    "8#7#7#>#E#Ea#HIIr1   c                     | j                   }t        |      }t        ||d      \  }}t        t	        j
                  ||      j                  d            S )NzOpenVINOKerasTensor::__pow__r   )r)   rD   r0   r>   r'   powerr[   s      r/   __pow__zOpenVINOKerasTensor.__pow__   sN    e$*58
u #8>>%#?#F#Fq#IJJr1   c                 D   | j                   }g }d }t        |t              r|f}t        |t              sJ d       t	        |      D ]q  \  }}t        |t              r6|j                  |       t        j                  |t        j                        }L|j                  |j                  |j                  qJ  t        |      dk(  sJ d       t        j                  |t        j                        }t        t        j                  |||      j                  d            S )Nzonly tuple is supportedr   zaxis must contain one elementr   )r)   r3   r7   rM   	enumerateappendr'   r6   r   r8   startstopsteplenr>   gather)rQ   indicesr?   axisgather_indexrT   indexs          r/   __getitem__zOpenVINOKerasTensor.__getitem__   s    {{gs#jG'5)D+DD)#G, 		JC%%C '00A KK'

*

*+		 4yA~>>>~  txx0"OOD,5<<Q?
 	
r1   c                     | j                   }|j                         }|j                  j                  r|j                  j	                         dkD  sJ d       |d   j                  sJ d       |d   j	                         S )Nr   z)rank must be static and greater than zeroz"the first dimension must be static)r)   rH   rI   rP   rK   )rQ   	ov_outputov_shapes      r/   __len__zOpenVINOKerasTensor.__len__  sx    KK	..0}}&&8==+C+C+E+I 	
7	
I {$$J&JJ${%%''r1   c                     | j                   }t        |      }t        ||d      \  }}t        t	        j
                  ||      j                  d            S )NzOpenVINOKerasTensor::__mod__r   )r)   rD   r0   r>   r'   modr[   s      r/   __mod__zOpenVINOKerasTensor.__mod__  r_   r1   rG   )__name__
__module____qualname__rW   r^   ra   re   rh   rm   ro   rs   ru   rx   rz   r   r   r   r   r   r   r    r1   r/   r>   r>      sl    @&IINNNNLLLLGGJK
4(Ir1   r>   c                     t         j                         D ]  \  }}| |k(  s|c S  t        d| j                          d      )Nz/Requested OpenVINO type has no keras analogue 'r!   )r&   itemsr$   	to_string)rC   _keras_type_ov_types      r/   r%   r%   (  sR    !0!6!6!8 Xh 
9':K:K:M9NaP r1   c                 F    t        |       }t        j                  d|       y )Nopenvino_device)_parse_device_inputr
   set_global_attribute)device_namecurrent_devices     r/   device_scoper   1  s    (5N%%&7Hr1   c                  8    t        j                  dd       } | y| S )Nr   CPU)r
   get_global_attribute)devices    r/   
get_devicer   7  s"    ../@$GF~Mr1   c                     t        | t              r&| j                         } | j                  d      \  }}|S t	        d|  d      )N:zjInvalid value for argument `device_name`. Expected a string like 'gpu:0' or 'cpu'. Received: device_name='r!   )r3   struppersplitr$   )r   device_type_s      r/   r   r   >  sT    +s# "'')$**3/Q&&1]!5
 	
r1   c                   8    e Zd Zd Zd Zd	dZd Zd Zd Zd Z	y)
Variablec                    t        |t              r|| _        y t        |t              rRt	        j
                  |j                  t        | j                           }t        |j                  d            | _        y t	        j
                  |t        | j                           }t        |j                  d            | _        y )Nr;   r   )
r3   r>   _valuer   r'   r6   r?   r&   _dtyper)   )rQ   r=   value_consts      r/   _initializezVariable._initializeO  s    e01DKv&"++

/$++">K .k.@.@.CDDK"++_T[[9K .k.@.@.CDDKr1   c                     || _         y rG   )r   )rQ   r=   s     r/   _direct_assignzVariable._direct_assign]  s	    r1   Nc                     t        ||      S )Nr   )convert_to_tensor)rQ   r=   r;   s      r/   _convert_to_tensorzVariable._convert_to_tensor`  s     e44r1   c                     t        | j                  t              r.| j                  j                  j	                         j
                  S | j                  j
                  S rG   )r3   r=   r>   r)   get_noder?   )rQ   s    r/   	__array__zVariable.__array__c  s>    djj"56::$$--/444zzr1   c                     t        | j                  t              r?| j                  j                  j	                         j
                  }|j                  |      S | j                  j                  |      S rG   )r3   r=   r>   r)   r   r?   r   )rQ   idxarrs      r/   r   zVariable.__getitem__h  sS    djj"56**##,,.33C??3''zz%%c**r1   c                 $   t        | j                  t              r/| j                  j                  j	                         j
                  }n| j                  j
                  }|j                  dkD  rt        d|j                         t        |      S Nr   zBOnly scalar arrays can be converted to Python scalars. Got: shape=)
r3   r=   r>   r)   r   r?   rO   	TypeErrorrN   r7   rQ   r   s     r/   __int__zVariable.__int__n  sr    djj"56**##,,.33C**//C88a<!ii[*  3xr1   c                 $   t        | j                  t              r/| j                  j                  j	                         j
                  }n| j                  j
                  }|j                  dkD  rt        d|j                         t        |      S r   )
r3   r=   r>   r)   r   r?   rO   r   rN   r4   r   s     r/   	__float__zVariable.__float__z  ss    djj"56**##,,.33C**//C88a<!ii[*  Szr1   rG   )
r   r   r   r   r   r   r   r   r   r   r   r1   r/   r   r   N  s&    E5
+

r1   r   c                 D    t        | t        t        t        t        f       S rG   )r3   rJ   rM   setdict)elems    r/   
_is_scalarr     s    $uc4 8999r1   c                 |    t        | t        t        f      r| D ]  }t        |      }||c S  y t	        |       r| S y rG   )r3   rM   rJ   _get_first_elementr   )rB   	elem_in_xr   s      r/   r   r     sJ    !eT]# 	I%i0D	  
Ar1   c                 z   |rt        d      |rt        d      t        | t              r| S t        | t        j                        rq|Bt        |      }t        |   }t        t        j                  | |      j                  d            S t        t        j                  |       j                  d            S t        | t        t        f      r|t        |      }n0t        |       }t        |t              rd}nt        |t              rd}t        j                  | |      } t        t        j                  |       j                  d      |       S t        | t        t        f      rCt        |      }t        |   }t        t        j                  | |      j                  d      |       S |t        |      }t        | t               r8|r*|| j"                  k7  r| j$                  j'                  |      S | j$                  S t)        |       sEt        |      dk(  r7t+        j,                  t        j.                  |       j'                  |            S |=t1        t3        j4                  |       D cg c]  }t7        |dt9        |             c} }t+        j,                  t        j                  | |            S c c}w )	Nz4`sparse=True` is not supported with openvino backendz4`ragged=True` is not supported with openvino backendr   r   r   r   r   r;   )r$   r3   r>   r9   r:   r   r&   r'   r6   r)   rJ   rM   r   r4   r7   arrayr   r;   r=   astype	is_tensorovr   asarrayr   r   flattengetattrrA   )rB   r;   sparseraggedrC   r   items          r/   r   r     s,   OPPOPP!()	Arzz	"%e,E%e,G&x'8'8G'D'K'KA'NOO"8#4#4Q#7#>#>q#ABB	Ae}	%%e,E &a(D$&!D#&HHQe$"8#4#4Q#7#>#>q#A1EE	As|	$!%(!%("8#4#4Q#@#G#G#JANN!%(!XUagg%77>>%((wwQ<-e4
ByyA--e455}=A\\!_MTgdGT$Z0M
 99RXXau-.. Ns   -J8c                 ,   t        | t        j                        r| S t        | t        t        f      rt        j
                  |       S t        | t        t        f      r8g }| D ]  }|j                  t        |              t        j
                  |      S t        j                  |       r| S t        | t        j                        r| j                  S | | S t        | t              r=t        | j                  t               r| j                  } n| j                  j                  S t        | t               sJ dj#                  t%        |                    	 | j&                  }t)        |gg       }t+        |t-                     } |i       d   }|S #  dxY w)Nz>unsupported type {} for `convert_to_numpy` in openvino backend)results
parametersr   z*`convert_to_numpy` cannot convert to numpy)r3   r9   r:   r7   r4   r   rJ   rM   r   convert_to_numpyr<   r   r   r?   r   r=   r>   r@   rA   r)   r   r   r   )rB   x_newr   	ov_resultov_modelov_compiled_modelresults          r/   r   r     sO   !RZZ 	AU|	$xx{	Ae}	% 	1DLL)$/0	1xx	Q	Aryy	!vv	
	A}	%agg23A77<<a,- HOOG	
-
;HH	)<)(JLA"2&q) M;::s   9F Fc                 \    t        | t              ryt        | t        j                        ryy)NTF)r3   r>   r   r   rB   s    r/   r   r     s$    !()!RYYr1   c                 ,    t        | j                        S rG   )rM   rN   r   s    r/   rN   rN     s    >r1   c                     t         |   }t        |       } t        t        j                  | |      j                  d            S r|   )r&   rD   r>   r'   r(   r)   )rB   r;   rC   s      r/   castr     s9    e$GaAx//7;BB1EFFr1   c                     t        d      )Nz-`cond` is not supported with openvino backendNotImplementedError)predtrue_fnfalse_fns      r/   condr         
M
NNr1   c                     t        d      )Nz7`vectorized_map` is not supported with openvino backendr   )functionelementss     r/   vectorized_mapr         
A r1   c                    	 t               5  d 	t        j                  	fd||f      \  }} | |i |}|}d }t        j                  ||      }d d d        |S # 1 sw Y   S xY w)Nc                    t        | t              rlt        | j                        }|D cg c]  }|dn|
 }}t        | j
                     }t        j                  ||      }t        |j                  d            S | S c c}w )N)rN   r;   r   )
r3   r   rJ   rN   r&   r;   r'   	parameterr>   r)   )rB   rR   rT   rU   params        r/    convert_keras_tensor_to_openvinoz=compute_output_spec.<locals>.convert_keras_tensor_to_openvino  ss    ![)qww-AHI#2#5II(1 **G*5<<?;;H	 Js   A?c                      |       S rG   r   )rB   r  s    r/   <lambda>z%compute_output_spec.<locals>.<lambda>  s    6q9 r1   c                     t        |       r$| j                  }| j                  }t        ||      S t	        | t
              r$| j                  }| j                  }t        ||      S | S rG   )r   r;   rN   r   r3   r>   )rB   rU   rR   s      r/    convert_openvino_to_keras_tensorz=compute_output_spec.<locals>.convert_openvino_to_keras_tensor  sW    |''"7F33A23''"7F33Hr1   )r   r   map_structure)
fnargskwargsargs_1kwargs_1	outputs_1outputsr  output_specr  s
            @r/   compute_output_specr    s    		  
	  --96N
 +(+			 ((,g
= 
B C 
B s   AAA%c                     t        d      )Nz-`scan` is not supported with openvino backendr   )finitxslengthreverseunrolls         r/   scanr  (  r   r1   c                     t        d      )Nz0`scatter` is not supported with openvino backendr   )r   valuesrN   s      r/   scatterr   ,      
: r1   c                     t        d      )Nz7`scatter_update` is not supported with openvino backendr   )inputsr   updatess      r/   scatter_updater%  2  r  r1   c           	         t        |       } t        |t              sJ dj                  t	        |                   t        |t              sJ dj                  t	        |                   g }g }g }t        |      D ]J  \  }}|	|dk\  s|j                  |       |j                  ||          |j                  ||   |z          L t        |      dk(  r| S dgt        |      z  }t        j                  |t        j                        j                  d      }t        j                  |t        j                        j                  d      }t        j                  |t        j                        j                  d      }t        j                  |t        j                        j                  d      }t        t        j                  | ||||      j                  d            S )NzK`slice` is not supported by openvino backend for `start_indices` of type {}zE`slice` is not supported by openvino backend for `lengths` of type {}r   r   )rD   r3   rM   r@   rA   r   r   r   r'   r6   r   r8   r)   r>   slice)	r#  start_indiceslengthsaxesr   r   r   r  r   s	            r/   r'  r'  8  s   6"FmU+ 	**0&g*?+ gu% 	$$*F4=$9%
 DED ) 5V&A+KKLLs+,KKc*V34	5 4yA~3UDT488,33A6DeTXX.55a8ET488,33A6DT488,33A6DvudD$7>>qA r1   c                     t        d      )Nz5`slice_update` is not supported with openvino backendr   )r#  r(  r$  s      r/   slice_updater,  Y  s    
? r1   c                     t        d      )Nz3`while_loop` is not supported with openvino backendr   )r   body	loop_varsmaximum_iterationss       r/   
while_loopr1  _  s     = r1   c                     t        d      )Nz2`fori_loop` is not supported with openvino backendr   )lowerr   body_funinit_vals       r/   	fori_loopr6  j  s    
< r1   c                     | S rG   r   r   s    r/   stop_gradientr8  p  s    Hr1   c                     t        d      )Nz0`unstack` is not supported with openvino backendr   )rB   numr   s      r/   unstackr;  t  r!  r1   c                       y)Nr   r   r   r1   r/   random_seed_dtyper=  z  s    r1   c                     d }d }y)zSDecorator for custom gradients.

    Args:
        fun: Forward pass function.
    c                 <    t        j                  d       || _        y )Nz`custom_gradient` for the openvino backend acts as a pass-through to support the forward pass. No gradient computation or modification takes place.)warningswarnfun)rQ   rB  s     r/   rW   z!custom_gradient.<locals>.__init__  s    	
 r1   c                 0     | j                   |i |\  }}|S rG   )rB  )rQ   r  r  r  r   s        r/   __call__z!custom_gradient.<locals>.__call__  s     TXXt.v.
r1   Nr   )rB  rW   rD  s      r/   custom_gradientrE  ~  s    r1   c                 0    t        j                  d       | S )NzRematerialization memory optimization is not supported by the OpenVino backend. Please switch to JAX, TensorFlow, or PyTorch to utilize this feature.)r@  rA  )r  s    r/   rematrG    s    MM	 
 Hr1   rG   )NNN)NNFr   r|   )`
contextlibr@  numpyr9   openvinor   openvino.runtime.opset14runtimeopset14r'   r   r   r   openvino.runtimer   	keras.srcr   keras.src.backend.commonr   r	   r
   r   keras.src.backend.common.dtypesr   %keras.src.backend.common.keras_tensorr   (keras.src.backend.common.stateless_scoper   SUPPORTS_SPARSE_TENSORSSUPPORTS_RAGGED_TENSORSIS_THREAD_SAFEf16r5   f64u8u16u32u64i8i16r8   i64bf16booleanf8e4m3f8e5m2r   r&   finfor   maxr   r   iinfor   r   r   r   r   r   r   r   
DTYPES_MAXmin
DTYPES_MINr0   rD   r>   r%   contextmanagerr   r   r   r   r   r   r   r   r   rN   r   r   r   r  r  r   r%  r'  r,  r1  r6  r8  r;  r=  rE  rG  r   r1   r/   <module>rk     s       + +   " !  2 + 1 6 7 = C  rww{{rww{{ rww{{ RWWZZ	
 bggkk bggkk bggkk BGGJJ RWW[[ RWW[[ RWW[[  BGGOO RWW^^ 277>>  bggnn!( GGLL-GGKK"**%))GGKK"**%))GGKK"**%))GGJJ"&&GGKK"))$((GGKK"))$((GGKK"))$((GGJJ!%%GGKK"((#''GGKK"((#''GGKK"((#''GGOOQ
" GGLL.GGKK"**%))GGKK"**%))GGKK"**%))GGJJ"&&GGKK"))$((GGKK"))$((GGKK"))$((GGJJ!%%GGKK"((#''GGKK"((#''GGKK"((#''GGOOQ
"*DaI aIH I I
 6} 6r:)/X!HGO"JOB 	,r1   