
    ijg                        d dl 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 Zd Zd Zd Zd Zd Zd Zd ZdKdZd Zd ZdLdZd ZdMdZd Z d Z!dNdZ"d Z#dOdZ$dNdZ%dPd Z&d! Z'dKd"Z(d# Z)dPd$Z*dPd%Z+dPd&Z,	 	 dQd'Z-	 	 dRd(Z.	 	 	 dSd)Z/	 	 	 dSd*Z0d+ Z1d, Z2d- Z3d. Z4d/ Z5dTd0Z6dTd1Z7	 	 dUd2Z8	 	 	 	 dVd3Z9	 	 	 	 dVd4Z:	 	 	 	 dVd5Z;	 	 	 	 	 dWd6Z<dXd7Z=dXd8Z>dYd9Z?dYd:Z@dZd;ZAd[d<ZB	 d\d=ZCd]d>ZD	 	 d^d?ZE	 	 	 d_d@ZF	 	 	 	 	 d`dAZGdB ZHdC ZIdD ZJdE ZK	 	 	 	 	 	 dadFZLdbdGZMdbdHZNdcdIZOdcdJZPy)d    N)lax)backend)check_conv_input_channels)#check_conv_transpose_input_channels)%compute_adaptive_pooling_window_sizes)+compute_conv_transpose_padding_args_for_jax)cast)convert_to_tensor)	is_tensor)scipyc                     t        |       } t        j                  | t        j                  d| j                              S N        r
   npmaximumarraydtypexs    o/var/www/html/emotional.easysim.app/public_html/venv/lib/python3.12/site-packages/keras/src/backend/numpy/nn.pyrelur      s,    !A::a#qww/00    c           	          t        |       } t        j                  t        j                  | t        j                  d| j
                              t        j                  d| j
                              S )Nr         @)r
   r   minimumr   r   r   r   s    r   relu6r      sM    !A ::


1bhhsAGG,-rxxQWW/E r   c                     t        |       } t        j                  d| j                        t        j                  d| j                        t        j                  |        z   z  S N      ?)r
   r   r   r   expr   s    r   sigmoidr"   &   sD    !A88C!RXXc177%;bffaRj%HIIr   c                 <   t        |       } t        j                  | dk  t        j                  d| j                        t        j                  | dk\  t        j                  d| j                        t        j                  d| dz   z  | j                                    S )Nr      r          ?r
   r   wherer   r   r   s    r   sparse_sigmoidr)   +   ss    !A88	R
agg
FBHHS!''*BHHSAE]AGG,L	
 r   c                 ,    t        j                  |       S N)r   tanhr   s    r   r,   r,   6   s    771:r   c                 H    t        |       } | t        j                  |       z
  S r+   )r
   r   r,   r   s    r   tanh_shrinkr.   :   s    !Arwwqz>r   c                     t        |       } t        j                  | t        j                  d| j                              S r   )r
   r   	logaddexpr   r   r   s    r   softplusr1   ?   s,    !A<<288C122r   c                     t        |       } | t        j                  d| j                        t        j                  |       z   z  S r   )r
   r   r   r   absr   s    r   softsignr4   D   s3    !Aagg&233r   c                 .   t        j                  | |kD  t        j                  | |z
  | j                        t        j                  | | k  t        j                  | |z   | j                        t        j                  d| j                                    S )Nr   r   )r   r(   r   r   r   	thresholds     r   soft_shrinkr9   I   sm    88	I
Yagg.

NHHQ]!''2HHS(	
 r   c                     t        j                  | dk  t        j                  | | j                        t        j                  | dk  t        j                  d| dz   dz  z  | j                        |             S )Nr$   r6   r%   g      ?   )r   r(   
zeros_liker   r   r   s    r   sparse_plusr=   U   s\    88	R
aqww'
Q%AEa<!7qwwGK r   c                 4    t        |       } | t        |       z  S r+   )r
   r"   r   s    r   silur?   ]   s    !Awqz>r   c                     t        |       } t        || j                        }| t        j                  | dz  |z         z   }|dz  S )Nr6   r;   )r
   r   r   sqrt)r   bys      r   
squareplusrD   b   s@    !A!177+A	BGGAqD1HAq5Lr   c                 2    t        |       } t        |         S r+   )r
   r1   r   s    r   log_sigmoidrF   i   s    !AaRL=r   c                     t        |       } t        j                  | t        j                  || j                        | z        S r+   r   )r   negative_slopes     r   
leaky_relurI   n   s1    !A::a.!'':Q>??r   c                 f   | t        j                  d| j                        z  t        j                  d| j                        z   } t        j                  | dk  t        j                  d| j                        t        j                  | dk\  t        j                  d| j                        |             S )Nr   r&   r   r    )r   r   r   r(   r   s    r   hard_sigmoidrK   s   s~     	
BHHS!''""RXXc177%;;A88	S
agg
c288C115 r   c                     | t        |       z  S r+   )rK   r   s    r   	hard_silurM   ~   s    |Ar   c                     t        |       } t        j                  | t        j                  d| j                        k\  | t        j                  || j                        t        j
                  |       z        S r   )r
   r   r(   r   r   expm1r   alphas     r   elurR      sT    !A88	RXXc177##Q(@288A;(N r   c                 z    d}d}t        |       } t        j                  || j                        t	        | |      z  S )Ng,x?g2֫?)r
   r   r   r   rR   )r   rQ   scales      r   selurU      s6    -E-E!A88E177#c!Um33r   c           
         t        |       } |rt        j                  dt        j                  z        j	                  | j
                        }t        j                  d| j
                        t        j                  d| j
                        t        j                  || t        j                  d| j
                        | dz  j	                  | j
                        z  z   z        z   z  }| |z  S t        j                  d      j	                  | j
                        }| t        j                  j                  | |z        dz   j	                  | j
                        z  t        j                  d| j
                        z  S )Nr;   r&   r    gHm?   r%   )r
   r   rA   piastyper   r   r,   r   specialerf)r   approximatesqrt_2_over_picdfsqrt_2s        r   gelur`      s   !ARUU+22177;hhsAGG$HHS!''"ggrxx!''2ad]]1775KKKM
 3w""177+}}  V,q088ABhhq!''"#	
r   c                 `   t        |       } t        j                  || j                        }t        j                  | t        j                  d| j                              |t        j
                  t        j                  | t        j                  d| j                              |z        z  z   S Nr   r6   )r
   r   r   r   r   rO   r   rP   s     r   celurc      s|    !AHHUAGG$E::a#QWW56


1bhhs!''23e;B :  r   c                     t        |       } | j                  }| j                  |   dz  dk7  rt        d| j                   d|       t	        j
                  | d|      \  }}|t        |      z  j                  |      S )Nr;   r   z4axis size must be divisible by 2. Received: x.shape=z with axis=)r
   r   shape
ValueErrorr   splitr"   rY   )r   axisr   x1x2s        r   glurk      s    !AGGEwwt}qA!!"	TF<
 	
 XXaD!FB$$U++r   c                    t        |       } t        j                  d| j                        }t        j                  d| j                        }t        j                  t        j
                  | ||      | j                        S )N      r    r6   )r
   r   asarrayr   r   clip)r   min_valmax_vals      r   	hard_tanhrr      sV    !Ajjqww'Gjjagg&G88BGGAw0@@r   c           
      .   t        |       } t        j                  || j                        }t        j                  t        j
                  t        j                  |       |kD  | t        j                  d| j                              | j                        S rb   )r
   r   rn   r   r   r(   r3   r7   s     r   hard_shrinkrt      sd    !A

9agg.I88
Y&288Cqww+GHgg r   c                     t        |       } t        j                  | |kD  | t        j                  || j                              S )Nr6   r'   )r   r8   default_values      r   r8   r8      s2    !A88A	M1bhh}AGG&LMMr   c                     t        j                  | t        j                  | |d      z
        }|t        j                  ||d      z  S NTrh   keepdims)r   r!   maxsum)r   rh   exp_xs      r   softmaxr~      s:    FF1rvvadT::;E266%dT:::r   c                     t        j                  | |d      }t        j                  t        j                  | |z
        j	                  |d            }| |z
  |z
  S rx   )r   r{   logr!   r|   )r   rh   max_x	logsumexps       r   log_softmaxr      sN    FF14$/Ervva%i(,,$,FGIu9y  r   c                    t        |       }dt        j                  d|z  |      z  }t        j                  ||      }t        j                  d|j
                  |   dz         }dg|j                  z  }d||<   |j                  |      }||dz
  |z  z
  dkD  }t        j                  ||d      }t        j                  ||d      }	t        j                  |	|d      dz
  |z  }
t        j                  ||
z
  d      }|S )	Nrm   rh   r%   r$   r   Try   r   )r
   r   sortcumsumarangere   ndimreshaper|   r(   r   )r   rh   logitslogits_sortedlogits_cumsumrr_shapesupportklogits_cumsum_safetauoutputs               r   	sparsemaxr      s    q!F2774&=t<<MIIm$7M
		!V\\$'!+,AcFKKGGDM			'A}q0A559G
wTD1A'=#>66$4$?!Cq
HCZZc*FMr   c                 f    t        | t              r| f|z  n| } |s| S |dk(  r
d| z   dz   } | S d| z   } | S )Nchannels_lastr%   )r%   r%   
isinstanceint)r   num_spatial_dimsdata_formatinclude_batch_and_channelss       r   _convert_to_spatial_operandr      sP     $.a#51A%o%1HtO H !OHr   c           
          |dvrt        d| d      |j                         }t        j                  t	        j
                  | |||||            S )aC  Helper function to define pooling functions.

    Args:
        inputs: input data of shape `N+2`.
        initial_value: the initial value for the reduction.
        reduce_fn: a reduce function of the form `(T, T) -> T`.
        pool_size: a sequence of `N` integers, representing the window size to
            reduce over.
        strides: a sequence of `N` integers, representing the inter-window
            strides (default: `(1, ..., 1)`).
        padding: either the string `same` or `valid`.

    Returns:
        The output of the reduction for each window slice.
    )samevalidzInvalid padding 'z', must be 'same' or 'valid'.)rf   upperr   r   r   reduce_window)inputsinitial_value	reduce_fn	pool_sizestridespaddings         r   _poolr      se    . ''y(EF
 	
 mmoG88	
	 	r   c                     t        j                  |      }| j                  dz
  }t        |||      }||n|}t        |||      }t	        | t
        j                   t        j                  |||      S )Nr;   )	r   standardize_data_formatr   r   r   r   infr   r{   )r   r   r   r   r   r   s         r   max_poolr   %  st     11+>K{{Q+#[I #?iG)!;G "&&#''9gwGGr   c                    t        j                  |      }| j                  dz
  }t        |||      }||n|}t        |||      }t	        | dt
        j                  |||      }|dk(  r|t        j                  |      z  S t        | j                  |      D cg c]  \  }}|dk7  r|nd }	}}t	        t        j                  |	| j                        dt
        j                  |||      }
||
z  S c c}}w )Nr;   r   r   r%   )r   r   r   r   r   r   addmathprodzipre   r   onesr   )r   r   r   r   r   r   pooledarB   re   window_countss              r   average_poolr   8  s    11+>K{{Q+#[I #?iG)!;G 63GWEF'		),,, 036<</K
%+a!q&Qa
 
 GGE6<<(GG
 %%
s   C0c                    t        j                  t        j                  |      | z  |z        j                  t         j                        }t        j
                  t        j                  d|dz         | z  |z        j                  t         j                        }||z
  }||k(  }|dz
  }| |z
  dz   }|}	||z   }
t        j                  ||
|	      }|j                  t         j                        S )Nr%   )r   floorr   rY   int32ceilr(   )	input_dimoutput_size
big_windowwindow_startswindow_endswindow_sizesis_bigsmall_windowsmall_pool_lensmall_indicesbig_indicesgathers               r   (_compute_adaptive_pooling_gather_indicesr   `  s     HH	;	)	+{:fRXX  ''	1kAo	&	2kAfRXX  .LZ'F>L-1N!M.0KXXfk=9F==""r   c                     | j                   \  }}}||z
  dz   }| j                  }||||f}|d   |d   |d   |d   f}t        j                  j                  j                  | ||      S )Nr%   r   r;   )re   r   )re   r   r   libstride_tricks
as_strided)	r   window_sizenlcoutr   re   new_stridess	            r   _strided_view_1dr   x  sv    ggGAq!
k/A
CiiG[!$E1:wqz71:wqzBK66**1E;*OOr   c                 @   t        |t              r|f}|dk(  rt        j                  | d      } | j                  \  }}}|d   }t        ||      \  }}	t        |||	      }
t        | |      }|dk(  rt        j                  |d      nt        j                  |d      }t        | |	      }|dk(  rt        j                  |d      nt        j                  |d      }t        j                  ||gd      }|d d |
d d f   }|dk(  rt        j                  |d      }|S )Nchannels_first)r   r;   r%   r   averager;   r   r%   )r   r   r   	transposere   r   r   r   meanr{   concatenate)r   r   moder   r   r   r   out_lsmallbigr   sv_small
small_poolsv_bigbig_poolcombinedr   s                    r   _adaptive_pool1d_implr     s   +s#"n&&fi0llGAq!NE6q%@JE35aDF.H 9 	q!VVH1%  fc*F#'9#4Q"&&a:P  ~~z841=H
1fa<
 C&&ll3	*Jr   c                    t        |t              r||f}|dk(  rt        j                  | d      } | j                  \  }}}}|\  }}	t        ||      \  }
}t        |||      }t        j                  | d      j                  ||z  ||      }t        ||
      }|dk(  rt        j                  |d      nt        j                  |d      }t        ||      }|dk(  rt        j                  |d      nt        j                  |d      }t        j                  ||gd      }|d d |d d f   }|j                  ||||      }t        j                  |d      }t        ||	      \  }}t        ||	|      }|j                  ||z  ||      }t        ||      }|dk(  rt        j                  |d      nt        j                  |d      }t        ||      }|dk(  rt        j                  |d      nt        j                  |d      }t        j                  ||gd      }|d d |d d f   j                  |||	|      }|dk(  rt        j                  |d      }|S )	Nr   )r   r;   rW   r%   )r   r;   r%   rW   r   r;   r   r%   )r   rW   r%   r;   r   r   r   r   re   r   r   r   r   r   r{   r   )r   r   r   r   r   hwr   out_hout_wsmall_hbig_hgather_hx_h
sv_small_hsmall_pool_hsv_big_h
big_pool_h
combined_hpooled_hsmall_wbig_wgather_wx_w
sv_small_wsmall_pool_wsv_big_w
big_pool_w
combined_wr   s                                 r   _adaptive_pool2d_implr     sK   +s#"K0&&fl3JAq!QLE5:1eDNGU75%HH
,,v|
,
4
4QUAq
AC!#w/J 9 	
#VVJQ'   U+H 9 	q!VVH1%  z :CJ!Xq.)H1eQ/H||Hl3H:1eDNGU75%HH


1u9a
+C!#w/J 9 	
#VVJQ'   U+H 9 	q!VVH1%  z :CJ
Q!^
$
,
,Qua
@C&&ll3-Jr   c                    t        |t              r|||f}|dk(  rt        j                  | d      } | j                  \  }}}}}|\  }	}
}t        ||	      \  }}t        ||	|      }t        j                  | d      j                  ||z  |z  ||      }t        ||      }|dk(  rt        j                  |d      nt        j                  |d      }t        ||      }|dk(  rt        j                  |d      nt        j                  |d      }t        j                  ||gd      }|d d |d d f   j                  ||||	|      }t        j                  |d      }t        ||
      \  }}t        ||
|      }t        j                  |d	      j                  ||	z  |z  ||      }t        ||      }|dk(  rt        j                  |d      nt        j                  |d      }t        ||      }|dk(  rt        j                  |d      nt        j                  |d      }t        j                  ||gd      }|d d |d d f   j                  ||	||
|      }t        j                  |d	      }t        ||      \  } }!t        |||!      }"|j                  ||	z  |
z  ||      }#t        |#|       }$|dk(  rt        j                  |$d      nt        j                  |$d      }%t        |#|!      }&|dk(  rt        j                  |&d      nt        j                  |&d      }'t        j                  |%|'gd      }(|(d d |"d d f   j                  ||	|
||      })|dk(  rt        j                  |)d
      })|)S )Nr   )r   r;   rW      r%   )r   r;   rW   r%   r  r   r;   r   r%   )r   rW   r%   r;   r  )r   r%   rW   r;   r  )r   r  r%   r;   rW   r   )*r   r   r   r   r   dr   r   r   out_dr   r   small_dbig_dgather_dx_d
sv_small_dsmall_pool_dsv_big_d
big_pool_d
combined_dpooled_dr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s*                                             r   _adaptive_pool3d_implr    s]   +s#"K=&&fo6LLMAq!Q%E5%:1eDNGU75%HH
,,v
/
7
7A	1a
HC!#w/J 9 	
#VVJQ'   U+H 9 	q!VVH1%  z :CJ!Xq.)11!Q5!DH||Ho6H:1eDNGU75%HH
,,x
1
9
9!e)a-A
NC!#w/J 9 	
#VVJQ'   U+H 9 	q!VVH1%  z :CJ!Xq.)11!UAuaHH||Ho6H:1eDNGU75%HH


1u9u,a
3C!#w/J 9 	
#VVJQ'   U+H 9 	q!VVH1%  z :CJ
Q!^
$
,
,QueQ
GC&&ll30Jr   c                     t        j                  |      }| j                  dz
  }|dk(  rt        | |d|      S |dk(  rt	        | |d|      S |dk(  rt        | |d|      S t        d      )Nr;   r%   r   rW   z,adaptive_average_pool supports only 1D/2D/3Dr   r   r   r   r   r  rf   r   r   r   dimss       r   adaptive_average_poolr  8  s    11+>K;;?Dqy$KK
 	
 qy$KK
 	
 qy$KK
 	
 C
DDr   c                     t        j                  |      }| j                  dz
  }|dk(  rt        | |d|      S |dk(  rt	        | |d|      S |dk(  rt        | |d|      S t        d      )Nr;   r%   r{   rW   z(adaptive_max_pool supports only 1D/2D/3Dr  r  s       r   adaptive_max_poolr  J  ss    11+>K;;?Dqy$V[%MMqy$V[%MMqy$V[%MM
?
@@r   c                 N   | dz   }|dk(  r#t        t        d|dz
              }d|dz
  f|z   }nt        t        d|            }d|z   }|r#|dz
  |dz
  ft        t        |dz
              z   }n"|dz
  |dz
  ft        t        |dz
              z   }t        j                  |||      S )z9Create a `lax.ConvDimensionNumbers` for the given inputs.r;   r   r%   r   r   r%   )lhs_specrhs_specout_spec)tupleranger   ConvDimensionNumbers)r   r   r   num_dimsspatial_dims	inputs_dn	kernel_dns          r   &_convert_to_lax_conv_dimension_numbersr"  V  s      !#Ho%U1hl341%4	U1h/0\)	\8a<05x!|9L3MM	\8a<05x!|9L3MM	##Y r   c                 D   t        j                  |      }| j                  dz
  }t        ||d      }t	        |||d      }t	        |||d      }|dk(  r| j
                  d   }n| j
                  d   }|j
                  d   }	||	z  d	kD  rt        d
| d|	 d      ||	z  }
t        j                  t        j                  j                  | t        |      r|n|j                         |||||
            }|j                  d	k(  r| j                  d	k7  rt        d      |S )Nr;   Fr   r   r   r$   r%   r   zgThe number of input channels must be evenly divisible by kernel's in_channels. Received input channels z and kernel in_channels z. rhs_dilationdimension_numbersfeature_group_countzThe convolution operation resulted in an empty output. This can happen if the input is too small for the given kernel size, strides, dilation rate, and padding mode. Please check the input shape and convolution parameters.)r   r   r   r"  r   re   rf   r   r   jaxr   conv_general_dilatedr   numpysize)r   kernelr   r   r   dilation_rater   r)  channelskernel_in_channelsr*  results               r   convr4  o  s\    11+>K{{Q>
 *#(	G 0#(	M o%<<#<<?b)$$q(==EJ G""4!5R9
 	

 #&88XX$$'FV\\^&/ 3 	% 	

F {{aFKK1,G
 	
 Mr   c                 F   t        j                  |      }t        |       } t        |      }t        | ||       | j                  dz
  }t        ||d      }t        |||d      }t        |||d      }|dk(  r| j                  d   n| j                  d   }t        j                  t        |      r|n|j                         |j                  d d d||j                  d   z  fz         }t        j                  t        j                  j                  | ||||||	            S )
Nr;   Fr$  r%  r   r$   r%   r&  r'  )r   r   r
   r   r   r"  r   re   r   r   r   r-  r   r+  r   r,  )	r   r/  r   r   r   r0  r   r)  r*  s	            r   depthwise_convr6    s2    11+>Kv&Fv&Fffk:{{Q>
 *#(	G 0#(	M (?:RQ  ZZF#SbQ 3fll26F FGGF 88$$&/ 3 	% 	

 
r   c                     t        j                  |      }t        |       } t        |      }t        |      }t        | ||       t	        | |||||      }t        ||dd||      S )Nr%   r   )r   r   r   r0  )r   r   r
   r   r6  r4  )r   depthwise_kernelpointwise_kernelr   r   r   r0  depthwise_conv_outputs           r   separable_convr;    s     11+>Kv&F()9:()9:f&6D* # r   c                    t        j                  |      }t        |       } t        |      }t        | ||       | j                  dz
  }t        | j                  |j                  ||||      }t        ||d      }	t        |||d      }t        |||d      }t        j                  t        j                  j                  | t        |      r|n|j                         ||||	d            S )Nr;   )input_shapekernel_shaper   r   output_paddingr0  Fr$  r%  T)r   r(  r)  transpose_kernel)r   r   r
   r   r   r   re   r"  r   r   r   r+  r   conv_transposer   r-  )
r   r/  r   r   r?  r   r0  r   padding_valuesr)  s
             r   rA  rA    s     11+>Kv&Fv&F'D{{Q@LL\\%#N ?
 *#(	G 0#(	M 88'FV\\^"&/! 	 	

 
r   c                    |rt        d      |d}t        |       } | j                  }| j                  d      } |st	        j
                  |       dz   }| j                  d   }t	        j                  ||f|      }| dk\  }d|t	        j                  |      |   | |   f<   ||fz   }	t	        j                  ||	      }|dk7  rt	        j                  |d|      }|S )N2Unsupported value `sparse=True` with numpy backendfloat32r$   r%   r   r6   )	rf   r
   re   r   r   r{   zerosr   moveaxis)
r   num_classesrh   r   sparser=  
batch_sizecategoricalvalid_indicesoutput_shapes
             r   one_hotrN  2  s    MNN}!A''K			"AffQi!mJ((J4EBKFMJKK		*%m4a6FFG +/L**[,7K rzkk+r48r   c                     |rt        d      t        |       } t        | j                        dkD  rdnd}t	        j
                  t        t        | d      |||      |      }|S )NrD  r%   r   r   )rh   r   r   )rf   r
   lenre   r   r{   rN  r	   )r   rH  rh   r   rI  reduction_axisoutputss          r   	multi_hotrS  N  s^    MNN!Aagg,*QNffQ +DFG Nr   c                 ~   t        j                  |       } t        j                  |      }| j                  |j                  k7  r%t        d| j                   d|j                         t	        | j                        dk  r%t        d| j                   d|j                         |rt        ||      }nn|t        j                  ||d      z  }t        j                  |t        j                         dt        j                         z
        }t        j                  |      }t        j                  | |z  |       S )	NQArguments `target` and `output` must have the same shape. Received: target.shape=, output.shape=r%   zPArguments `target` and `output` must be at least rank 1. Received: target.shape=r   Trz   r    )r   r   re   rf   rP  r   r|   ro   r   epsilonr   targetr   from_logitsrh   log_probs        r   categorical_crossentropyr]  Z  s
   XXfFXXfF||v||#"LL>H
 	

 6<<1"LL>H
 	
 vD1"&&==!2C'//:K4KL66&>FF6H$4000r   c                 L   t        j                  | d      } t        j                  |      }t        | j                        t        |j                        k(  r)| j                  d   dk(  rt        j                  | d      } t        |j                        dk  rt        d|j                         | j                  |j                  d d k7  r%t        d| j                   d|j                         |rt        ||      }nn|t        j                  ||d	
      z  }t        j                  |t        j                         dt        j                         z
        }t        j                  |      }t        | |j                  |   |      } t        j                  | |z  |       S )Nr   r6   r$   r%   r   zBArgument `output` must be at least rank 1. Received: output.shape=zcArguments `target` and `output` must have the same shape up until the last dimension: target.shape=rV  TrW  r    )r   r   rP  re   squeezerf   r   r|   ro   r   rX  r   rN  rY  s        r   sparse_categorical_crossentropyr`  t  sY   XXfG,FXXfF
6<<C--&,,r2Ba2GF,
6<<1"LL>+
 	

 ||v||CR(("LL>H
 	

 vD1"&&==!2C'//:K4KL66&>VV\\$/d;FFF6H$4000r   c                    t        j                  |       } t        j                  |      }| j                  |j                  k7  r%t        d| j                   d|j                         |rt	        |      }t        j
                  |t        j                         dt        j                         z
        }| t        j                  |      z  }|d| z
  t        j                  d|z
        z  z  }| S )NrU  rV  r    )	r   r   re   rf   r"   ro   r   rX  r   )rZ  r   r[  bces       r   binary_crossentropyrc    s    XXfFXXfF||v||#"LL>H
 	
 WWVW__.goo6G0GHF
266&>
!CC&LBFF3<000C4Kr   c                    |rt        d      t        |t              rt        |      n|}d}t	        j
                  | j                        }|dk(  rd}t        | d      } t        j                  | |d      }t        j                  t        j                  |       |d      t        j                  |      z
  }|s,t        j                  ||      }t        j                  ||      }|rt        j                  |t        j                  t        j                        j                  t        j                  t        j                        j                         }t        j                  |t        j                  t        j                        j                  t        j                  t        j                        j                         }t        ||      }t        ||      }||fS )Nz7Argument synchronized=True is not supported with NumPy.Ffloat16TrE  rW  ry   )NotImplementedErrorr   listr  r   standardize_dtyper   r	   r   r   squarer_  ro   finfore  minr{   )r   axesrz   synchronized	need_cast	ori_dtyper   variances           r   momentsrq    sW   !E
 	
 %T405;dD I))!''2II	I771dT*D wwryy|$>4PHzz$%::h-wwtRXXbjj155rxx

7K7O7OP77bhhrzz*..0D0H0H
 D)$),>r   c                 v   dgt        | j                        z  }|j                  d   ||<   t        j                  ||      }t        j                  ||      }dt        j                  ||z         z  }|t        j                  ||      }||z  }| |z  }	|t        j                  ||      }|	|z   }	| |z  |	z   S )Nr%   r   r    )rP  re   r   r   rA   )
r   r   rp  rh   offsetrT   rX  re   invress
             r   batch_normalizationrv    s     C#agg,E**Q-E$K::dE"Dzz(E*H
7*+
+C

5%(Ek%#+CFE*Fls7S=r   c                    t        | d      } t        |      }t        |d      }t        |d      }|j                  \  }}| j                  \  }dt        j                  |j                  d      }|j                  |      }d }	 |	||      }
 |	||      }|
j                  |j                        }
|j                  |j                        }t        |d      }|t        j                  |
d      j                  t        j                        z
  }| d d d df   | d d dd f   k(  j                  t        j                        t        j                  d	      |d d d d ||dz   f   }t        j                  |d
      }t        | |      }t        j                  d||      }t        j                  |d
      }t        j                  |dz   f|j                        z  }d|d d df<   t        j                  |f|j                        z  }d fd}d }|||j                  d      f} ||||f|      \  }\  }} |d   |d         }||d<   t        ||dz         }t        j                  d||       }|S )Nr   r6   g     jrE  c                     t        j                  |      j                  d| j                  z  |fz         }t        j                  | d      } || k  }t        j
                  |      S )Nr   r$   r   )r   r   r   r   expand_dimslogical_not)lengths
max_lengthindices
elem_valids       r   _lengths_to_paddingsz&ctc_loss.<locals>._lengths_to_paddings  sY    ))J'//7<<:-/
 ..r2w&
~~j))r   r$   r   r%   )r   r   r  r%   r   r;   )rH  zbtk,bnk->btnr   r   c           	          t        j                  | d d d df   t        j                  | d d dd f   |      gd      S )Nr%   r$   r   )r   r   r0   )phiadded_scores     r   update_phi_scorez"ctc_loss.<locals>.update_phi_score  s>    ~~BQBZc!QR%j+>?b
 	
r   c                 (   | \  }}|} ||z  z         }|\  }}}t        j                  |d d d df   |z   ||z         }||z   }	 |	||z   dz
  z  z         }	|j                  
df      }||z  d|z
  |z  z   }||z  d|z
  |	z  z   }	|	|f|	|ffS )Nr$   r    r%   )r   r0   r   )prevr   prev_phi	prev_emitprev_phi_origlogprob_emitlogprob_phipad	next_emitnext_phirJ  log_epsilonrepeatr  s             r   	loop_bodyzctc_loss.<locals>.loop_body  s    ") #Hi+:N.NO)*&k3 LLQV|+Y-E
	 k)#i+-sV|0LL
 kk:q/*)OsSyI&==	&#)x)??)$x&;;;r   c           
         |}g }t        | D ]  } | ||      \  }}|j                  |       ! g }t        t        |d               D ]7  }|j                  t	        j
                  |D cg c]  }||   	 c}             9 ||fS c c}w )Nr   )r   appendr  rP  r   stack)	finitxscarryysr   rC   r3  is	            r   np_scanzctc_loss.<locals>.np_scan2  s    b 	A{HE1IIaL	 s2a5z" 	8AMM"(("#5QAaD#567	8f} $6s   )Br%   r   zbn,bn->b)r
   re   r   result_typer   rY   r   r   r|   r   rE  r  r   rN  einsumr   )rZ  r   target_lengthoutput_length
mask_indexmax_input_lengthrH  max_label_lengthr   r  target_paddingsoutput_paddingslogprobslabel_lengthslogprobs_phi_one_hotlogprobs_emitlogalpha_phi_initlogalpha_emit_initr  r  r  _logalpha_philogalpha_emitlogalpha_phi_lastper_seq_lossrJ  r  r  r  s                              @@@@r   ctc_lossr    s    vW5Fv&F%mW=M%mW=M06-J +#)<< J K i8E]]5!F* +=:JKO*=:JKO%,,V\\:O%,,V\\:O6+H$rvvoA'F'M'M
( M
 QVnq!"u-55bjjAFVVF,-FAq*zA~"==>L<<i8Lv;7HIInhAMLL	:M 	-12&,,G
	  "ad
-.fllC
	 

<2	 '@'@'H	IB'.%'9:B($A$m
 )b)9=;LM(L }2BQ2FGHIIj*;XFFLr   c                    t        |       } t        |d      }| j                  \  }}}||dz
  }t        j                  | d      j	                  d      }t        j
                  | d      }t        j                  |      d d d f   }	|	|d d d f   k\  }	t        j                  |	||      }t        j                  |	d|      }|rD|d d dd f   |d d d df   k(  }
t        j                  |
d      }
t        j                  |
||      }||k(  }t        j                  |d|      }t        j                  t        j                  |      d      }t        j                  ||df      }t        j                  |||      }t        j                  |d      }t        j                  ||d      }t        j                  |d      d d d f    }t        j                  |d      }||fS )	Nr   r6   r%   r$   r   r   )r  r  r   )r
   re   r   argmaxrY   r{   r   r(   r  ry  tileargsorttake_along_axisr|   )r   sequence_lengthsmerge_repeatedr  rJ  r|  rH  r}  scoresseqlen_maskrepeat_maskinvalid_maskorders                r   _ctc_greedy_decoder  M  s    v&F()9I*0,,'J
K 1_
iiR(//8GVVF$F))J'a0K!1!T'!::Khh{J8GXXk3/Faen3B37ff[*:;((;
G< j(Lhh|R1G NN299Z0q9EGGEJ?+EHH\:u5EJJu2&E  %b9GffV!$QW--FnnW1-GF?r   c                 (   t        |       } t        |      }| j                  \  }}t        | d      } t        j                  |      d d d f   |d d d f   k\  }dz
  t        j
                  | d      } z
  dz
  dt        j                  |dz  |ft        j                        }t        j                  t        j                  g            }	t        j                  | d d df   d      d d |	 d f   }
t        j                  |
k(  |
      }||d d d |	df<   t        j                  |dz  ft        j                   | j                        }t        j                  | d d df   |
d      |d d d |	f<   |d d d d df   k(  }fdd fd	fd
fdfd}t        |||| |      D cg c]  \  }}}}} ||||||       }}}}}}t        j                   |D cg c]  }|d   	 c}      }t        j                   |D cg c]  }|d   	 c}      }t        j                  |k(  |z
  dz
        }t        j"                  |g d      }||fS c c}}}}}w c c}w c c}w )Nr$   r   r%   r;   r6   r   c                 F   t        j                  | d      } t        j                  |      }t        j                  |      }t        j                  | 
k(  d      }t        j                  dz  z        }| ||dz
  f   }t        j                  |dk(  
|      }t        j                        }
|<   t        j
                  |dz        }|}|
k(  }| ||k(  z  }	t        j                  |	
|      }|| ||f<   t        j
                  |dz        }||z   }| ||fS )Nr   r   r%   r;   )r   r  r  r   r(   r  )pathsr  maskedr   path_tail_indexpaths_arange
path_tailsclassesprev_maskedmasked_repeat_pad
beam_widthr  rH  s             r   _extend_pathsz._ctc_beam_search_decode.<locals>._extend_paths  s!   		%156;/6;/))ETM:yyZ+!=><1)<<=
XXo2D*E
))K("
'''1z>2D$
g(=>((=$8/6lO+,GGAq:~&!ff$$r   c                     t        j                  |      }t        j                  ||z
        }t        j                  |      }t         j                  j                  || |       t        j                  |      |z   S r+   )r   r{   r!   r<   r   atr   )unique_inverser  
scores_max
scores_exp
new_scoress        r   _merge_scoresz._ctc_beam_search_decode.<locals>._merge_scores  sX    VVF^
VVFZ/0
]]6*

		*nj9vvj!J..r   c                 J   t        j                  | dd      \  } }dz  z  t        |       z
  }|dkD  rt        j                  | d|gddgg
      } | d dz  z   } t        |j                        dk\  rt        j
                  |d      }t        j                  |t         j                   |      }t        j                  ||t         j                         } 	||      } 	||      }t        j                  ||      }t        j                  |d	       d  }| |   } ||   }||   }t        j                  | d
      } t        j                  ||g      }t        j                  t        j                  t              t        j                  t              g      }| ||fS )NTr   return_inverserh   r;   constant_valuesr%   r   stable)kind)r;   r%   )r   uniquerP  r  re   r_  r(   r   r0   r  r  r   rF  boolr   )r  r  r  r  pad_sizeemit_scoresmask_scorestotal_scorestop_indicesr  r  r  rH  s            r   _prune_pathsz-_ctc_beam_search_decode.<locals>._prune_paths  s}    "		%1 M~Oj0CJ>a<FF5Ax=1a&"94PE4K*45~##$)ZZQ?Nhhvw7hhvvw7#NK@#NK@||K=jjH=zklKk"!+.!+.v&k :;XXj$'T)BC
 ff$$r   c                 H     | |||      \  } }} | ||      \  } }}| ||fS r+    )r  r  r  r   r  r  s       r   _decode_stepz-_ctc_beam_search_decode.<locals>._decode_step  s<     -eVVQ Gvv ,UFF Cvvff$$r   c                 J    | \  }}}|\  }}|s ||||      \  }}}|||fd fS r+   r  )r  r   r  r  r  r  r  s         r   _stepz&_ctc_beam_search_decode.<locals>._step  sD     $vv;$0$J!E66vv&,,r   c                    d } || ||f|dd  |dd  f      \  \  }}}}	t        j                  |dd      \  }}
dz  z  t        |      z
  }|dkD  rt        j                  |d|gddgg      }|d dz  z   }t        |
j                        dk\  rt        j
                  |
d      }
 |
|      }t        j                  |       d  d d d	   }||   }||   }||fS )
Nc                 @    |}t        | D ]  } | ||      \  }} |d fS r+   )r   )r  r  r  r  r   rC   s         r   np_scan_only_carryzJ_ctc_beam_search_decode.<locals>._decode_batch.<locals>.np_scan_only_carry  s3    E"X 'UA;q'$;r   r%   Tr   r  r;   r  r   r$   )r   r  rP  r  re   r_  r  )
init_pathsinit_scoresinit_maskedr   r  r  r  r  r  r  r  r  r  r  r  r  r  rH  	top_pathss                r   _decode_batchz._ctc_beam_search_decode.<locals>._decode_batch  s   	 &8k2ABZQR)&
" !#		%1 M~Oj0CJ>a<FF5Ax=1a&"94PE4K*45~##$)ZZQ?N~v6jj()5dd;k"$f}r   r  )r
   re   r   r   r   flipfullr   rk  r   r  r(   r   r   r  r   r  r   )r   r  r  r  r  rJ  max_seq_lenr  r  num_init_pathsmax_classesinit_classesr  r  r  psmr  smresultsr   r  r  r  r  r  r  r  r  rH  s     ```                   @@@@@@@r   _ctc_beam_search_decoder  x  s    v&F()9:+1<<(J[b)F))K(q15Eag5NNK 1_
 WWV!$Fz)A-JD	Q^[14rxxJ VVBHHk:%>?@N**VAqD\21~o6F3FGK88K:5t[IL(4Jq/>/1$%''	Q^$rvvgV\\K ')&8&8q!tk'K?N?"# Q1W%-K%4/%<%
- @ "[&+
 Aq!Q 	aAq"%G  HHG,qad,-EXXW-qt-.F HHUd]D+*=*ABELL	*E&= --s   JJ
2Jc                     t        |       } t        j                  | j                  d      }t	        | |      } |dk(  rt        | |||      S |dk(  rt        | ||||      S t        d| d      )NrE  greedy)r  r  beam_search)r  r  r  zInvalid strategy z2. Supported values are 'greedy' and 'beam_search'.)r
   r   r  r   r	   r  r  rf   )r   r  strategyr  r  r  r  r   s           r   
ctc_decoder    s     v&Fi8E&% F8!)!	
 	
 
]	"&!!
 	
 z ** *
 	
r   c                 j   | j                   |j                   k7  r&t        d| j                    d|j                    d      t        ||j                        }t	        j
                  t	        j                  | |z
              }dt	        j                  |      z  dt	        j                  |      z  z
  }|S )NzInput shapes z and z" must match for PSNR calculation. r6      
   )re   rf   r
   r   r   r   ri  log10)ri   rj   rq   msepsnrs        r   r  r  >  s    	xx288BHH:U288* 5+ +
 	

  rxx8G
''"))BG$
%C!!B#$66DKr   c                 r    t        j                  |       } | dk(  rdnd}t        j                  |dz  |       S )Nre  g    @g̓$Ggffffffr6   )r   rh  r   rn   )r   vals     r   _get_large_negativer
  K  s5    %%e,Ei''ZC::cDj..r   c                    ||s| S t        j                  | t         j                        }|t        j                  ||      }|r{| j                  d   | j                  d   }}t        j
                  t        j                  ||ft         j                              }|d d d d d d f   }t        j                  ||      }t        j                  || t        | j                              }|S )Nr6   r;   rW   )
r   	ones_likebool_logical_andre   trilr   r(   r
  r   )r   mask	is_causalcombined_maskTSpadded_logitss          r   _apply_masksr  Q  s    |ILLrxx8M}d;||AQ1wwrww1vRXX67D$1$%}d;HHv26<<@M r   c                 Z   |j                   }t        j                  | j                   t        j                        }t	        j
                  |j                         dk(  r"|j                  d      }|j                  d      }t        j                  d| |      }	|	j                  |      }	|	t        j                  ||	j                         z  }	||	|z   j                  |	j                         }	t        |	||      }
|
j                  t        j                        }
t        |
d      j                  |      }|j                   }t	        j
                  |j                         dk(  r"|j                  d      }|j                  d      }t        j                  d||      }|j                  |      }|S )Nbfloat16rE  zBTNH,BSNH->BNTSr6   r$   r   zBNTS,BSNH->BTNH)r   r   promote_typesrE  r   rh  rY   r  r   r  r~   )querykeyvaluebiasr  r  rT   original_dtypelogits_dtyper   r  probsencoded_dtypeencodeds                 r   _dot_product_attention_xlar#  e  sM   YYN##EKK<L  +z9jj#Y'YY(%5F]]<(F
bhhuFLL11F4-''5 y9M "((4MM+22>BEKKM  -;Y'Y'ii)5%8Gnn]+GNr   c	           	      H   |d}|rt        d      t        |       } t        |      }t        |      }t        | j                        dk7  r3t        d| j                   d|j                   d|j                   d      t	        j
                  | j                  |j                  |j                        }	t        | |	      } t        ||	      }t        ||	      }|t        ||	      }|j                  \  }
}
}
}|d	t        j                  |      z  n|}t        | ||||||      S )
NFz2Flash attention is not supported in numpy backend.r  zG`dot_product_attention` only supports 4D inputs. Received: query.shape=z, key.shape=z, value.shape=.r6   r    )rf   r
   rP  re   r   r  r   r	   r   rA   r#  )r  r  r  r  r  rT   r  flash_attentionattn_logits_soft_capcompute_dtyper  Hs               r   dot_product_attentionr*    s'    MNN
 e$E
C
 Ce$E
5;;1%%*[[Mcii[ I ;;-q*
 	

 ''SYYLM&E
sM
"C&E ];JAq!Q"'-S2771:UE%sE4y% r   c           
         d } ||      } ||      } ||      } ||      }	| j                   \  }
}}}t        d |D              r,t        j                  | dd|d   |d   f|d   |d   ffd      } | j                   d   |d   dz
  |d   z  z
  dz
  |	d   z  dz   }| j                   d	   |d   dz
  |d   z  z
  dz
  |	d   z  dz   }t        j                  d|      |	d   z  }t        j                  d|      |	d   z  }t        j
                  ||d
      \  }}|j                  d      }|j                  d      }t        j                  |
||d   |d   ||z  f| j                        }t        |d         D ]B  }t        |d         D ]/  }| dddd|||d   z  z   |||d   z  z   f   |dddd||ddf<   1 D |j                  |
||d   z  |d   z  d      S )a  NumPy implementation of Unfold.
    Extract sliding local blocks from a **NCHW** batched image tensor.

    Args:
        input: 4-D tensor, shape (N, C, H, W)  **required**.
        kernel_size: int or (kH, kW)
        dilation: int or (dH, dW), default 1
        padding: int or (pH, pW), default 0
        stride: int or (sH, sW), default 1

    Returns:
        3-D tensor, shape (N, C*kH*kW, L)
    c                 .    t        | t              r| | fS | S r+   r   r   s    r   _pairzunfold.<locals>._pair  s    #As+1v22r   c              3   &   K   | ]	  }|d kD    yw)r   Nr  ).0r  s     r   	<genexpr>zunfold.<locals>.<genexpr>  s     
Q1q5
s   r  r   r%   constant)r   r;   rW   ij)indexingr$   r6   N)
re   anyr   r  r   meshgridr   emptyr   r  )inputkernel_sizedilationr   strider-  r   r  r  r  NCr)  WoHoWi0j0r  jpatchesidxjdxs                          r   unfoldrF    s   3 	kAhAgAfAJAq!Q 
!
FFQqT1Q4L1Q41,?j

 ++a.AaD1H!,
,q
0QqT	9A	=B
++a.AaD1H!,
,q
0QqT	9A	=B	1b	AaD	 B	1b	AaD	 B;;r2-DAq			"A			"A hh1adAaD"r'2%++FGQqT{ 1; 	C).1a#!*na#!*n4*GAq#sA%&	 ??1a!A$h1or22r   c                 4   d } ||      \  }} ||      \  }	}
 ||      \  }} ||      \  }} ||      \  }}| j                   \  }}}||	|
z  z  }|d|z  z   ||	dz
  z  z
  dz
  |z  dz   }|d|z  z   ||
dz
  z  z
  dz
  |z  dz   }t        j                  | |||	|
||f      } |d|z  z   }|d|z  z   }t        j                  ||||f| j                        }t        |	      D ]  }t        |
      D ]  }||z  }||z  }|t        j                  |      |z  z   }|t        j                  |      |z  z   }t        j                  ||      \  } }!|dddd| |!fxx   | dddd||ddddf   z  cc<     |dkD  s|dkD  r|dddd|||z
  |||z
  f   }|S )a  NumPy implementation of Fold (col2im).
    Combine an array of sliding local blocks into a large tensor.

    Args:
        x: 3-D tensor, shape (N, C*kH*kW, L)  **required**.
        output_size: int or (oH, oW)
        kernel_size: int or (kH, kW)
        dilation: int or (dH, dW), default 1
        padding: int or (pH, pW), default 0
        stride: int or (sH, sW), default 1

    Returns:
        4-D tensor, shape (N, C, oH, oW)
    c                 .    t        | t              r| | fS | S r+   r   )r	  s    r   r-  zfold.<locals>._pair  s    'S1Sz:s:r   r;   r%   r6   Nr   )re   r   r   rF  r   r  r   ix_)"r   r   r8  r9  r   r:  r-  r>  r?  kHkWdHdWpHpWsHsWr;  CKKLr<  nHnWoH_padoW_padr   r  rB  h_startw_start	h_indices	w_indicesh_ixw_ixs"                                     r   foldr^    s    ; ;FB;FB8_FB7^FB6]FBIAsARA q2v+b1f
%
)b	01	4B
q2v+b1f
%
)b	01	4B 	

1q!RR,-A !b&[F!b&[FXXq!VV,AGG<F2Y <r 	<A"fG"fG"))B-""44I"))B-""44I	95JD$1at#$!Q1a*:(;;$	<< 
Ava1b6B;.Vb[0@@AMr   c           	         |dk(  rm| j                   \  }}}}||dz  z  }t        j                  | ||||||f      } t        j                  | d      } t        j                  | |||z  ||z  |f      } | S | j                   \  }}}}||dz  z  }t        j                  | ||||||f      } t        j                  | d      } t        j                  | ||||z  ||z  f      } | S )a-  NumPy implementation of depth_to_space (pixel shuffle).

    Rearranges data from depth into blocks of spatial data.

    Args:
        x: 4-D tensor with shape (N, H, W, C) for channels_last or
            (N, C, H, W) for channels_first.
        block_size: An integer specifying the block size.
        data_format: "channels_last" or "channels_first".

    Returns:
        A tensor with shape (N, H*block_size, W*block_size, C/block_size**2)
        for channels_last or (N, C/block_size**2, H*block_size, W*block_size)
        for channels_first.
    r   r;   r   r%   rW   r;   r     )r   r%   r  r;   ra  rW   re   r   r   r   )r   
block_sizer   r   r   r   r   new_cs           r   depth_to_spacere    s      o%WW
1aj!m$JJq1aJ
EBCLL./JJq1a*na*neDE H WW
1aj!m$JJq1eZQBCLL./JJq1eQ^Q^DEHr   c           	         |dk(  ro| j                   \  }}}}||z  }||z  }t        j                  | ||||||f      } t        j                  | d      } t        j                  | |||||dz  z  f      } | S | j                   \  }}}}||z  }||z  }t        j                  | ||||||f      } t        j                  | d      } t        j                  | |||dz  z  ||f      } | S )a%  NumPy implementation of space_to_depth (pixel unshuffle).

    Rearranges blocks of spatial data into depth.

    Args:
        x: 4-D tensor with shape (N, H, W, C) for channels_last or
            (N, C, H, W) for channels_first.
        block_size: An integer specifying the block size.
        data_format: "channels_last" or "channels_first".

    Returns:
        A tensor with shape (N, H/block_size, W/block_size, C*block_size**2)
        for channels_last or (N, C*block_size**2, H/block_size, W/block_size)
        for channels_first.
    r   r`  r;   )r   r%   rW   ra  r;   r  rb  )	r   rc  r   r   r   r   r   new_hnew_ws	            r   space_to_depthri  A  s      o%WW
1aZZJJq1eZ
AFGLL./JJq1eUA
A,=>? H WW
1aZZJJq1a
E:FGLL./JJq1a*a-/>?Hr   )r&   )r  )g?)r    )T)r$   )r   T)Nr   )Nr   Nr+   )r   F)r%   r   Nr%   )r%   r   NNr%   )r$   NF)Fr$   )F)FF)NNgMbP?)r   )TN)d   r%   N)r  rj  r%   Tr   )NNNFNN)r%   r   r%   )r   )Qr   r+  r-  r   r   	keras.srcr   &keras.src.backend.common.backend_utilsr   r   r   r   keras.src.backend.numpy.corer	   r
   r   keras.src.utils.module_utilsr   r   r   r"   r)   r,   r.   r1   r4   r9   r=   r?   rD   rF   rI   rK   rM   rR   rU   r`   rc   rk   rr   rt   r8   r~   r   r   r   r   r   r   r   r   r   r   r  r  r  r"  r4  r6  r;  rA  rN  rS  r]  r`  rc  rq  rv  r  r  r  r  r  r
  r  r#  r*  rF  r^  re  ri  r  r   r   <module>ro     s4    
    L . : 2 .1
J

3
4
	

@
4
,	,AN
;
!*  #	, %V H, %&P#0PD<~QhE$	A  8 9~ /l F 2j8	1418( H ?C*nh 	(\ `L  
F
/(B 
	
'T23j6r$N&r   