
    RЦi                        S r SSKrSSKJr  SSKJrJrJrJrJ	r	J
r
  SSKrSSKJr  SSKJrJr  SSKJrJrJrJrJr  SSKJr  SS	KJr  SS
KJr  SSKJr  SSKJ r J!r!J"r"  SSK#J$r$  S/r%\ " S S\RL                  5      5       r'SS jr( " S S\RL                  5      r) " S S\RL                  5      r* " S S\RL                  5      r+ " S S\RL                  5      r, " S S\RL                  5      r- " S S\RL                  5      r.S r/SS jr0SS jr1\!" 0 S \1" S!S"S#9_S$\1" S!S%S#9_S&\1" S!S'S(S)9_S*\1" S!S+S#9_S,\1" S!S-S#9_S.\1" S!S/S(S)9_S0\1" S!S1S#9_S2\1" S!S3S#9_S4\1" S!S5S(S)9_S6\1" S!S7S#9_S8\1" S!S9S#9_S:\1" S!S;S(S)9_S<\1" S!S=S#9_S>\1" S!S?S#9_S@\1" S!SAS(S)9_SB\1" S!SCS#9_SD\1" S!SES#9_0 SF\1" S!SGS(S)9_SH\1" S!SIS#9_SJ\1" S!SKS#9_SL\1" S!SMS(S)9_SN\1" S!SOS#9_SP\1" S!SQS#9_SR\1" S!SSS(S)9_ST\1" S!SUS#9_SV\1" S!SWS#9_SX\1" S!SYS(S)9_SZ\1" S!S[S#9_S\\1" S!S]S#9_S^\1" S!S_S(S)9_S`\1" S!SaS#9_Sb\1" S!ScS#9_Sd\1" S!SeS(S)9_Sf\1" S!SgS#9_E\1" S!ShS#9\1" S!SiS(S)9\1" S!SjS#9\1" S!SkS#9\1" S!SlS(S)9\1" S!SmS#9\1" S!SnS#9\1" S!SoS(S)9Sp.E5      r2\ SSq\.4Sr jj5       r3\ SSq\.4Ss jj5       r4\ SSq\.4St jj5       r5\ SSq\.4Su jj5       r6\ SSq\.4Sv jj5       r7\ SSq\.4Sw jj5       r8\ SSq\.4Sx jj5       r9\ SSq\.4Sy jj5       r:\ SSq\.4Sz jj5       r;\ SSq\.4S{ jj5       r<\ SSq\.4S| jj5       r=\ SSq\.4S} jj5       r>\ SSq\.4S~ jj5       r?\ SSq\.4S jj5       r@\ SSq\.4S jj5       rA\ SSq\.4S jj5       rB\ SSq\.4S jj5       rC\ SSq\.4S jj5       rD\ SSq\.4S jj5       rE\ SSq\.4S jj5       rF\ SSq\.4S jj5       rG\ SSq\.4S jj5       rH\ SSq\.4S jj5       rI\ SSq\.4S jj5       rJ\ SSq\.4S jj5       rK\ SSq\.4S jj5       rL\ SSq\.4S jj5       rM\ SSq\.4S jj5       rN\"" \O0 SS$_SS&_SS,_SS._SS2_SS4_SS8_SS:_SS>_SS@_SSD_SSF_SSJ_SSL_SSP_SSR_SSV_SXS\S^SbSdSSSSSSS.E5        g)a\  Cross-Covariance Image Transformer (XCiT) in PyTorch

Paper:
    - https://arxiv.org/abs/2106.09681

Same as the official implementation, with some minor adaptations, original copyright below
    - https://github.com/facebookresearch/xcit/blob/master/xcit.py

Modifications and additions for timm hacked together by / Copyright 2021, Ross Wightman
    N)partial)ListOptionalTupleUnionTypeAnyIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)DropPathtrunc_normal_	to_2tupleuse_fused_attnMlp   )build_model_with_cfg)feature_take_indices)register_notrace_module)
checkpoint)register_modelgenerate_default_cfgsregister_model_deprecations)	ClassAttnXcitc                   `   ^  \ rS rSrSr     SS\S\S\4U 4S jjjrS\S\S	\4S
 jrSr	U =r
$ )PositionalEncodingFourier!   z
Positional encoding relying on a fourier kernel matching the one used in the "Attention is all you Need" paper.
Based on the official XCiT code
    - https://github.com/facebookresearch/xcit/blob/master/xcit.py

hidden_dimdimtemperaturec                    > XES.n[         TU ]  5         [        R                  " US-  U4SS0UD6U l        S[
        R                  -  U l        X0l        Xl	        X l
        SU l        g )Ndevicedtype   kernel_sizer   ư>)super__init__nnConv2dtoken_projectionmathpiscaler!   r   r    eps)selfr   r    r!   r$   r%   dd	__class__s          O/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/timm/models/xcit.pyr*   "PositionalEncodingFourier.__init__)   s`     / "		*q.# S1 SPR S[
&$    BHWc           
         U R                   R                  R                  nU R                   R                  R                  n[        R
                  " SUS-   US9R                  [        R                  5      R                  S5      R                  SSU5      n[        R
                  " SUS-   US9R                  [        R                  5      R                  SUS5      nXfS S 2SS 2S S 24   U R                  -   -  U R                  -  nXwS S 2S S 2SS 24   U R                  -   -  U R                  -  n[        R
                  " U R                  US9R                  [        R                  5      nU R                  S[        R                  " USSS9-  U R                  -  -  nUS S 2S S 2S S 2S 4   U-  n	US S 2S S 2S S 2S 4   U-  n
[        R                  " U	S S 2S S 2S S 2SS S24   R!                  5       U	S S 2S S 2S S 2SS S24   R#                  5       /SS	9R%                  S
5      n	[        R                  " U
S S 2S S 2S S 2SS S24   R!                  5       U
S S 2S S 2S S 2SS S24   R#                  5       /SS	9R%                  S
5      n
[        R&                  " X4S
S	9R)                  SS
SS5      nU R                  UR                  U5      5      nUR                  USSS5      $ )Nr   )r$   r&   floor)rounding_moder      r       )r-   weightr$   r%   torcharangetofloat32	unsqueezerepeatr1   r0   r   r!   divstacksincosflattencatpermute)r2   r8   r9   r:   r$   r%   y_embedx_embeddim_tpos_xpos_yposs               r5   forward!PositionalEncodingFourier.forward:   s{   &&--44%%,,22,,q!a%7::5==ISSTUV]]^_abdef,,q!a%7::5==IPPQRTUWXYQQY/$((:;djjHQ23Y/$((:;djjHT__V<??N  Q5!7)S%SVZVeVe%ef1a&.1a&.U1aADqD=1557q!Q1}9M9Q9Q9STZ[\ddefgU1aADqD=1557q!Q1}9M9Q9Q9STZ[\ddefgiiA.66q!QB##CFF5M2zz!Q1%%r7   )r    r1   r   r0   r!   r-   )       i'  NN)__name__
__module____qualname____firstlineno____doc__intfloatr*   rV   __static_attributes____classcell__r4   s   @r5   r   r   !   s^     !!&  	 "& & & & &r7   r   c           
          X4S.n[         R                  R                  [        R                  " X4SUSSS.UD6[        R                  " U40 UD65      $ )z3x3 convolution + batch normr#   rA   r   F)r'   stridepaddingbias)rC   r+   
Sequentialr,   BatchNorm2d)	in_planes
out_planesre   r$   r%   r3   s         r5   conv3x3rl   L   sP    	+B88
		)cQvqW\c`bc
z(R( r7   c                      ^  \ rS rSrSrSSSS\R                  SS4S\S	\S
\S\S\\R                     4
U 4S jjjr
S rSrU =r$ )ConvPatchEmbedU   z<Image to Patch Embedding using multiple convolutional layers      rA   rY   Nimg_size
patch_sizein_chans	embed_dim	act_layerc                 Z  > XgS.n[         T
U ]  5         [        U5      nUS   U-  US   U-  -  n	Xl        X l        Xl        US:X  a{  [        R                  R                  [        X4S-  S40 UD6U" 5       [        US-  US-  S40 UD6U" 5       [        US-  US-  S40 UD6U" 5       [        US-  US40 UD65      U l
        g US:X  ab  [        R                  R                  [        X4S-  S40 UD6U" 5       [        US-  US-  S40 UD6U" 5       [        US-  US40 UD65      U l
        g Se)	Nr#   r   r   rq      r&   r?   z=For convolutional projection, patch size has to be in [8, 16])r)   r*   r   rr   rs   num_patchesrC   r+   rh   rl   proj)r2   rr   rs   rt   ru   rv   r$   r%   r3   ry   r4   s             r5   r*   ConvPatchEmbed.__init__X   sH    /X&{j0Xa[J5NO $&++q.!:r:	Q	Q@R@	Q	Q@R@	Q	1;;DI 1_++q.!:r:	Q	Q@R@	Q	1;;DI RRr7   c                     U R                  U5      nUR                  S   UR                  S   p2UR                  S5      R                  SS5      nXU44$ )Nr&   rA   r   )rz   shaperM   	transpose)r2   xHpWps       r5   rV   ConvPatchEmbed.forward   sL    IIaLQWWQZBIIaL""1a(r({r7   )rr   ry   rs   rz   )rZ   r[   r\   r]   r^   r+   GELUr_   r   Moduler*   rV   ra   rb   rc   s   @r5   rn   rn   U   su    F    )+%S%S %S 	%S
 %S BII%S %SN r7   rn   c            	          ^  \ rS rSrSrS\R                  SSS4S\S\\   S\	\R                     S\4U 4S	 jjjrS
\S\4S jrSrU =r$ )LPI   a  
Local Patch Interaction module that allows explicit communication between tokens in 3x3 windows to augment the
implicit communication performed by the block diagonal scatter attention. Implemented using 2 layers of separable
3x3 convolutions with GeLU and BatchNorm2d
NrA   in_featuresout_featuresrv   r'   c                 >  > [         T	U ]  5         XVS.nU=(       d    UnUS-  n[        R                  R                  " X4XHUS.UD6U l        U" 5       U l        [        R                  " U40 UD6U l        [        R                  R                  " X4XHUS.UD6U l	        g )Nr#   r&   )r'   rf   groups)
r)   r*   rC   r+   r,   conv1actri   bnconv2)
r2   r   r   rv   r'   r$   r%   r3   rf   r4   s
            r5   r*   LPI.__init__   s     	/#2{"XX__j2=Wbjfhj
;..33XX__l3>Xdlhjl
r7   r9   r:   c                 8   UR                   u  pEnUR                  SSS5      R                  XFX#5      nU R                  U5      nU R	                  U5      nU R                  U5      nU R                  U5      nUR                  XFU5      R                  SSS5      nU$ )Nr   r&   r   )r}   rO   reshaper   r   r   r   )r2   r   r9   r:   r8   NCs          r5   rV   LPI.forward   s    ''aIIaA&&qQ2JJqMHHQKGGAJJJqMIIaA&&q!Q/r7   )r   r   r   r   )rZ   r[   r\   r]   r^   r+   r   r_   r   r   r   r*   rV   ra   rb   rc   s   @r5   r   r      sw     +/)+ ll #3-l BII	l
 l l*C C  r7   r   c                      ^  \ rS rSrSrSSSSS\R                  \R                  SSSS4S\S	\S
\	S\
S\	S\	S\	S\\R                     S\\R                     S\\	   S\
4U 4S jjjrS rSrU =r$ )ClassAttentionBlock   zAClass Attention Layer as in CaiT https://arxiv.org/abs/2103.17239      @F              ?Nr    	num_heads	mlp_ratioqkv_bias	proj_drop	attn_drop	drop_pathrv   
norm_layeretatokens_normc                 x  > XS.n[         TU ]  5         U	" U40 UD6U l        [        U4UUUUS.UD6U l        US:  a  [        U5      O[        R                  " 5       U l        U	" U40 UD6U l	        [        SU[        X-  5      UUS.UD6U l        US:  a  [        U5      O[        R                  " 5       U l        U
bg  [        R                  " U
[        R                   " U40 UD6-  5      U l        [        R                  " U
[        R                   " U40 UD6-  5      U l        OSu  U l        U l        Xl        g )Nr#   r   r   r   r   r   r   hidden_featuresrv   drop)r   r    )r)   r*   norm1r   attnr   r+   Identity
drop_path1norm2r   r_   mlp
drop_path2	ParameterrC   onesgamma1gamma2r   )r2   r    r   r   r   r   r   r   rv   r   r   r   r$   r%   r3   r4   s                  r5   r*   ClassAttentionBlock.__init__   s+     /*r*


 
	 2;R(9-R[[]*r*
 
0	

 
 2;R(9-R[[]?,,sUZZ-Br-B'BCDK,,sUZZ-Br-B'BCDK'/$DK 'r7   c                 6   U R                  U5      n[        R                  " U R                  U5      US S 2SS 24   /SS9nXR	                  U R
                  U-  5      -   nU R                  (       a  U R                  U5      nO8[        R                  " U R                  US S 2SS24   5      US S 2SS 24   /SS9nUnUS S 2SS24   nU R                  U R                  U5      -  n[        R                  " XQS S 2SS 24   /SS9nX@R                  U5      -   nU$ )Nr   r@   r   )r   rC   rN   r   r   r   r   r   r   r   r   )r2   r   x_norm1x_attnx_res	cls_tokens         r5   rV   ClassAttentionBlock.forward   s    **Q-DIIg.12?QGf 455

1A		4::a1Q3i0!AqrE(;CAa1fI	KK$((9"55	IIyAqrE(+3OOA&&r7   )	r   r   r   r   r   r   r   r   r   )rZ   r[   r\   r]   r^   r+   r   	LayerNormr_   r`   boolr   r   r   r*   rV   ra   rb   rc   s   @r5   r   r      s    K  ""!!!)+*,,,#% %.'.' .' 	.'
 .' .' .' .' BII.' RYY.' %.' .' .'` r7   r   c                      ^  \ rS rSr% \R
                  R                  \   \S'          SS\	S\	S\S\
S\
4
U 4S jjjrS	 r\R
                  R                  S
 5       rSrU =r$ )XCA   
fused_attnr    r   r   r   r   c                   > XgS.n[         T	U ]  5         X l        [        SS9U l        [
        R                  " [        R                  " USS40 UD65      U l	        [
        R                  " XS-  4SU0UD6U l        [
        R                  " U5      U l        [
        R                  " X40 UD6U l        [
        R                  " U5      U l        g )Nr#   T)experimentalr   rA   rg   )r)   r*   r   r   r   r+   r   rC   r   r!   LinearqkvDropoutr   rz   r   )
r2   r    r   r   r   r   r$   r%   r3   r4   s
            r5   r*   XCA.__init__   s     /"(d;<<

9a(Ib(IJ99S'??B?I.IIc-"-	I.r7   c                    UR                   u  p#nU R                  U5      R                  X#SU R                  X@R                  -  5      R	                  SSSSS5      nUR                  S5      u  pgnU R                  (       a  [        R                  R                  R                  USS9U R                  -  n[        R                  R                  R                  USS9n[        R                  R                  R                  XgUSS	9nO[        R                  R                  R                  USS9n[        R                  R                  R                  USS9nXgR                  S
S5      -  U R                  -  n	U	R                  SS9n	U R                  U	5      n	X-  nUR	                  SSSS5      R                  X#U5      nU R!                  U5      nU R#                  U5      nU$ )NrA   r&   r   r?   r   r<   r@   r   )r0   )r}   r   r   r   rO   unbindr   rC   r+   
functional	normalizer!   scaled_dot_product_attentionr~   softmaxr   rz   r   )
r2   r   r8   r   r   r   qkvr   s
             r5   rV   XCA.forward  s   ''ahhqk!!!4>>1;NOWWXY[\^_abdef**Q-a??##--aR-84;K;KKA##--aR-8A##@@qPS@TA ##--aR-8A##--aR-8AB++t/?/??D<<B<'D>>$'DAIIaAq!))!2IIaLNN1r7   c                     S1$ )Nr!   r   r2   s    r5   no_weight_decayXCA.no_weight_decay$  s
    r7   )r   r   r   rz   r   r   r!   )rx   Fr   r   NN)rZ   r[   r\   r]   rC   jitFinalr   __annotations__r_   r`   r*   rV   ignorer   ra   rb   rc   s   @r5   r   r      s    		%% "!!// / 	/
 / / /(0 YY r7   r   c                      ^  \ rS rSrSSSSS\R
                  \R                  SSS4
S\S\S	\S
\	S\S\S\S\
\R                     S\
\R                     S\4U 4S jjjrS\S\4S jrSrU =r$ )XCABlocki)  r   Fr   r   Nr    r   r   r   r   r   r   rv   r   r   c                 B  > XS.n[         TU ]  5         U	" U40 UD6U l        [        U4UUUUS.UD6U l        US:  a  [        U5      O[        R                  " 5       U l        U	" U40 UD6U l	        [        SXS.UD6U l        US:  a  [        U5      O[        R                  " 5       U l        U	" U40 UD6U l        [        SU[        X-  5      UUS.UD6U l        US:  a  [        U5      O[        R                  " 5       U l        [        R$                  " U
[&        R(                  " U40 UD6-  5      U l        [        R$                  " U
[&        R(                  " U40 UD6-  5      U l        [        R$                  " U
[&        R(                  " U40 UD6-  5      U l        g )Nr#   r   r   )r   rv   r   r   )r)   r*   r   r   r   r   r+   r   r   norm3r   local_mp
drop_path3r   r   r_   r   r   r   rC   r   r   gamma3r   )r2   r    r   r   r   r   r   r   rv   r   r   r$   r%   r3   r4   s                 r5   r*   XCABlock.__init__*  sr    /*r*


 
	 2;R(9-R[[]*r*
GGBG1:R(9-R[[]*r*
 
0	

 
 2;R(9-R[[]ll3C)>2)>#>?ll3C)>2)>#>?ll3C)>2)>#>?r7   r9   r:   c           	      |   XR                  U R                  U R                  U R                  U5      5      -  5      -   nXR	                  U R
                  U R                  U R                  U5      X#5      -  5      -   nXR                  U R                  U R                  U R                  U5      5      -  5      -   nU$ N)r   r   r   r   r   r   r   r   r   r   r   r   )r2   r   r9   r:   s       r5   rV   XCABlock.forwardX  s    dii

1.F FGG dmmDJJqM1.P PQQdhhtzz!}.E EFFr7   )r   r   r   r   r   r   r   r   r   r   r   r   )rZ   r[   r\   r]   r+   r   r   r_   r`   r   r   r   r*   rV   ra   rb   rc   s   @r5   r   r   )  s    
  ""!!!)+*,,,,@,@ ,@ 	,@
 ,@ ,@ ,@ ,@ BII,@ RYY,@ ,@ ,@\C C  r7   r   c            +       8  ^  \ rS rSrSr                       S/S\\\\\4   4   S\S\S\S\S\S	\S
\S\	S\
S\	S\	S\	S\	S\	S\\\R                        S\\\R                        S\S\
S\	S\
4*U 4S jjjrS r\R$                  R&                  S 5       r\R$                  R&                  S0S j5       r\R$                  R&                  S1S j5       r\R$                  R&                  S\R                  4S j5       rS2S\S\\   4S jjr     S3S \R2                  S!\\\\\   4      S"\
S#\
S$\S%\
S\\\R2                     \\R2                  \\R2                     4   4   4S& jjr   S4S!\\\\   4   S'\
S(\
4S) jjrS* rS0S+\
4S, jjrS- rS.r U =r!$ )5r   ia  z
Based on timm and DeiT code bases
https://github.com/rwightman/pytorch-image-models/tree/master/timm
https://github.com/facebookresearch/deit/
rr   rs   rt   num_classesglobal_poolru   depthr   r   r   	drop_ratepos_drop_rateproj_drop_rateattn_drop_ratedrop_path_raterv   r   cls_attn_layersuse_pos_embedr   r   c                 8  > [         TU ]  5         UUS.nUS;   d   e[        U5      nUS   U-  S:X  a  US   U-  S:X  d   S5       eU=(       d    [        [        R
                  SS9nU=(       d    [        R                  nX@l        X0l        U=U l	        =U l
        U l        XPl        SU l        [        SUUUUUS.UD6U l        Un[        R                   " ["        R$                  " S	S	U40 UD65      U l        U(       a  [)        SS
U0UD6U l        OSU l        [        R,                  " US9U l        [        R0                  " [3        U5       Vs/ s H  n[5        SUUU	U
UUUUUUS.
UD6PM     sn5      U l        [3        U5       Vs/ s H  n[9        UUSU 3S9PM     snU l        [        R0                  " [3        U5       Vs/ s H  n[=        SUUU	U
UUUUUUS.
UD6PM     sn5      U l        U" U40 UD6U l         [        R,                  " U5      U l!        US:  a"  [        RD                  " U R                  U40 UD6O[        RF                  " 5       U l$        [K        U R&                  SS9  U RM                  U RN                  5        gs  snf s  snf s  snf )a  
Args:
    img_size (int, tuple): input image size
    patch_size (int): patch size
    in_chans (int): number of input channels
    num_classes (int): number of classes for classification head
    embed_dim (int): embedding dimension
    depth (int): depth of transformer
    num_heads (int): number of attention heads
    mlp_ratio (int): ratio of mlp hidden dim to embedding dim
    qkv_bias (bool): enable bias for qkv if True
    drop_rate (float): dropout rate after positional embedding, and in XCA/CA projection + MLP
    pos_drop_rate: position embedding dropout rate
    proj_drop_rate (float): projection dropout rate
    attn_drop_rate (float): attention dropout rate
    drop_path_rate (float): stochastic depth rate (constant across all layers)
    norm_layer: (nn.Module): normalization layer
    cls_attn_layers: (int) Depth of Class attention layers
    use_pos_embed: (bool) whether to use positional encoding
    eta: (float) layerscale initialization value
    tokens_norm: (bool) Whether to normalize all tokens or just the cls_token in the CA

Notes:
    - Although `layer_norm` is user specifiable, there are hard-coded `BatchNorm2d`s in the local patch
      interaction (class LPI) and the patch embedding (class ConvPatchEmbed)
r#    avgtokenr   z2`patch_size` should divide image dimensions evenlyr(   )r1   F)rr   rs   rt   ru   rv   r   r    N)p)
r    r   r   r   r   r   r   rv   r   r   zblocks.)num_chs	reductionmodule)
r    r   r   r   r   r   rv   r   r   r   {Gz?stdr   )(r)   r*   r   r   r+   r   r   r   rt   num_featureshead_hidden_sizeru   r   grad_checkpointingrn   patch_embedr   rC   zerosr   r   	pos_embedr   pos_drop
ModuleListranger   blocksdictfeature_infor   cls_attn_blocksnorm	head_dropr   r   headr   apply_init_weights)r2   rr   rs   rt   r   r   ru   r   r   r   r   r   r   r   r   r   rv   r   r   r   r   r   r$   r%   r3   r_ir4   s                               r5   r*   Xcit.__init__h  s   h 	/2222X&j(A-HQK*4LPQ4Q 	A@	ARB72<<T#B
(	& ENNND1DN&"') 
!
 
 ekk!Q	&HR&HI6K9KKDN!DN

]3mm 5\%# "  ##!(((#%  "%# $ bgglamnam\]T)q7STRUWamn!}} ?+.- ,   ##!#(#%'  ,.-  ." y/B/	I.GRUVBIId//CC\^\g\g\i	 	dnn#.

4%%&Q%# o.-s    J	J Jc                    [        U[        R                  5      (       am  [        UR                  SS9  [        U[        R                  5      (       a9  UR
                  b+  [        R                  R                  UR
                  S5        g g g g )Nr   r   r   )
isinstancer+   r   r   rB   rg   init	constant_)r2   ms     r5   r  Xcit._init_weights  s`    a##!((,!RYY''AFF,>!!!&&!, -?' $r7   c                 
    SS1$ )Nr  r   r   r   s    r5   r   Xcit.no_weight_decay  s    [))r7   c                     [        SSSS/S9$ )Nz ^cls_token|pos_embed|patch_embedz^blocks\.(\d+))z^cls_attn_blocks\.(\d+)N)z^norm)i )stemr  r
  )r  )r2   coarses     r5   group_matcherXcit.group_matcher  s    4$?AUV
 	
r7   c                     Xl         g r   )r   )r2   enables     r5   set_grad_checkpointingXcit.set_grad_checkpointing  s    "(r7   returnc                     U R                   $ r   )r  r   s    r5   get_classifierXcit.get_classifier  s    yyr7   c                    Xl         Ub  US;   d   eX l        [        U R                  S5      (       a   U R                  R                  R
                  OS n[        U R                  S5      (       a   U R                  R                  R                  OS nUS:  a&  [        R                  " U R                  XUS9U l        g [        R                  " 5       U l        g )Nr   rB   r   r#   )r   r   hasattrr  rB   r$   r%   r+   r   r   r   )r2   r   r   r$   r%   s        r5   reset_classifierXcit.reset_classifier   s    &""6666*,3DIIx,H,H!!((d*1$))X*F*F		  &&D]hkl]lBIId//SXY	rtr}r}r	r7   r   indicesr  
stop_early
output_fmtintermediates_onlyc           	      *   US;   d   S5       eUS:H  n/ n[        [        U R                  5      U5      u  pUR                  u  ppU R	                  U5      u  nu  nnU R
                  bF  U R                  XU5      R                  USUR                  S   5      R                  SSS5      nUU-   nU R                  U5      n[        R                  R                  5       (       d  U(       d  U R                  nOU R                  SU
S-    n[        U5       H  u  nnU R                  (       a1  [        R                  R                  5       (       d  [        UXU5      nO	U" XU5      nUU	;   d  MY  UR                  U(       a  U R!                  U5      OU5        M     U(       aC  U Vs/ s H6  nUR                  XUS5      R                  SS	SS5      R#                  5       PM8     nnU(       a  U$ [        R$                  " U R&                  R)                  USS5      U4SS
9nU R*                   HM  nU R                  (       a1  [        R                  R                  5       (       d  [        UU5      nME  U" U5      nMO     U R!                  U5      nX4$ s  snf )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 all 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:

)NCHWNLCz)Output format must be one of NCHW or NLC.r2  Nr<   r   r   r&   rA   r@   )r   lenr  r}   r  r  r   rO   r  rC   r   is_scripting	enumerater   r   appendr  
contiguousrN   r   expandr
  )r2   r   r-  r  r.  r/  r0  r   intermediatestake_indices	max_indexr8   r  heightwidthr   r   pos_encodingr  r  blkys                         r5   forward_intermediatesXcit.forward_intermediates	  s1   * _,Y.YY,&"6s4;;7G"Q  ggf&&q)8B>>%>>!4<<QAGGAJOWWXY[\^_`LL AMM!99!!##:[[F[[)a-0F'FAs&&uyy/E/E/G/GsA2.rNL $$TTYYq\qA ( `mn`m[\QYYqb"5==aAqITTV`mMn   IIt~~,,QB7;C''C&&uyy/E/E/G/GsA&F	 ( IIaL os   %=J
prune_norm
prune_headc                    [        [        U R                  5      U5      u  pEU R                  SUS-    U l        U(       a  [        R                  " 5       U l        U(       a,  [        R                  " 5       U l        U R                  SS5        U$ )z?Prune layers not required for specified intermediates.
        Nr   r   r   )	r   r4  r  r+   r   r  r  r
  r+  )r2   r-  rD  rE  r;  r<  s         r5   prune_intermediate_layersXcit.prune_intermediate_layersM  si     #7s4;;7G"Qkk.9q=1DI#%==?D !!!R(r7   c                    UR                   S   nU R                  U5      u  nu  p4U R                  bE  U R                  X#U5      R                  USUR                   S   5      R	                  SSS5      nX-   nU R                  U5      nU R                   HN  nU R                  (       a1  [        R                  R                  5       (       d  [        XaX45      nME  U" XU5      nMP     [        R                  " U R                  R                  USS5      U4SS9nU R                   HL  nU R                  (       a0  [        R                  R                  5       (       d  [        Xa5      nMD  U" U5      nMN     U R!                  U5      nU$ )Nr   r<   r   r&   r@   )r}   r  r  r   rO   r  r  r   rC   r   r5  r   rN   r   r9  r
  r  )r2   r   r8   r   r   r?  r@  s          r5   forward_featuresXcit.forward_features^  s:   GGAJ&&q)8B>>%>>!4<<QAGGAJOWWXY[\^_`L AMM!;;C&&uyy/E/E/G/Gsr.rN	  IIt~~,,QB7;C''C&&uyy/E/E/G/Gs&F	 ( IIaLr7   
pre_logitsc                     U R                   (       a1  U R                   S:X  a  US S 2SS 24   R                  SS9OUS S 2S4   nU R                  U5      nU(       a  U$ U R                  U5      $ )Nr   r   r@   r   )r   meanr  r  )r2   r   rL  s      r5   forward_headXcit.forward_headz  s_    (,(8(8E(A!QR%!$qAwANN1q0DIIaL0r7   c                 J    U R                  U5      nU R                  U5      nU$ r   )rJ  rO  )r2   r   s     r5   rV   Xcit.forward  s'    !!!$a r7   )r  r
  r   ru   r	  r   r   r  r  r   rt   r  r   r   r  r  r  )rp   rq   rA     r   rY      rT  r   Tr   r   r   r   r   NNr&   Tr   FNNF)Tr   )NFFr2  F)r   FT)"rZ   r[   r\   r]   r^   r   r_   r   strr`   r   r   r   r+   r   r*   r  rC   r   r   r   r  r#  r'  r+  Tensorr   rB  rG  rJ  rO  rV   ra   rb   rc   s   @r5   r   r   a  s    58 #& !!!#%$&$&$&3748#$"& %1|'CsCx01|' |' 	|'
 |' |' |' |' |' |' |' |' !|' "|' "|'  "!|'"  RYY0#|'$ !bii1%|'& !'|'(  )|'* +|', -|' |'|- YY* * YY
 
 YY) ) YY		  @C @hsm @ 8<$$',B ||B  eCcN34B  	B 
 B  B  !%B  
tELL!5tELL7I)I#JJ	KB L ./$#	3S	>*  	"81$ 1 r7   c           	         SU ;   a  U S   n [        USS 5      S LnU  Vs/ s H  o3R                  S5      (       d  M  UPM     nnU H1  nU(       a%  U R                  U5      XR                  SS5      '   M/  X	 M3     SU ;   a  SUR	                  5       ;   a  [        UR                  5      n[        U5       H  nU R                  SU S35      nUR                  S	S
UR                  S
   5      n[        S5       H  u  pXx   U SU SU	 S3'   M     U R                  SU S3S 5      n
U
c  Mu  U
R                  S	S
5      n
[        S5       H  u  pX   U SU SU	 S3'   M     M     U $ s  snf )Nmodelr  zpos_embeder.z
pos_embed.z!cls_attn_blocks.0.attn.qkv.weightzcls_attn_blocks.0.attn.q.weightzcls_attn_blocks.z.attn.qkv.weightrA   r<   r   z.attn.z.weightz.attn.qkv.biasz.bias)getattr
startswithpopreplace
state_dictr4  r
  r  r   r}   r6  )r^  rY  r   r   pos_embed_keysnum_ca_blocksr  
qkv_weightj	subscriptr   s              r5   checkpoint_filter_fnrd    s   *(
 E;5TAM!+IA||K/HaNIBL..QRBSJyy>?	  +j8=^bgbrbrbt=tE112}%A#*:1#=M(NOJ#++Ar:3C3CB3GHJ )% 0MW]
-aSykIJ !1!~~(8>&JDQH##++Ar2$-e$4LAOW{J!1!F9+UKL %5 & ) Js
   E$E$c           	      l    UR                  SS5      n[        [        U U4[        [	        USS9S.UD6nU$ )Nout_indicesrA   getter)rf  feature_cls)pretrained_filter_fnfeature_cfg)r\  r   r   rd  r  )variant
pretraineddefault_cfgkwargsrf  rY  s         r5   _create_xcitro    sJ    **]A.K  2[hG E Lr7   c                 4    U SSS SSS[         [        SSSS	.UE$ )
NrS  )rA   rp   rp   r   bicubicTzpatch_embed.proj.0.0r  z
apache-2.0)urlr   
input_size	pool_sizecrop_pctinterpolationfixed_input_sizerN  r   
first_conv
classifierlicenser
   )rr  rn  s     r5   _cfgr{    s5    =t)%.B,F $* r7   zxcit_nano_12_p16_224.fb_in1kztimm/z<https://dl.fbaipublicfiles.com/xcit/xcit_nano_12_p16_224.pth)	hf_hub_idrr  z!xcit_nano_12_p16_224.fb_dist_in1kzAhttps://dl.fbaipublicfiles.com/xcit/xcit_nano_12_p16_224_dist.pthz!xcit_nano_12_p16_384.fb_dist_in1kzAhttps://dl.fbaipublicfiles.com/xcit/xcit_nano_12_p16_384_dist.pth)rA     r}  )r|  rr  rs  zxcit_tiny_12_p16_224.fb_in1kz<https://dl.fbaipublicfiles.com/xcit/xcit_tiny_12_p16_224.pthz!xcit_tiny_12_p16_224.fb_dist_in1kzAhttps://dl.fbaipublicfiles.com/xcit/xcit_tiny_12_p16_224_dist.pthz!xcit_tiny_12_p16_384.fb_dist_in1kzAhttps://dl.fbaipublicfiles.com/xcit/xcit_tiny_12_p16_384_dist.pthzxcit_tiny_24_p16_224.fb_in1kz<https://dl.fbaipublicfiles.com/xcit/xcit_tiny_24_p16_224.pthz!xcit_tiny_24_p16_224.fb_dist_in1kzAhttps://dl.fbaipublicfiles.com/xcit/xcit_tiny_24_p16_224_dist.pthz!xcit_tiny_24_p16_384.fb_dist_in1kzAhttps://dl.fbaipublicfiles.com/xcit/xcit_tiny_24_p16_384_dist.pthzxcit_small_12_p16_224.fb_in1kz=https://dl.fbaipublicfiles.com/xcit/xcit_small_12_p16_224.pthz"xcit_small_12_p16_224.fb_dist_in1kzBhttps://dl.fbaipublicfiles.com/xcit/xcit_small_12_p16_224_dist.pthz"xcit_small_12_p16_384.fb_dist_in1kzBhttps://dl.fbaipublicfiles.com/xcit/xcit_small_12_p16_384_dist.pthzxcit_small_24_p16_224.fb_in1kz=https://dl.fbaipublicfiles.com/xcit/xcit_small_24_p16_224.pthz"xcit_small_24_p16_224.fb_dist_in1kzBhttps://dl.fbaipublicfiles.com/xcit/xcit_small_24_p16_224_dist.pthz"xcit_small_24_p16_384.fb_dist_in1kzBhttps://dl.fbaipublicfiles.com/xcit/xcit_small_24_p16_384_dist.pthzxcit_medium_24_p16_224.fb_in1kz>https://dl.fbaipublicfiles.com/xcit/xcit_medium_24_p16_224.pthz#xcit_medium_24_p16_224.fb_dist_in1kzChttps://dl.fbaipublicfiles.com/xcit/xcit_medium_24_p16_224_dist.pthz#xcit_medium_24_p16_384.fb_dist_in1kzChttps://dl.fbaipublicfiles.com/xcit/xcit_medium_24_p16_384_dist.pthzxcit_large_24_p16_224.fb_in1kz=https://dl.fbaipublicfiles.com/xcit/xcit_large_24_p16_224.pthz"xcit_large_24_p16_224.fb_dist_in1kzBhttps://dl.fbaipublicfiles.com/xcit/xcit_large_24_p16_224_dist.pthz"xcit_large_24_p16_384.fb_dist_in1kzBhttps://dl.fbaipublicfiles.com/xcit/xcit_large_24_p16_384_dist.pthzxcit_nano_12_p8_224.fb_in1kz;https://dl.fbaipublicfiles.com/xcit/xcit_nano_12_p8_224.pthz xcit_nano_12_p8_224.fb_dist_in1kz@https://dl.fbaipublicfiles.com/xcit/xcit_nano_12_p8_224_dist.pthz xcit_nano_12_p8_384.fb_dist_in1kz@https://dl.fbaipublicfiles.com/xcit/xcit_nano_12_p8_384_dist.pthzxcit_tiny_12_p8_224.fb_in1kz;https://dl.fbaipublicfiles.com/xcit/xcit_tiny_12_p8_224.pthz xcit_tiny_12_p8_224.fb_dist_in1kz@https://dl.fbaipublicfiles.com/xcit/xcit_tiny_12_p8_224_dist.pthz xcit_tiny_12_p8_384.fb_dist_in1kz@https://dl.fbaipublicfiles.com/xcit/xcit_tiny_12_p8_384_dist.pthzxcit_tiny_24_p8_224.fb_in1kz;https://dl.fbaipublicfiles.com/xcit/xcit_tiny_24_p8_224.pthz xcit_tiny_24_p8_224.fb_dist_in1kz@https://dl.fbaipublicfiles.com/xcit/xcit_tiny_24_p8_224_dist.pthz xcit_tiny_24_p8_384.fb_dist_in1kz@https://dl.fbaipublicfiles.com/xcit/xcit_tiny_24_p8_384_dist.pthzxcit_small_12_p8_224.fb_in1kz<https://dl.fbaipublicfiles.com/xcit/xcit_small_12_p8_224.pthz!xcit_small_12_p8_224.fb_dist_in1kzAhttps://dl.fbaipublicfiles.com/xcit/xcit_small_12_p8_224_dist.pthz!xcit_small_12_p8_384.fb_dist_in1kzAhttps://dl.fbaipublicfiles.com/xcit/xcit_small_12_p8_384_dist.pthzxcit_small_24_p8_224.fb_in1kz<https://dl.fbaipublicfiles.com/xcit/xcit_small_24_p8_224.pthzAhttps://dl.fbaipublicfiles.com/xcit/xcit_small_24_p8_224_dist.pthzAhttps://dl.fbaipublicfiles.com/xcit/xcit_small_24_p8_384_dist.pthz=https://dl.fbaipublicfiles.com/xcit/xcit_medium_24_p8_224.pthzBhttps://dl.fbaipublicfiles.com/xcit/xcit_medium_24_p8_224_dist.pthzBhttps://dl.fbaipublicfiles.com/xcit/xcit_medium_24_p8_384_dist.pthz<https://dl.fbaipublicfiles.com/xcit/xcit_large_24_p8_224.pthzAhttps://dl.fbaipublicfiles.com/xcit/xcit_large_24_p8_224_dist.pthzAhttps://dl.fbaipublicfiles.com/xcit/xcit_large_24_p8_384_dist.pth)!xcit_small_24_p8_224.fb_dist_in1k!xcit_small_24_p8_384.fb_dist_in1kzxcit_medium_24_p8_224.fb_in1k"xcit_medium_24_p8_224.fb_dist_in1k"xcit_medium_24_p8_384.fb_dist_in1kzxcit_large_24_p8_224.fb_in1k!xcit_large_24_p8_224.fb_dist_in1k!xcit_large_24_p8_384.fb_dist_in1kr%  c           	      P    [        SSSSSSS9n[        S	SU 0[        U40 UD6D6nU$ )
Nrq      rT  r?   r   Frs   ru   r   r   r   r   rl  )xcit_nano_12_p16_224r  ro  rl  rn  
model_argsrY  s       r5   r  r  @  s=    B!RWYJeJe$zJd]cJdeELr7   c           
      R    [        SSSSSSSS9n[        S
S	U 0[        U40 UD6D6nU$ )Nrq   r  rT  r?   r   Fr}  )rs   ru   r   r   r   r   rr   rl  )xcit_nano_12_p16_384r  r  s       r5   r  r  H  s@    B!RWbegJeJe$zJd]cJdeELr7   c           	      P    [        SSSSSSS9n[        S	SU 0[        U40 UD6D6nU$ )
Nrq      rT  r?   r   Tr  rl  )xcit_tiny_12_p16_224r  r  s       r5   r  r  P  =    B!RVXJeJe$zJd]cJdeELr7   c           	      P    [        SSSSSSS9n[        S	SU 0[        U40 UD6D6nU$ )
Nrq   r  rT  r?   r   Tr  rl  )xcit_tiny_12_p16_384r  r  s       r5   r  r  X  r  r7   c           	      P    [        SSSSSSS9n[        S	SU 0[        U40 UD6D6nU$ )
Nrq   r}  rT  rx   r   Tr  rl  )xcit_small_12_p16_224r  r  s       r5   r  r  `  >    B!RVXJfZf4PZKe^dKefELr7   c           	      P    [        SSSSSSS9n[        S	SU 0[        U40 UD6D6nU$ )
Nrq   r}  rT  rx   r   Tr  rl  )xcit_small_12_p16_384r  r  s       r5   r  r  h  r  r7   c           	      P    [        SSSSSSS9n[        S	SU 0[        U40 UD6D6nU$ )
Nrq   r     r?   h㈵>Tr  rl  )xcit_tiny_24_p16_224r  r  s       r5   r  r  p  =    B!SWYJeJe$zJd]cJdeELr7   c           	      P    [        SSSSSSS9n[        S	SU 0[        U40 UD6D6nU$ )
Nrq   r  r  r?   r  Tr  rl  )xcit_tiny_24_p16_384r  r  s       r5   r  r  x  r  r7   c           	      P    [        SSSSSSS9n[        S	SU 0[        U40 UD6D6nU$ )
Nrq   r}  r  rx   r  Tr  rl  )xcit_small_24_p16_224r  r  s       r5   r  r    >    B!SWYJfZf4PZKe^dKefELr7   c           	      P    [        SSSSSSS9n[        S	SU 0[        U40 UD6D6nU$ )
Nrq   r}  r  rx   r  Tr  rl  )xcit_small_24_p16_384r  r  s       r5   r  r    r  r7   c           	      P    [        SSSSSSS9n[        S	SU 0[        U40 UD6D6nU$ )
Nrq      r  rx   r  Tr  rl  )xcit_medium_24_p16_224r  r  s       r5   r  r    >    B!SWYJgjgDQ[Lf_eLfgELr7   c           	      P    [        SSSSSSS9n[        S	SU 0[        U40 UD6D6nU$ )
Nrq   r  r  rx   r  Tr  rl  )xcit_medium_24_p16_384r  r  s       r5   r  r    r  r7   c           	      P    [        SSSSSSS9n[        SSU 0[        U40 UD6D6nU$ )	Nrq   rY   r  r  Tr  rl  )xcit_large_24_p16_224r  r  s       r5   r  r    >    B"$TXZJfZf4PZKe^dKefELr7   c           	      P    [        SSSSSSS9n[        SSU 0[        U40 UD6D6nU$ )	Nrq   rY   r  r  Tr  rl  )xcit_large_24_p16_384r  r  s       r5   r  r    r  r7   c           	      P    [        SSSSSSS9n[        S	SU 0[        U40 UD6D6nU$ )
Nrx   r  rT  r?   r   Fr  rl  )xcit_nano_12_p8_224r  r  s       r5   r  r    =    2QVXJd:djIc\bIcdELr7   c           	      P    [        SSSSSSS9n[        S	SU 0[        U40 UD6D6nU$ )
Nrx   r  rT  r?   r   Fr  rl  )xcit_nano_12_p8_384r  r  s       r5   r  r    r  r7   c           	      P    [        SSSSSSS9n[        S	SU 0[        U40 UD6D6nU$ )
Nrx   r  rT  r?   r   Tr  rl  )xcit_tiny_12_p8_224r  r  s       r5   r  r    =    2QUWJd:djIc\bIcdELr7   c           	      P    [        SSSSSSS9n[        S	SU 0[        U40 UD6D6nU$ )
Nrx   r  rT  r?   r   Tr  rl  )xcit_tiny_12_p8_384r  r  s       r5   r  r    r  r7   c           	      P    [        SSSSSSS9n[        SSU 0[        U40 UD6D6nU$ )	Nrx   r}  rT  r   Tr  rl  )xcit_small_12_p8_224r  r  s       r5   r  r    =    2QUWJeJe$zJd]cJdeELr7   c           	      P    [        SSSSSSS9n[        SSU 0[        U40 UD6D6nU$ )	Nrx   r}  rT  r   Tr  rl  )xcit_small_12_p8_384r  r  s       r5   r  r    r  r7   c           	      P    [        SSSSSSS9n[        S	SU 0[        U40 UD6D6nU$ )
Nrx   r  r  r?   r  Tr  rl  )xcit_tiny_24_p8_224r  r  s       r5   r  r    =    2RVXJd:djIc\bIcdELr7   c           	      P    [        SSSSSSS9n[        S	SU 0[        U40 UD6D6nU$ )
Nrx   r  r  r?   r  Tr  rl  )xcit_tiny_24_p8_384r  r  s       r5   r  r    r  r7   c           	      P    [        SSSSSSS9n[        SSU 0[        U40 UD6D6nU$ )	Nrx   r}  r  r  Tr  rl  )xcit_small_24_p8_224r  r  s       r5   r  r    =    2RVXJeJe$zJd]cJdeELr7   c           	      P    [        SSSSSSS9n[        SSU 0[        U40 UD6D6nU$ )	Nrx   r}  r  r  Tr  rl  )xcit_small_24_p8_384r  r  s       r5   r  r    r  r7   c           	      P    [        SSSSSSS9n[        SSU 0[        U40 UD6D6nU$ )	Nrx   r  r  r  Tr  rl  )xcit_medium_24_p8_224r  r  s       r5   r  r    >    2RVXJfZf4PZKe^dKefELr7   c           	      P    [        SSSSSSS9n[        SSU 0[        U40 UD6D6nU$ )	Nrx   r  r  r  Tr  rl  )xcit_medium_24_p8_384r  r  s       r5   r  r  	  r  r7   c           	      P    [        SSSSSSS9n[        S	SU 0[        U40 UD6D6nU$ )
Nrx   rY   r  rq   r  Tr  rl  )xcit_large_24_p8_224r  r  s       r5   r  r    =    2SWYJeJe$zJd]cJdeELr7   c           	      P    [        SSSSSSS9n[        S	SU 0[        U40 UD6D6nU$ )
Nrx   rY   r  rq   r  Tr  rl  )xcit_large_24_p8_384r  r  s       r5   r  r    r  r7   xcit_nano_12_p16_224_distxcit_nano_12_p16_384_distxcit_tiny_12_p16_224_distxcit_tiny_12_p16_384_distxcit_tiny_24_p16_224_distxcit_tiny_24_p16_384_distxcit_small_12_p16_224_distxcit_small_12_p16_384_distxcit_small_24_p16_224_distxcit_small_24_p16_384_distxcit_medium_24_p16_224_distxcit_medium_24_p16_384_distxcit_large_24_p16_224_distxcit_large_24_p16_384_distxcit_nano_12_p8_224_distxcit_nano_12_p8_384_distxcit_tiny_12_p8_224_distr~  r  r  r  r  r  )xcit_tiny_12_p8_384_distxcit_tiny_24_p8_224_distxcit_tiny_24_p8_384_distxcit_small_12_p8_224_distxcit_small_12_p8_384_distxcit_small_24_p8_224_distxcit_small_24_p8_384_distxcit_medium_24_p8_224_distxcit_medium_24_p8_384_distxcit_large_24_p8_224_distxcit_large_24_p8_384_dist)r   NN)FN)r   rU  )Pr^   r.   	functoolsr   typingr   r   r   r   r   r	   rC   torch.nnr+   	timm.datar   r   timm.layersr   r   r   r   r   _builderr   	_featuresr   _features_fxr   _manipulater   	_registryr   r   r   caitr   __all__r   r   rl   rn   r   r   r   r   r   rd  ro  r{  default_cfgsr  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   r7   r5   <module>r     s8	  	   : :   A O O * + 1 # Y Y ( '&		 '& '&T.RYY .b$")) $NA")) AH5")) 5p5ryy 5pb299 bJ	:
 % B&"DJ%LB&
 (O*QB& (O\i*kB& #DJ%LB& (O*QB&" (O\i*k#B&( #DJ%L)B&. (O*Q/B&4 (O\i*k5B&: $TK&M;B&@ )$P+RAB&F )$P]j+lGB&L $TK&MMB&R )$P+RSB&X )$P]j+lYB&^ %dL'N_B&d *4Q,SeB&j *4Q^k,mkB&p $TK&MqB&v )$P+RwB&| )$P]j+l}B&F "4I$KGB&L 'N)PMB&R 'N[h)jSB&X "4I$KYB&^ 'N)P_B&d 'N[h)jeB&j "4I$KkB&p 'N)PqB&v 'N[h)jwB&| #DJ%L}B&B (O*QCB&H (O\i*kIB&N #DJ%LOB&T *.O*Q *.O\i*k &*K&M +/P+R +/P]j+l %)J%L *.O*Q *.O\i*kB& BJ                               $   $         t   t   t   t         t   t                     H  '!D '  !D '  !D	 '
  !D '  !D '  !D ' !"F ' !"F ' !"F ' !"F ' "#H ' "#H ' !"F ' !"F '$  B% '&  B' '(  B) '* !C B B!D!D!D!D"F"F!D!D? '  r7   