
    ,`i              !          U d dl Z d dlm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mZ d dlmZmZ  e	j                    ZdefdZ e            Zdefd	Zd
edefdZ e            rd dlmZ ej        Z	 	 	 	 	 	 	 	 	 	 dvdej        dej        dej        dej        dej        dej        dz  dedededej        dz  dej        dz  dej        dz  dej        dz  dej        dz  dej        dz  dej        f dZ	 	 	 	 	 	 	 	 	 	 dvdej        dej        dej        dej        dej        dej        dz  dedededej        dz  dej        dz  dej        dz  dej        dz  dej        dz  dej        dz  dej        f dZ	 	 	 	 	 	 	 	 dwdej        dej        dej        dej        dej        d ej        dz  d!ej        dz  d"ej        dz  d#ej        dz  d$ed%ej        dz  dej        dz  dedej        fd&Z 	 	 	 	 	 	 	 	 dwdej        dej        dej        dej        dej        d ej        dz  d!ej        dz  d"ej        dz  d#ej        dz  d$ed%ej        dz  dej        dz  dedej        fd'Z!dej        d(ej        d)ej        d*ej        d+eddfd,Z"dej        d(ej        d)ej        d*ej        d+eddfd-Z#dej        d(ej        d*ej        ddfd.Z$dej        d(ej        d*ej        ddfd/Z%	 dxd*ej        d1ej        dej        dej        d2ed3ed4ed5e&ddfd6Z'	 dxd*ej        d1ej        dej        dej        d2ed3ed4ed5e&ddfd7Z(	 	 dyd*ej        dej        dej        d2ed3ed4ed9e)d5e&ddfd:Z*	 	 dyd*ej        dej        dej        d2ed3ed4ed9e)d5e&ddfd;Z+da,edz  e-d<<   defd=Z.	 	 	 	 	 	 	 dzd?ej        d@ej        dAej        dBej        dCedDej        dz  dEej        dz  dFej        dz  dGe&dHe&dIej        dz  dJej        dz  ddfdKZ/	 	 	 	 	 	 	 dzd?ej        d@ej        dAej        dBej        dCedDej        dz  dEej        dz  dFej        dz  dGe&dHe&dIej        dz  dJej        dz  ddfdLZ0dej1        fdMej        dNej        dOej        dPej        dQej        dz  dej        dej        fdRZ2dej1        fdMej        dNej        dOej        dPej        dQej        dz  dej        dej        fdSZ3ej1        fdMej        dNej        dOej        dPej        dej        dej        fdTZ4ej1        fdMej        dNej        dOej        dPej        dej        dej        fdUZ5ej1        fdMej        dNej        dOej        dPej        dej        dej        fdVZ6ej1        fdMej        dNej        dOej        dPej        dej        dej        fdWZ7dXej        dYej        dZe&dej        fd[Z8dXej        dYej        dZe&dej        fd\Z9dXej        d]ej        dYej        dZe&de:ej        ej        f         f
d^Z;dXej        d]ej        dYej        dZe&de:ej        ej        f         f
d_Z<dXej        d]ej        dYej        d`e&daej        de:ej        ej        ej        f         fdbZ=dXej        d]ej        dYej        d`e&daej        de:ej        ej        ej        f         fdcZ>dXej        dYej        d`e&daej        de:ej        ej        f         f
ddZ?dXej        dYej        d`e&daej        de:ej        ej        f         f
deZ@	 d{dXej        daej        dfej        dz  de:ej        ej        f         fdgZA	 d{dXej        daej        dfej        dz  de:ej        ej        f         fdhZB	 d{dXej        daej        dfej        dz  de:ej        ej        f         fdiZC	 d{dXej        daej        dfej        dz  de:ej        ej        f         fdjZDdXej        d]ej        dYej        dZe&dkede:ej        ej        ej        f         fdlZEdXej        d]ej        dYej        dZe&dkede:ej        ej        ej        f         fdmZFdXej        dYej        dZe&dkede:ej        ej        f         f
dnZGdXej        dYej        dZe&dkede:ej        ej        f         f
doZHdXej        dkede:ej        ej        f         fdpZIdXej        dkede:ej        ej        f         fdqZJdXej        dkede:ej        ej        f         fdrZKdXej        dkede:ej        ej        f         fdsZLdaM G dt du          ZNeNO                                 dS )|    N)Callable)
OpOverload)current_platform)direct_register_custom_opis_torch_equal_or_newer)rocm_aiter_sparse_attn_indexer#rocm_aiter_sparse_attn_indexer_fakereturnc                  (    ddl m}   | d          d uS )Nr   	find_specaiter)importlib.utilr   r   s    c/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/vllm/_aiter_ops.pyis_aiter_foundr      s)    ((((((9WT))    c                  Z    t          j                    rt          rddlm}   |             S dS )Nr   on_gfx9F)r   is_rocmIS_AITER_FOUNDvllm.platforms.rocmr   r   s    r   is_aiter_found_and_supportedr   !   s=    !! n //////wyy5r   funcc                 F     t          j                    fd            }|S )zdDecorator that only executes the function if
    ROCm AITER package is supported on gfx9 archs.
    c                  4    t                      r | i |S d S N)r   )argskwargsr   s     r   wrapperz#if_aiter_supported.<locals>.wrapper.   s-     ()) 	)4((((tr   )	functoolswraps)r   r    s   ` r   if_aiter_supportedr#   )   s:    
 _T     Nr   )dtypesFhidden_statesw1w2topk_weighttopk_idsexpert_maskactivation_methodquant_methoddoweight_stage1w1_scalew2_scalea1_scalea2_scalenum_local_tokensoutput_dtypec                 ~    ddl m}m} ddlm}  ||          } ||          } || |||||||||	|
||||          S )Nr   )ActivationType	QuantType)	fused_moe)r2   dtype)r   r5   r6   aiter.fused_moer7   )r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r5   r6   r7   
activation
quant_types                       r   _rocm_aiter_fused_moe_implr<   D   s    " 0///////)))))) 122J<((J9

)   r   c                 Z    |t          j        | |          S t          j        |           S )Nr8   torch
empty_liker%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   s                  r   _rocm_aiter_fused_moe_fakerC   n   s1    " \BBBBM***r   topk_weights	fc1_scale	fc2_scalefc1_smooth_scalefc2_smooth_scalea16per_tensor_quant_scalec                 `    ddl m} ddlm}  ||          } || |||||||||	|
||          S )Nr   )r5   )asm_moe_tkw1)rE   rF   rG   rH   rI   rJ   r*   r:   )r   r5   aiter.fused_moe_bf16_asmrL   )r%   r&   r'   rD   r)   rE   rF   rG   rH   rI   rJ   r*   r+   r5   rL   r:   s                   r   _rocm_aiter_asm_moe_tkw1_implrN      sx     %$$$$$555555 122J<

))5   r   c                 *    t          j        |           S r   r?   r%   r&   r'   rD   r)   rE   rF   rG   rH   rI   rJ   r*   r+   s                r   _rocm_aiter_asm_moe_tkw1_fakerQ      s     M***r   topk_indicestoken_expert_indicesgating_outputrenormalizec                 0    ddl m}  || ||||           d S )Nr   )topk_softmax)r   rW   )rD   rR   rS   rT   rU   rW   s         r   _rocm_aiter_topk_softmax_implrX      s@     #"""""Ll$8-    r   c                     d S r    rD   rR   rS   rT   rU   s        r   _rocm_aiter_topk_softmax_faker\      s	     	Dr   c                 ,    ddl m}  || ||           d S )Nr   )topk_sigmoid)r   r^   )rD   rR   rT   r^   s       r   _rocm_aiter_topk_sigmoid_implr_      s0    
 #"""""L|];;;;;r   c                     d S r   rZ   )rD   rR   rT   s      r   _rocm_aiter_topk_sigmoid_fakera      s	    
 	Dr         ?correction_biasnum_expert_group
topk_groupneed_renormrouted_scaling_factorc           
      6    ddl m}  || |||||||           d S )Nr   )biased_grouped_topk)r   ri   )	rT   rc   rD   r)   rd   re   rf   rg   ri   s	            r   $_rocm_aiter_biased_grouped_topk_implrj      sM     *)))))	 	 	 	 	r   c                     d S r   rZ   rT   rc   rD   r)   rd   re   rf   rg   s           r   $_rocm_aiter_biased_grouped_topk_fakerm      	     	Dr   softmaxscoring_funcc           
      B    |dk    }ddl m}	  |	| |||||||           d S )Nro   r   )grouped_topk)r   rr   )
rT   rD   r)   rd   re   rf   rp   rg   
is_softmaxrr   s
             r   _rocm_aiter_grouped_topk_implrt   
  sV     *J""""""L	 	 	 	 	r   c                     d S r   rZ   rT   rD   r)   rd   re   rf   rp   rg   s           r   _rocm_aiter_grouped_topk_fakerw   #  rn   r   _AITER_MLA_SUPPORTS_FP8c                      t           ^	 ddl} ddlm} |                     |          }d|j        v od|j        v a n+# t          t          t          t          t          f$ r da Y nw xY wt           S )zKCheck if aiter.mla.mla_decode_fwd supports q_scale and kv_scale parameters.Nr   mla_decode_fwdq_scalekv_scaleF)rx   inspect	aiter.mlar{   	signature
parametersImportErrorModuleNotFoundErrorAttributeError
ValueError	TypeError)r~   r{   sigs      r   _check_aiter_mla_fp8_supportr   4  s     &	,NNN000000##N33CS^+L
cn0L $# 
 	, 	, 	, ',###	, #"s   1; %A#"A#        q	kv_buffero	qo_indptrmax_seqlen_qo	kv_indptr
kv_indiceskv_last_page_lenssm_scale	logit_capr|   r}   c           
          ddl m} ||	d}t                      r
|
|d<   ||d<    || |                    ddd| j        d                   ||||||fi | d S )Nr   rz   )r   r   r|   r}      )r   r{   r   viewshape)r   r   r   r   r   r   r   r   r   r   r|   r}   r{   r   s                 r   _rocm_aiter_mla_decode_fwd_implr   P  s     )(((((  F $%% &#y%zN	r1a--	
 
 
 
 
 
 
r   c                     d S r   rZ   )r   r   r   r   r   r   r   r   r   r   r|   r}   s               r   _rocm_aiter_mla_decode_fwd_faker   w  s	     	Dr   ABAsBsbiasc                 .    ddl m}  || |||||          S )Nr   )gemm_a8w8_CK)r   r   )r   r   r   r   r   r3   r   s          r   _rocm_aiter_gemm_a8w8_implr     s2     #""""" <1b"dL999r   c                 t    | j         d         }|j         d         }t          j        |||| j                  }|S Nr   r8   devicer   r@   emptyr   )	r   r   r   r   r   r3   mnYs	            r   _rocm_aiter_gemm_a8w8_faker     s9     	

A	
AAqQX>>>AHr   c                 .    ddl m}  || ||||          S Nr   )gemm_a8w8_blockscaler>   )%aiter.ops.triton.gemm_a8w8_blockscaler   r   r   r   r   r3   r   s         r   ,_rocm_aiter_triton_gemm_a8w8_blockscale_implr     s3     KJJJJJ1b"LAAAAr   c                 t    | j         d         }|j         d         }t          j        |||| j                  }|S r   r   r   r   r   r   r3   r   r   r   s           r   ,_rocm_aiter_triton_gemm_a8w8_blockscale_faker     9     	

A	
AAqQX>>>AHr   c                 .    ddl m}  || ||||          S r   )r   r   r   s         r   %_rocm_aiter_gemm_a8w8_blockscale_implr     s2     +*****1b"LAAAAr   c                 t    | j         d         }|j         d         }t          j        |||| j                  }|S r   r   r   s           r   %_rocm_aiter_gemm_a8w8_blockscale_faker     r   r   xweightvariance_epsilonc                     ddl m} |                                 dk    rE| j        }|                     d|d                   }  || ||          } |                     |          S  || ||          S )Nr   )rms_norm   r   )r   r   dimr   reshape)r   r   r   r   x_original_shapes        r   _rocm_aiter_rms_norm_implr     s     uuww{{7IIb*2.//HQ 011yy)***8Av/000r   c                 *    t          j        |           S r   r?   r   r   r   s      r   _rocm_aiter_rms_norm_faker     s     Ar   residualc                     ddl m} t          j        |          }t          j        |           } ||| ||||           ||fS )Nr   )rmsnorm2d_fwd_with_add)r   r   r@   rA   )r   r   r   r   r   residual_outouts          r   '_rocm_aiter_rmsnorm2d_fwd_with_add_implr     sj     -,,,,,#H--L

1

C	   r   c                 Z    t          j        |          }t          j        |           }||fS r   r?   )r   r   r   r   r   r   s         r   '_rocm_aiter_rmsnorm2d_fwd_with_add_faker     s/     #H--L

1

Cr   epsilonquant_dtypec           
      J   dd l }|t          j        t          fv sJ t          j        | j        d         dt          j        | j                  }t          j        | j        || j                  }t          j        |           }|	                    || |||||d           |||fS Nr   r   r   )use_model_sensitive_rmsnorm)
r   r@   int8
_FP8_DTYPEr   r   float32r   rA   #rmsnorm2d_fwd_with_add_dynamicquant)	r   r   r   r   r   
rocm_aitery_scaler   r   s	            r   0_rocm_aiter_rmsnorm_fused_add_dynamic_quant_implr     s     5:z22222k!'!*au}QXNNNG
+ag[
B
B
BC#A&&L22	$% 3 	 	 	 g%%r   c                     t          j        | j        d         dt           j        | j                  }t          j        | j        || j                  }t          j        |           }|||fS Nr   r   r   )r@   r   r   r   r   rA   )r   r   r   r   r   r   r   r   s           r   0_rocm_aiter_rmsnorm_fused_add_dynamic_quant_faker   *  s]     k!'!*au}QXNNNG
+ag[
B
B
BC#A&&Lg%%r   c                    dd l }|t          j        t          fv sJ t          j        | j        d         dt          j        | j                  }t          j        | j        || j                  }|                    || |||d           ||fS r   )	r   r@   r   r   r   r   r   r   rmsnorm2d_fwd_with_dynamicquant)r   r   r   r   r   r   r   s          r   ,_rocm_aiter_rmsnorm_fused_dynamic_quant_implr   8  s     5:z22222k!'!*au}QXNNNG
+ag[
B
B
BC..Qa /    <r   c                     t          j        | j        d         dt           j        | j                  }t          j        | j        || j                  }||fS r   )r@   r   r   r   r   )r   r   r   r   r   r   s         r   ,_rocm_aiter_rmsnorm_fused_dynamic_quant_faker   L  sJ     k!'!*au}QXNNNG
+ag[
B
B
BC<r   scalec                 (    ddl m}  || ||          S )Nr   )per_tensor_quant_hip)aiter.ops.quantr   )r   r   r   r   s       r   !_rocm_aiter_per_tensor_quant_implr   X  s+    
 5444445+666r   c                 z    t          j        | |          t          j        dt           j        | j                  fS )Nr>   r   r   )r@   rA   r   r   r   r   r   r   s      r   !_rocm_aiter_per_tensor_quant_faker   b  s?    
 A[1115;	qx4 4 4  r   c           	      ,   ddl m} |t          j        t          fv sJ | j        }t          j        | j        t          | j                  }|3t          j        g |d d         dR t          j        | j                  } ||| |d dd d           ||fS )Nr   )dynamic_per_token_scaled_quantr   r   r   F)scale_ubshuffle_scalenum_rowsnum_rows_factor)	r   r   r@   r   r   r   r   r   r   )r   r   r   r   	out_shaper   s         r    _rocm_aiter_per_token_quant_implr   l  s     ?>>>>>5:z22222I
+agZ
A
A
AC}0in0a00ahWWW""	    :r   c                     | j         }t          j        | j         t          | j                  t          j        g |d d         dR t          j        | j                  fS )Nr   r   r   )r   r@   r   r   r   r   )r   r   r   r   s       r    _rocm_aiter_per_token_quant_faker     s[     IAG:ah???(in(a((ahOOO r   
group_sizec                 Z    ddl m}  || ||d d d |t          |	  	        \  \  }}}}}	||	|fS Nr   )fused_rms_fp8_group_quant)r   dtype_quantres1 aiter.ops.triton.fused_fp8_quantr   AITER_FP8_DTYPE)
r   r   r   r   r   r   x_quantx_quant_scales_ress
             r   1_rocm_aiter_rmsnorm_with_add_fp8_group_quant_implr    sl     KJJJJJ+D+D	#
, 
, 
,(Wnq!S 	 r   c                     | j         \  }}|||z   dz
  |z  f}t          j        | t          | j                  t          j        ||j                  t          j        |t          j        | j                  fS )Nr   r   )r   r   r@   rA   r   r   r   r   )r   r   r   r   r   MNscale_shapes           r   1_rocm_aiter_rmsnorm_with_add_fp8_group_quant_faker
    su     7DAqq:~)j89K/!(CCC(/:::Ku}QXFFF r   c                 X    ddl m}  || ||d d d |t          d 	  	        \  \  }}}}}||fS r   r   )	r   r   r   r   r   r   r  r  r  s	            r   (_rocm_aiter_rmsnorm_fp8_group_quant_implr    sd     KJJJJJ+D+D	#
, 
, 
,(Wnq!S ^$$r   c                     | j         \  }}|||z   dz
  |z  f}t          j        | t          | j                  t          j        |t          j        | j                  fS )Nr   r   r  )r   r   r   r   r  r  r	  s          r   (_rocm_aiter_rmsnorm_fp8_group_quant_faker    s`     7DAqq:~)j89K/!(CCCKu}QXFFF r   c                     | j         d         |z  dk    s
J d            ddlm}m}  ||j                  } ||                                 t                    S )Nr   r   z+Input shape must be divisible by group size)r6   get_hip_quant)r   )r   r   r6   r  	per_1x128
contiguousr   )r   r   r6   r  aiter_per1x128_quants        r    _rocm_aiter_group_fp8_quant_implr    sr     72;#q(((*W(((........(=)<==OLLLLr   c                     | j         \  }}t          j        ||ft          | j                  }t          j        |||z   dz
  |z  ft          j        | j                  }||fS )Nr   r   r   r@   r   r   r   r   )r   r   r  r  x_fp8out_bss         r    _rocm_aiter_group_fp8_quant_faker    sr     7DAqKAoahGGGE[^aJ.	
 mx  F &=r   c                 6    ddl m}  || d|t                    S )Nr   )act_mul_and_fp8_group_quantsilu)r:   r   r   )aiter.ops.triton.activationr  r   )r   r   r  s      r   ,_rocm_aiter_act_mul_and_fp8_group_quant_implr    s=     HGGGGG&&	#	   r   c                     | j         \  }}|dz  dk    sJ |dz  }t          j        ||ft          | j                  }t          j        |||z   dz
  |z  ft          j        | j                  }||fS )Nr   r   r   r   r  )r   r   r  r  N_halfr  r  s          r   ,_rocm_aiter_act_mul_and_fp8_group_quant_faker!    s     7DAqq5A::::!VFKF?18LLLE[j 1$3	
 mx  F &=r   c            "          e Zd ZdZej        Zej        Zej	        Z
ej        Zej        Zej        Zej        Zej        Zej        Zej        Zej        Zej        Zej        Zej        Z e!d             Z"e!e#de$fd                        Z%e!e#de$fd                        Z&e!e#de$fd                        Z'e!e#de$fd                        Z(e!e#de$fd                        Z)e!e#de$fd	                        Z*e!e#de$fd
                        Z+e!e#de$fd                        Z,e!e#de$fd                        Z-e!e#de$fd                        Z.e!e#de$fd                        Z/e!e#de$fd                        Z0e!e#de$fd                        Z1e!e#de$fd                        Z2e!e#de$fd                        Z3e4e#dd                        Z5e4de6fd            Z7e4de6fd            Z8e4de6fd            Z9e4de6fd            Z:e4de6fd            Z;e4de6fd            Z<e4de6fd            Z=e4de6fd            Z>e4de6fd            Z?e4de@jA        de@jA        d eBde@jA        fd!            ZCe4de@jA        d"e@jA        de@jA        d eBdeDe@jA        e@jA        f         f
d#            ZEe4de@jF        fd$e@jA        d%e@jA        d&e@jA        d'e@jA        d(e@jA        dz  d)e@jG        de@jA        fd*            ZHe4e@jF        fd$e@jA        d%e@jA        d&e@jA        d'e@jA        d+eIeJ         d)e@jG        de@jA        fd,            ZKe4e@jF        fd$e@jA        d%e@jA        d&e@jA        d'e@jA        d+eIeJ         d)e@jG        de@jA        fd-            ZLe4	 	 	 	 	 	 	 	 	 	 dd0e@jA        d1e@jA        d2e@jA        d3e@jA        d4e@jA        d5e@jA        dz  d6eJd7eJd8e$d9e@jA        dz  d:e@jA        dz  d;e@jA        dz  d<e@jA        dz  d=e@jA        dz  d)e@jG        dz  de@jA        f d>            ZMe4	 	 	 	 	 	 	 	 dd0e@jA        d1e@jA        d2e@jA        d?e@jA        d4e@jA        d@e@jA        dz  dAe@jA        dz  dBe@jA        dz  dCe@jA        dz  dDe$dEe@jA        dz  d5e@jA        dz  d6eJde@jA        fdF            ZNe4d?e@jA        dGe@jA        dHe@jA        dIe@jA        dJe$deDe@jA        dKf         fdL            ZOe4d?e@jA        dGe@jA        dHe@jA        dIe@jA        dJe$deDe@jA        dKf         fdM            ZPe4	 ddIe@jA        dOe@jA        d?e@jA        d4e@jA        dPeJdQeJdRe$dSeBddfdT            ZQe4	 	 ddIe@jA        d?e@jA        d4e@jA        dPeJdQeJdRe$dVeRdSeBddfdW            ZSe4	 	 	 	 	 	 ddYe@jA        dZe@jA        d[e@jA        d\eBd]e@jA        d^eJd_e@jA        dz  d`e@jA        dz  dae@jA        dz  dbeBdce@jA        dz  dde@jA        dz  fde            ZTe4	 dde@jA        dfe@jG        dge@jA        dz  deDe@jA        e@jA        f         fdh            ZUe4	 dde@jA        dfe@jG        dge@jA        dz  deDe@jA        e@jA        f         fdi            ZVe4e@jW        dfde@jA        de@jA        dje@jA        dke@jG        dz  dle@jA        dz  de@jA        fdm            ZXe4dne@jA        doe@jA        dpe@jA        dqe@jA        dreJdseJdte$fdu            ZYe4	 	 	 ddve@jA        dwe@jA        dxe@jA        dye@jA        dze$dz  d{e$dz  d|e@jA        dz  de@jA        fd}            ZZe4d~de@jW        ddd/dfdve@jA        de@jA        dxe@jA        deJd(e@jA        dz  de@jG        dz  deJdz  de@jA        dz  dze$dz  de[dz  de@jA        fd            Z\e4	 dde@jA        deJdeDe@jA        dKf         fd            Z]e4deJdeJde$fd            Z^e4deJdeJde$fd            Z_e4	 dde@jA        deDeJeJf         de@jA        fd            Z`e4ddde@jA        deDeJeJf         deDe@jA        dKf         fd            ZadS )rocm_aiter_opsa  ROCm AITER operations wrapper for AMD GPU acceleration in vLLM.

    This class centralizes the import and registration of AITER ops,
    and provides a unified interface for checking if AITER is enabled.
    Operations are only available on supported gfx9
    architectures when aiter is installed.

    The class uses environment variables to control which features are enabled,
    allowing fine-grained control over which AITER optimizations are used.

    Environment Variables:
        VLLM_ROCM_USE_AITER: Main toggle for all AITER operations.
        VLLM_ROCM_USE_AITER_LINEAR: Controls GEMM and quantization ops.
        VLLM_ROCM_USE_AITER_RMSNORM: Controls RMSNorm operations.
        VLLM_ROCM_USE_AITER_MOE: Controls MoE (Mixture of Experts) ops.
        VLLM_ROCM_USE_AITER_MLA: Controls MLA (Multi-head Latent Attention) ops.
        VLLM_ROCM_USE_AITER_MHA: Controls MHA ops including flash_attn_varlen.
        VLLM_ROCM_USE_AITER_UNIFIED_ATTENTION: Controls Triton unified attention.
        VLLM_ROCM_USE_AITER_FP8BMM: Controls FP8 batched matrix multiply.
        VLLM_ROCM_USE_AITER_FP4_ASM_GEMM: Controls FP4 assembly GEMM.
        VLLM_ROCM_USE_AITER_TRITON_ROPE: Controls Triton rotary embeddings.
        VLLM_ROCM_USE_AITER_FUSION_SHARED_EXPERTS: Controls shared expert fusion.
        VLLM_ROCM_USE_AITER_TRITON_GEMM: Controls Triton unquantized GEMM.

    Note:
        The environment variables are assigned when the module is imported,
        so you can't change the environment variables after the module is imported.
        This is done out of performance consideration. Accessing environment variables
        is expensive as described in issue https://github.com/vllm-project/vllm/issues/17067
        so we don't want to do it repeatedly, especially in the hot path (the forward pass).
        You can call the refresh_env_variables() function to reload the env variables
        after monkey patching the env variables in the unit test.

    Check Functions:
        All check functions (is_*_enabled) are decorated with @if_aiter_supported,
        which verifies: (1) platform is ROCm, (2) device arch is gfx9, and
        (3) aiter library is installed. The check function then also verifies
        the corresponding environment variable is enabled.
        i.e.                                             ___
        is_enabled() == current_platform.is_rocm() and      |     checked by
                        current_platform.is_on_gfx9() and   | @if_aiter_supported
                        IS_AITER_FOUND and   _______________|
                        cls._AITER_ENABLED   -----> Check by the logic in `is_enabled()`

    Example:
        from vllm._aiter_ops import rocm_aiter_ops

        # Check if aiter is enabled before using operations
        if rocm_aiter_ops.is_enabled():
            result = rocm_aiter_ops.rms_norm(x, weight, epsilon)

    Operations:
        - RMS normalization: rms_norm, rms_norm2d_with_add
        - GEMM operations: gemm_a8w8, gemm_a8w8_blockscale
        - Fused MoE: fused_moe, asm_moe_tkw1
        - Routing: topk_softmax, biased_grouped_topk, grouped_topk
        - MLA decode: mla_decode_fwd
        - Quantization: per_tensor_quant, per_token_quant, group_fp8_quant
        - Triton ops: triton_rotary_embed, triton_fp8_bmm, triton_gemm_a8w8_blockscale
    c                    t           j        | _        t           j        | _        t           j        | _        t           j        | _        t           j	        | _
        t           j        | _        t           j        | _        t           j        | _        t           j        | _        t           j        | _        t           j        | _        t           j        | _        t           j        | _        t           j        | _        dS )aT  
        Since the environment variables are assigned when the module is imported,
        This is a helper function to reload all the env variables from
        the environment variables.
        for example, after monkey patching the env variables in the unit test,
        you can call this function to reload the env variables.
        N)envsVLLM_ROCM_USE_AITER_AITER_ENABLEDVLLM_ROCM_USE_AITER_LINEAR_LINEAR_ENABLEDVLLM_ROCM_USE_AITER_RMSNORM_RMSNORM_ENABLEDVLLM_ROCM_USE_AITER_MOE_FMOE_ENABLEDVLLM_ROCM_USE_AITER_MLA_MLA_ENABLEDVLLM_ROCM_USE_AITER_MHA_MHA_ENABLED!VLLM_ROCM_SHUFFLE_KV_CACHE_LAYOUT_SHUFFLE_KV_CACHE_ENABLED%VLLM_ROCM_USE_AITER_UNIFIED_ATTENTION_TRITON_UNIFIED_ATTN_ENABLEDVLLM_ROCM_USE_AITER_FP8BMM_FP8BMM_ENABLEDVLLM_ROCM_USE_AITER_FP4BMM_FP4BMM_ENABLED VLLM_ROCM_USE_AITER_FP4_ASM_GEMM_FP4_GEMM_DYNAMIC_QUANT_ASMVLLM_ROCM_USE_AITER_TRITON_ROPE_TRITON_ROTARY_EMBED)VLLM_ROCM_USE_AITER_FUSION_SHARED_EXPERTS_MOE_SHARED_EXPERTS_ENABLEDVLLM_ROCM_USE_AITER_TRITON_GEMM_TRITON_UNQUANT_GEMMclss    r   refresh_env_variablesz$rocm_aiter_ops.refresh_env_variableso  s     "5"=#? 877(,(N%+/+U("="=*.*O'#'#G *.*X'#'#G   r   r
   c                     | j         S r   )r'  rB  s    r   
is_enabledzrocm_aiter_ops.is_enabled  s     !!r   c                     | j         o| j        S r   )r'  r)  rB  s    r   is_linear_enabledz rocm_aiter_ops.is_linear_enabled       !9c&99r   c                 *    |                                  S r   )rH  rB  s    r   is_linear_fp8_enabledz$rocm_aiter_ops.is_linear_fp8_enabled  s     $$&&&r   c                     | j         o| j        S r   )r'  r+  rB  s    r   is_rmsnorm_enabledz!rocm_aiter_ops.is_rmsnorm_enabled  s     !:c&::r   c                     | j         o| j        S r   )r'  r-  rB  s    r   is_fused_moe_enabledz#rocm_aiter_ops.is_fused_moe_enabled  s     !7c&77r   c                 8    |                                  o| j        S r   )rO  r?  rB  s    r   $is_fusion_moe_shared_experts_enabledz3rocm_aiter_ops.is_fusion_moe_shared_experts_enabled  s     ''))Mc.MMr   c                     | j         o| j        S r   )r'  r/  rB  s    r   is_mla_enabledzrocm_aiter_ops.is_mla_enabled       !6c&66r   c                     | j         o| j        S r   )r'  r1  rB  s    r   is_mha_enabledzrocm_aiter_ops.is_mha_enabled  rT  r   c                     | j         o| j        S r   )r'  r3  rB  s    r   is_shuffle_kv_cache_enabledz*rocm_aiter_ops.is_shuffle_kv_cache_enabled  s     !Cc&CCr   c                     | j         o| j        S r   )r'  r5  rB  s    r   is_triton_unified_attn_enabledz-rocm_aiter_ops.is_triton_unified_attn_enabled  s     !Fc&FFr   c                     | j         o| j        S r   )r'  r7  rB  s    r   is_fp8bmm_enabledz rocm_aiter_ops.is_fp8bmm_enabled  rI  r   c                     | j         o| j        S r   )r'  r9  rB  s    r   is_fp4bmm_enabledz rocm_aiter_ops.is_fp4bmm_enabled  rI  r   c                     | j         o| j        S r   )r'  r;  rB  s    r   %is_asm_fp4_gemm_dynamic_quant_enabledz4rocm_aiter_ops.is_asm_fp4_gemm_dynamic_quant_enabled  s     !Ec&EEr   c                     | j         o| j        S r   )r'  r=  rB  s    r   is_triton_rotary_embed_enabledz-rocm_aiter_ops.is_triton_rotary_embed_enabled       !>c&>>r   c                     | j         o| j        S r   )r'  rA  rB  s    r   is_triton_gemm_enabledz%rocm_aiter_ops.is_triton_gemm_enabled  rc  r   Nc                  \   t           s#t          d          rt                      nt          j        j        f} t          dt          g t          t          j
                   t          dt          g t          t          j
                   t          dt          g dt          t          j
                   t          dt          dd	gt           t          j
                   t          d
t"          ddgt$          t          j
                   t          dt&          ddgt(          t          j
                   t          dt*          dgt,          |            t          dt.          g t0          t          j
                   t          dt2          t4                     t          dt6          t8                     t          dt:          t<                     t          dt>          t@          t          j
                   t          dtB          tD          t          j
                   t          dtF          tH          t          j
                   t          dtJ          tL                     t          dtN          tP                     t          dtR          tT                     t          dtV          tX                     t          dtZ          g t\          t          j
                   t          dt^          t`          t          j
                   t          dtb          d gtd          t          j
                   d!a d S d S )"Nz2.7.0rocm_aiter_asm_moe_tkw1)op_nameop_funcmutates_args	fake_impldispatch_keyrocm_aiter_fused_moerocm_aiter_topk_softmax)rD   rR   rS   rocm_aiter_topk_sigmoidrD   rR   rocm_aiter_biased_grouped_topkr)   rocm_aiter_grouped_topkrocm_aiter_mla_decode_fwdr   )rh  ri  rj  rk  tagsrocm_aiter_gemm_a8w8&rocm_aiter_triton_gemm_a8w8_blockscale)rh  ri  rk  rocm_aiter_gemm_a8w8_blockscalerocm_aiter_rms_norm!rocm_aiter_rmsnorm2d_fwd_with_add)rh  ri  rk  rl  &rocm_aiter_rmsnorm_fused_dynamic_quant*rocm_aiter_rmsnorm_fused_add_dynamic_quant"rocm_aiter_rmsnorm_fp8_group_quant+rocm_aiter_rmsnorm_with_add_fp8_group_quant&rocm_aiter_act_mul_and_fp8_group_quantrocm_aiter_group_fp8_quantrocm_aiter_per_tensor_quantrocm_aiter_per_token_quantr   topk_indices_bufferT)3_OPS_REGISTEREDr   tupler@   Tagneeds_fixed_stride_orderr   rN   rQ   r   rl  r<   rC   rX   r\   r_   ra   rj   rm   rt   rw   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r
  r  r!  r  r  r   r   r   r   r   r	   )rs  s    r   register_ops_oncez rocm_aiter_ops.register_ops_once  s     ^	# +733;i8:  &157-:    &.24-:    &15UUU7-:    &15,n=7-:    &8<,j9>-:    &15,j97-:    &37!U9    &.24-:    &@DF    &9=?    &-13    &;?A-:	    &@DF-:	    &DHJ-:	    &<@B    &EIK    &@DF    &48:    &59;-:    &48:-:	    &8634=-:    #OOO}^	# ^	#r   c                  8    t           j        j        j        j        S r   )r@   opsvllmrx  defaultrZ   r   r   get_rmsnorm_fused_add_opz'rocm_aiter_ops.get_rmsnorm_fused_add_opv  s    y~?GGr   c                  8    t           j        j        j        j        S r   )r@   r  r  rw  r  rZ   r   r   get_rmsnorm_opzrocm_aiter_ops.get_rmsnorm_opz  s    y~199r   c                  8    t           j        j        j        j        S r   )r@   r  r  rz  r  rZ   r   r   &get_rmsnorm_fused_add_dynamic_quant_opz5rocm_aiter_ops.get_rmsnorm_fused_add_dynamic_quant_op~  s    y~HPPr   c                  8    t           j        j        j        j        S r   )r@   r  r  ry  r  rZ   r   r   "get_rmsnorm_fused_dynamic_quant_opz1rocm_aiter_ops.get_rmsnorm_fused_dynamic_quant_op      y~DLLr   c                  8    t           j        j        j        j        S r   )r@   r  r  r{  r  rZ   r   r    get_rmsnorm_group_fused_quant_opz/rocm_aiter_ops.get_rmsnorm_group_fused_quant_op  s    y~@HHr   c                  8    t           j        j        j        j        S r   )r@   r  r  r|  r  rZ   r   r   $get_rmsnorm_group_add_fused_quant_opz3rocm_aiter_ops.get_rmsnorm_group_add_fused_quant_op  s    y~IQQr   c                  8    t           j        j        j        j        S r   )r@   r  r  r  r  rZ   r   r   get_per_token_quant_opz%rocm_aiter_ops.get_per_token_quant_op      y~8@@r   c                  8    t           j        j        j        j        S r   )r@   r  r  r~  r  rZ   r   r   get_group_quant_opz!rocm_aiter_ops.get_group_quant_op  r  r   c                  8    t           j        j        j        j        S r   )r@   r  r  r}  r  rZ   r   r   $get_act_mul_fused_fp8_group_quant_opz3rocm_aiter_ops.get_act_mul_fused_fp8_group_quant_op  r  r   r   r   r   c                 N    t           j        j                            | ||          S r   )r@   r  r  rw  r   s      r   r   zrocm_aiter_ops.rms_norm  s!     y~11!V=MNNNr   r   c                 P    t           j        j                            | |||          S r   )r@   r  r  rx  )r   r   r   r   s       r   rms_norm2d_with_addz"rocm_aiter_ops.rms_norm2d_with_add  s*     y~??x!1
 
 	
r   r   r   r   r   r   r3   c                 T    t           j        j                            | |||||          S r   )r@   r  r  rt  )r   r   r   r   r   r3   s         r   	gemm_a8w8zrocm_aiter_ops.gemm_a8w8  s&     y~221aR|TTTr   
block_sizec                 R    t           j        j                            | ||||          S r   )r@   r  r  ru  r   r   r   r   r  r3   s         r   triton_gemm_a8w8_blockscalez*rocm_aiter_ops.triton_gemm_a8w8_blockscale  s+     y~DDq"b,
 
 	
r   c                 R    t           j        j                            | ||||          S r   )r@   r  r  rv  r  s         r   r   z#rocm_aiter_ops.gemm_a8w8_blockscale  s+     y~==q"b,
 
 	
r   r   Fr%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   c                 f    t           j        j                            | |||||||||	|
||||          S r   )r@   r  r  rm  rB   s                  r   r7   zrocm_aiter_ops.fused_moe  sM    $ y~22
 
 	
r   rD   rE   rF   rG   rH   rI   rJ   c                 b    t           j        j                            | |||||||||	|
||          S r   )r@   r  r  rg  rP   s                r   rL   zrocm_aiter_ops.asm_moe_tkw1  sG      y~55"
 
 	
r   rR   rS   rT   rU   .c                 Z    t           j        j                            | ||||           | |fS r   )r@   r  r  rn  r[   s        r   rW   zrocm_aiter_ops.topk_softmax  s9     		..,(<m[	
 	
 	
 \))r   c                 V    t           j        j                            | ||           | |fS r   )r@   r  r  ro  r[   s        r   r^   zrocm_aiter_ops.topk_sigmoid!  s4     		..,	
 	
 	
 \))r   rb   rc   rd   re   rf   rg   c           
      \    t           j        j                            | |||||||           d S r   )r@   r  r  rp  rl   s           r   ri   z"rocm_aiter_ops.biased_grouped_topk.  sB     		55!		
 		
 		
 		
 		
r   ro   rp   c           
      \    t           j        j                            | |||||||           d S r   )r@   r  r  rq  rv   s           r   rr   zrocm_aiter_ops.grouped_topkD  sB     		..!		
 		
 		
 		
 		
r   r   r   r   r   r   r   r   r   r   r   r   r|   r}   c                     t           j        j                            | |                    ddd| j        d                   ||||||||	|
|           d S )Nr   r   )r   r   r|   r}   )r@   r  r  rr  r   r   )r   r   r   r   r   r   r   r   r   r   r|   r}   s               r   r{   zrocm_aiter_ops.mla_decode_fwdZ  sk     		00NN2q!QWR[11 	1 	
 	
 	
 	
 	
r   r   r   c                 N    t           j        j                            | ||          S r   )r@   r  r  r  r   s      r   per_tensor_quantzrocm_aiter_ops.per_tensor_quantx  s      y~99![%PPPr   c                 N    t           j        j                            | ||          S r   )r@   r  r  r  r   s      r   per_token_quantzrocm_aiter_ops.per_token_quant  s      y~88KOOOr   weight_scale	out_dtypex_scalesc                     ddl m} ddlm} | ||           \  }}n| }|}t	          j        |j        d         |j        d         |j        |          }	 |||||j        ||	           |	S )Nr   )gemm_afp4wfp4)dynamic_mxfp4_quant)r   r8   )	aiter.ops.triton.gemm_afp4wfp4r  aiter.ops.triton.quantr  r@   r   r   r   T)
r   r   r  r  r  r  r  x_qx_sys
             r   triton_fp4_gemm_dynamic_qauntz,rocm_aiter_ops.triton_fp4_gemm_dynamic_qaunt  s     	A@@@@@>>>>>>**1--HCCCKIaL&,q/#*I
 
 
 	c63	1EEEr   	positionsquerykeycos_sin_cache	head_size
rotary_dimis_neox_stylec           
         ddl m} |                                 }|                    dd          \  }	}
|j        }|j        }|rdnd}|                    |d|          }|                    |d|          }|dd |f         }|dd |f         } | j        |j        d d          }  ||||	|
| |dd	
           |                    |          }|                    |          }d S )Nr   )(rope_cached_thd_positions_2c_fwd_inplacer   r   )r   r   .TF)reuse_freqs_front_part
nope_first)aiter.ops.triton.roper  numelchunkr   r   )r  r  r  r  r  r  r  r  
num_tokenscossinquery_shape	key_shaperotate_stylequery_key_s                   r   triton_rotary_embedz"rocm_aiter_ops.triton_rotary_embed  s     	SRRRRR__&&
 &&qb&11SkI	)0qqq

:r955hhz2y11sKZK'(3#$"INEKO4	00#'		
 		
 		
 		
 

;''hhy!!r   XWw_scaler   transpose_bmprequantr   c           	      2    ddl m}  || ||||||          S )Nr   )batched_gemm_a16wfp4)r  r  r  r   )%aiter.ops.triton.batched_gemm_a16wfp4r  )r  r  r  r   r  r  r   r  s           r   r  z#rocm_aiter_ops.batched_gemm_a16wfp4  sF     	ONNNNN##%
 
 
 	
r      WQr   r8   splitKYQconfigc
                 8    ddl m}
  |
| |||||||||	
  
        S )Nr   )Gbatched_gemm_a8w8_a_per_token_group_prequant_w_per_batched_tensor_quant)r   r   r8   r  r  r  r  )Xaiter.ops.triton.batched_gemm_a8w8_a_per_token_group_prequant_w_per_batched_tensor_quantr  )r  r  r  r   r   r8   r  r  r  r  aiter_triton_fp8_bmms              r   triton_fp8_bmmzrocm_aiter_ops.triton_fp8_bmm  sZ    	
 	
 	
 	
 	
 	
 $#!%
 
 
 	
r   input_2dc                 l    |dk    s
J d            t           j        j                            | |          S )Nr  zGroup size must be 128)r@   r  r  r~  )r  r   s     r   group_fp8_quantzrocm_aiter_ops.group_fp8_quant  s8    
 S   ":   y~88:NNNr   r   kc                     | |fdv S )N))       )i@     )i   i   )   r  )   r  )i   r  )i   r  )r     )r     r  r  )r  r  rZ   r   r  s     r   is_triton_gemm_w8a8_tunedz(rocm_aiter_ops.is_triton_gemm_w8a8_tuned  s    1v 
 
 	
r   c                     | |fdv S )N))r  r  )i   r  ) @  i   )i  r  )i   r  )r  r  )i 
  r  )i (  r  )r  r  )r   p  )r  r  )i H  r  r  )r  r  )i   r  )r  r  )r  r  ) 8  r  )r  r  )r  i   rZ   r  s     r   &is_triton_gemm_afp4wfp4_presh_ws_tunedz5rocm_aiter_ops.is_triton_gemm_afp4wfp4_presh_ws_tuned  s    1v 
 
 	
r      r  tensorlayoutc                 (    ddl m}  |||          S )Nr   shuffle_weightr   )aiter.ops.shuffler  )selfr  r   r  s       r   r  zrocm_aiter_ops.shuffle_weight+  s+     	544444~fV4444r   r  tensorsc                 J     ddl m t           fd|D                       S )a  
        Applies shuffle_weight function from AITER to each
        input tensor and returns them.

        Rearranges (shuffles) the input tensor/s
        into a specified block layout for optimized computation.

        Args:
            *tensors: Variable number of torch.Tensor objects.
            layout: A pair of integers specifying the block sizes used to divide
                the tensors during shuffling. Default is (16, 16).

        Returns:
        A Tuple of shuffled tensors.
        r   r  c              3   2   K   | ]} |           V  dS )r  NrZ   ).0r  r   r  s     r   	<genexpr>z1rocm_aiter_ops.shuffle_weights.<locals>.<genexpr>H  s2      QQv^^F6:::QQQQQQr   )r  r  r  )r   r  r  s   ` @r   shuffle_weightszrocm_aiter_ops.shuffle_weights3  s>    & 	544444QQQQQQQQQQQr   )r
   N
Nr   r   FNNNNNNNNNNFNNr   rb   ro   rb   )NNNr   NNr   )FFN)r  )r  )b__name__
__module____qualname____doc__r%  r&  r'  r(  r)  r*  r+  r,  r-  r.  r/  r0  r1  r2  r3  r4  r5  r6  r7  r8  r9  r:  r;  r<  r=  r>  r?  r@  rA  classmethodrD  r#   boolrF  rH  rK  rM  rO  rQ  rS  rV  rX  rZ  r\  r^  r`  rb  re  staticmethodr  r   r  r  r  r  r  r  r  r  r  r@   Tensorfloatr   r  r  float16r8   r  listintr  r   r7   rL   rW   r^   ri   strrr   r{   r  r  bfloat16r  r  r  dictr  r  r  r  r  r  rZ   r   r   r#  r#    s*       ; ;| -N5O70M/L/L $ F#'#M 5O5O"&"G?"&"P?H H [H. "4 " " "  [" :$ : : :  [: 'd ' ' '  [' ;4 ; ; ;  [; 8T 8 8 8  [8 NT N N N  [N 7t 7 7 7  [7 7t 7 7 7  [7 DD D D D  [D Gt G G G  [G :$ : : :  [: :$ : : :  [: Fd F F F  [F ?t ? ? ?  [? ?t ? ? ?  [? `# `# `#  \`#D Hj H H H \H :J : : : \: QJ Q Q Q \Q M
 M M M \M Ij I I I \I R* R R R \R AJ A A A \A A
 A A A \A M* M M M \M O<O!&OAFO	O O O \O
 
<
,
 
  	

 
u|U\)	*
 
 
 \
  %)$)MU U<U<U LU L	U
 lT!U kU 
U U U \U  %*M

 

<

<

 L

 L	


 I

 k

 


 

 

 \

  %*M

 

<

<

 L

 L	


 I

 k

 


 

 

 \

  ,0!" %(,(,(,(,04+/!
 !
|!
L!
 L!
 \	!

 ,!
 \D(!
 !
 !
 !
 ,%!
 ,%!
 ,%!
 ,%!
  ,-!
 kD(!
  
!!
 !
 !
 \!
F  *.)-04046:+/!"
 
|
L
 L
 l	

 ,
 <$&
 <$&
  ,-
  ,-
 
 !&t 3
 \D(
 
 

 
 
 \
> 
*l
*l
* $l
* |	
*
 
* 
u|S 	!
* 
* 
* \
* 
*l
*l
* $l
* |	
*
 
* 
u|S 	!
* 
* 
* \
*  (+
 
|

 l
 ,	

 
 
 
  %
 

 
 
 \
*  &'*
 
|
l
 ,
 	

 
 
 
  %
 

 
 
 \
*  *.*.15'+(,
 
<
<
 <
 	

 <
 
 <$&
 L4'
 !<$.
 
 $
 ,%
 
 
 \
:  &*Q Q<Q[Q |d"Q 
u|U\)	*	Q Q Q \Q  &*P P<P[P |d"P 
u|U\)	*	P P P \P 
 ).(, < l ;%	
 ,% 
   \. !"<!"|!" \!" |	!"
 !" !" !" !" !" \!"F  %* %'+
 
<
<
 
 <	

 Tk
 +
 $
 

 
 
 \
, 
 $($)N!"&$)"
 
<
L
 
 	

 lT!
 {T!
 d

 L4
 Tk
 t
 

 
 
 \
<  O O,OO 
u|S 	!O O O \O 
S 
S 
T 
 
 
 \
 
# 
# 
$ 
 
 
 \
0 >F5 5l5,1#s(O5	5 5 5 \5 :BR R R,R(-c3hR	u|S 	!R R R \R R Rr   r#  r  r  r  r  )NNNrb   r   NNr   )Pr!   collections.abcr   r@   
torch._opsr   	vllm.envsr%  vllm.platformsr   vllm.utils.torch_utilsr   r   +vllm.v1.attention.ops.rocm_aiter_mla_sparser   r	   	fp8_dtyper   r  r   r   r   r#   r   r$   fp8r   r  r  r8   r<   rC   rN   rQ   rX   r\   r_   ra   r  rj   rm   r  rt   rw   rx   __annotations__r   r   r   r  r   r   r   r   r   r   r   r   r  r   r   r   r   r   r   r   r   r   r   r  r
  r  r  r  r  r  r!  r  r#  r  rZ   r   r   <module>r)     s        $ $ $ $ $ $  ! ! ! ! ! !       + + + + + + U U U U U U U U       
 ('))
* * * * *  !!d    X (    *  !! !jO (,!$($($($(,0'+' '<'' 	' 	'
 l' $' ' ' ' lT!' lT!' lT!' lT!' lT)' +$'  \!' ' ' '` (,!$($($($(,0'++ +<++ 	+ 	+
 l+ $+ + + + lT!+ lT!+ lT!+ lT!+ lT)+ +$+  \!+ + + +8 &*%),0,026'+" "<"" 	" ,	"
 l" |d"" |d"" lT)" lT)" 
" "L4/" $" " \" " " "V &*%),0,026'++ +<++ 	+ ,	+
 l+ |d"+ |d"+ lT)+ lT)+ 
+ "L4/+ $+ + \+ + + +$,,  , <	
  
   	,	,	  ,	 <		
 	 
	 	 	 	<,<,< << 
	< < < <	,	,	 <	 
		 	 	 	  $' <\ , l	
    ! 
   @ $'
	 
	<
	\
	 ,
	 l	
	
 
	 
	 
	 !
	 

	 
	 
	 
	( "#& <, l 	
    ! 
   @ "#&
	 
	<
	,
	 l
	 	
	
 
	 
	 
	 !
	 

	 
	 
	 
	 (,  + + +#d # # # #D &*&*-1#'$($ $|$|$ |$ |	$
 $ |d"$ t#$ |d*$ $ $ \D $ lT!$ 
$ $ $ $Z &*&*-1#'$(	 	|	|	 |	 |		
 	 |d"	 t#	 |d*	 	 	 \D 	 lT!	 
	 	 	 	, !% %: :|:|: 	: 		:
 ,
: +: \: : : :, !% % || 	 		
 ,
 + \   & !&	B 	B|	B|	B 		B 			B
 +	B \	B 	B 	B 	B" !&
 
|
|
 	
 		

 +
 \
 
 
 
$ !&	B 	B|	B|	B 		B 			B
 +	B \	B 	B 	B 	B" !&
 
|
|
 	
 		

 +
 \
 
 
 
1|1"\1=B1
\1 1 1 1|"\=B
\   |l L 	
 5<%&   *|l L 	
 5<%&   &|&l& L& 	&
 & 5<u|34& & & &:&|&l& L& 	&
 & 5<u|34& & & &|L  	
 5<%&   (	|	L	 	 		
 5<%&	 	 	 	 "&7 7|77 <$7 5<%&	7 7 7 7 "& | <$ 5<%&	    MQ |"'+6;lT6I
5<%&   0 MQ |"'+6;lT6I
5<%&   |l L 	
  5<u|34   6|l L 	
  5<u|34    %|%L% % 	%
 5<%&% % % %,|L  	
 5<%&   M|MM 5<%&M M M M| 5<%&   "| 5<%&   | 5<%&   ( kR kR kR kR kR kR kR kR\      " " " " "r   