
    khd                     X   d Z ddlmZmZmZmZmZ ddlZddlm	Z	 ddl
m	c mZ ddlmZmZ ddlmZmZ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gZ G d de	j<                        Z G d de	j<                        Z  G d de	j<                        Z! G d de	j<                        Z" G d de	j<                        Z# G d de	j<                        Z$ G d de	j<                        Z% G d de	j<                        Z& G d de	j<                        Z' G d de	j<                        Z( e)dg d g d!g d"g d#g d$d%dg d&g d'g d(g d)g d*d%dg d+g d,g d-g d.g d/d%d0d1d1gg d2g d3g d4g d5d%d0d6d7gg d8g d9g d:g d;d%d0d6d7gg d<g d=g d>g d?d%d0d6d7gg d@g dAg dBg dCd%d0d7dDgg dEg dFg dGg dHd%d0d7dIgg dJg dKg dLg dMd%d0dDdNgg dOg dPg dQg dRd%S
      Z*dwdTZ+dxdUZ, ei dV e,dWdXY      dZ e,dWdXY      d[ e,dWdXY      d\ e,dWdXY      d] e,dWdXY      d^ e,dX_      d` e,dX_      da e,dX_      db e,dX_      dc e,dX_      dd e,dX_      de e,dX_      df e,dX_      dg e,dX_      dh e,dX_      di e,dX_      dj e,dX_       e,dX_       e,dX_      dk      Z-edwdle(fdm       Z.edwdle(fdn       Z/edwdle(fdo       Z0edwdle(fdp       Z1edwdle(fdq       Z2edwdle(fdr       Z3edwdle(fds       Z4edwdle(fdt       Z5edwdle(fdu       Z6edwdle(fdv       Z7y)ya   PP-HGNet (V1 & V2)

Reference:
https://github.com/PaddlePaddle/PaddleClas/blob/develop/docs/zh_CN/models/ImageNet1k/PP-HGNetV2.md
The Paddle Implement of PP-HGNet (https://github.com/PaddlePaddle/PaddleClas/blob/release/2.5.1/docs/en/models/PP-HGNet_en.md)
PP-HGNet: https://github.com/PaddlePaddle/PaddleClas/blob/release/2.5.1/ppcls/arch/backbone/legendary_models/pp_hgnet.py
PP-HGNetv2: https://github.com/PaddlePaddle/PaddleClas/blob/release/2.5.1/ppcls/arch/backbone/legendary_models/pp_hgnet_v2.py
    )DictListOptionalTupleUnionNIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)SelectAdaptivePool2dDropPathcreate_conv2d   )build_model_with_cfg)feature_take_indices)register_modelgenerate_default_cfgs)checkpoint_seqHighPerfGpuNetc                   *     e Zd Z	 	 d fd	Zd Z xZS )LearnableAffineBlockc                     t         |           t        j                  t	        j
                  |g      d      | _        t        j                  t	        j
                  |g      d      | _        y )NT)requires_grad)super__init__nn	Parametertorchtensorscalebias)selfscale_value
bias_value	__class__s      M/var/www/teggl/fontify/venv/lib/python3.12/site-packages/timm/models/hgnet.pyr   zLearnableAffineBlock.__init__   sJ    
 	\\%,,}"=TR
LLzl!;4P	    c                 :    | j                   |z  | j                  z   S N)r   r    r!   xs     r%   forwardzLearnableAffineBlock.forward#   s    zzA~		))r&   )      ?        __name__
__module____qualname__r   r+   __classcell__r$   s   @r%   r   r      s     Q*r&   r   c                   0     e Zd Z	 	 	 	 	 d fd	Zd Z xZS )	ConvBNActc	                    t         	|           || _        || _        t	        ||||||      | _        t        j                  |      | _        | j                  rt        j                         | _
        nt        j                         | _
        | j                  r| j                  rt               | _        y t        j                         | _        y )N)stridepaddinggroups)r   r   use_actuse_labr   convr   BatchNorm2dbnReLUactIdentityr   lab)
r!   in_chsout_chskernel_sizer7   r9   r8   r:   r;   r$   s
            r%   r   zConvBNAct.__init__(   s     	!
	 ..)<<wwyDH{{}DH<<DLL+-DH{{}DHr&   c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      }|S r(   )r<   r>   r@   rB   r)   s     r%   r+   zConvBNAct.forwardH   s;    IIaLGGAJHHQKHHQKr&   )r   r    TFr.   r3   s   @r%   r5   r5   '   s     %@r&   r5   c                   *     e Zd Z	 	 d fd	Zd Z xZS )LightConvBNActc                 x    t         |           t        ||dd|      | _        t        ||||d|      | _        y )Nr   F)rE   r:   r;   T)rE   r9   r:   r;   )r   r   r5   conv1conv2)r!   rC   rD   rE   r9   r;   r$   s         r%   r   zLightConvBNAct.__init__Q   sK     	

 #

r&   c                 J    | j                  |      }| j                  |      }|S r(   )rK   rL   r)   s     r%   r+   zLightConvBNAct.forwardj   s!    JJqMJJqMr&   )r   Fr.   r3   s   @r%   rI   rI   P   s     
2r&   rI   c                   $     e Zd Z fdZd Z xZS )	EseModulec                     t         |           t        j                  ||ddd      | _        t        j
                         | _        y )Nr   r   rE   r7   r8   )r   r   r   Conv2dr<   Sigmoidsigmoid)r!   chsr$   s     r%   r   zEseModule.__init__q   s<    II
	 zz|r&   c                     |}|j                  dd      }| j                  |      }| j                  |      }t        j                  ||      S )N)      T)keepdim)meanr<   rT   r   mul)r!   r*   identitys      r%   r+   zEseModule.forward|   sD    FF64F(IIaLLLOyy1%%r&   r.   r3   s   @r%   rO   rO   p   s    	$&r&   rO   c                   $     e Zd Z fdZd Z xZS )StemV1c                    t         |           t        j                  t	        t        |      dz
        D cg c]!  }t        ||   ||dz      d|dk(  rdnd      # c} | _        t        j                  ddd      | _	        y c c}w )Nr   rX   r   rW   )rE   r7   rQ   )
r   r   r   
Sequentialrangelenr5   stem	MaxPool2dpool)r!   stem_chsir$   s      r%   r   zStemV1.__init__   s    MM
 5:H!5#$

 01	 QFq	+$
 	 LLQq!D	$
s   &Bc                 J    | j                  |      }| j                  |      }|S r(   )rc   re   r)   s     r%   r+   zStemV1.forward   s!    IIaLIIaLr&   r.   r3   s   @r%   r^   r^      s    
Er&   r^   c                   &     e Zd Zd fd	Zd Z xZS )StemV2c                 @   t         |           t        ||dd|      | _        t        ||dz  dd|      | _        t        |dz  |dd|      | _        t        |dz  |dd|      | _        t        ||dd|      | _        t        j                  ddd      | _
        y )NrX   rW   rE   r7   r;   r   T)rE   r7   	ceil_mode)r   r   r5   stem1stem2astem2bstem3stem4r   rd   re   )r!   rC   mid_chsrD   r;   r$   s        r%   r   zStemV2.__init__   s    

  qL
  qL
 aK

 

 LLQqDI	r&   c                 \   | j                  |      }t        j                  |d      }| j                  |      }t        j                  |d      }| j	                  |      }| j                  |      }t        j                  ||gd      }| j                  |      }| j                  |      }|S )N)r   r   r   r   r   dim)
rn   Fpadro   rp   re   r   catrq   rr   )r!   r*   x2x1s       r%   r+   zStemV2.forward   s    JJqMEE!\"[[^UU2|$[[_YYq\IIr2hA&JJqMJJqMr&   Fr.   r3   s   @r%   rj   rj      s    %JN
r&   rj   c                   2     e Zd Z	 	 	 	 	 	 d fd	Zd Z xZS )HighPerfGpuBlockc           
         t         |           || _        t        j                         | _        t        |      D ]d  }|r0| j
                  j                  t        |dk(  r|n||||             5| j
                  j                  t        |dk(  r|n|||d|             f |||z  z   }|	dk(  rBt        ||dz  dd|      }t        |dz  |dd|      }t        j                  ||      | _        n6t        ||dd|      }t        |      }t        j                  ||      | _        |
rt        |
      | _        y t        j                         | _        y )Nr   )rE   r;   r   rl   serW   )r   r   residualr   
ModuleListlayersra   appendrI   r5   r`   aggregationrO   r   rA   	drop_path)r!   rC   rs   rD   	layer_numrE   r   light_blockr;   aggr   rg   	total_chsaggregation_squeeze_convaggregation_excitation_convaggregation_convattr$   s                    r%   r   zHighPerfGpuBlock.__init__   sf    	 mmoy! 	A""""#q&g$/ '	 """#q&g$/  '	, Y00	$;'01($ +41+'  "}}(+ D
  )  G$C!}}  D
 1:),r{{}r&   c                     |}|g}| j                   D ]  } ||      }|j                  |        t        j                  |d      }| j	                  |      }| j
                  r| j                  |      |z   }|S )Nr   ru   )r   r   r   ry   r   r   r   )r!   r*   r\   outputlayers        r%   r+   zHighPerfGpuBlock.forward  sw    [[ 	EaAMM!	 IIf!$Q==q!H,Ar&   )rX   FFFeser-   r.   r3   s   @r%   r~   r~      s$     IMV
r&   r~   c                   4     e Zd Z	 	 	 	 	 	 	 d fd	Zd Z xZS )HighPerfGpuStagec                    t         |           || _        |rt        ||d||d|
      | _        nt	        j
                         | _        g }t        |      D ]O  }|j                  t        |dk(  r|n|||||dk(  rdnd|	||
|t        |t        t        f      r||   n|
             Q t	        j                  | | _        d| _        y )NrX   F)rE   r7   r9   r:   r;   r   T)r   rE   r   r;   r   r   )r   r   
downsampler5   r   rA   ra   r   r~   
isinstancelisttupler`   blocksgrad_checkpointing)r!   rC   rs   rD   	block_numr   r   r7   r   rE   r;   r   r   blocks_listrg   r$   s                  r%   r   zHighPerfGpuStage.__init__(  s     	$'DO !kkmDOy! 	A 1fF'&'1fU$ + +#.8T5M.RilXa	 mm[1!&r&   c                     | j                  |      }| j                  r6t        j                  j	                         st        | j                  |      }|S | j                  |      }|S r(   )r   r   r   jitis_scriptingr   r   r)   s     r%   r+   zHighPerfGpuStage.forwardY  sS    OOA""599+A+A+Ct{{A.A  AAr&   )TrW   FrX   Fr   r-   r.   r3   s   @r%   r   r   '  s%     /'br&   r   c                   n     e Zd Z	 	 	 	 ddededededee   def fdZddedee   fdZ	dd	efd
Z
 xZS )ClassifierHeadin_featuresnum_classes	pool_type	drop_ratehidden_sizer;   c                    t         t        |           || _        ||s|dk(  sJ d       t	        |      | _        |{|| _        t        j                  ||dddd      }t        j                         }|r't               }	t        j                  |||	      | _        n5t        j                  ||      | _        nt        j                         | _        t        j                  |      | _        |rt        j                  d      nt        j                         | _        |dkD  r&t        j"                  | j                  |      | _        y t        j                         | _        y )Nr   6Classifier head must be removed if pooling is disabledr   r   F)rE   r7   r8   r    )r   r   r   num_featuresr   global_poolr   rR   r?   r   r`   	last_convrA   DropoutdropoutFlattenflattenLinearfc)r!   r   r   r   r   r   r;   r   r@   rB   r$   s             r%   r   zClassifierHead.__init__c  s    	nd,.' "a'a)aa'/)D" +D		I '')C*,!#y#s!C!#y#!>[[]DNzz),(1rzz!}r{{}?JQ"))D--{;TVT_T_Tar&   c                 .   |O|s|dk(  sJ d       t        |      | _        |rt        j                  d      nt        j                         | _        |dkD  r&t        j                  | j                  |      | _        y t        j                         | _        y )Nr   r   r   r   )	r   r   r   r   rA   r   r   r   r   )r!   r   r   s      r%   resetzClassifierHead.reset  ss     "a'a)aa'3iHD,52::a=2;;=DL?JQ"))D--{;TVT_T_Tar&   
pre_logitsc                     | j                  |      }| j                  |      }| j                  |      }| j                  |      }|r|S | j	                  |      }|S r(   )r   r   r   r   r   r!   r*   r   s      r%   r+   zClassifierHead.forward  sT    QNN1LLOLLOHGGAJr&   )avgr-      Fr(   r|   )r/   r0   r1   intstrfloatr   boolr   r   r+   r2   r3   s   @r%   r   r   b  s    
 #!)-!%b%b %b 	%b
 %b "#%b %bNb b# bT r&   r   c                   0    e Zd Z	 	 	 	 	 	 	 ddededededee   dededef fd	Z	e
j                  j                  dd
       Ze
j                  j                  dd       Ze
j                  j                  dej                   fd       Zd dedee   fdZ	 	 	 	 	 d!de
j&                  deeeee   f      dededededeee
j&                     ee
j&                  ee
j&                     f   f   fdZ	 	 	 d"deeee   f   dedefdZd ZddefdZd Z xZS )#r   cfgin_chansr   r   head_hidden_sizer   drop_path_rater;   c	                    t         t        |           |d   }
|d   }|d   |d   |d   |d   g}|| _        || _        || _        |
dv sJ |
dk(  rt        ||d	   |d
   |      | _        nt        |g|z         | _        d}g }g | _	        |D cg c]  }|d   	 }}t        j                  d	|t        |            j                  |      D cg c]  }|j                          }}t        |      D ]q  \  }}|\  }}}}}}}}|t!        ||||||||||
dk(  rdnd||         gz  }|| _        |r|dz  }| xj                  t%        | j"                  |d|       gz  c_	        s t'        j(                  | | _        t-        | j"                  |||||      | _        | j.                  j"                  | _        | j3                         D ]  \  }}t5        |t&        j6                        r-t&        j8                  j;                  |j<                  dd       Mt5        |t&        j>                        rSt&        j8                  jA                  |j<                         t&        j8                  jC                  |jD                         t5        |t&        jF                        st&        j8                  jC                  |jD                          y c c}w c c}w )N	stem_typerf   stage1stage2stage3stage4)v1v2r   r   r   )rC   rs   rD   r;      rX   r   r   r   )rC   rs   rD   r   r   r   r   rE   r;   r   r   rW   zstages.)num_chs	reductionmodule)r   r   r   r   r;   fan_outrelu)modenonlinearity)$r   r   r   r   r   r;   rj   rc   r^   feature_infor   linspacesumsplittolist	enumerater   r   dictr   r`   stagesr   headr   named_modulesr   rR   initkaiming_normal_weightr=   ones_zeros_r    r   ) r!   r   r   r   r   r   r   r   r;   kwargsr   rf   
stages_cfgcurrent_strider   cblock_depthsr*   dprrg   stage_configrC   rs   rD   r   r   r   rE   r   nmr$   s                                   r%   r   zHighPerfGpuNet.__init__  s    	nd,.$	z?(mS]CM3x=Q
&"L(((  	!DI zH45DI&01!11#(>>!^SEV#W#]#]^j#klaqxxzll(4 	sOA|co`FGWi[+W`'##%''&$.EDa&  F !(D!#$t/@/@Nelmnlocp"q!rr%	s& mmV,"#!(
	 !%		 6 6&&( 	'DAq!RYY'''yv'VAr~~.ahh'qvv&Aryy)qvv&	'C 2ls   KKc                 .    t        d|rd      S d      S )Nz^stemz^stages\.(\d+)z^stages\.(\d+).blocks\.(\d+))rc   r   )r   )r!   coarses     r%   group_matcherzHighPerfGpuNet.group_matcher  s%    (.$
 	
4S
 	
r&   c                 4    | j                   D ]	  }||_         y r(   )r   r   )r!   enabless      r%   set_grad_checkpointingz%HighPerfGpuNet.set_grad_checkpointing  s     	*A#)A 	*r&   returnc                 .    | j                   j                  S r(   )r   r   )r!   s    r%   get_classifierzHighPerfGpuNet.get_classifier  s    yy||r&   c                 J    || _         | j                  j                  ||       y r(   )r   r   r   )r!   r   r   s      r%   reset_classifierzHighPerfGpuNet.reset_classifier  s    &		[1r&   r*   indicesnorm
stop_early
output_fmtintermediates_onlyc                 r   |dv sJ d       g }t        t        | j                        |      \  }}	| j                  |      }t        j
                  j                         s|s| j                  }
n| j                  d|	dz    }
t        |
      D ]#  \  }} ||      }||v s|j                  |       % |r|S ||fS )a   Forward features that returns intermediates.

        Args:
            x: Input image tensor
            indices: Take last n blocks if int, all if None, select matching indices if sequence
            norm: Apply norm layer to compatible intermediates
            stop_early: Stop iterating over blocks when last desired intermediate hit
            output_fmt: Shape of intermediate feature outputs
            intermediates_only: Only return intermediate features
        Returns:

        )NCHWzOutput shape must be NCHW.Nr   )	r   rb   r   rc   r   r   r   r   r   )r!   r*   r   r   r   r   r   intermediatestake_indices	max_indexr   feat_idxstages                r%   forward_intermediatesz$HighPerfGpuNet.forward_intermediates   s    * Y&D(DD&"6s4;;7G"Qi IIaL99!!#:[[F[[)a-0F(0 	(OHeaA<'$$Q'	(
   -r&   
prune_norm
prune_headc                     t        t        | j                        |      \  }}| j                  d|dz    | _        |r| j                  dd       |S )z@ Prune layers not required for specified intermediates.
        Nr   r   r   )r   rb   r   r   )r!   r   r  r  r   r  s         r%   prune_intermediate_layersz(HighPerfGpuNet.prune_intermediate_layers*  sM     #7s4;;7G"Qikk.9q=1!!!U+r&   c                 F    | j                  |      }| j                  |      S r(   )rc   r   r)   s     r%   forward_featureszHighPerfGpuNet.forward_features8  s    IIaL{{1~r&   r   c                 N    |r| j                  ||      S | j                  |      S )N)r   )r   r   s      r%   forward_headzHighPerfGpuNet.forward_head<  s%    6@tyyzy2RdiiPQlRr&   c                 J    | j                  |      }| j                  |      }|S r(   )r
  r  r)   s     r%   r+   zHighPerfGpuNet.forward?  s'    !!!$a r&   )rX     r   r   r-   r-   Fr|   )Tr(   )NFFr   F)r   FT)r/   r0   r1   r   r   r   r   r   r   r   r   r   ignorer   r   r   Moduler   r   Tensorr   r   r   r  r  r
  r  r+   r2   r3   s   @r%   r   r     s   
 #$.2!$&!J'J' J' 	J'
 J' 'smJ' J' "J' J'X YY
 
 YY* * YY		  2C 2hsm 2 8<$$',( ||(  eCcN34(  	( 
 (  (  !%(  
tELL!5tELL7I)I#JJ	K( X ./$#	3S	>*  	S$ Sr&   r   )0   r  `   )r  r     r   FFrX      )r       r   TFrX   r  )r        rW   TFrX   r  )r        r   TFrX   r  )r   rf   r   r   r   r   )@   r  r  )r  r     r   FFrX      )r  r  r  r   TFrX   r  )r  r  r  rW   TFrX   r  )r  r     r   TFrX   r  )r  r  r  )r  r  @  r   FFrX      )r   r    rW   TFrX   r!  )r"  r    rX   TFrX   r!  )r#     i   rW   TFrX   r!  r      )r%  r%  r  r   FFrX   rX   )r      r  r   TFrX   rX   )r  r  r  rW   TTr  rX   )r  r  r  r   TTr  rX      r&  )r&  r&  r  r   FFrX   rX   )r  r  r  r   TFrX   rX   )r  r  r  rW   TTr  rX   )r  r  r  r   TTr  rX   )r&  r&  r  r   FFrX   r   )r  r    r   TFrX   r   )r(  r  r  rX   TTr  r   )r  r  i   r   TTr  r   )r&  r&  r  r   FFrX   r  )r  r  r  r   TFrX   r  )r  r  r  rX   TTr  r  )r  r  r   r   TTr  r  r  )r  r  r  r   FFrX   r  )r  r  r  r   TFrX   r  )r  r  r  rX   TTr  r  )r  r(  r   r   TTr  r  r  )r  r  r  r   FFrX   r  )r  r  r  rW   TFrX   r  )r  r  r  r  TTr  r  )r  r  r   rW   TTr  r  r  )r  r  r  rW   FFrX   r  )r  r  r  rX   TFrX   r  )r  r(  r  r  TTr  r  )r  r  r   rX   TTr  r  )

hgnet_tinyhgnet_small
hgnet_base
hgnetv2_b0
hgnetv2_b1
hgnetv2_b2
hgnetv2_b3
hgnetv2_b4
hgnetv2_b5
hgnetv2_b6c                 t    |j                  dd      }t        t        | |ft        |    t	        d|      d|S )Nout_indices)r   r   rW   rX   T)flatten_sequentialr4  )	model_cfgfeature_cfg)popr   r   
model_cfgsr   )variant
pretrainedr   r4  s       r%   _create_hgnetr<    sK    **]L9K W%DkJ  r&   c                 4    | dddddt         t        dddd	d
|S )Nr  )rX   r  r  )r!  r!  gzG?bicubiczhead.fczstem.stem1.convr,   )rX   r$  r$  )urlr   
input_size	pool_sizecrop_pctinterpolationrZ   std
classifier
first_convtest_crop_pcttest_input_sizer   )r?  r   s     r%   _cfgrI    s6    =vI%.B/@  r&   zhgnet_tiny.paddle_in1kzstem.stem.0.convztimm/)rF  	hf_hub_idzhgnet_tiny.ssld_in1kzhgnet_small.paddle_in1kzhgnet_small.ssld_in1kzhgnet_base.ssld_in1kzhgnetv2_b0.ssld_stage2_ft_in1k)rJ  z!hgnetv2_b0.ssld_stage1_in22k_in1kzhgnetv2_b1.ssld_stage2_ft_in1kz!hgnetv2_b1.ssld_stage1_in22k_in1kzhgnetv2_b2.ssld_stage2_ft_in1kz!hgnetv2_b2.ssld_stage1_in22k_in1kzhgnetv2_b3.ssld_stage2_ft_in1kz!hgnetv2_b3.ssld_stage1_in22k_in1kzhgnetv2_b4.ssld_stage2_ft_in1kz!hgnetv2_b4.ssld_stage1_in22k_in1kzhgnetv2_b5.ssld_stage2_ft_in1kz!hgnetv2_b5.ssld_stage1_in22k_in1k)zhgnetv2_b6.ssld_stage2_ft_in1kz!hgnetv2_b6.ssld_stage1_in22k_in1kr   c                     t        dd| i|S )Nr;  )r)  r<  r;  r   s     r%   r)  r)        G*GGGr&   c                     t        dd| i|S )Nr;  )r*  rL  rM  s     r%   r*  r*    s    H:HHHr&   c                     t        dd| i|S )Nr;  )r+  rL  rM  s     r%   r+  r+    rN  r&   c                     t        d| dd|S )NTr;  r;   )r,  rL  rM  s     r%   r,  r,        U*dUfUUr&   c                     t        d| dd|S )NTrR  )r-  rL  rM  s     r%   r-  r-     rS  r&   c                     t        d| dd|S )NTrR  )r.  rL  rM  s     r%   r.  r.    rS  r&   c                     t        d| dd|S )NTrR  )r/  rL  rM  s     r%   r/  r/  
  rS  r&   c                     t        dd| i|S )Nr;  )r0  rL  rM  s     r%   r0  r0    rN  r&   c                     t        dd| i|S )Nr;  )r1  rL  rM  s     r%   r1  r1    rN  r&   c                     t        dd| i|S )Nr;  )r2  rL  rM  s     r%   r2  r2    rN  r&   r|   )rG   )8__doc__typingr   r   r   r   r   r   torch.nnr   torch.nn.functional
functionalrw   	timm.datar	   r
   timm.layersr   r   r   _builderr   	_featuresr   	_registryr   r   _manipulater   __all__r  r   r5   rI   rO   r^   rj   r~   r   r   r   r   r9  r<  rI  default_cfgsr)  r*  r+  r,  r-  r.  r/  r0  r1  r2   r&   r%   <module>rh     s   6 5     A E E * + < '
*299 *&		 &RRYY @&		 &(RYY (3RYY 3lVryy Vr8ryy 8v9RYY 9xdRYY dN   6777 !8778 !8778 H5557 H5557 H5567 H6678 H6678 H6778 H6778i]
@		 % ,&d%,& D%	,& t% ,& T%,& D%,&  %d'!,&$ (*%,&( %d'),&, (*-,&0 %d'1,&4 (*5,&8 %d'9,&< (*=,&@ %d'A,&D (*E,&H %d'I,&L (*M,&P '+')-*U,& ,^ Hn H H I~ I I Hn H H Vn V V Vn V V Vn V V Vn V V Hn H H Hn H H Hn H Hr&   