
     `i[                     6   d dl Zd dlmZmZmZ d dlZd dlmZ ddl	m
Z
 ddlmZ ddlmZmZmZ ddlmZmZ ddlmZ dd	lmZmZ dd
lmZmZmZ ddlmZmZ ddl m!Z!  G d dej"                  Z# G d dej"                  Z$	 d4dej"        dej%        dej%        dej%        deej%                 de&de&f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          Z-e G d' d(e                      Z. G d) d*ej"                  Z/ G d+ d,ej"                  Z0e G d- d.e.                      Z1 ed/0           G d1 d2e.                      Z2g d3Z3dS )5    N)CallableOptionalUnion   )ACT2FN)GradientCheckpointingLayer)BaseModelOutputBaseModelOutputWithPoolingImageClassifierOutput)ALL_ATTENTION_FUNCTIONSPreTrainedModel)Unpack) find_pruneable_heads_and_indicesprune_linear_layer)TransformersKwargsauto_docstring	torch_int)can_return_tuplecheck_model_inputs   )IJepaConfigc                   R     e Zd ZdZdef fdZd	dej        dedej        fdZ	 xZ
S )
IJepaPatchEmbeddingsz
    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.
    configc                    t                                                       |j        |j        }}|j        |j        }}t          |t          j        j	                  r|n||f}t          |t          j        j	                  r|n||f}|d         |d         z  |d         |d         z  z  }|| _        || _        || _        || _
        t          j        ||||          | _        d S )Nr   r   )kernel_sizestride)super__init__
image_size
patch_sizenum_channelshidden_size
isinstancecollectionsabcIterablenum_patchesnnConv2d
projection)selfr   r    r!   r"   r#   r(   	__class__s          |/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/transformers/models/ijepa/modeling_ijepa.pyr   zIJepaPatchEmbeddings.__init__   s    !'!2F4EJ
$*$79Kk#-j+/:R#S#SqZZZdfpYq
#-j+/:R#S#SqZZZdfpYq
!!}
15*Q-:VW=:XY$$(&)L+:^hiii    Fpixel_valuesinterpolate_pos_encodingreturnc                    |j         \  }}}}|| j        k    rt          d| j         d| d          |sT|| j        d         k    s|| j        d         k    r2t          d| d| d| j        d          d| j        d          d		          |                     |                              d
                              dd
          }|S )NzoMake sure that the channel dimension of the pixel values match with the one set in the configuration. Expected z	 but got .r   r   zInput image size (*z) doesn't match model (z).   )shaper"   
ValueErrorr    r+   flatten	transpose)r,   r0   r1   
batch_sizer"   heightwidth
embeddingss           r.   forwardzIJepaPatchEmbeddings.forward.   s*   2>2D/
L&%4,,,I!.I I9EI I I   ( 	+++u8J/J/J E E E% E E+E E.2oa.@E E E   __\22::1==GG1MM
r/   F)__name__
__module____qualname____doc__r   r   torchTensorboolr?   __classcell__r-   s   @r.   r   r      s         j{ j j j j j j EL D ]b]i        r/   r   c            	            e Zd ZdZddededdf fdZdej        d	e	d
e	dej        fdZ
	 	 ddej        deej                 dedej        fdZ xZS )IJepaEmbeddingszb
    Construct the CLS token, position and patch embeddings. Optionally, also the mask token.
    Fr   use_mask_tokenr2   Nc                    t                                                       |r-t          j        t	          j        dd|j                            nd | _        t          |          | _	        | j	        j
        }t          j        t	          j        d||j                            | _        t          j        |j                  | _        |j        | _        || _        d S )Nr   )r   r   r)   	ParameterrE   zerosr#   
mask_tokenr   patch_embeddingsr(   randnposition_embeddingsDropouthidden_dropout_probdropoutr!   r   )r,   r   rL   r(   r-   s       r.   r   zIJepaEmbeddings.__init__D   s    Q_i",u{1a9K'L'LMMMei 4V < <+7#%<A{FL^0_0_#`#` z&"<== +r/   r>   r<   r=   c                    |j         d         }| j        j         d         }t          j                                        s||k    r||k    r| j        S | j        }|j         d         }|| j        z  }|| j        z  }	t          |dz            }
|                    d|
|
|          }|                    dddd          }t          j
                            |||	fdd	          }|                    dddd                              dd|          }|S )
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.

        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
        r   g      ?r   r   r6   bicubicF)sizemodealign_corners)r7   rS   rE   jit
is_tracingr!   r   reshapepermuter)   
functionalinterpolateview)r,   r>   r<   r=   r(   num_positionspatch_pos_embeddim
new_height	new_widthsqrt_num_positionss              r.   r1   z(IJepaEmbeddings.interpolate_pos_encodingN   s*    !&q)06q9 y##%% 	,+*F*F6UZ??++2r"t.
T_,	&}c'9::)11!5GI[]`aa)11!Q1==-33i(	 4 
 
 *11!Q1==BB1b#NNr/   r0   bool_masked_posr1   c                    |j         \  }}}}|                     ||          }|_|j         d         }	| j                            ||	d          }
|                    d                              |
          }|d|z
  z  |
|z  z   }|r||                     |||          z   }n
|| j        z   }|                     |          }|S )N)r1   r   rX         ?)	r7   rQ   rP   expand	unsqueezetype_asr1   rS   rV   )r,   r0   rj   r1   r;   _r<   r=   r>   
seq_lengthmask_tokensmasks               r.   r?   zIJepaEmbeddings.forwardu   s     (4'9$
Avu**<Rj*kk
&#)!,J/00ZLLK",,R0088EED#sTz2[45GGJ $ 	?#d&C&CJPVX]&^&^^JJ#d&>>J\\*--
r/   r@   )NF)rA   rB   rC   rD   r   rG   r   rE   rF   intr1   r   
BoolTensorr?   rH   rI   s   @r.   rK   rK   ?   s          { D T      %5< % %UX %]b]i % % % %T 7;).	 l "%"23 #'	
 
       r/   rK           modulequerykeyvalueattention_maskscalingrV   c                    t          j        ||                    dd                    |z  }t          j                            |dt           j                                      |j                  }t          j        	                    ||| j
                  }|||z  }t          j        ||          }	|	                    dd                                          }	|	|fS )NrX   )rf   dtype)ptrainingr   r6   )rE   matmulr:   r)   ra   softmaxfloat32tor   rV   r   
contiguous)
rw   rx   ry   rz   r{   r|   rV   kwargsattn_weightsattn_outputs
             r.   eager_attention_forwardr      s     <s}}R'<'<==GL =((2U](SSVVW\WbccL =((6?([[L !#n4,|U33K''1--88::K$$r/   c            	            e Zd Zdef fdZ	 ddej        deej                 deej        ej        f         fdZ	 xZ
S )	IJepaSelfAttentionr   c                    t                                                       |j        |j        z  dk    r0t	          |d          s t          d|j         d|j         d          || _        |j        | _        t          |j        |j        z            | _        | j        | j        z  | _	        |j
        | _        | j        dz  | _        d| _        t          j        |j        | j	        |j                  | _        t          j        |j        | j	        |j                  | _        t          j        |j        | j	        |j                  | _        d S )	Nr   embedding_sizezThe hidden size z4 is not a multiple of the number of attention heads r4   g      F)bias)r   r   r#   num_attention_headshasattrr8   r   rt   attention_head_sizeall_head_sizeattention_probs_dropout_probdropout_probr|   	is_causalr)   Linearqkv_biasrx   ry   rz   r,   r   r-   s     r.   r   zIJepaSelfAttention.__init__   sB    ::a??PVXhHiHi?76#5 7 737 7 7  
 #)#= #&v'9F<V'V#W#W !58PP"?/5Yv143EFO\\\
9V/1C&/ZZZYv143EFO\\\


r/   Nhidden_states	head_maskr2   c           
         |j         d         }|d| j        | j        f} |                     |          j        |                     dd          } |                     |          j        |                     dd          } |                     |          j        |                     dd          }t          }| j	        j
        dk    rt          | j	        j
                 } || ||||| j        | j        | j        sdn| j                  \  }	}
|	                                d d         | j        fz   }|	                    |          }	|	|
fS )	Nr   rX   r   r6   eagerrv   )r   r|   rV   r~   )r7   r   r   ry   rc   r:   rz   rx   r   r   _attn_implementationr   r   r|   r   r   rZ   r   r_   )r,   r   r   r;   	new_shape	key_layervalue_layerquery_layerattention_interfacecontext_layerattention_probsnew_context_layer_shapes               r.   r?   zIJepaSelfAttention.forward   sY    #(+
D$<d>VV	0DHH]++0)<FFq!LL	4djj//4i@JJ1aPP4djj//4i@JJ1aPP(?;+w66"9$+:Z"[)<)<nL#}CCC$2C	*
 	*
 	*
& #0"4"4"6"6ss";t?Q>S"S%--.EFFo--r/   N)rA   rB   rC   r   r   rE   rF   r   tupler?   rH   rI   s   @r.   r   r      s        ]{ ] ] ] ] ] ]* PT. ."\.6>u|6L.	u|U\)	*. . . . . . . .r/   r   c                   Z     e Zd ZdZdef fdZdej        dej        dej        fdZ xZ	S )IJepaSelfOutputz
    The residual connection is defined in IJepaLayer instead of here (as is the case with other models), due to the
    layernorm applied before each block.
    r   c                     t                                                       t          j        |j        |j                  | _        t          j        |j                  | _        d S r   )	r   r   r)   r   r#   denserT   rU   rV   r   s     r.   r   zIJepaSelfOutput.__init__   sJ    Yv163EFF
z&"<==r/   r   input_tensorr2   c                 Z    |                      |          }|                     |          }|S r   r   rV   r,   r   r   s      r.   r?   zIJepaSelfOutput.forward   s*    

=11]33r/   )
rA   rB   rC   rD   r   r   rE   rF   r?   rH   rI   s   @r.   r   r      s         
>{ > > > > > >
U\  RWR^        r/   r   c                   |     e Zd Zdef fdZdee         fdZd
dej	        de
ej	                 dej	        fd	Z xZS )IJepaAttentionr   c                     t                                                       t          |          | _        t	          |          | _        t                      | _        d S r   )r   r   r   	attentionr   outputsetpruned_headsr   s     r.   r   zIJepaAttention.__init__   sI    +F33%f--EEr/   headsc                    t          |          dk    rd S t          || j        j        | j        j        | j                  \  }}t          | j        j        |          | j        _        t          | j        j        |          | j        _        t          | j        j	        |          | j        _	        t          | j
        j        |d          | j
        _        | j        j        t          |          z
  | j        _        | j        j        | j        j        z  | j        _        | j                            |          | _        d S )Nr   r   rf   )lenr   r   r   r   r   r   rx   ry   rz   r   r   r   union)r,   r   indexs      r.   prune_headszIJepaAttention.prune_heads   s   u::??F74>5t~7Y[_[l
 
u
  2$.2FNN/0BEJJ1$.2FNN.t{/@%QOOO .2^-ORUV[R\R\-\*'+~'IDNLn'n$ -33E::r/   Nr   r   r2   c                 d    |                      ||          \  }}|                     ||          }|S r   )r   r   )r,   r   r   self_attn_outputrp   r   s         r.   r?   zIJepaAttention.forward  s4    "nn]IFF!-}==r/   r   )rA   rB   rC   r   r   r   rt   r   rE   rF   r   r?   rH   rI   s   @r.   r   r      s        "{ " " " " " ";S ; ; ; ;$ U\ hu|>T `e`l        r/   r   c                   H     e Zd Zdef fdZdej        dej        fdZ xZS )IJepaIntermediater   c                    t                                                       t          j        |j        |j                  | _        t          |j        t                    rt          |j                 | _        d S |j        | _        d S r   )r   r   r)   r   r#   intermediate_sizer   r$   
hidden_actstrr   intermediate_act_fnr   s     r.   r   zIJepaIntermediate.__init__  sn    Yv163KLL
f'-- 	9'-f.?'@D$$$'-'8D$$$r/   r   r2   c                 Z    |                      |          }|                     |          }|S r   )r   r   )r,   r   s     r.   r?   zIJepaIntermediate.forward  s,    

=1100??r/   	rA   rB   rC   r   r   rE   rF   r?   rH   rI   s   @r.   r   r     sj        9{ 9 9 9 9 9 9U\ el        r/   r   c                   V     e Zd Zdef fdZdej        dej        dej        fdZ xZS )IJepaOutputr   c                     t                                                       t          j        |j        |j                  | _        t          j        |j                  | _	        d S r   )
r   r   r)   r   r   r#   r   rT   rU   rV   r   s     r.   r   zIJepaOutput.__init__"  sJ    Yv79KLL
z&"<==r/   r   r   r2   c                 d    |                      |          }|                     |          }||z   }|S r   r   r   s      r.   r?   zIJepaOutput.forward'  s4    

=11]33%4r/   r   rI   s   @r.   r   r   !  su        >{ > > > > > >
U\  RWR^        r/   r   c                   h     e Zd ZdZdef fdZd	dej        deej                 dej        fdZ	 xZ
S )

IJepaLayerz?This corresponds to the Block class in the timm implementation.r   c                 z   t                                                       |j        | _        d| _        t	          |          | _        t          |          | _        t          |          | _	        t          j        |j        |j                  | _        t          j        |j        |j                  | _        d S )Nr   eps)r   r   chunk_size_feed_forwardseq_len_dimr   r   r   intermediater   r   r)   	LayerNormr#   layer_norm_epslayernorm_beforelayernorm_afterr   s     r.   r   zIJepaLayer.__init__1  s    '-'E$'//-f55!&)) "V-?VEZ [ [ [!|F,>FDYZZZr/   Nr   r   r2   c                     |                      |          }|                     ||          }||z   }|                     |          }|                     |          }|                     ||          }|S r   )r   r   r   r   r   )r,   r   r   hidden_states_normattention_outputlayer_outputs         r.   r?   zIJepaLayer.forward;  sz    !22=AA>>*<iHH )=8 ++M::((66 {{<??r/   r   )rA   rB   rC   rD   r   r   rE   rF   r   r?   rH   rI   s   @r.   r   r   .  s        II[{ [ [ [ [ [ [ U\ hu|>T `e`l        r/   r   c                       e Zd ZU eed<   dZdZdZddgZdZ	dZ
dZdZeedZdeej        ej        ej        f         d	d
fdZd
S )IJepaPreTrainedModelr   ijepar0   TrK   r   )r   
attentionsrw   r2   Nc                    t          |t          j        t          j        f          rt          j                            |j        j                            t          j
                  d| j        j                                      |j        j                  |j        _        |j         |j        j                                         dS dS t          |t          j                  r?|j        j                                         |j        j                            d           dS t          |t$                    rt          j                            |j        j                            t          j
                  d| j        j                                      |j        j                  |j        _        |j        "|j        j                                         dS dS dS )zInitialize the weightsrv   )meanstdNrl   )r$   r)   r   r*   inittrunc_normal_weightdatar   rE   r   r   initializer_ranger   r   zero_r   fill_rK   rS   rP   )r,   rw   s     r.   _init_weightsz"IJepaPreTrainedModel._init_weights\  s   fry")455 	/ "$!6!6"%%em443DKDa "7 " "b$%% M {& &&((((( '&-- 
	/K""$$$M$$S)))))00 	/.0g.C.C*/225=AAK1 /D / / b+122	 &+
  ,!&,,.....	/ 	/ -,r/   )rA   rB   rC   r   __annotations__base_model_prefixmain_input_namesupports_gradient_checkpointing_no_split_modules_supports_sdpa_supports_flash_attn_supports_flex_attn_supports_attention_backendr   r   _can_record_outputsr   r)   r   r*   r   r    r/   r.   r   r   L  s         $O&*#*L9N"&#( 
/E")RY*L$M /RV / / / / / /r/   r   c                   Z     e Zd Zdef fdZddej        deej                 defdZ	 xZ
S )	IJepaEncoderr   c                     t                                                       | _        t          j        fdt          j                  D                       | _        d| _        d S )Nc                 .    g | ]}t                    S r   )r   ).0rp   r   s     r.   
<listcomp>z)IJepaEncoder.__init__.<locals>.<listcomp>w  s!    #`#`#`1Jv$6$6#`#`#`r/   F)	r   r   r   r)   
ModuleListrangenum_hidden_layerslayergradient_checkpointingr   s    `r.   r   zIJepaEncoder.__init__t  s`    ]#`#`#`#`fF^@_@_#`#`#`aa
&+###r/   Nr   r   r2   c                     t          | j                  D ]\  }}|||         nd } |||          }t          |          S )N)last_hidden_state)	enumerater  r	   )r,   r   r   ilayer_modulelayer_head_masks         r.   r?   zIJepaEncoder.forwardz  sW    (44 	I 	IOA|.7.CillO(LHHMM????r/   r   )rA   rB   rC   r   r   rE   rF   r   r	   r?   rH   rI   s   @r.   r   r   s  s        ,{ , , , , , ,@ @U\ @hu|>T @`o @ @ @ @ @ @ @ @r/   r   c                   H     e Zd Zdef fdZdej        dej        fdZ xZS )IJepaPoolerr   c                     t                                                       t          j        |j        |j                  | _        t          |j                 | _	        d S r   )
r   r   r)   r   r#   pooler_output_sizer   r   
pooler_act
activationr   s     r.   r   zIJepaPooler.__init__  sE    Yv163LMM
 !23r/   r   r2   c                 r    |d d df         }|                      |          }|                     |          }|S )Nr   )r   r  )r,   r   first_token_tensorpooled_outputs       r.   r?   zIJepaPooler.forward  s@     +111a40

#56666r/   r   rI   s   @r.   r
  r
    sj        4{ 4 4 4 4 4 4
U\ el        r/   r
  c                       e Zd Zddededef fdZdefdZdee	e
e	         f         fd	Z ed
          e	 	 	 	 ddeej                 deej                 deej                 dee         dee         defd                        Z xZS )
IJepaModelFr   add_pooling_layerrL   c                 N   t                                          |           || _        t          ||          | _        t          |          | _        t          j        |j	        |j
                  | _        |rt          |          nd| _        |                                  dS )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.
        )rL   r   N)r   r   r   rK   r>   r   encoderr)   r   r#   r   	layernormr
  pooler	post_init)r,   r   r  rL   r-   s       r.   r   zIJepaModel.__init__  s     	   )&PPP#F++f&8f>STTT->Hk&)))D 	r/   r2   c                     | j         j        S r   )r>   rQ   )r,   s    r.   get_input_embeddingszIJepaModel.get_input_embeddings  s    //r/   heads_to_prunec                     |                                 D ]/\  }}| j        j        |         j                            |           0dS )z
        Prunes heads of the model. heads_to_prune: dict of {layer_num: list of heads to prune in this layer} See base
        class PreTrainedModel
        N)itemsr  r  r   r   )r,   r  r  r   s       r.   _prune_headszIJepaModel._prune_heads  sU    
 +0022 	C 	CLE5Lu%/;;EBBBB	C 	Cr/   )tie_last_hidden_statesNr0   rj   r   r1   r   c                    |t          d          |                     || j        j                  }| j        j        j        j        j        }|j        |k    r|	                    |          }|                     |||          }| 
                    ||          }|j        }	|                     |	          }	| j        |                     |	          nd}
t          |	|
          S )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).
        Nz You have to specify pixel_values)rj   r1   )r   )r  pooler_output)r8   get_head_maskr   r   r>   rQ   r+   r   r   r   r  r  r  r  r
   )r,   r0   rj   r   r1   r   expected_dtypeembedding_outputencoder_outputssequence_outputr  s              r.   r?   zIJepaModel.forward  s     ?@@@ &&y$+2OPP	 9DKQ//'??>::L??/Tl + 
 
 ,0<<8HT]<+^+^);..998<8OO444UY)O[hiiiir/   )FFNNNN)rA   rB   rC   r   rG   r   r   r  dictrt   listr  r   r   r   rE   rF   ru   r   r   r
   r?   rH   rI   s   @r.   r  r    sV        { t ]a      $0&: 0 0 0 0C4T#Y+? C C C C u555 046:,037&j &ju|,&j "%"23&j EL)	&j
 #+4.&j +,&j 
$&j &j &j ^ 65&j &j &j &j &jr/   r  a  
    IJepa Model transformer with an image classification head on top (a linear layer on top of the final hidden states)
    e.g. for ImageNet.

    <Tip>

        Note that it's possible to fine-tune IJepa 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>
    )custom_introc                        e Zd Zdef fdZee	 	 	 	 ddeej	                 deej	                 deej	                 dee
         dee         d	efd
                        Z xZS )IJepaForImageClassificationr   c                 :   t                                          |           |j        | _        t          |d          | _        |j        dk    rt          j        |j        |j                  nt          j                    | _	        | 
                                 d S )NF)r  r   )r   r   
num_labelsr  r   r)   r   r#   Identity
classifierr  r   s     r.   r   z$IJepaForImageClassification.__init__  s        +%@@@
 OUN_bcNcNc")F$68IJJJikitiviv 	r/   Nr0   r   labelsr1   r   r2   c                      | j         |f||d|}|j        }|                     |                    d                    }d}	| | j        ||| j        fi |}	t          |	||j        |j                  S )a  
        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   r1   r   r   N)losslogitsr   r   )	r   r  r1  r   loss_functionr   r   r   r   )
r,   r0   r   r2  r1   r   outputsr'  r5  r4  s
             r.   r?   z#IJepaForImageClassification.forward  s    " /9dj/
%=/
 /
 	/
 /
 "3!5!5!!5!<!<==%4%ffdkLLVLLD$!/)	
 
 
 	
r/   r(  )rA   rB   rC   r   r   r   r   r   rE   rF   rG   r   r   r   r?   rH   rI   s   @r.   r-  r-    s        
{ 
 
 
 
 
 
  04,0)-37!
 !
u|,!
 EL)!
 &	!

 #+4.!
 +,!
 
!
 !
 !
 ^ !
 !
 !
 !
 !
r/   r-  )r   r  r-  )rv   )4collections.abcr%   typingr   r   r   rE   torch.nnr)   activationsr   modeling_layersr   modeling_outputsr	   r
   r   modeling_utilsr   r   processing_utilsr   pytorch_utilsr   r   utilsr   r   r   utils.genericr   r   configuration_ijepar   Moduler   rK   rF   floatr   r   r   r   r   r   r   r   r   r
  r  r-  __all__r   r/   r.   <module>rG     s3       , , , , , , , , , ,        ! ! ! ! ! ! 9 9 9 9 9 9 b b b b b b b b b b F F F F F F F F & & & & & & Q Q Q Q Q Q Q Q B B B B B B B B B B A A A A A A A A , , , , , ,$ $ $ $ $29 $ $ $NN N N N Nbi N N Np % %I%<% 
% <	%
 U\*% % % % % %<1. 1. 1. 1. 1. 1. 1. 1.h    bi   "    RY   >    	   
 
 
 
 
") 
 
 
    +   < #/ #/ #/ #/ #/? #/ #/ #/L@ @ @ @ @29 @ @ @    ")    Fj Fj Fj Fj Fj% Fj Fj FjR   0
 0
 0
 0
 0
"6 0
 0
 0
f P
O
Or/   