
     `ijr                        d Z ddlmZmZ ddlZddlmZ ddlmZ ddlm	Z	m
Z
 ddlmZ dd	lmZ dd
lmZ ddlmZmZ ddlmZ ddlmZmZmZ ddlmZ  e            rddlmZ ddlmZ  ej         e!          Z"de#de#dej$        fdZ%dej$        dej$        fdZ&dej$        dej$        dej$        dej$        fdZ' G d dej(                  Z) G d dej(                  Z* G d  d!e          Z+e G d" d#e                      Z,e G d$ d%e,                      Z- ed&'           G d( d)e,e                      Z.g d*Z/dS )+zPyTorch CodeGen model.    )OptionalUnionN)nn   )ACT2FN)CacheDynamicCache)GenerationMixin)AttentionMaskConverter)GradientCheckpointingLayer)BaseModelOutputWithPastCausalLMOutputWithPast)PreTrainedModel)auto_docstringis_torch_flex_attn_availablelogging   )CodeGenConfig)	BlockMask)make_flex_block_causal_masknum_posdimreturnc                    ddt          j        d|dt           j                  |z  z  z  }t          j        dt          j        | t           j                                                  |                                          }t          j        t          j        |          t          j        |          fd          S )	N      ?i'  r      dtypezi , j -> i jr   r   )torcharangeint64einsumfloatcatsincos)r   r   inv_freqsinusoid_inps       /home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/transformers/models/codegen/modeling_codegen.pycreate_sinusoidal_positionsr+   /   s    eQQek J J JS PQRH<WEK0X0X0X0^0^0`0`bjkkqqssL9ei--uy/F/FGQOOOO    xc                     | d d d d d d d d df         }| d d d d d d dd df         }t          j        | |fd          } |                     d          S )Nr   r   r   )r    stackflatten)r-   x1x2s      r*   rotate_every_twor5   6   ss    	
111aaaCCaC<B	
111aaaADqD=	BbS"I2&&&A99R==r,   tensorr&   r'   c                     t          j        |d d d d d d d f         dd          }t          j        |d d d d d d d f         dd          }| |z  t          |           |z  z   S )Nr   r   )r    repeat_interleaver5   )r6   r&   r'   s      r*   apply_rotary_pos_embr9   >   sy    

!#aaaD!!!m"4a
;
;C

!#aaaD!!!m"4a
;
;CSL-f55;<<r,   c                       e Zd Zd fd	Zd Zd Z	 	 ddZ	 	 	 	 	 	 	 ddeej	                 dee
         d	eej	                 d
eej                 deej	                 dee         dee         deej                 deeej        eej                 f         eeej        eej                 eej        df         f                  f         fdZ xZS )CodeGenAttentionNc                    t                                                       |j        }t          j        |j                  | _        t          j        |j                  | _        || _	        |(t                              d| j        j         d           |j        | _        |j        | _        | j        | j        z  | _        | j        | j        z  | j        k    r t%          d| j         d| j         d          t'          j        t'          j        | j        t&          j                                                t'          j                              | _        t          j        | j        | j        dz  d	          | _        t          j        | j        | j        d	          | _        |j        | _        | j        p| j        }t=          ||          | _        d S )
NzInstantiating z without passing a `layer_idx` is not recommended and will lead to errors during the forward call if caching is used. Please make sure to provide a `layer_idx` when creating this class.zEembed_dim must be divisible by num_attention_heads (got `embed_dim`: z and `num_attention_heads`: z).r   r   F)bias) super__init__max_position_embeddingsr   Dropout
attn_pdropattn_dropoutresid_pdropresid_dropout	layer_idxloggerwarning_once	__class____name__hidden_size	embed_dimnum_attention_headshead_dim
ValueErrorr    sqrtr6   float32toget_default_dtype
scale_attnLinearqkv_projout_proj
rotary_dimr+   embed_positions)selfconfigrF   max_positionspos_embd_dimrI   s        r*   r?   zCodeGenAttention.__init__E   s   6Jv'899Z(:;;",!8 , , ,    +#)#= $*BB=433t~EEHX\Xf H H+/+CH H H    *U\$-u}%U%U%UVVYYZ_ZqZsZstt	$.$.12D5QQQ	$.$.uMMM +8$.:=,WWr,   c                     |                     |j        d d         ||z  |fz             }|                     |j        d d         dz   |j        dd          z             }|S )Nr/   r0   )r/   )reshapeshape)rZ   r-   n_headdim_headmp_numreshapeds         r*   _split_headszCodeGenAttention._split_headsc   sc    99QWSbS\Vv-=x,HHII##AGCRCL5$88>"##;N$NOOr,   c                    t          |j                  dk    r,|                    ddddd                                          }ngt          |j                  dk    r+|                    dddd                                          }n$t	          dt          |j                             |                                dd	         ||z  fz   }|                    |          S )
zM
        Merges attn_head_size dim and num_attn_heads dim into n_ctx
           r   r   r   r      z3Input tensor rank should be one of [4, 5], but is: Nr0   )lenr`   permute
contiguousrO   sizeview)rZ   r6   rM   attn_head_size	new_shapes        r*   _merge_headszCodeGenAttention._merge_headsh   s     v|!!^^Aq!Q22==??FF!##^^Aq!Q//::<<FFfSVW]WcSdSdffgggKKMM#2#&*=*N)PP	{{9%%%r,   c                 
   |                     t          j                  }|                     t          j                  }t          j        ||                    dd                    }|$|d d d d d d d |j        d         f         }||z  }|| j        z  } t          j        d          |          }|                     |j	                  }| 
                    |          }|||z  }t          j        ||          }||fS )Nr/   r0   r   )rR   r    rQ   matmul	transposer`   rT   r   Softmaxr   rC   )	rZ   querykeyvalueattention_mask	head_maskattn_weightscausal_maskattn_outputs	            r*   _attnzCodeGenAttention._attnu   s     ''ffU]##|E3==R+@+@AA%(AAAqqq/CIbM/)ABKK'L#do5)rzb))),77#u{33((66  ')3Ll<77L((r,   Fhidden_states
layer_pastrx   position_idsry   	use_cacheoutput_attentionscache_positionr   .c	                 ,   |                      |          }	d}
|	                    |	j        d d         |
dfz             }| j        | j        z  |
z  }t          j        ||d          \  }}}|                     || j        | j        |
          }|                     || j        | j        |
          }|                     || j        | j        |
          }|                    dddd          }| j	        }|j
        |j
        k    r!|                    |j
                  }|| _	        ||         }t          j        ||j        d         dz  d          \  }}| j        |d d d d d d d | j        f         }|d d d d d d | j        d f         }|d d d d d d d | j        f         }|d d d d d d | j        d f         }t          |||          }t          |||          }t          j        ||gd          }t          j        ||gd          }n"t          |||          }t          |||          }|                    dddd          }|                    dddd          }|D||| j        |d	}|                    |                    |j                  || j        |          \  }}|                     |||||          \  }}|                     || j        | j                  }|                     |          }|                     |          }||fS )
Nrh   r/   r   )rc   r   r   r   r   )r&   r'   partial_rotation_sizer   )rV   r_   r`   rN   rM   r    splitre   rj   rY   devicerR   rX   r9   r%   updater   rF   r}   rp   rW   rE   )rZ   r~   r   rx   r   ry   r   r   r   qkvrc   	qkv_split	local_dimru   rw   rv   rY   sincosr&   r'   k_rotk_passq_rotq_passcache_kwargsr|   rz   s                              r*   forwardzCodeGenAttention.forward   sZ    mmM**KK	#2#&" =>>	MD$<<F	!K	9"EEEuc!!%)A4=Y_!``T%=t}U[\\!!%)A4=Y_!``aAq)).!\%888-001DEEO#2D  .;vv|B'71'<"EEES?&111aaa!24?!223EAAAqqq$/"3"334F!!!QQQ#4T_#445E111aaaDO$5$556F(S99E(S99E)UFO444CIufo2666EE&sC55C(S99Ekk!Q1%%aAq)) !)-"0	 L $**366-2E+F+Ft~_kllJC %)JJuc5.R[$\$\!\''T5Mt}]]mmK00((55L((r,   N)NNNNNNFFN)rJ   
__module____qualname__r?   re   rp   r}   r   r    FloatTensorr   
LongTensorboolr   tupleTensorr   __classcell__rI   s   @r*   r;   r;   D   s       X X X X X X<  
& & &$ ) ) ) )D '+6:3715$),159G) G) 12G) UOG) !!23	G)
 u/0G) E-.G) D>G) $D>G) !!12G) 
elE%,//0u|U5<%8%c@Q:RRST	V
G) G) G) G) G) G) G) G)r,   r;   c                   N     e Zd Z fdZdeej                 dej        fdZ xZS )
CodeGenMLPc                 (   t                                                       |j        }t          j        ||          | _        t          j        ||          | _        t          |j                 | _	        t          j
        |j                  | _        d S r   )r>   r?   n_embdr   rU   fc_infc_outr   activation_functionactrA   rD   dropout)rZ   intermediate_sizer[   rL   rI   s       r*   r?   zCodeGenMLP.__init__   so    M	Yy*;<<
i 19==&45z&"455r,   r~   r   c                     |                      |          }|                     |          }|                     |          }|                     |          }|S r   )r   r   r   r   )rZ   r~   s     r*   r   zCodeGenMLP.forward   sL    

=11//M22]33r,   )	rJ   r   r   r?   r   r    r   r   r   r   s   @r*   r   r      se        6 6 6 6 6Xe.?%@ UEV        r,   r   c                   T    e Zd Zd fd	Z	 	 	 	 	 	 	 ddeej                 dee         deej                 deej                 deej                 d	ee	         d
ee	         deej                 de
eej                 eeej        eej        df         f                  f         fdZ xZS )CodeGenBlockNc                    t                                                       |j        |j        n	d|j        z  }t	          j        |j        |j                  | _        t          ||          | _	        t          ||          | _        d S )Nrh   eps)r>   r?   n_innerr   r   	LayerNormlayer_norm_epsilonln_1r;   attnr   mlp)rZ   r[   rF   	inner_dimrI   s       r*   r?   zCodeGenBlock.__init__   ss    &,n&@FNNa&-FW	LF4MNNN	$VY77	i00r,   Fr~   r   rx   r   ry   r   r   r   r   .c	           
          |}	|                      |          }|                     ||||||||          \  }
}|                     |          }|
|z   |	z   }||fS )N)r~   r   rx   r   ry   r   r   r   )r   r   r   )rZ   r~   r   rx   r   ry   r   r   r   residualattn_outputsrz   feed_forward_hidden_statess                r*   r   zCodeGenBlock.forward   s~     !		-00%)YY'!)%/) &/ 	&
 	&
"l &*XXm%<%<"$'AAHLl**r,   r   r   )rJ   r   r   r?   r   r    r   r   r   r   r   r   r   r   r   r   s   @r*   r   r      s)       1 1 1 1 1 1 '+6:3715$),159+ + 12+ UO+ !!23	+
 u/0+ E-.+ D>+ $D>+ !!12+ 
uU\"HU5<uGXZ]G]A^3^-_$``	a+ + + + + + + +r,   r   c                   F     e Zd ZU eed<   dZdZdgZdZdZ	 fdZ
d Z xZS )CodeGenPreTrainedModelr[   transformerTr   past_key_valuesc                 :     t                      j        |i | d S r   )r>   r?   )rZ   inputskwargsrI   s      r*   r?   zCodeGenPreTrainedModel.__init__#  s%    &+F+++++r,   c                    t          |t          j        f          rT|j        j                            d| j        j                   |j         |j        j        	                                 dS dS t          |t          j
                  r_|j        j                            d| j        j                   |j        +|j        j        |j                 	                                 dS dS t          |t          j                  r?|j        j        	                                 |j        j                            d           dS dS )zInitialize the weights.        )meanstdNr   )
isinstancer   rU   weightdatanormal_r[   initializer_ranger=   zero_	Embeddingpadding_idxr   fill_)rZ   modules     r*   _init_weightsz$CodeGenPreTrainedModel._init_weights&  s+   fryl++ 	* M&&CT[5R&SSS{& &&((((( '&-- 	*M&&CT[5R&SSS!-"6#56<<>>>>> .--- 	*K""$$$M$$S)))))	* 	*r,   )rJ   r   r   r   __annotations__base_model_prefixsupports_gradient_checkpointing_no_split_modules_skip_keys_device_placement_can_compile_fullgraphr?   r   r   r   s   @r*   r   r     sv         %&*#'("3!, , , , ,* * * * * * *r,   r   c                   D    e Zd Z fdZd Zd Ze	 	 	 	 	 	 	 	 	 	 	 	 ddeej	                 dee
eeeej                          f                  deej                 deej	                 d	eej	                 d
eej                 deej                 dee         dee         dee         dee         deej	                 de
eef         fd            Z	 dde
ej        df         dej        dej        dedef
dZedej        dededej        dej        defd            Z xZS )CodeGenModelc                 <   t                                                     j        | _        j        | _        t          j        j        | j                  | _        t          j        j	                  | _
        t          j        fdt          j                  D                       | _        t          j        | j        j                  | _        t%          j        j        j        z            | _        d| _        |                                  d S )Nc                 2    g | ]}t          |           S ))rF   )r   ).0ir[   s     r*   
<listcomp>z)CodeGenModel.__init__.<locals>.<listcomp>@  s&    aaaaVq A A Aaaar,   r   F)r>   r?   r   rL   
vocab_sizer   r   wterA   
embd_pdropdrop
ModuleListrangen_layerhr   r   ln_fminrX   n_ctxrM   gradient_checkpointing	post_initrZ   r[   rI   s    `r*   r?   zCodeGenModel.__init__9  s        +< 14>BBJv011	aaaa5QWQ_K`K`aaabbLV5NOOO	f/A[1[\\&+# 	r,   c                     | j         S r   r   )rZ   s    r*   get_input_embeddingsz!CodeGenModel.get_input_embeddingsI  s	    xr,   c                     || _         d S r   r   )rZ   new_embeddingss     r*   set_input_embeddingsz!CodeGenModel.set_input_embeddingsL  s    !r,   N	input_idsr   rx   token_type_idsr   ry   inputs_embedsr   r   output_hidden_statesreturn_dictr   r   c                    |	|	n| j         j        }	|
|
n| j         j        }
||n| j         j        }||n| j         j        }|du |duz  rt          d          | j        r%| j        r|rt          	                    d           d}|| 
                    |          }|r|t          | j                   }|j        d         }|7||                                nd}t          j        |||z   |j                  }||                    d          }|                     |||||	          }|                     || j         j                  }|}|0|                    d	|          }| 
                    |          }||z   }|                     |          }d	||                    d	          f}|	rd
nd}|
rd
nd}t1          | j                  D ]<\  }}|
r||fz   } |||||||         ||	|          }|d         }|	r||d         fz   }=|                     |          }|                    |          }|
r||fz   }|st7          d ||||fD                       S t9          ||||          S )a  
        inputs_embeds (`torch.FloatTensor` of shape `(batch_size, sequence_length, hidden_dim)`, *optional*):
            Optionally, instead of passing `input_ids` you can choose to directly pass an embedded representation. This
            is useful if you want more control over how to convert *input_ids* indices into associated vectors than the
            model's internal embedding lookup matrix.
        Nz:You must specify exactly one of input_ids or inputs_embedszZ`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`...F)r[   r   r   r   r/    )r   rx   r   ry   r   r   r   c              3      K   | ]}||V  	d S r   r   )r   vs     r*   	<genexpr>z'CodeGenModel.forward.<locals>.<genexpr>  s1        ghgtgtgtgtgt r,   )last_hidden_stater   r~   
attentions)r[   r   r   r   use_return_dictrO   r   trainingrG   rH   r   r	   r`   get_seq_lengthr    r!   r   	unsqueeze_update_causal_maskget_head_maskr   rm   r   rl   	enumerater   r   r   r   )rZ   r   r   rx   r   r   ry   r   r   r   r   r   r   r   
seq_lengthpast_seen_tokensr{   r~   token_type_embedsoutput_shapeall_self_attentionsall_hidden_statesr   blockoutputss                            r*   r   zCodeGenModel.forwardO  sT   . 2C1N--TXT_Tq$8$D  $+Jj 	 "+!6IIDK<Q	%0%<kk$+B]-t";< 	[YZZZ& 	"4= 	" "##p   "	  HHY//M 	?0*$+>>>O"(+
!CRC^==???de"\*:<Lz<YbobvwwwN)33A66L..M>?L]
 
 &&y$+2EFF	%%+00Z@@N $ 8 8),==M		-00J(:(:2(>(>?$5?bb4"6@BBD!$&)) 	J 	JHAu# I$58H$H!e**)#A,#"3-	 	 	G $AJM  J&9WQZM&I#		-00%**<88 	E 1]4D D 	  )?<MObc      '+++*	
 
 
 	
r,   Fr   input_tensorc           	      $   | j         j        dk    r||dk                                    r|S d S | j         j        dk    r+t          |t          j                  rt          |          }|S ||                                nd}||j        nd}| j         j        dk    r#|s!|st          j
        |||| j                  rd S |j        }|j        d         }	|r|                                }
n/t          |t          j                  r|j        d	         n||	z   dz   }
|                     ||	|
|||j        d         
          }| j         j        dk    r@|>|j        j        dv r0|s.t	          j        |          j        }t          j        ||          }|S )Nflash_attention_2r   flex_attentionr   Fsdpa)r   past_key_values_lengthis_trainingr   r/   )sequence_lengthtarget_lengthr   r   
batch_size)cudaxpunpu)r[   _attn_implementationanyr   r    r   r   r   is_compileabler   _ignore_causal_mask_sdpar   r   r`   get_max_cache_shape5_prepare_4d_causal_attention_mask_with_cache_positionr   typefinfor   _unmask_unattended)rZ   rx   r  r   r   r   r  using_compilable_cacher   r  r  r{   	min_dtypes                r*   r  z CodeGenModel._update_causal_mask  s    ;+/BBB)~/D.I.I.K.K)%%4;+/???.%,77 M!<^!L!L!!
 @O?Z?99;;;`aCRC^!?!?di ;+v55>T5]n5%>*'7 M	    t"&,Q/! 	+??AAMM nel;;<$R((%7!;  PP+')#)!, Q 
 
 K,66*%*.DDD% E E**.I0CKQZ[[Kr,   r  r  r   r  c                    | |                                  dk    r| }nMt          j        |          j        }t          j        ||f|||j                  }|dk    rt          j        |d          }|t          j        ||j                  |                    dd          k    z  }|ddddddf         	                    |ddd          }| |
                                }| j        d         }	|ddddddd|	f         | ddddddf                             |j                  z   }
|
dk    }
|ddddddd|	f                             |
|          |ddddddd|	f<   |S )	aM  
        Creates a causal 4D mask of shape `(batch_size, 1, query_length, key_value_length)` from a 2D mask of shape
        `(batch_size, key_value_length)`, or if the input `attention_mask` is already 4D, do nothing.

        Args:
            attention_mask (`torch.Tensor`):
                A 2D attention mask of shape `(batch_size, key_value_length)` or a 4D attention mask of shape
                `(batch_size, 1, query_length, key_value_length)`.
            sequence_length (`int`):
                The sequence length being processed.
            target_length (`int`):
                The target length: when generating with static cache, the mask should be as long as the static cache,
                to account for the 0 padding, the part of the cache that is not filled yet.
            dtype (`torch.dtype`):
                The dtype to use for the 4D attention mask.
            cache_position (`torch.Tensor`):
                Indices depicting the position of the input sequence tokens in the sequence.
            batch_size (`torch.Tensor`):
                Batch size.
        Nrh   )
fill_valuer   r   r   )diagonalr   r/   r   )r   r    r   r   fullr   triur!   r_   expandcloner`   rR   masked_fill)rx   r  r  r   r   r  r   r{   r#  mask_lengthpadding_masks              r*   r  zBCodeGenModel._prepare_4d_causal_attention_mask_with_cache_position  s   > %.*<*<*>*>!*C*C(KKE**.I* -0Ye\j\q  K !###jqAAA5<n>STTTWeWmWmnprsWtWtttK%dD!!!QQQ&67>>z1bRTUUK))//11,226*111aaaL[L+@ANSTSTSTVZ\`bcbcbcScDdDgDg&E E    ,q05@AAAqqq,;,AV5W5c5c )6 6AAAqqq!!!\k\12 r,   )NNNNNNNNNNNN)F)rJ   r   r   r?   r   r   r   r   r    r   r   r   r   r   r   r   r   r   r  staticmethodintr   r  r   r   s   @r*   r   r   7  si              " " "  15NR6:59371559$(,0/3&*59n
 n
E,-n
 "%uU5<5H/I(I"JKn
 !!23	n

 !!12n
 u/0n
 E-.n
   12n
 D>n
 $D>n
 'tnn
 d^n
 !!12n
 
u--	.n
 n
 n
 ^n
n #(B BelK78B lB 	B
 B  B B B BH 444 4 {	4
 4 4 4 4 \4 4 4 4 4r,   r   zM
    The CodeGen Model transformer with a language modeling head on top.
    )custom_introc                        e Zd ZdgZ fdZe	 	 	 	 	 	 	 	 	 	 	 	 	 ddeej                 dee	e
eeej                          f                  deej                 deej                 deej                 d	eej                 d
eej                 deej                 dee         dee         dee         dee         deej                 de	eef         fd            Z xZS )CodeGenForCausalLMzlm_head.weightc                     t                                          |           t          |          | _        t	          j        |j        |j                  | _        | 	                                 d S r   )
r>   r?   r   r   r   rU   r   r   lm_headr   r   s     r*   r?   zCodeGenForCausalLM.__init__F  s[       '//y0ABB 	r,   Nr   r   rx   r   r   ry   r   labelsr   r   r   r   r   r   c                    ||n| j         j        }|                     ||||||||	|
|||          }|d         }|                     |                              t
          j                  }d}|O|                    |j                  } | j        ||fd| j         j	        i|}|                    |j
                  }|s|f|dd         z   }||f|z   n|S t          |||j        |j        |j                  S )aG  
        inputs_embeds (`torch.FloatTensor` of shape `(batch_size, sequence_length, hidden_dim)`, *optional*):
            Optionally, instead of passing `input_ids` you can choose to directly pass an embedded representation. This
            is useful if you want more control over how to convert *input_ids* indices into associated vectors than the
            model's internal embedding lookup matrix.
        labels (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*):
            Labels for language modeling. Note that the labels **are shifted** inside the model, i.e. you can set
            `labels = input_ids` Indices are selected in `[-100, 0, ..., config.vocab_size]` All labels set to `-100`
            are ignored (masked), the loss is only computed for labels in `[0, ..., config.vocab_size]`
        N)r   rx   r   r   ry   r   r   r   r   r   r   r   r   r   )losslogitsr   r~   r   )r[   r   r   r4  rR   r    rQ   r   loss_functionr   r   r   r   r~   r   )rZ   r   r   rx   r   r   ry   r   r5  r   r   r   r   r   r   transformer_outputsr~   	lm_logitsr7  outputs                       r*   r   zCodeGenForCausalLM.forwardN  sW   8 &1%<kk$+B]"..+))%'/!5#) / 
 
 ,A.
 LL//225=AA	YYy/00F%4%   ;1 	 D 77=.//D 	F\$7$;;F)-)9TGf$$vE%/?-;*5
 
 
 	
r,   )NNNNNNNNNNNNN)rJ   r   r   _tied_weights_keysr?   r   r   r    r   r   r   r   r   r   r   r   r   r   r   s   @r*   r2  r2  >  s        ++      15NR6:59371559-1$(,0/3&*59J
 J
E,-J
 "%uU5<5H/I(I"JKJ
 !!23	J

 !!12J
 u/0J
 E-.J
   12J
 )*J
 D>J
 $D>J
 'tnJ
 d^J
 !!12J
  
u,,	-!J
 J
 J
 ^J
 J
 J
 J
 J
r,   r2  )r2  r   r   )0__doc__typingr   r   r    r   activationsr   cache_utilsr   r	   
generationr
   modeling_attn_mask_utilsr   modeling_layersr   modeling_outputsr   r   modeling_utilsr   utilsr   r   r   configuration_codegenr   !torch.nn.attention.flex_attentionr   integrations.flex_attentionr   
get_loggerrJ   rG   r/  r   r+   r5   r9   Moduler;   r   r   r   r   r2  __all__r   r,   r*   <module>rN     s^     " " " " " " " "        ! ! ! ! ! ! . . . . . . . . ) ) ) ) ) ) > > > > > > 9 9 9 9 9 9 O O O O O O O O - - - - - -         
 1 0 0 0 0 0  !! K;;;;;;JJJJJJ 
	H	%	%P P3 P5< P P P P     = =EL =u| =X]Xd = = = =W) W) W) W) W)ry W) W) W)v       (#+ #+ #+ #+ #+- #+ #+ #+L * * * * *_ * * *: C C C C C) C C CL   
V
 V
 V
 V
 V
/ V
 V
 
V
r K
J
Jr,   