
    Ng-Y                        d Z ddlmZ ddlmZ ddlZddlmc mZ	 ddlmZ ddl
mZmZ ddlmZmZmZmZmZmZ ddlmZ d	d
lmZ d	dlmZ d	dlmZ d	dlmZmZ dgZd/dZ G d dej                   Z!d/d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)d  Z*d0d"Z+d1d$Z, e e,d%&           e,d%&           e,d%&           e,d%d'd(d)*           e,d%d'd(d)*           e,d%d'd(d)*           e,d%&           e,d%&           e,d%&           e,d%d'd(d)*           e,d%d'd(d)*           e,d%d'd(d)*          d+          Z-ed0d,            Z.ed0d-            Z/ed0d.            Z0dS )2z Next-ViT

As described in https://arxiv.org/abs/2207.05501

Next-ViT model defs and weights adapted from https://github.com/bytedance/Next-ViT, original copyright below
    )partial)OptionalN)nnIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)DropPathtrunc_normal_ConvMlpget_norm_layerget_act_layeruse_fused_attn)ClassifierHead   )build_model_with_cfg)register_notrace_function)checkpoint_seq)generate_default_cfgsregister_modelNextViTc                    | j         j        }| j        ^t          j        | j        |j                                      |                                          }t          j	        |          | _        | j        j        }|}|j
        du s
J d            |j        du s
J d            |j                            |j                                      d          }||j         z  }|j        |j         |j        z  |z  z
  }n|j
        du s
J d            |j        du s
J d            |j
        du s
J d            |j        du s
J d            |j                            |j                                      d          }	|j                            |j                                      d          }
|	|j         z  |
z  |j         z  }|
|j         z  |j        |j         |j        z  |	z  z
  |j        z
  z  |j        z   }t#          | t          j                  rU||z  }|                    |                    d|                    d                                        |                     nt#          | t          j                  r|j        d         dk    r|j        d	         dk    sJ |                    |j        d
         |j        d                   }||z  }|                    |                    d|                    d                                        |                     |                    |j        d
         |j        d         dd          }|                    |           || j         _        || j        _        dS )z/ Merge pre BN to reduce inference runtime.
    N)deviceTz2Unsupported bn_module.track_running_stats is Falsez%Unsupported bn_module.affine is False      r         r   )weightdatabiastorchzerosout_chsr   typer   	Parametertrack_running_statsaffinerunning_varaddepspowrunning_mean
isinstanceLinearmul_viewsize	expand_asConv2dshapereshapeadd_)modulepre_bn_1pre_bn_2r   r    r   scale_invstdextra_weight
extra_biasscale_invstd_1scale_invstd_2s              O/var/www/html/ai-engine/env/lib/python3.11/site-packages/timm/models/nextvit.pymerge_pre_bnr>      sP    ]F{FN6=AAAFFv{{}}UUl5));D+t3335i333$&&&(O&&&+//==AA$GG#ho5]X_x7L%L|%[[

+t3335i333$&&&(O&&&+t3335i333$&&&(O&&&!-11(,??CCDII!-11(,??CCDII%7.H8?Z0=8?X5J#J^#[[^f^ssu-  	 &")$$ Hj(
L%%aQ88BB6JJKKKK	FBI	&	& H|A!##Q1(<(<(<(<QaAAj(
L%%aQ88BB6JJKKKQa!QGGIIjFMFK    c                   D     e Zd Zdddej        ej        f fd	Zd Z xZS )ConvNormActr   r   c           	          t          t          |                                            t          j        ||||d|d          | _         ||          | _         |            | _        d S )Nr   Fkernel_sizestridepaddinggroupsr   )superrA   __init__r   r1   convnormact)	selfin_chsr!   rD   rE   rG   
norm_layer	act_layer	__class__s	           r=   rI   zConvNormAct.__init__J   sm     	k4  ))+++IGVf52 2 2	 Jw''	9;;r?   c                     |                      |          }|                     |          }|                     |          }|S N)rJ   rK   rL   rM   xs     r=   forwardzConvNormAct.forward[   s4    IIaLLIIaLLHHQKKr?   )	__name__
__module____qualname__r   BatchNorm2dReLUrI   rV   __classcell__rQ   s   @r=   rA   rA   I   sa        
 ~g     "      r?   rA   c                 |    ||}t          |t          | |dz  z             |z  |z            }|d| z  k     r||z  }|S )Nr   g?)maxint)vdivisor	min_valuenew_vs       r=   _make_divisiblere   b   sR    		3q7Q;//7:WDEEEsQwLr?   c                   4     e Zd Zdej        f fd	Zd Z xZS )
PatchEmbedr   c                 (   t          t          |                                            |dk    rMt          j        dddd          | _        t          j        ||ddd          | _         ||          | _        d S ||k    rHt          j	                    | _        t          j        ||ddd          | _         ||          | _        d S t          j	                    | _        t          j	                    | _        t          j	                    | _        d S )Nr   )r   r   TF)rE   	ceil_modecount_include_padr   )rD   rE   r   )
rH   rg   rI   r   	AvgPool2dpoolr1   rJ   rK   Identity)rM   rN   r!   rE   rO   rQ   s        r=   rI   zPatchEmbed.__init__m   s     	j$((***Q;;VAY^___DI	&'qQVWWWDI"
7++DIIIwDI	&'qQVWWWDI"
7++DIIIDIDIDIIIr?   c                 x    |                      |                     |                     |                              S rS   )rK   rJ   rl   rT   s     r=   rV   zPatchEmbed.forward   s*    yy499Q<<00111r?   )rW   rX   rY   r   rZ   rI   rV   r\   r]   s   @r=   rg   rg   l   sV         	& & & & & &*2 2 2 2 2 2 2r?   rg   c                   B     e Zd ZdZej        ej        f fd	Zd Z xZ	S )ConvAttentionz,
    Multi-Head Convolutional Attention
    c           	         t          t          |                                            t          j        ||ddd||z  d          | _         ||          | _         |            | _        t          j        ||dd          | _        d S )Nr   r   FrC   )rD   r   )	rH   rp   rI   r   r1   group_conv3x3rK   rL   
projection)rM   r!   head_dimrO   rP   rQ   s        r=   rI   zConvAttention.__init__   s    mT""++---YW!Qw(7JQV
 
 
 Jw''	9;;)GW!%PPPr?   c                     |                      |          }|                     |          }|                     |          }|                     |          }|S rS   )rr   rK   rL   rs   rM   rU   outs      r=   rV   zConvAttention.forward   sI      ##iinnhhsmmooc""
r?   )
rW   rX   rY   __doc__r   rZ   r[   rI   rV   r\   r]   s   @r=   rp   rp      si          8:~SUSZ Q Q Q Q Q Q      r?   rp   c                   |     e Zd ZdZdddddej        ej        f fd	Z ej	                    d             Z
d Z xZS )	NextConvBlockz 
    Next Convolution Block
    r               g      @c
                    t          t          |                                            || _        || _        ||z  dk    sJ t          ||||          | _        t          ||||	          | _        t          |          | _
         ||          | _        t          |t          ||z            |d|	          | _        t          |          | _        d| _        d S )Nr   )rO   )rO   rP   T)hidden_featuresdropr   rP   F)rH   rz   rI   rN   r!   rg   patch_embedrp   mhcar	   attn_drop_pathrK   r   r`   mlpmlp_drop_pathis_fused)rM   rN   r!   rE   	drop_pathr   rt   	mlp_ratiorO   rP   rQ   s             r=   rI   zNextConvBlock.__init__   s     	mT""++---!Q&&&&%fgv*UUU!!	
 
 
	 'y11Jw''	) 344
 
 
 &i00r?   c                     | j         s@t          | j        j        | j                   t          j                    | _        d| _         d S d S NT)r   r>   r   fc1rK   r   rm   rM   s    r=   reparameterizezNextConvBlock.reparameterize   sD    } 	!ty111DI DMMM	! 	!r?   c                    |                      |          }||                     |                     |                    z   }|                     |          }||                     |                     |                    z   }|S rS   )r   r   r   rK   r   r   rv   s      r=   rV   zNextConvBlock.forward   sm    Q##DIIaLL111iill""488C==111r?   rW   rX   rY   rx   r   rZ   r[   rI   r   no_gradr   rV   r\   r]   s   @r=   rz   rz      s          ~g# # # # # #J U]__! ! _!      r?   rz   c                   n     e Zd ZU dZej        j        e         ed<   dddddde	j
        f fd	Zd	 Z xZS )
EfficientAttentionz-
    Efficient Multi-Head Self Attention
    
fused_attnNr|   Tr{   r   c	                    t                                                       || _        ||n|| _        | j        |z  | _        || _        |dz  | _        t                      | _        t          j
        || j        |          | _        t          j
        || j        |          | _        t          j
        || j        |          | _        t          j
        | j        | j                  | _        t          j        |          | _        t          j        |          | _        || _        |dz  | _        |dk    r7t          j        | j        | j                  | _         ||          | _        d S d | _        d | _        d S )Nr   )r   r   r   )rD   rE   )rH   rI   dimout_dim	num_headsrt   scaler   r   r   r,   qkra   projDropout	attn_drop	proj_dropsr_ratioN_ratio	AvgPool1dsrrK   )
rM   r   r   rt   qkv_biasr   r   r   rO   rQ   s
            r=   rI   zEfficientAttention.__init__   sA    	")"5ww3X- %
(**3x8883x8883x888Idh55	I..I.. 1}a<<lt|DLQQQDG"
3DIIIDGDIIIr?   c                 >   |j         \  }}}|                     |                              ||| j        | j                                      dddd          }| j        R|                     |                    dd                    }|                     |                              dd          }| 	                    |                              |d| j        | j                                      dd          }| 
                    |                              |d| j        | j                                      dd          }| j        r,t          j        |||| j        r| j        j        nd          }nS|| j        z  }||                    dd          z  }|                    d	          }|                     |          }||z  }|                    dd                              |||          }|                     |          }|                     |          }|S )
Nr   r   r   r   r{   )	dropout_pr   )r2   r   r3   r   rt   permuter   	transposerK   r   ra   r   Fscaled_dot_product_attentiontrainingr   pr   softmaxr   r   )	rM   rU   BNCr   r   ra   attns	            r=   rV   zEfficientAttention.forward   s   '1aFF1IIaDNDMBBJJ1aQRTUVV7Aq))**A		!&&q!,,AFF1IIaT^T]CCMMaQRSSFF1IIaT^T]CCMMaQRSS? 
	.1a.2mC$.**  AA
 DJAq{{2r***D<<B<''D>>$''DqAKK1%%aA..IIaLLNN1r?   )rW   rX   rY   rx   r   jitFinalbool__annotations__r   BatchNorm1drI   rV   r\   r]   s   @r=   r   r      s           	%%%%
 ~! ! ! ! ! !F      r?   r   c            	            e Zd ZdZdddddddej        ej        f	 fd	Z ej	                    d             Z
d	 Z xZS )
NextTransformerBlockz 
    Next Transformer Block
    r   r   r|         ?r{   c                 
   t          t          |                                            || _        || _        || _        t          t          ||z            d          | _        || j        z
  | _	        t          || j        |          | _         || j                  | _        t          | j        |||	|
          | _        t          ||z            | _        t          | j        | j	        d|          | _        t%          | j	        |||          | _        t          |d|z
  z            | _         ||          | _        t-          |t          ||z            ||
          | _        t          |          | _        d| _        d S )Nr|   )rt   r   r   r   r   )rE   rO   )rt   rO   rP   )r~   rP   r   F)rH   r   rI   rN   r!   mix_block_ratiore   r`   mhsa_out_chsmhca_out_chsrg   r   norm1r   e_mhsar	   mhsa_drop_pathrs   rp   r   mhca_drop_pathnorm2r   r   r   r   )rM   rN   r!   r   rE   r   r   rt   r   r   r   rO   rP   rQ   s                r=   rI   zNextTransformerBlock.__init__!  s    	"D))22444.+C/0I,J,JBOO#d&77%fd.?HHZ 122
(
 
 
 'y?'BCC$T%68IRS`jkkk!!	
 
 
	 'yA4G'HIIZ((
) 344	
 
 
 &i00r?   c                 |   | j         s3t          | j        j        | j                   | j        j        rt          | j        j        | j        | j        j                   t          | j        j        | j        | j        j                   t          j	                    | j        _        n>t          | j        j        | j                   t          | j        j        | j                   t          j	                    | _        t          | j
        j        | j                   t          j	                    | _        d| _         d S d S r   )r   r>   r   r   r   rK   r   ra   r   rm   r   r   r   r   s    r=   r   z#NextTransformerBlock.reparameterizeV  s    } 	!
333{+T[]DJ8HIIIT[]DJ8HIII#%;==  T[]DJ777T[]DJ777DJtz222DJ DMMM	! 	!r?   c                    |                      |          }|j        \  }}}}|                     |          }|                    ||d                              dd          }|                     |                     |                    }||                    dd                              ||||          z   }|                     |          }||                     | 	                    |                    z   }t          j        ||gd          }|                     |          }||                     |                     |                    z   }|S )Nr   r   r   r   )r   r2   r   r3   r   r   r   rs   r   r   r   catr   r   r   )rM   rU   r   r   HWrw   s          r=   rV   zNextTransformerBlock.forwardg  s$   QW
1ajjmmkk!Q##--b"55!!$++c"2"233b"%%--aAq999ooa  D''		#777Iq#hA&&&jjmm""488C==111r?   r   r]   s   @r=   r   r     s           ~g3 3 3 3 3 3j U]__! ! _!       r?   r   c            	       x     e Zd Zdddddddej        ej        f	 fd	Zej        j	        d
d            Z
d	 Z xZS )	NextStager   r         ?r{   r|   c                 
   t                                                       d| _        g }t          |          D ]\  }}|dk    r|nd}||         }||         }t	          |	t
          t          f          r|	|         n|	}|t          u r-t          ||||||
||          }|                    |           n8|t          u r/t          ||||||
|||||          }|                    |           |}t          j        | | _        d S )NFr   r   )rE   r   r   rt   rO   rP   )	r   rE   r   rt   r   r   r   rO   rP   )rH   rI   grad_checkpointing	enumerater+   listtuplerz   appendr   r   
Sequentialblocks)rM   rN   	block_chsblock_typesrE   r   r   r   r   r   rt   rO   rP   r   	block_idx
block_typer!   dprlayerrQ   s                      r=   rI   zNextStage.__init__{  sH    	"'%.{%;%;  	  	!Iz(A~~VV1F	*G$Y/J*4Yu*N*N])I&&T]C]**%!!%)'	 	 	 e$$$$333,!!%%$3')'   e$$$FFmV,r?   Tc                     || _         d S rS   )r   )rM   enables     r=   set_grad_checkpointingz NextStage.set_grad_checkpointing  s    "(r?   c                     | j         r4t          j                                        st	          | j        |          }n|                     |          }|S rS   )r   r   r   is_scriptingr   r   rT   s     r=   rV   zNextStage.forward  sI    " 	59+A+A+C+C 	t{A..AAAAr?   T)rW   rX   rY   r   rZ   r[   rI   r   r   ignorer   rV   r\   r]   s   @r=   r   r   y  s         ~g5- 5- 5- 5- 5- 5-n Y) ) ) )      r?   r   c                       e Zd Zdddddddddd	d
ej        df fd	Z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 ZddefdZd Z xZS )r     avg)@   r|   r   r      
   r   )r   r   r   r   )   r   r   r   皙?r{   r|   r   Nc                    t          t          |                                            d| _        || _        t          |          }|t          t          j        d          }nt          |          }dgd         z  dgd         dz
  z  dgz   g d	d
         dz  z  dgd         dz
  z  dgz   g| _
        d t          | j
                  D             | _        t          gd         z  t          gd         dz
  z  t          gz   t          t          t          t          t          gd
         dz  z  t          gd         dz
  z  t          gz   g| _        t          j        t#          ||d         dd
||          t#          |d         |d         dd||          t#          |d         |d
         dd||          t#          |d
         |d
         dd
||                    | _        |d         x}}g }d}d t'          j        d|t+                                                            D             }t/          t1                              D ]k}t3          || j
        |         | j        |         ||         ||         |||
|	||         ||          }| j
        |         d         x}}||gz  }||         z  }l|x| _        | _        t          j        | | _         ||          | _        t=          |||          | _        fdt/          t1                              D             | _         | !                                 d S )NFT)inplace`   r      r      )  r   r   r   i   r      i   r   i   c                 V    g | ]&\  }}t          |d          d|dz   z  d|           'S )r   r   zstages.)num_chs	reductionr5   dict).0iscs      r=   
<listcomp>z$NextViT.__init__.<locals>.<listcomp>  sX     6 6 6 a	 "rF!a%j Q==
 
 
 6 6 6r?   )rD   rE   rO   rP   r   c                 6    g | ]}|                                 S  )tolist)r   rU   s     r=   r   z$NextViT.__init__.<locals>.<listcomp>  s     ```aqxxzz```r?   )rN   r   r   rE   r   r   rt   r   r   r   rO   rP   )	pool_typein_featuresnum_classesc                 J    g | ]}t          d |dz                      dz
   S )Nr   )sum)r   idxdepthss     r=   r   z$NextViT.__init__.<locals>.<listcomp>  s3    VVVCc&#'"233a7VVVr?   )"rH   r   rI   r   r   r   r   r   r[   r   stage_out_chsr   feature_inforz   r   stage_block_typesr   rA   stemr   linspacer  splitrangelenr   num_featureshead_hidden_sizestagesrK   r   headstage_out_idx_initialize_weights)rM   in_chansr   global_poolstem_chsr  strides	sr_ratiosdrop_path_rateattn_drop_rate	drop_ratert   r   rO   rP   rN   r!   r  r  r   	stage_idxstagerQ   s        `                r=   rI   zNextViT.__init__  s   " 	gt%%'''"'&#J//
666II%i00I DF1IEVAY]#se+%%%a8EVAY]#tf,	
6 6 !!344	6 6 6 OfQi'Ovay1}-1E0FFM=-I]^bhijbkopbpqOvay1}-1E0FF	"H M(1+1QS]irsssXa[aV`luvvvXa[aV`luvvvXa[aV`luvvv	
 
	 $B<'``5>!^S[[#Q#Q#W#WX^#_#_```s6{{++ 	% 	%I,Y7 29=y)"9- /!(i.%#  E  $1)<R@@FWugF6)$$CC4;;D1mV,Jw''	"[g[fggg	VVVV5VCUCUVVV  """""r?   c                    |                                  D ]\  }}t          |t          j                  rSt	          |j        d           t          |d          r,|j        %t          j        	                    |j        d           rt          |t          j
                  rRt	          |j        d           t          |d          r,|j        %t          j        	                    |j        d           d S )Ng{Gz?)stdr   r   )named_modulesr+   r   r,   r
   r   hasattrr   init	constant_r1   )rM   nms      r=   r  zNextViT._initialize_weights  s    &&(( 	1 	1DAq!RY'' 1ahC00001f%% 1!&*<G%%afa000Ary)) 1ahC00001f%% 1!&*<G%%afa000	1 	1r?   Fc                 0    t          d|rdnddg          S )Nz^stemz^stages\.(\d+))z^stages\.(\d+)\.blocks\.(\d+)N)z^norm)i )r  r   r   )rM   coarses     r=   group_matcherzNextViT.group_matcher  s5    (. $$8$5
 
 
 	
r?   Tc                 T    || _         | j        D ]}|                    |           d S )N)r   )r   r  r   )rM   r   r  s      r=   r   zNextViT.set_grad_checkpointing%  s?    "([ 	8 	8E(((7777	8 	8r?   returnc                     | j         j        S rS   )r  fcr   s    r=   get_classifierzNextViT.get_classifier+  s    y|r?   r   r  c                 >    | j                             ||           d S )N)r   )r  reset)rM   r   r  s      r=   reset_classifierzNextViT.reset_classifier/  s     	{;;;;;r?   c                     |                      |          }| j        r4t          j                                        st          | j        |          }n|                     |          }|                     |          }|S rS   )r  r   r   r   r   r   r  rK   rT   s     r=   forward_featureszNextViT.forward_features2  sg    IIaLL" 	59+A+A+C+C 	t{A..AAAAIIaLLr?   
pre_logitsc                 ^    |r|                      ||          n|                      |          S )N)r1  )r  )rM   rU   r1  s      r=   forward_headzNextViT.forward_head;  s-    6@Rtyyzy222diiPQllRr?   c                 Z    |                      |          }|                     |          }|S rS   )r0  r3  rT   s     r=   rV   zNextViT.forward>  s-    !!!$$a  r?   Fr   rS   )rW   rX   rY   r   rZ   rI   r  r   r   r   r&  r   Moduler+  r`   r   strr.  r0  r   r3  rV   r\   r]   s   @r=   r   r     sh        !  " ~O# O# O# O# O# O#b	1 	1 	1 Y
 
 
 
 Y8 8 8 8
 Y	    < <C <hsm < < < <  S S$ S S S S      r?   c                    d| v r| S |                                 }i }t          |                                |                                 |                                |                                           D ]\  }}}}|||<   |S )z$ Remap original checkpoints -> timm zhead.fc.weight)
state_dictzipkeysvalues)r9  modelDout_dictkakbvavbs           r=   checkpoint_filter_fnrD  D  s    :%%AHaffhh
(9(9188::zGXGXGZGZ[[  BBOr?   Fc           	          t          d t          |                    dd                    D                       }|                    d|          }t	          t
          | |ft          t          d|          d|}|S )Nc              3       K   | ]	\  }}|V  
d S rS   r   )r   r   _s      r=   	<genexpr>z"_create_nextvit.<locals>.<genexpr>S  s&      \\da\\\\\\r?   r  )r   r   r   r   out_indicesT)flatten_sequentialrI  )pretrained_filter_fnfeature_cfg)r   r   getpopr   r   rD  r   )variant
pretrainedkwargsdefault_out_indicesrI  r=  s         r=   _create_nextvitrS  R  s    \\i

8\8Z8Z.[.[\\\\\**],?@@K  2DkJJJ   E Lr?    c                 4    | dddddt           t          ddd
|S )	Nr   )r      rV  )   rW  gffffff?bicubiczstem.0.convzhead.fc)
urlr   
input_size	pool_sizecrop_pctinterpolationmeanr  
first_conv
classifierr   )rY  rQ  s     r=   _cfgra  a  s5    =v9%.B#9   r?   ztimm/)	hf_hub_id)r   r   r   )   rc  r   )rb  rZ  r[  r\  )znextvit_small.bd_in1kznextvit_base.bd_in1kznextvit_large.bd_in1kznextvit_small.bd_in1k_384znextvit_base.bd_in1k_384znextvit_large.bd_in1k_384znextvit_small.bd_ssld_6m_in1kznextvit_base.bd_ssld_6m_in1kznextvit_large.bd_ssld_6m_in1kz!nextvit_small.bd_ssld_6m_in1k_384z nextvit_base.bd_ssld_6m_in1k_384z!nextvit_large.bd_ssld_6m_in1k_384c           	      \    t          dd          }t          	 dd| it          |fi |}|S )Nr   r   r  r  nextvit_smallrP  )rf  r   rS  rP  rQ  
model_argsr=  s       r=   rf  rf    U    ]3???JN N$.N26z2L2LV2L2LN NELr?   c           	      \    t          dd          }t          	 dd| it          |fi |}|S )N)r   r      r   皙?re  nextvit_baserP  )rn  rg  rh  s       r=   rn  rn    sU    ]3???JM M#-M15j1K1KF1K1KM MELr?   c           	      \    t          dd          }t          	 dd| it          |fi |}|S )N)r   r      r   rm  re  nextvit_largerP  )rq  rg  rh  s       r=   rq  rq    rj  r?   rS   r5  )rT  )1rx   	functoolsr   typingr   r   torch.nn.functionalr   
functionalr   	timm.datar   r   timm.layersr	   r
   r   r   r   r   r   _builderr   _features_fxr   _manipulater   	_registryr   r   __all__r>   r6  rA   re   rg   rp   rz   r   r   r   r   rD  rS  ra  default_cfgsrf  rn  rq  r   r?   r=   <module>r~     s                                A A A A A A A A g g g g g g g g g g g g g g g g & & & & & & * * * * * * 3 3 3 3 3 3 ' ' ' ' ' ' < < < < < < < <+, , , ,^    ")   2   2 2 2 2 2 2 2 24    BI   ,7 7 7 7 7BI 7 7 7tC C C C C C C CLZ Z Z Z Z29 Z Z ZzB B B B B	 B B BJC C C C Cbi C C CL         %$!T   !D   "T   "& Hs" " " !% Hs! ! ! "& Hs" " "
 &*T& & & %)D% % % &*T& & & *. Hs* * * )- Hs) ) ) *. Hs* * *Q,& ,& , ,^              r?   