+
    œ°³jdn  ã                   óØ  € ^ RI HtHt ^ RIHt ^ RIt^ RIHt ^RIHt	 ^RI
Ht ^RIHt ^RIHt ^R	IHtHtHt ^R
IHtHt ^RIHt ^RIHtHtHtHt ^RIHtH t  ^RI!H"t" ^RI#H$t$  ! R R]PJ                  4      t& ! R R]PJ                  4      t'R/R R llt( ! R R]PJ                  4      t) ! R R]PJ                  4      t* ! R R]4      t+] ! R R]4      4       t, ! R R]PJ                  4      t-] ! R  R!],4      4       t.]! R"R#7       ! R$ R%],4      4       t/]! R&R#7       ! R' R(],4      4       t0]! R)R#7      ] ! R* R+]4      4       4       t1]! R,R#7       ! R- R.],4      4       t2. R0Ot3R# )1é    )ÚCallableÚIterable)Ú	dataclassN)Únn)Úinitialization)ÚACT2FN)Úcreate_bidirectional_mask)ÚGradientCheckpointingLayer)ÚBaseModelOutputWithPoolingÚImageClassifierOutputÚMaskedImageModelingOutput)ÚALL_ATTENTION_FUNCTIONSÚPreTrainedModel)ÚUnpack)ÚModelOutputÚTransformersKwargsÚauto_docstringÚ	torch_int)Úcan_return_tupleÚmerge_with_config_defaults)Úcapture_outputs©Ú
DeiTConfigc                   óT   a a€ ] tR t^(t oRtV3R lV 3R lltV3R lR ltRtVtV ;t	# )ÚDeiTPatchEmbeddingszÜ
This class turns `pixel_values` of shape `(batch_size, num_channels, height, width)` into the initial
`hidden_states` (patch embeddings) of shape `(batch_size, seq_length, hidden_size)` to be consumed by a
Transformer.
c                ó    <€ V ^8„  d   QhRS[ /# ©é   Úconfigr   )ÚformatÚ__classdict__s   "€Úg/home/luca/screen-checking/.venv/lib/python3.14/site-packages/transformers/models/deit/modeling_deit.pyÚ__annotate__Ú DeiTPatchEmbeddings.__annotate__/   s   ø€ ÷ xñ x™zñ xó    c                óÎ  <€ \         SV `  4        VP                  pVP                  p\	        V\
        4      '       d   TMW"3p\	        V\
        4      '       d   TMW33pV^,          V^,          ,          V^ ,          V^ ,          ,          ,          V n        W n        W0n        VP                  V n        \        P                  ! VP                  VP                  W3R7      V n        R# )é   )Úkernel_sizeÚstrideN)ÚsuperÚ__init__Ú
image_sizeÚ
patch_sizeÚ
isinstancer   Únum_patchesÚnum_channelsr   ÚConv2dÚhidden_sizeÚ
projection)Úselfr   r,   r-   Ú	__class__s   &&  €r"   r+   ÚDeiTPatchEmbeddings.__init__/   s³   ø€ Ü‰ÑÔØ×&Ñ&ˆ
Ø×&Ñ&ˆ
Ü#-¨j¼(×#CÒ#C‘ZÈ*ÐIaˆ
Ü#-¨j¼(×#CÒ#C‘ZÈ*ÐIaˆ
à& q�M¨Z¸­]Õ:¸zÈ!½}ÐPZÐ[\ÕP]Õ?]Õ^ˆÔØ$ŒØ$ŒØ"×/Ñ/ˆÔÜŸ)š) F×$7Ñ$7¸×9KÑ9KÐYcÔwˆŽr%   c                óN   <€ V ^8„  d   QhRS[ P                  RS[ P                  /# )r   Úpixel_valuesÚreturn©ÚtorchÚTensor)r    r!   s   "€r"   r#   r$   <   s'   ø€ ÷ Hñ H¡E§L¡Lð H±U·\±\ñ Hr%   c                óà   € VP                   ^,          pW P                  8w  d   \        RV P                   RV R24      hV P                  V4      P	                  ^4      P                  ^^4      # )r'   zoMake sure that the channel dimension of the pixel values match with the one set in the configuration. Expected z	 but got Ú.)Úshaper0   Ú
ValueErrorr3   ÚflattenÚ	transpose)r4   r8   r0   s   && r"   ÚforwardÚDeiTPatchEmbeddings.forward<   ss   € Ø#×)Ñ)¨!Õ,ˆØ×,Ñ,Ô,ÜðØ!×.Ñ.Ð/¨y¸¸ÀaðIóð ð �‰˜|Ó,×4Ñ4°QÓ7×AÑAÀ!ÀQÓGÐGr%   )r,   r0   r/   r-   r3   )
Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r+   rC   Ú__static_attributes__Ú__classdictcell__Ú__classcell__©r5   r!   s   @@r"   r   r   (   s(   ù‡ € ñ÷xó x÷H÷ Hð Hr%   r   c                   ón   a a€ ] tR t^Ft oRtR	V3R lV 3R llltV3R lR ltR
V3R lR lltRtVt	V ;t
# )ÚDeiTEmbeddingsa«  
Construct the CLS token, distillation token, position and patch embeddings. Optionally, also the mask token.

Differences from ViTEmbeddings:
- Adds a distillation token (for distillation pre-training).
- Position embeddings include +2 slots (CLS + distillation) instead of +1.
- interpolate_pos_encoding handles 2 special tokens instead of 1.
- forward concatenates distillation token and handles position encoding for both.
c                ó*   <€ V ^8„  d   QhRS[ RS[RR/# )r   r   Úuse_mask_tokenr9   N©r   Úbool)r    r!   s   "€r"   r#   ÚDeiTEmbeddings.__annotate__Q   s'   ø€ ÷ Vñ V™zð V¹4ð VÈDñ Vr%   c                ó  <€ \         SV `  4        \        P                  ! \        P
                  ! ^^VP                  4      4      V n        V'       d7   \        P                  ! \        P
                  ! ^^VP                  4      4      MRV n        \        V4      V n
        V P                  P                  p\        P                  ! \        P
                  ! ^V^,           VP                  4      4      V n        \        P                  ! VP                  4      V n        VP                   V n        V P                  P"                  V n        \        P                  ! \        P
                  ! ^^VP                  4      4      V n        R# )r'   N)r*   r+   r   Ú	Parameterr;   Úzerosr2   Ú	cls_tokenÚ
mask_tokenr   Úpatch_embeddingsr/   Úposition_embeddingsÚDropoutÚhidden_dropout_probÚdropoutr-   r,   Údistillation_token)r4   r   rQ   r/   r5   s   &&& €r"   r+   ÚDeiTEmbeddings.__init__Q   sú   ø€ Ü‰ÑÔÜŸš¤e§k¢k°!°Q¸×8JÑ8JÓ&KÓLˆŒßQ_œ"Ÿ,š,¤u§{¢{°1°a¸×9KÑ9KÓ'LÔMÐeiˆŒÜ 3°FÓ ;ˆÔØ×+Ñ+×7Ñ7ˆä#%§<¢<´·²¸A¸{ÈQ½ÐPV×PbÑPbÓ0cÓ#dˆÔ Ü—z’z &×"<Ñ"<Ó=ˆŒØ ×+Ñ+ˆŒØ×/Ñ/×:Ñ:ˆŒÜ"$§,¢,¬u¯{ª{¸1¸aÀ×ASÑASÓ/TÓ"UˆÖr%   c                óZ   <€ V ^8„  d   QhRS[ P                  RS[RS[RS[ P                  /# )r   Ú
embeddingsÚheightÚwidthr9   )r;   r<   Úint)r    r!   s   "€r"   r#   rT   ^   s;   ø€ ÷ &Mñ &M±5·<±<ð &MÉð &MÑUXð &MÑ]b×]iÑ]iñ &Mr%   c                óæ  € VP                   ^,          ^,
          pV P                  P                   ^,          ^,
          p\        P                  P	                  4       '       g   WE8X  d   W#8X  d   V P                  # V P                  R,          pV P                  R,          pVP                   R,          pW P
                  ,          p	W0P
                  ,          p
\        VR,          4      pVP                  ^W»V4      pVP                  ^ ^^^4      p\        P                  P                  VWš3RRR7      pVP                  ^ ^^^4      P                  ^RV4      p\        P                  ! Wg3^R7      # )	aç  
This method allows to interpolate the pre-trained position encodings, to be able to use the model on higher resolution
images. This method is also adapted to support torch.jit tracing and 2 class embeddings.

Adapted from:
- https://github.com/facebookresearch/dino/blob/de9ee3df6cf39fac952ab558447af1fa1365362a/vision_transformer.py#L174-L194, and
- https://github.com/facebookresearch/dinov2/blob/e1277af2ba9496fbadf7aec6eba56e8d882d1e35/dinov2/models/vision_transformer.py#L179-L211
ç      à?ÚbicubicF)ÚsizeÚmodeÚalign_corners©Údim)ºNNN:Nr   N©rn   :r   NNéÿÿÿÿ)r?   r[   r;   ÚjitÚ
is_tracingr-   r   ÚreshapeÚpermuter   Ú
functionalÚinterpolateÚviewÚcat)r4   rb   rc   rd   r/   Únum_positionsÚclass_and_dist_pos_embedÚpatch_pos_embedrm   Ú
new_heightÚ	new_widthÚsqrt_num_positionss   &&&&        r"   Úinterpolate_pos_encodingÚ'DeiTEmbeddings.interpolate_pos_encoding^   sG  € ð !×&Ñ& qÕ)¨AÕ-ˆØ×0Ñ0×6Ñ6°qÕ9¸AÕ=ˆô �y‰y×#Ñ#×%Ò%¨+Ô*FÈ6Ì?Ø×+Ñ+Ð+à#'×#;Ñ#;¸EÕ#BÐ Ø×2Ñ2°5Õ9ˆà×Ñ˜rÕ"ˆàŸ™Õ.ˆ
ØŸ_™_Õ,ˆ	ä& }°cÕ'9Ó:ÐØ)×1Ñ1°!Ð5GÐ]`ÓaˆØ)×1Ñ1°!°Q¸¸1Ó=ˆäŸ-™-×3Ñ3ØØÐ(ØØð	 4ó 
ˆð *×1Ñ1°!°Q¸¸1Ó=×BÑBÀ1ÀbÈ#ÓNˆä�yŠyÐ2ÐDÈ!ÔLÐLr%   c                ó|   <€ V ^8„  d   QhRS[ P                  RS[ P                  R,          RS[RS[ P                  /# )r   r8   Úbool_masked_posNr   r9   )r;   r<   Ú
BoolTensorrS   )r    r!   s   "€r"   r#   rT   †   sF   ø€ ÷  ñ  á—l‘lð ñ ×)Ñ)¨DÕ0ð ñ #'ð	 ñ
 
�‰ñ r%   c                ó(  € VP                   w   rEpV P                  V4      pVP                  4       w  r‰pVeZ   V P                  P	                  W‰R4      p
VP                  R4      P                  V
4      pVRV,
          ,          W«,          ,           pV P                  P	                  VRR4      pV P                  P	                  VRR4      p\        P                  ! WÍV3^R7      pV'       d   WpP                  WuV4      ,           pMzWPP                  ^ ,          8w  g   W`P                  ^,          8w  d;   \        RV RV RV P                  ^ ,           RV P                  ^,           R2	4      hWpP                  ,           pV P                  V4      pV# )Ng      ð?rl   zInput image size (Ú*z) doesn't match model (z).rp   )r?   rZ   ri   rY   ÚexpandÚ	unsqueezeÚtype_asrX   r_   r;   rx   r   r,   r@   r[   r^   )r4   r8   r‚   r   Ú_rc   rd   rb   Ú
batch_sizeÚ
seq_lengthÚmask_tokensÚmaskÚ
cls_tokensÚdistillation_tokenss   &&&&          r"   rC   ÚDeiTEmbeddings.forward†   sm  € ð +×0Ñ0Ñˆˆ1�eØ×*Ñ*¨<Ó8ˆ
à$.§O¡OÓ$5Ñ!ˆ
 àÒ&ØŸ/™/×0Ñ0°ÈÓLˆKà"×,Ñ,¨RÓ0×8Ñ8¸ÓEˆDØ# s¨T¥zÕ2°[Õ5GÕGˆJà—^‘^×*Ñ*¨:°r¸2Ó>ˆ
Ø"×5Ñ5×<Ñ<¸ZÈÈRÓPÐÜ—Y’Y 
ÀÐLÐRSÔTˆ
ç#Ø#×&CÑ&CÀJÐX]Ó&^Õ^‰JàŸ™¨Õ+Ô+¨u¿¹ÈÕ8JÔ/JÜ Ø(¨¨°°%°ð 9ØŸ™¨Õ+Ð,¨A¨d¯o©o¸aÕ.@Ð-AÀðEóð ð $×&>Ñ&>Õ>ˆJà—\‘\ *Ó-ˆ
ØÐr%   )rX   r_   r^   r,   rY   rZ   r-   r[   )F)NF)rE   rF   rG   rH   rI   r+   r   rC   rJ   rK   rL   rM   s   @@r"   rO   rO   F   s2   ù‡ € ñ÷Võ V÷&Mð &M÷P ÷  ò  r%   rO   c                ó  € V ^8„  d   QhR\         P                  R\        P                  R\        P                  R\        P                  R\        P                  R,          R\        R,          R\        R	\
        \        ,          /# )
r   ÚmoduleÚqueryÚkeyÚvalueÚattention_maskNÚscalingr^   Úkwargs)r   ÚModuler;   r<   Úfloatr   r   )r    s   "r"   r#   r#   ©   s{   € ÷ %ñ %Ü�I‰Ið%ä�<‰<ð%ô 
�‰ð%ô �<‰<ð	%ô
 —L‘L 4Õ'ð%ô �T�\ð%ô ð%ô Ô'Õ(ñ%r%   c                 ó  € Vf   VP                  R4      R,          p\        P                  ! WP                  ^^4      4      V,          pVe	   W„,           p\        P
                  P                  VR\        P                  R7      P                  VP                  4      p\        P
                  P                  W†V P                  R7      p\        P                  ! Wƒ4      p	V	P                  ^^4      P                  4       p	W˜3# )N)rm   Údtype)ÚpÚtrainingrp   ç      à¿)ri   r;   ÚmatmulrB   r   ru   ÚsoftmaxÚfloat32Útorœ   r^   rž   Ú
contiguous)
r’   r“   r”   r•   r–   r—   r^   r˜   Úattn_weightsÚattn_outputs
   &&&&&&&,  r"   Úeager_attention_forwardr§   ©   sÉ   € ð ‚Ø—*‘*˜R“. DÕ(ˆô —<’< §}¡}°Q¸Ó':Ó;¸gÕE€LàÒ!Ø#Õ4ˆä—=‘=×(Ñ(¨¸2ÄUÇ]Á]Ð(ÓS×VÑVÐW\×WbÑWbÓc€LÜ—=‘=×(Ñ(¨È6Ï?É?Ð(Ó[€Lä—,’,˜|Ó3€KØ×'Ñ'¨¨1Ó-×8Ñ8Ó:€KàÐ$Ð$r%   c                   óT   a a€ ] tR t^Åt oV3R lV 3R lltRV3R lR lltRtVtV ;t# )ÚDeiTAttentionc                ó    <€ V ^8„  d   QhRS[ /# r   r   )r    r!   s   "€r"   r#   ÚDeiTAttention.__annotate__Æ   s   ø€ ÷ kñ k™zñ kr%   c                ó`  <€ \         SV `  4        Wn        VP                  V n        \	        VR VP
                  VP                  ,          4      V n        VP                  V n        V P                  R,          V n	        RV n
        \        P                  ! VP
                  VP                  V P                  ,          VP                  R7      V n        \        P                  ! VP
                  VP                  V P                  ,          VP                  R7      V n        \        P                  ! VP
                  VP                  V P                  ,          VP                  R7      V n        \        P                  ! VP                  V P                  ,          VP
                  RR7      V n        R# )Úhead_dimF)ÚbiasTNrŸ   )r*   r+   r   Únum_attention_headsÚgetattrr2   r­   Úattention_probs_dropout_probÚattention_dropoutr—   Ú	is_causalr   ÚLinearÚqkv_biasÚq_projÚk_projÚv_projÚo_proj©r4   r   r5   s   &&€r"   r+   ÚDeiTAttention.__init__Æ   s*  ø€ Ü‰ÑÔØŒØ#)×#=Ñ#=ˆÔ Ü ¨
°F×4FÑ4FÈ&×JdÑJdÕ4dÓeˆŒØ!'×!DÑ!DˆÔØ—}‘} dÕ*ˆŒØˆŒä—i’i × 2Ñ 2°F×4NÑ4NÐQU×Q^ÑQ^Õ4^Ðek×etÑetÔuˆŒÜ—i’i × 2Ñ 2°F×4NÑ4NÐQU×Q^ÑQ^Õ4^Ðek×etÑetÔuˆŒÜ—i’i × 2Ñ 2°F×4NÑ4NÐQU×Q^ÑQ^Õ4^Ðek×etÑetÔuˆŒÜ—i’i × :Ñ :¸T¿]¹]Õ JÈF×L^ÑL^ÐeiÔjˆŽr%   c          
      ó¶   <€ V ^8„  d   QhRS[ P                  RS[ P                  R,          RS[S[,          RS[S[ P                  S[ P                  3,          /# ©r   Úhidden_statesr–   Nr˜   r9   )r;   r<   r   r   Útuple)r    r!   s   "€r"   r#   r«   Ô   sX   ø€ ÷ )ñ )á—|‘|ð)ñ Ÿ™ tÕ+ð)ñ Ñ+Õ,ð	)ñ
 
‰u�|‰|™UŸ\™\Ð)Õ	*ñ)r%   c                ó¨  € VP                   R R p. VORNV P                  N5pV P                  V4      P                  V4      P	                  ^^4      pV P                  V4      P                  V4      P	                  ^^4      pV P                  V4      P                  V4      P	                  ^^4      p\        P                  ! V P                  P                  \        4      p	T	! V VVVV3RV P                  '       g   RMV P                  RV P                  /VB w  r«V
P                  ! . VORN5!  P!                  4       p
V P#                  V
4      p
W«3# )Nr^   ç        r—   rp   )r?   r­   r¶   rw   rB   r·   r¸   r   Úget_interfacer   Ú_attn_implementationr§   rž   r²   r—   rs   r¤   r¹   )r4   r¾   r–   r˜   Úinput_shapeÚhidden_shapeÚquery_statesÚ
key_statesÚvalue_statesÚattention_interfacer¦   r¥   s   &&&,        r"   rC   ÚDeiTAttention.forwardÔ   sN  € ð $×)Ñ)¨#¨2Ð.ˆØ8˜Ð8 bÐ8¨$¯-©-Ñ8ˆà—{‘{ =Ó1×6Ñ6°|ÓD×NÑNÈqÐRSÓTˆØ—[‘[ Ó/×4Ñ4°\ÓB×LÑLÈQÐPQÓRˆ
Ø—{‘{ =Ó1×6Ñ6°|ÓD×NÑNÈqÐRSÓTˆä(?×(MÒ(MØ�K‰K×,Ñ,Ô.Eó)
Ðñ %8ØØØØØñ	%
ð  $Ÿ}Ÿ}˜}‘C°$×2HÑ2Hð	%
ð —L‘Lð	%
ð ñ	%
Ñ!ˆð "×)Ò)Ð;¨;Ð;¸Ó;×FÑFÓHˆØ—k‘k +Ó.ˆàÐ(Ð(r%   )
r²   r   r­   r³   r·   r¯   r¹   r¶   r—   r¸   ©N©	rE   rF   rG   rH   r+   rC   rJ   rK   rL   rM   s   @@r"   r©   r©   Å   s    ù‡ € ÷kó k÷)÷ )ò )r%   r©   c                   óP   a a€ ] tR t^öt oV3R lV 3R lltV3R lR ltRtVtV ;t# )ÚDeiTMLPc                ó    <€ V ^8„  d   QhRS[ /# r   r   )r    r!   s   "€r"   r#   ÚDeiTMLP.__annotate__÷   s   ø€ ÷ Kñ K™zñ Kr%   c                ó(  <€ \         SV `  4        Wn        \        VP                  ,          V n        \        P                  ! VP                  VP                  4      V n
        \        P                  ! VP                  VP                  4      V n        R # rË   )r*   r+   r   r   Ú
hidden_actÚactivation_fnr   r´   r2   Úintermediate_sizeÚfc1Úfc2rº   s   &&€r"   r+   ÚDeiTMLP.__init__÷   sb   ø€ Ü‰ÑÔØŒÜ# F×$5Ñ$5Õ6ˆÔÜ—9’9˜V×/Ñ/°×1IÑ1IÓJˆŒÜ—9’9˜V×5Ñ5°v×7IÑ7IÓJˆŽr%   c                óN   <€ V ^8„  d   QhRS[ P                  RS[ P                  /# ©r   r¾   r9   r:   )r    r!   s   "€r"   r#   rÐ   þ   s#   ø€ ÷ ñ ¡U§\¡\ð ±e·l±lñ r%   c                ól   € V P                  V4      pV P                  V4      pV P                  V4      pV# rË   )rÕ   rÓ   rÖ   )r4   r¾   s   &&r"   rC   ÚDeiTMLP.forwardþ   s4   € ØŸ™ Ó/ˆØ×*Ñ*¨=Ó9ˆØŸ™ Ó/ˆàÐr%   )rÓ   r   rÕ   rÖ   rÌ   rM   s   @@r"   rÎ   rÎ   ö   s    ù‡ € ÷Kó K÷÷ ð r%   rÎ   c                   óT   a a€ ] tR tRt oV3R lV 3R lltRV3R lR lltRtVtV ;t# )Ú	DeiTLayeri  c                ó    <€ V ^8„  d   QhRS[ /# r   r   )r    r!   s   "€r"   r#   ÚDeiTLayer.__annotate__  s   ø€ ÷ >ñ >™zñ >r%   c                ór  <€ \         SV `  4        \        V4      V n        \        P
                  ! VP                  VP                  R 7      V n        \        P
                  ! VP                  VP                  R 7      V n	        \        V4      V n        \        P                  ! VP                  4      V n        R# )©ÚepsN)r*   r+   r©   Ú	attentionr   Ú	LayerNormr2   Úlayer_norm_epsÚlayernorm_beforeÚlayernorm_afterrÎ   Úmlpr\   r]   r^   rº   s   &&€r"   r+   ÚDeiTLayer.__init__  sy   ø€ Ü‰ÑÔÜ& vÓ.ˆŒÜ "§¢¨V×-?Ñ-?ÀV×EZÑEZÔ [ˆÔÜ!Ÿ|š|¨F×,>Ñ,>ÀF×DYÑDYÔZˆÔÜ˜6“?ˆŒÜ—z’z &×"<Ñ"<Ó=ˆŽr%   c                óŒ   <€ V ^8„  d   QhRS[ P                  RS[ P                  R,          RS[S[,          RS[ P                  /# r½   )r;   r<   r   r   )r    r!   s   "€r"   r#   rß     sJ   ø€ ÷ ñ á—|‘|ðñ Ÿ™ tÕ+ðñ Ñ+Õ,ð	ñ
 
�‰ñr%   c                ó  € TpV P                  V4      pV P                  ! W3/ VB w  rV P                  V4      pW,           pTpV P                  V4      pV P	                  V4      pV P                  V4      pW,           pV# rË   )ræ   rã   r^   rç   rè   )r4   r¾   r–   r˜   Úresidualr‰   s   &&&,  r"   rC   ÚDeiTLayer.forward  s†   € ð !ˆØ×-Ñ-¨mÓ<ˆØŸ>š>¨-ÑRÈ6ÑRÑˆØŸ™ ]Ó3ˆØ%Õ0ˆð !ˆØ×,Ñ,¨]Ó;ˆØŸ™ Ó/ˆØŸ™ ]Ó3ˆØ%Õ0ˆàÐr%   )rã   r^   rç   ræ   rè   rË   rÌ   rM   s   @@r"   rÝ   rÝ     s   ù‡ € ÷>ó >÷÷ ò r%   rÝ   c                   ó®   a a€ ] tR tRt oRtRtRtRtRR.tRt	Rt
RtRtRtR]R]/tR	t]P&                  ! 4       V3R
 lV 3R ll4       tV3R ltRtVtV ;t# )ÚDeiTPreTrainedModeli&  Údeitr8   TrO   rÝ   r¾   Ú
attentionsrZ   c                ó€   <€ V ^8„  d   QhRS[ P                  S[ P                  ,          S[ P                  ,          RR/# )r   r’   r9   N)r   r´   r1   rä   )r    r!   s   "€r"   r#   Ú DeiTPreTrainedModel.__annotate__:  s1   ø€ ÷ /ñ /¡B§I¡I±·	±	Õ$9¹B¿L¹LÕ$Hð /ÈTñ /r%   c                óö  <€ \         SV `  V4       \        V\        4      '       d«   VP                  e8   \
        P                  ! VP                  RV P                  P                  R7       \
        P                  ! VP                  RV P                  P                  R7       VP                  e!   \
        P                  ! VP                  4       \        V\        4      '       d“   \
        P                  ! VP                  4       \
        P                  ! VP                  4       \
        P                  ! VP                  4       VP                  e#   \
        P                  ! VP                  4       R# R# R# )zInitialize the weightsNrÁ   )ÚmeanÚstd)r*   Ú_init_weightsr.   rO   r[   ÚinitÚtrunc_normal_r   Úinitializer_rangerX   rY   Úzeros_r_   )r4   r’   r5   s   &&€r"   r÷   Ú!DeiTPreTrainedModel._init_weights9  sø   ø€ ô 	‰Ñ˜fÔ%Ü�fœn×-Ò-Ø×)Ñ)Ò5Ü×"Ò" 6×#=Ñ#=ÀCÈTÏ[É[×MjÑMjÕkÜ×Ò˜v×/Ñ/°c¸t¿{¹{×?\Ñ?\Õ]Ø× Ñ Ò,Ü—’˜F×-Ñ-Ô.Ü�fœn×-Ò-Ü�KŠK˜×(Ñ(Ô)Ü�KŠK˜×2Ñ2Ô3Ü�KŠK˜×1Ñ1Ô2Ø× Ñ Ò,Ü—’˜F×-Ñ-Ö.ñ -ñ	 .r%   c                ó&   <€ V ^8„  d   Qh/ S[ ;R&   # r   r   )r    r!   s   "€r"   r#   ró   &  s   ø‡ ‚ áÑò r%   © )Úimage)rE   rF   rG   rH   Úbase_model_prefixÚmain_input_nameÚinput_modalitiesÚsupports_gradient_checkpointingÚ_no_split_modulesÚ_supports_sdpaÚ_supports_flash_attnÚ_supports_flex_attnÚ_supports_attention_backendÚ_can_compile_fullgraphrÝ   r©   Ú_can_record_outputsÚ_input_embed_layerr;   Úno_gradr÷   Ú__annotate_func__rJ   rK   rL   rM   s   @@r"   rï   rï   &  s„   ù‡ € ð ÐØ$€OØ!ÐØ&*Ð#Ø)¨;Ð7ÐØ€NØÐØÐØ"&ÐØ!Ðà˜Ø�mðÐð ,Ðà
‡]‚]ƒ_÷/ò /ó ð/÷) … r%   rï   c                   óP   a a€ ] tR tRt oV3R lV 3R lltV3R lR ltRtVtV ;t# )Ú
DeiTPooleriK  c                ó    <€ V ^8„  d   QhRS[ /# r   r   )r    r!   s   "€r"   r#   ÚDeiTPooler.__annotate__L  s   ø€ ÷ 4ñ 4™zñ 4r%   c                ó¼   <€ \         SV `  4        \        P                  ! VP                  VP
                  4      V n        \        VP                  ,          V n	        R # rË   )
r*   r+   r   r´   r2   Úpooler_output_sizeÚdenser   Ú
pooler_actÚ
activationrº   s   &&€r"   r+   ÚDeiTPooler.__init__L  s>   ø€ Ü‰ÑÔÜ—Y’Y˜v×1Ñ1°6×3LÑ3LÓMˆŒ
Ü  ×!2Ñ!2Õ3ˆŽr%   c                óN   <€ V ^8„  d   QhRS[ P                  RS[ P                  /# rÙ   r:   )r    r!   s   "€r"   r#   r  Q  s#   ø€ ÷ ñ ¡U§\¡\ð ±e·l±lñ r%   c                ó\   € VR,          pV P                  V4      pV P                  V4      pV# )rn   )rn   r   )r  r  )r4   r¾   Úfirst_token_tensorÚpooled_outputs   &&  r"   rC   ÚDeiTPooler.forwardQ  s2   € ð +¨4Õ0ÐØŸ
™
Ð#5Ó6ˆØŸ™¨Ó6ˆØÐr%   )r  r  rÌ   rM   s   @@r"   r  r  K  s   ù‡ € ÷4ó 4÷
÷ ð r%   r  c                   ó„   a a€ ] tR tRt oR	V3R lV 3R lllt]]! RR7      ]R
V3R lR ll4       4       4       tRt	Vt
V ;t# )Ú	DeiTModeliZ  Fc                ó,   <€ V ^8„  d   QhRS[ RS[RS[/# )r   r   Úadd_pooling_layerrQ   rR   )r    r!   s   "€r"   r#   ÚDeiTModel.__annotate__\  s#   ø€ ÷ ñ ™zð ¹dð Ñ[_ñ r%   c                ó¢  <€ \         SV `  V4       Wn        \        WR7      V n        \
        P                  ! \        VP                  4       Uu. uF  p\        V4      NK  	  up4      V n
        \
        P                  ! VP                  VP                  R7      V n        V'       d   \        V4      MRV n        V P#                  4        R# u upi )zÓ
add_pooling_layer (bool, *optional*, defaults to `True`):
    Whether to add a pooling layer
use_mask_token (`bool`, *optional*, defaults to `False`):
    Whether to use a mask token for masked image modeling.
)rQ   rá   N)r*   r+   r   rO   rb   r   Ú
ModuleListÚrangeÚnum_hidden_layersrÝ   Úlayersrä   r2   rå   Ú	layernormr  ÚpoolerÚ	post_init)r4   r   r   rQ   r‰   r5   s   &&&& €r"   r+   ÚDeiTModel.__init__\  s’   ø€ ô 	‰Ñ˜Ô ØŒÜ(¨ÔOˆŒÜ—m’mÄÀf×F^ÑF^Ô@_Ó$`Ñ@_¸1¤Y¨vÖ%6Ñ@_Ñ$`ÓaˆŒÜŸš f×&8Ñ&8¸f×>SÑ>SÔTˆŒß,=”j Ô(À4ˆŒà�‰Öùò	 %as   ÁC)Útie_last_hidden_statesc                óÂ   <€ V ^8„  d   QhRS[ P                  R,          RS[ P                  R,          RS[R,          RS[ P                  R,          RS[S[,          RS[/# ©r   r8   Nr‚   r   r–   r˜   r9   )r;   r<   rƒ   rS   r   r   r   )r    r!   s   "€r"   r#   r!  o  sv   ø€ ÷  jñ  já—l‘l TÕ)ð jñ ×)Ñ)¨DÕ0ð jñ #'¨¥+ð	 jñ
 Ÿ™ tÕ+ð jñ Ñ+Õ,ð jñ 
$ñ jr%   c                ó¼  € V P                   P                  P                  P                  P                  pVP                  V8w  d   VP                  V4      pV P                  WVR7      p\        V P                  VVR7      pTpV P                   F  p	V	! W„3/ VB pK  	  V P                  V4      p
V P                  e   V P                  V
4      MRp\        W«R7      # )z³
bool_masked_pos (`torch.BoolTensor` of shape `(batch_size, num_patches)`, *optional*):
    Boolean masked positions. Indicates which patches are masked (1) and which aren't (0).
)r‚   r   )r   Úinputs_embedsr–   N)Úlast_hidden_stateÚpooler_output)rb   rZ   r3   Úweightrœ   r£   r	   r   r&  r'  r(  r   )r4   r8   r‚   r   r–   r˜   Úexpected_dtypeÚembedding_outputr¾   ÚlayerÚsequence_outputr  s   &&&&&,      r"   rC   ÚDeiTModel.forwardl  sÍ   € ð  Ÿ™×9Ñ9×DÑD×KÑK×QÑQˆØ×Ñ Ô/Ø'Ÿ?™?¨>Ó:ˆLàŸ?™?ØÐTlð +ó 
Ðô 3Ø—;‘;Ø*Ø)ô
ˆð
 )ˆØ—[”[ˆEÙ! -ÑJÀ6ÑJŠMñ !ð Ÿ.™.¨Ó7ˆØ8<¿¹Ò8O˜Ÿ™ OÔ4ÐUYˆä)¸OÔiÐir%   )r   rb   r'  r&  r(  )TF©NNNN)rE   rF   rG   rH   r+   r   r   r   rC   rJ   rK   rL   rM   s   @@r"   r  r  Z  sF   ù‡ € ÷õ ð   Ù¨EÔ2Ø÷ jñ  jó ó 3ó  ÷ jð  jr%   r  ad  
    DeiT Model with a decoder on top for masked image modeling, as proposed in [SimMIM](https://huggingface.co/papers/2111.09886).

    <Tip>

    Note that we provide a script to pre-train this model on custom data in our [examples
    directory](https://github.com/huggingface/transformers/tree/main/examples/pytorch/image-pretraining).

    </Tip>
    )Úcustom_introc                   óh   a a€ ] tR tRt oV3R lV 3R llt]]RV3R lR ll4       4       tRtVt	V ;t
# )ÚDeiTForMaskedImageModelingi’  c                ó    <€ V ^8„  d   QhRS[ /# r   r   )r    r!   s   "€r"   r#   Ú'DeiTForMaskedImageModeling.__annotate__Ÿ  s   ø€ ÷ ñ ™zñ r%   c                óf  <€ \         SV `  V4       \        VR RR7      V n        \        P
                  ! \        P                  ! VP                  VP                  ^,          VP                  ,          ^R7      \        P                  ! VP                  4      4      V n        V P                  4        R# )FT)r   rQ   )Úin_channelsÚout_channelsr(   N)r*   r+   r  rð   r   Ú
Sequentialr1   r2   Úencoder_strider0   ÚPixelShuffleÚdecoderr)  rº   s   &&€r"   r+   Ú#DeiTForMaskedImageModeling.__init__Ÿ  s�   ø€ Ü‰Ñ˜Ô ä˜f¸ÈdÔSˆŒ	ä—}’}Ü�IŠIØ"×.Ñ.Ø#×2Ñ2°AÕ5¸×8KÑ8KÕKØôô
 �OŠO˜F×1Ñ1Ó2ó
ˆŒð 	�‰Ör%   c                ó´   <€ V ^8„  d   QhRS[ P                  R,          RS[ P                  R,          RS[RS[ P                  R,          RS[S[,          RS[/# r-  )r;   r<   rƒ   rS   r   r   r   )r    r!   s   "€r"   r#   r=  ²  sr   ø€ ÷ J
ñ J
á—l‘l TÕ)ðJ
ñ ×)Ñ)¨DÕ0ðJ
ñ #'ð	J
ñ
 Ÿ™ tÕ+ðJ
ñ Ñ+Õ,ðJ
ñ 
#ñJ
r%   c           	     ó�  € V P                   ! V3RVRVRV/VB pVP                  pVR
,          pVP                  w  r‰p
\        V	R,          4      ;r¼VP	                  ^ ^^4      P                  WŠW¼4      pV P                  V4      pRpVEe   V P                  P                  V P                  P                  ,          pVP                  RWÿ4      pVP                  V P                  P                  ^4      P                  V P                  P                  ^4      P                  ^4      P                  4       p\        P                  P                  WRR7      pVV,          P!                  4       VP!                  4       R,           ,          V P                  P"                  ,          p\%        VVVP&                  VP(                  R	7      # )a“  
bool_masked_pos (`torch.BoolTensor` of shape `(batch_size, num_patches)`):
    Boolean masked positions. Indicates which patches are masked (1) and which aren't (0).

Examples:
```python
>>> from transformers import AutoImageProcessor, DeiTForMaskedImageModeling
>>> import torch
>>> from PIL import Image
>>> import requests

>>> url = "http://images.cocodataset.org/val2017/000000039769.jpg"
>>> image = Image.open(requests.get(url, stream=True).raw)

>>> image_processor = AutoImageProcessor.from_pretrained("facebook/deit-base-distilled-patch16-224")
>>> model = DeiTForMaskedImageModeling.from_pretrained("facebook/deit-base-distilled-patch16-224")

>>> num_patches = (model.config.image_size // model.config.patch_size) ** 2
>>> pixel_values = image_processor(images=image, return_tensors="pt").pixel_values
>>> # create random boolean mask of shape (batch_size, num_patches)
>>> bool_masked_pos = torch.randint(low=0, high=2, size=(1, num_patches)).bool()

>>> outputs = model(pixel_values, bool_masked_pos=bool_masked_pos)
>>> loss, reconstructed_pixel_values = outputs.loss, outputs.reconstruction
>>> list(reconstructed_pixel_values.shape)
[1, 3, 224, 224]
```r‚   r   r–   rg   NÚnone)Ú	reductiongñhãˆµøä>)ÚlossÚreconstructionr¾   rñ   ro   rp   )rð   r0  r?   re   rt   rs   rD  r   r,   r-   Úrepeat_interleaver‡   r¤   r   ru   Úl1_lossÚsumr0   r   r¾   rñ   )r4   r8   r‚   r   r–   r˜   Úoutputsr6  rŠ   Úsequence_lengthr0   rc   rd   Úreconstructed_pixel_valuesÚmasked_im_lossri   r�   Úreconstruction_losss   &&&&&,            r"   rC   Ú"DeiTForMaskedImageModeling.forward°  s£  € ðL /3¯iªiØñ/
à+ð/
ð &>ð/
ð *ð	/
ð
 ñ/
ˆð "×3Ñ3ˆð *¨%Õ0ˆØ4C×4IÑ4IÑ1ˆ
 \Ü˜_¨cÕ1Ó2Ð2ˆØ)×1Ñ1°!°Q¸Ó:×BÑBÀ:Ð]cÓkˆð &*§\¡\°/Ó%BÐ"àˆØÓ&Ø—;‘;×)Ñ)¨T¯[©[×-CÑ-CÕCˆDØ-×5Ñ5°b¸$ÓEˆOà×1Ñ1°$·+±+×2HÑ2HÈ!ÓLß"Ñ" 4§;¡;×#9Ñ#9¸1Ó=ß‘˜1“ß‘“ð	 ô #%§-¡-×"7Ñ"7¸ÐlrÐ"7Ó"sÐØ1°DÕ8×=Ñ=Ó?À4Ç8Á8Ã:ÐPTÕCTÕUÐX\×XcÑXc×XpÑXpÕpˆNä(ØØ5Ø!×/Ñ/Ø×)Ñ)ô	
ð 	
r%   )rD  rð   )NNFN©rE   rF   rG   rH   r+   r   r   rC   rJ   rK   rL   rM   s   @@r"   r;  r;  ’  s9   ù‡ € ÷ó ð" Ø÷J
ñ J
ó ó ÷J
ð J
r%   r;  aâ  
    DeiT Model transformer with an image classification head on top (a linear layer on top of the final hidden state of
    the [CLS] token) e.g. for ImageNet.

    <Tip>

        Note that it's possible to fine-tune DeiT on higher resolution images than the ones it has been trained on, by
        setting `interpolate_pos_encoding` to `True` in the forward of the model. This will interpolate the pre-trained
        position embeddings to the higher resolution.

    </Tip>
    c                   óh   a a€ ] tR tRt oV3R lV 3R llt]]RV3R lR ll4       4       tRtVt	V ;t
# )ÚDeiTForImageClassificationiÿ  c                ó    <€ V ^8„  d   QhRS[ /# r   r   )r    r!   s   "€r"   r#   Ú'DeiTForImageClassification.__annotate__  s   ø€ ÷ 
ñ 
™zñ 
r%   c                ó8  <€ \         SV `  V4       VP                  V n        \        VR R7      V n        VP                  ^ 8”  d,   \
        P                  ! VP                  VP                  4      M\
        P                  ! 4       V n	        V P                  4        R# ©F)r   N)r*   r+   Ú
num_labelsr  rð   r   r´   r2   ÚIdentityÚ
classifierr)  rº   s   &&€r"   r+   Ú#DeiTForImageClassification.__init__  ss   ø€ Ü‰Ñ˜Ô à ×+Ñ+ˆŒÜ˜f¸Ô>ˆŒ	ð OU×N_ÑN_ÐbcÔNcœ"Ÿ)š) F×$6Ñ$6¸×8IÑ8IÔJÔik×itÒitÓivˆŒð 	�‰Ör%   c                óÂ   <€ V ^8„  d   QhRS[ P                  R,          RS[ P                  R,          RS[R,          RS[ P                  R,          RS[S[,          RS[/# )r   r8   NÚlabelsr   r–   r˜   r9   )r;   r<   rS   r   r   r   )r    r!   s   "€r"   r#   rY    sl   ø€ ÷ #
ñ #
á—l‘l TÕ)ð#
ñ —‘˜tÕ#ð#
ñ #'¨¥+ð	#
ñ
 Ÿ™ tÕ+ð#
ñ Ñ+Õ,ð#
ñ 
ñ#
r%   c                ó
  € V P                   ! V3RVRV/VB pVP                  pVR,          pV P                  V4      p	Rp
Ve   V P                  ! W)V P                  3/ VB p
\        V
V	VP                  VP                  R7      # )ab  
labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*):
    Labels for computing the image classification/regression loss. Indices should be in `[0, ...,
    config.num_labels - 1]`. If `config.num_labels == 1` a regression loss is computed (Mean-Square loss), If
    `config.num_labels > 1` a classification loss is computed (Cross-Entropy).
r   r–   N)rJ  Úlogitsr¾   rñ   ©rn   r   rn   )rð   r0  r^  Úloss_functionr   r   r¾   rñ   )r4   r8   ra  r   r–   r˜   rO  r6  r  rc  rJ  s   &&&&&,     r"   rC   Ú"DeiTForImageClassification.forward  s¡   € ð" /3¯iªiØñ/
à%=ð/
ð *ð/
ð ñ	/
ˆð "×3Ñ3ˆØ'¨Õ0ˆØ—‘ Ó/ˆàˆØÒØ×%Ò% f°d·k±kÑLÀVÑLˆDä$ØØØ!×/Ñ/Ø×)Ñ)ô	
ð 	
r%   )r^  rð   r\  r8  rU  rM   s   @@r"   rW  rW  ÿ  s5   ù‡ € ÷
ó 
ð Ø÷#
ñ #
ó ó ÷#
ð #
r%   rW  zC
    Output type of [`DeiTForImageClassificationWithTeacher`].
    c                   óD   a € ] tR tRt o RtRtRtRtRtRt	V 3R lt
RtV tR# )Ú+DeiTForImageClassificationWithTeacherOutputiB  aF  
logits (`torch.FloatTensor` of shape `(batch_size, config.num_labels)`):
    Prediction scores as the average of the cls_logits and distillation logits.
cls_logits (`torch.FloatTensor` of shape `(batch_size, config.num_labels)`):
    Prediction scores of the classification head (i.e. the linear layer on top of the final hidden state of the
    class token).
distillation_logits (`torch.FloatTensor` of shape `(batch_size, config.num_labels)`):
    Prediction scores of the distillation head (i.e. the linear layer on top of the final hidden state of the
    distillation token).
Nc                ó   <€ V ^8„  d   Qh/ S[ P                  R,          ;R&   S[ P                  R,          ;R&   S[ P                  R,          ;R&   S[S[ P                  ,          R,          ;R&   S[S[ P                  ,          R,          ;R&   # )r   Nrc  Ú
cls_logitsÚdistillation_logitsr¾   rñ   )r;   ÚFloatTensorr¿   )r    r!   s   "€r"   r#   Ú8DeiTForImageClassificationWithTeacherOutput.__annotate__B  s‡   ø‡ ‚ ñ$ ×Ñ Õ$Ñ+ñ% ñ& ×!Ñ! DÕ(Ñ/ñ' ñ( ×*Ñ*¨TÕ1Ñ8ñ) ñ* ™×*Ñ*Õ+¨dÕ2Ñ9ñ+ ñ, ‘e×'Ñ'Õ(¨4Õ/Ñ6ò- r%   rþ   )rE   rF   rG   rH   rI   rc  rj  rk  r¾   rñ   r  rJ   rK   )r!   s   @r"   rh  rh  B  s-   ø‡ € ñ	ð (,€FØ+/€JØ48ÐØ59€MØ26€J÷- ƒ r%   rh  aˆ  
    DeiT Model transformer with image classification heads on top (a linear layer on top of the final hidden state of
    the [CLS] token and a linear layer on top of the final hidden state of the distillation token) e.g. for ImageNet.

    .. warning::

           This model supports inference-only. Fine-tuning with distillation (i.e. with a teacher) is not yet
           supported.
    c                   óh   a a€ ] tR tRt oV3R lV 3R llt]]RV3R lR ll4       4       tRtVt	V ;t
# )Ú%DeiTForImageClassificationWithTeacheri[  c                ó$   <€ V ^8„  d   QhRS[ RR/# )r   r   r9   Nr   )r    r!   s   "€r"   r#   Ú2DeiTForImageClassificationWithTeacher.__annotate__g  s   ø€ ÷ ñ ™zð ¨dñ r%   c                óä  <€ \         SV `  V4       VP                  V n        \        VR R7      V n        VP                  ^ 8”  d,   \
        P                  ! VP                  VP                  4      M\
        P                  ! 4       V n	        VP                  ^ 8”  d,   \
        P                  ! VP                  VP                  4      M\
        P                  ! 4       V n
        V P                  4        R# r[  )r*   r+   r\  r  rð   r   r´   r2   r]  Úcls_classifierÚdistillation_classifierr)  rº   s   &&€r"   r+   Ú.DeiTForImageClassificationWithTeacher.__init__g  s·   ø€ Ü‰Ñ˜Ô à ×+Ñ+ˆŒÜ˜f¸Ô>ˆŒ	ð AG×@QÑ@QÐTUÔ@UŒB�IŠI�f×(Ñ(¨&×*;Ñ*;Ô<Ô[]×[fÒ[fÓ[hð 	Ôð AG×@QÑ@QÐTUÔ@UŒB�IŠI�f×(Ñ(¨&×*;Ñ*;Ô<Ô[]×[fÒ[fÓ[hð 	Ô$ð
 	�‰Ör%   c          
      óŒ   <€ V ^8„  d   QhRS[ P                  R,          RS[RS[ P                  R,          RS[S[,          RS[/# )r   r8   Nr   r–   r˜   r9   )r;   r<   rS   r   r   rh  )r    r!   s   "€r"   r#   rq  z  sU   ø€ ÷ 
ñ 
á—l‘l TÕ)ð
ñ #'ð
ñ Ÿ™ tÕ+ð	
ñ
 Ñ+Õ,ð
ñ 
5ñ
r%   c                ó  € V P                   ! V3R VRV/VB pVP                  pV P                  VR,          4      pV P                  VR,          4      pWx,           ^,          p	\	        V	VVVP
                  VP                  R7      # )r   r–   )rc  rj  rk  r¾   rñ   rd  )rn   r'   rn   )rð   r0  rs  rt  rh  r¾   rñ   )
r4   r8   r   r–   r˜   rO  r6  rj  rk  rc  s
   &&&&,     r"   rC   Ú-DeiTForImageClassificationWithTeacher.forwardx  s    € ð /3¯iªiØñ/
à%=ð/
ð *ð/
ð ñ	/
ˆð "×3Ñ3ˆà×(Ñ(¨¸Õ)AÓBˆ
Ø"×:Ñ:¸?È7Õ;SÓTÐð Õ2°aÕ7ˆä:ØØ!Ø 3Ø!×/Ñ/Ø×)Ñ)ô
ð 	
r%   )rs  rð   rt  r\  )NFNrU  rM   s   @@r"   ro  ro  [  s5   ù‡ € ÷ó ð" Ø÷
ñ 
ó ó ÷
ð 
r%   ro  )NrÁ   )rW  ro  r;  r  rï   )4Úcollections.abcr   r   Údataclassesr   r;   r   Ú r   rø   Úactivationsr   Úmasking_utilsr	   Úmodeling_layersr
   Úmodeling_outputsr   r   r   Úmodeling_utilsr   r   Úprocessing_utilsr   Úutilsr   r   r   r   Úutils.genericr   r   Úutils.output_capturingr   Úconfiguration_deitr   r™   r   rO   r§   r©   rÎ   rÝ   rï   r  r  r;  rW  rh  ro  Ú__all__rþ   r%   r"   Ú<module>r‡     s�  ð÷* /Ý !ã Ý å &Ý !Ý 6Ý 9ß lÑ lß FÝ &ß OÓ Oß IÝ 5Ý *ôH˜"Ÿ)™)ô Hô<`�R—Y‘Yô `÷F%ô8.)�B—I‘Iô .)ôbˆb�i‰iô ô Ð*ô ð@ ô!/˜/ó !/ó ð!/ôH�—‘ô ð ô4jÐ#ó 4jó ð4jñn ð	ôô^
Ð!4ó ^
óð^
ñB ðôô2
Ð!4ó 2
óð2
ñj ðôð
 ô7°+ó 7ó óð7ñ& ðô
ô0
Ð,?ó 0
ó
ð0
òf‚r%   