Ë
    Gêñi4B  ã            
       ó   — d Z ddlZddlZddlZddlmZ ddlmZ ddlm	Z	  ej                  e«      Z G d„ dej                  «      Z G d	„ d
«      Zd„ Z G d„ d«      Z	 	 	 	 ddedz  dedz  dedz  dedz  fd„Zd„ Zy)zACollection of utils to be used by backbones and their components.é    N)Úrepo_existsé   )Úlogging)Úmaybe_install_capturing_hooksc                   ó   — e Zd ZdZdZy)ÚBackboneTypeÚtimmÚtransformersN)Ú__name__Ú
__module__Ú__qualname__ÚTIMMÚTRANSFORMERS© ó    ú]/var/www/pod-logistic/pod-ai/venv/lib/python3.12/site-packages/transformers/backbone_utils.pyr   r      s   „ Ø€DØ!�Lr   r   c                   óÔ   ‡ — e Zd ZdZdedz  dedz  fd„Zd„ Zed„ «       Zej                  dee
   fd„«       Zed	„ «       Zej                  deed
f   ee   z  fd„«       Zˆ fd„Zˆ xZS )ÚBackboneConfigMixinzv
    A Mixin to support handling the `out_features` and `out_indices` attributes for the backbone configurations.
    Úout_featuresNÚout_indicesc                 óî  — || _         t        |t        «      rt        |«      n|| _        | j                  «        | j                   | j                  }}|€,|€*t        | j                  «      dz
  g}| j                  d   g}nM|€+|�)|D �cg c]  }| j                  j                  |«      ‘Œ }}n |€|�|D �cg c]  }| j                  |   ‘Œ }}||c| _         | _        | j                  «        yc c}w c c}w )ap  
        Sets output indices and features to new values and aligns them with the given `stage_names`.
        If one of the inputs is not given, find the corresponding `out_features` or `out_indices`
        for the given `stage_names`.

        Args:
            out_features (`list[str]`, *optional*):
                The names of the features for the backbone to output. Defaults to `config._out_features` if not provided.
            out_indices (`list[int]` or `tuple[int]`, *optional*):
                The indices of the features for the backbone to output. Defaults to `config._out_indices` if not provided.
        Nr   éÿÿÿÿ)	Ú_out_featuresÚ
isinstanceÚtupleÚlistÚ_out_indicesÚverify_out_features_out_indicesÚlenÚstage_namesÚindex)Úselfr   r   ÚlayerÚidxs        r   Ú"set_output_features_output_indicesz6BackboneConfigMixin.set_output_features_output_indices(   s  € ð  *ˆÔÜ1;¸KÌÔ1OœD Ô-ÐU`ˆÔð 	×,Ñ,Ô.ð %)×$6Ñ$6¸×8IÑ8I�kˆØÐ <Ð#7Ü˜t×/Ñ/Ó0°1Ñ4Ð5ˆKØ ×,Ñ,¨RÑ0Ð1‰LØÐ  \Ð%=ØFRÖS¸U˜4×+Ñ+×1Ñ1°%Õ8ÐSˆKÑSØÐ! kÐ&=Ø=HÖI°c˜D×,Ñ,¨SÓ1ÐIˆLÐIð 1=¸kÐ-ˆÔ˜DÔ-Ø×,Ñ,Õ.ùò TùâIs   Â"C-Â5C2c                 óz  ‡ — ‰ j                   €t        d«      ‚‰ j                  ��t        ‰ j                  t        f«      s!t        dt        ‰ j                  «      › �«      ‚t        ˆ fd„‰ j                  D «       «      r%t        d‰ j                   › d‰ j                  › �«      ‚t        ‰ j                  «      t        t        ‰ j                  «      «      k7  rt        d‰ j                  › �«      ‚‰ j                  ‰ j                   D �cg c]  }|‰ j                  v sŒ|‘Œ c}x}k7  rt        d|› d‰ j                  › �«      ‚‰ j                  ��Lt        ‰ j                  t        «      s!t        d	t        ‰ j                  «      › �«      ‚t        ˆ fd
„‰ j                  D «       «      }t        ˆ fd„|D «       «      r%t        d‰ j                   › d‰ j                  › �«      ‚t        |«      t        t        |«      «      k7  r4d‰ j                  › �}||‰ j                  k7  rd|› d�ndz  }t        |«      ‚|t        t        |«      «      k7  rOt        t        |‰ j                  «      d„ ¬«      D ��cg c]  \  }}|‘Œ	 }}}t        d|› d‰ j                  › �«      ‚‰ j                  �ƒ‰ j                  �vt        ‰ j                  «      t        ‰ j                  «      k7  rt        d«      ‚‰ j                  ‰ j                  D �cg c]  }‰ j                   |   ‘Œ c}k7  rt        d«      ‚yyyc c}w c c}}w c c}w )z_
        Verify that out_indices and out_features are valid for the given stage_names.
        Nz2Stage_names must be set for transformers backbonesz out_features must be a list got c              3   ó:   •K  — | ]  }|‰j                   v–— Œ y ­w©N)r    )Ú.0Úfeatr"   s     €r   ú	<genexpr>zFBackboneConfigMixin.verify_out_features_out_indices.<locals>.<genexpr>V   s   øè ø€ ÒO°D�4˜t×/Ñ/Ô/ÑOùs   ƒz.out_features must be a subset of stage_names: z got z2out_features must not contain any duplicates, got z@out_features must be in the same order as stage_names, expected z out_indices must be a list, got c              3   ó\   •K  — | ]#  }|d k  r|t        ‰j                  «      z  n|–— Œ% y­w)r   N)r   r    ©r)   r$   r"   s     €r   r+   zFBackboneConfigMixin.verify_out_features_out_indices.<locals>.<genexpr>g   s.   øè ø€ Ò$rÐY\ÀCÈ!ÂG S¬3¨t×/?Ñ/?Ó+@Ò%@ÐQTÓ%TÑ$rùs   ƒ),c              3   ód   •K  — | ]'  }|t        t        ‰j                  «      «      vsŒ$|–— Œ) y ­wr(   )Úranger   r    r-   s     €r   r+   zFBackboneConfigMixin.verify_out_features_out_indices.<locals>.<genexpr>h   s(   øè ø€ Ò^˜3°cÄÄsÈ4×K[ÑK[ÓG\ÓA]Ò6]”3Ñ^ùs   ƒ%0©0z2out_indices must be valid indices for stage_names z, got z1out_indices must not contain any duplicates, got z(equivalent to z))Ú c                 ó   — | d   S )Nr   r   )Úxs    r   ú<lambda>zEBackboneConfigMixin.verify_out_features_out_indices.<locals>.<lambda>r   s   € ÐefÐghÑei€ r   )Úkeyz?out_indices must be in the same order as stage_names, expected zHout_features and out_indices should have the same length if both are setzQout_features and out_indices should correspond to the same stages if both are set)r    Ú
ValueErrorr   r   r   ÚtypeÚanyr   Úsetr   r   ÚsortedÚzip)r"   r*   Úsorted_featsÚpositive_indicesÚmsgÚ_r$   Úsorted_negatives   `       r   r   z3BackboneConfigMixin.verify_out_features_out_indicesL   s3  ø€ ð ×ÑÐ#ÜÐQÓRÐRà×ÑÑ)Ü˜d×0Ñ0´4°'Ô:Ü Ð#CÄDÈ×I[ÑI[ÓD\ÐC]Ð!^Ó_Ð_ÜÓO¸D×<NÑ<NÔOÔOÜ ØDÀT×EUÑEUÐDVÐV[Ð\`×\nÑ\nÐ[oÐpóð ô �4×%Ñ%Ó&¬#¬c°$×2DÑ2DÓ.EÓ*FÒFÜ Ð#UÐVZ×VhÑVhÐUiÐ!jÓkÐkØ×!Ñ!Ø26×2BÑ2BÖ a¨$ÀdÈd×N`ÑN`ÒF`¢Ò aÐa�òô !ØVÐWcÐVdÐdiÐjn×j|Ñj|Ði}Ð~óð ð ×ÑÑ(Ü˜d×/Ñ/´Ô6Ü Ð#CÄDÈ×IZÑIZÓD[ÐC\Ð!]Ó^Ð^ä$Ó$rÐ`d×`qÑ`qÔ$rÓrÐÜÓ^Ð"2Ô^Ô^Ü ØHÈ×IYÑIYÐHZÐZ`Ðae×arÑarÐ`sÐtóð ô Ð#Ó$¬¬CÐ0@Ó,AÓ(BÒBØIÈ$×J[ÑJ[ÐI\Ð]�ØÐAQÐUY×UfÑUfÒAf˜Ð)9Ð(:¸"Ñ=ÐlnÑn�Ü  “oÐ%Ø¤5¬Ð0@Ó)AÓ#BÒBä&,¬SÐ1AÀ4×CTÑCTÓ-UÑ[iÔ&j÷#Ù"˜A˜s’Cð#�ñ #ô !ØUÐVeÐUfÐfkÐlp×l}Ñl}Ðk~Ðóð ð ×ÑÐ)¨d×.?Ñ.?Ð.KÜ�4×%Ñ%Ó&¬#¨d×.?Ñ.?Ó*@Ò@Ü Ð!kÓlÐlØ×!Ñ!Àt×GXÑGXÖ%YÀ d×&6Ñ&6°sÓ&;Ò%YÒYÜ Ð!tÓuÐuð Zð /LÐ)ùò7 !bùó(#ùò &Zs   Ä
L-ÄL-É3L2ÌL8c                 ó   — | j                   S r(   )r   ©r"   s    r   r   z BackboneConfigMixin.out_features~   s   € à×!Ñ!Ð!r   c                 ó*   — | j                  |d¬«       y)ú€
        Set the out_features attribute. This will also update the out_indices attribute to match the new out_features.
        N©r   r   )r%   ©r"   r   s     r   r   z BackboneConfigMixin.out_features‚   s   € ð
 	×/Ñ/¸\ÐW[Ð/Õ\r   c                 ó   — | j                   S r(   )r   rA   s    r   r   zBackboneConfigMixin.out_indices‰   s   € à× Ñ Ð r   .c                 óH   — |�t        |«      n|}| j                  d|¬«       y)ú
        Set the out_indices attribute. This will also update the out_features attribute to match the new out_indices.
        NrD   )r   r%   ©r"   r   s     r   r   zBackboneConfigMixin.out_indices�   s(   € ð
 ,7Ð+B”d˜;Ô'ÈˆØ×/Ñ/¸TÈ{Ð/Õ[r   c                 óx   •— t         ‰| �  «       }|j                  dd«      |d<   |j                  dd«      |d<   |S )z¿
        Serializes this instance to a Python dictionary. Override the default `to_dict()` from `PreTrainedConfig` to
        include the `out_features` and `out_indices` attributes.
        r   Nr   r   r   )ÚsuperÚto_dictÚpop)r"   ÚoutputÚ	__class__s     €r   rL   zBackboneConfigMixin.to_dict•   s@   ø€ ô
 ‘‘Ó"ˆØ!'§¡¨O¸TÓ!Bˆˆ~ÑØ &§
¡
¨>¸4Ó @ˆˆ}ÑØˆr   )r   r   r   Ú__doc__r   r%   r   Úpropertyr   ÚsetterÚstrr   r   ÚintrL   Ú__classcell__©rO   s   @r   r   r   #   s¾   ø„ ñð"/à˜T‘kð"/ð ˜D‘[ó"/òH0vðd ñ"ó ð"ð ×Ñð]¨¨c©ò ]ó ð]ð ñ!ó ð!ð ×Ñð\ u¨S°#¨X¡¸¸c¹Ñ'Bò \ó ð\÷ð r   r   c                 óB   ‡ — t        j                  ‰ «      ˆ fd„«       }|S )ak  
    Wrapper to filer out `hidden_states` as backbones tend to always use them to get their feature maps, i.e.
    they also always output `hidden_states`. This controls for user-defined behavior again.

    NOTE: We assume a `can_return_tuple` decorator to be applied before so that we always expect a dict like
          object to remove the hidden states.
    c                 óð   •— |j                  dt        | j                  dd«      «      } ‰| g|¢­i |¤Ž}|s9|j                  «       D ��ci c]  \  }}|dvsŒ||“Œ }}} t	        |«      di |¤Ž}|S c c}}w )NÚoutput_hidden_statesFÚhidden_statesr   )ÚgetÚgetattrÚconfigÚitemsr6   )	r"   ÚargsÚkwargsrY   rN   ÚkÚvÚfiltered_output_dataÚforward_functions	           €r   Úwrapperz,filter_output_hidden_states.<locals>.wrapper©   s„   ø€ à%Ÿz™zÐ*@Ä'È$Ï+É+ÐWmÐotÓBuÓvÐÙ! $Ð8¨Ò8°Ñ8ˆÙ#Ø5;·\±\³^×#b©T¨Q°ÀqÐQ`ÒGa A q¡DÐ#bÐ Ñ#bØ!”T˜&“\Ñ9Ð$8Ñ9ˆFØˆùó $cs   Á
A2ÁA2)Ú	functoolsÚwraps)rd   re   s   ` r   Úfilter_output_hidden_statesrh       s(   ø€ ô ‡_�_Ð%Ó&óó 'ðð €Nr   c                   ó>  ‡ — e Zd ZU dZedz  ed<   dZeed<   dˆ fd„Zˆ fd„Z	dd„Z
dd„Zed	„ «       Zej                  d
ee   fd„«       Zed„ «       Zej                  dee   ee   z  fd„«       Zed„ «       Zed„ «       Zd„ Z	 	 	 ddedz  dedz  dedz  fd„Zˆ xZS )ÚBackboneMixinNÚbackbone_typeTÚhas_attentionsc                 óŽ  •— t        ‰| �  |i |¤Ž |j                  dd«      }|�t        j                  | _        nt        j                  | _        | j
                  t        j                  k(  r| j                  |¬«       y| j
                  t        j                  k(  r| j                  «        yt        d| j
                  › d�«      ‚)z¬
        Method to initialize the backbone. This method is called by the constructor of the base class after the
        pretrained model weights have been loaded.
        Útimm_backboneN)Úbackbonezbackbone_type z not supported.)
rK   Ú__init__rM   r   r   rk   r   Ú_init_timm_backboneÚ_init_transformers_backboner5   )r"   r_   r`   rn   rO   s       €r   rp   zBackboneMixin.__init__¼   s©   ø€ ô
 	‰Ñ˜$Ð) &Ò)ØŸ
™
 ?°DÓ9ˆØÐ$Ü!-×!2Ñ!2ˆDÕä!-×!:Ñ!:ˆDÔà×Ñ¤×!2Ñ!2Ò2Ø×$Ñ$¨mÐ$Õ<Ø×Ñ¤<×#<Ñ#<Ò<Ø×,Ñ,Õ.ä˜~¨d×.@Ñ.@Ð-AÀÐQÓRÐRr   c                 ó8   •— t         ‰| �  «        t        | «       y)a•  
        Override `post_init` to always install capturing hooks, as backbone will ALWAYS capture outputs. We need to do
        it in `post_init`, as modules need to be already instantiated.
        It avoids some mixups with `torch.compile`, as the first hook installation will need/create a graph break,
        which can clash with external user call such as `model = torch.compile(model...)`.
        N)rK   Ú	post_initr   )r"   rO   s    €r   rt   zBackboneMixin.post_initÏ   s   ø€ ô 	‰ÑÔÜ% dÕ+r   c                 óp  — t        | j                  dd«      }t        | j                  dd«      }|j                  j                  D �cg c]  }|d   ‘Œ	 c}| _        |j                  j                  D �cg c]  }|d   ‘Œ	 c}| _        t        |j                  j                  «      }|j                  j                  «       }|�||k7  rt        d|› d�«      ‚|�|| j                  k7  rt        d|› d	�«      ‚| j                  | j                  _        | j                  j                  ||«       yc c}w c c}w )
zj
        Initialize the backbone model from timm. The backbone must already be loaded to backbone
        r   Nr    ÚmoduleÚnum_chsz!Config has `out_features` set to z‰ which doesn't match `out_features` from backbone's feature_info. Please check if your checkpoint has correct out features/indices saved.z Config has `stage_names` set to z� which doesn't match `stage_names` from backbone's feature_info. Please check if your checkpoint has correct `stage_names` saved.)r\   r]   Úfeature_infoÚinfor    Únum_featuresr   r   Úmodule_namer5   r%   )r"   ro   Úout_features_from_configÚstage_names_from_configÚstager   r   s          r   rq   z!BackboneMixin._init_timm_backboneÛ   s:  € ô
 $+¨4¯;©;¸ÈÓ#MÐ Ü")¨$¯+©+°}ÀdÓ"KÐð
 :B×9NÑ9N×9SÑ9SÖT°˜E (›OÒTˆÔØ;C×;PÑ;P×;UÑ;UÖV°%˜U 9Ó-ÒVˆÔä˜8×0Ñ0×<Ñ<Ó=ˆØ×,Ñ,×8Ñ8Ó:ˆà#Ð/Ð4LÐP\Ò4\ÜØ3Ð4LÐ3Mð Nxð xóð ð
 #Ð.Ð3JÈd×N^ÑN^Ò3^ÜØ2Ð3JÐ2Kð Lqð qóð ð #'×"2Ñ"2ˆ�‰ÔØ�‰×6Ñ6°|À[ÕQùò) UùÚVs   ÁD.Á3D3c                 ó|   — | j                   j                  | _        | j                   j                  «        d | _        y r(   )r]   r    r   rz   rA   s    r   rr   z)BackboneMixin._init_transformers_backboneü   s,   € ØŸ;™;×2Ñ2ˆÔØ�‰×3Ñ3Ô5à ˆÕr   c                 ó.   — | j                   j                  S r(   )r]   r   rA   s    r   r   zBackboneMixin.out_features  s   € à�{‰{×(Ñ(Ð(r   r   c                 ó&   — || j                   _        y)rC   N)r]   r   rE   s     r   r   zBackboneMixin.out_features  s   € ð
 $0ˆ�‰Õ r   c                 ó.   — | j                   j                  S r(   )r]   r   rA   s    r   r   zBackboneMixin.out_indices  s   € à�{‰{×'Ñ'Ð'r   r   c                 ó&   — || j                   _        y)rH   N)r]   r   rI   s     r   r   zBackboneMixin.out_indices  s   € ð
 #.ˆ�‰Õr   c                 óz   — t        | j                  «      D ��ci c]  \  }}|| j                  |   “Œ c}}S c c}}w r(   )Ú	enumerater    rz   )r"   Úir~   s      r   Úout_feature_channelsz"BackboneMixin.out_feature_channels  s8   € ô =FÀd×FVÑFVÓ<W×X±°°5��t×(Ñ(¨Ñ+Ñ+ÓXÐXùÓXs   ™7c                 óZ   — | j                   D �cg c]  }| j                  |   ‘Œ c}S c c}w r(   )r   r‡   )r"   Únames     r   ÚchannelszBackboneMixin.channels  s'   € à<@×<MÑ<MÖN°D�×)Ñ)¨$Ó/ÒNÐNùÒNs   �(c                 óH  — | j                   s|j                  dd «       | j                  t        j                  k(  rZt        t        j                  | j                  «      j                  «      }|j                  «       D ��ci c]  \  }}||v sŒ||“Œ }}} | |i |¤ŽS c c}}w )NÚoutput_attentions)rl   rM   rk   r   r   ÚdictÚinspectÚ	signatureÚforwardÚ
parametersr^   )r"   r_   r`   r�   ra   rb   s         r   Úforward_with_filtered_kwargsz*BackboneMixin.forward_with_filtered_kwargs"  sŠ   € Ø×"Ò"Ø�J‰JÐ*¨DÔ1Ø×Ñ¤×!2Ñ!2Ò2ÜœW×.Ñ.¨t¯|©|Ó<×GÑGÓHˆIØ'-§|¡|£~×H™t˜q !¸¸iº�a˜‘dÐHˆFÑHÙ�TÐ$˜VÑ$Ð$ùó Is   ÂBÂBrY   rŒ   Úreturn_dictc                 ó   — t        d«      ‚)Nz7This method should be implemented by the derived class.)ÚNotImplementedError)r"   Úpixel_valuesrY   rŒ   r“   s        r   r�   zBackboneMixin.forward*  s   € ô "Ð"[Ó\Ð\r   )ÚreturnN)NNN)r   r   r   rk   r   Ú__annotations__rl   Úboolrp   rt   rq   rr   rQ   r   rR   r   rS   r   r   rT   r‡   rŠ   r’   r�   rU   rV   s   @r   rj   rj   µ   s  ø… Ø)-€M�< $Ñ&Ó-ð  €N�DÓõSô&
,óRóB!ð ñ)ó ð)ð ×Ñð0¨¨c©ò 0ó ð0ð ñ(ó ð(ð ×Ñð. u¨S¡z°D¸±IÑ'=ò .ó ð.ð ñYó ðYð
 ñOó ðOò%ð -1Ø)-Ø#'ñ]ð # T™kð]ð   $™;ð	]ð
 ˜D‘[÷]r   rj   Údefault_backboneÚdefault_config_typeÚdefault_config_kwargsÚtimm_default_kwargsc                 ó�  — ddl m} ddlm} |j	                  dd«      }|j	                  di «      }	|j                  d«      �|j	                  d«      n|}
|j	                  dd «       |�|r|
�| €|	s |d	   dd|
i|¤Ž} | |fS |
�W| €Ut        |
«      r9|j                  |
«      \  }}||d
      }|j                  |	«        |di |¤Ž} | |fS  |d	   dd|
i|	¤Ž} | |fS | €0|�.t        j                  d|› d�«       |xs i } ||   di |¤Ž} | |fS t        | t        «      r'| j                  d
«      }||   }|j                  | «      } | |fS )Nr   )ÚPreTrainedConfig)ÚCONFIG_MAPPINGÚuse_timm_backboneTÚbackbone_kwargsro   Úuse_pretrained_backbonern   Ú
model_typezG`backbone_config` is `None`. Initializing the config with the default `z` vision config.r   )Úconfiguration_utilsrŸ   Úmodels.autor    rM   r[   r   Úget_config_dictÚupdateÚloggerry   r   r�   Ú	from_dict)Úbackbone_configrš   r›   rœ   r�   r`   rŸ   r    r¡   r¢   ro   Úconfig_dictr>   Úconfig_classÚbackbone_model_types                  r   Ú%consolidate_backbone_kwargs_to_configr¯   4  sÁ  € õ 6Ý+àŸ
™
Ð#6¸Ó=ÐØ—j‘jÐ!2°BÓ7€OØ)/¯©°JÓ)?Ð)Kˆv�z‰z˜*Ô%ÐQa€HØ
‡J�JÐ(¨$Ô/ð
 	Ð'ÙØÐ ØÐ#Ùà9˜.¨Ñ9ÑcÀ8ÐcÐObÑcˆð( ˜FÐ"Ð"ð' 
Ð	 /Ð"9Ü�xÔ Ø-×=Ñ=¸hÓG‰NˆK˜Ø)¨+°lÑ*CÑDˆLØ×Ñ˜Ô/Ù*Ñ9¨[Ñ9ˆOð ˜FÐ"Ð"ð >˜n¨_Ñ=ÑcÀxÐcÐSbÑcˆOð ˜FÐ"Ð"ð 
Ð	 Ð%8Ð%DÜ�‰ØUÐViÐUjÐjzÐ{ô	
ð !6Ò ;¸ÐØ=˜.Ð)<Ñ=ÑVÐ@UÑVˆð ˜FÐ"Ð"ô 
�O¤TÔ	*Ø-×1Ñ1°,Ó?ÐØ%Ð&9Ñ:ˆØ&×0Ñ0°ÓAˆà˜FÐ"Ð"r   c                 ó|   — ddl m} t        | dd«      }|€|j                  | ¬«      }|S |j                  |¬«      }|S )a>  
    Loads the backbone model from a config object.

    If the config is from the backbone model itself, then we return a backbone model with randomly initialized
    weights.

    If the config is from the parent model of the backbone model itself, then we load the pretrained backbone weights
    if specified.
    r   )ÚAutoBackboner«   N)r]   )r
   r±   r\   Úfrom_config)r]   r±   r«   ro   s       r   Úload_backboner³   f  sP   € õ *ä˜fÐ&7¸Ó>€OàÐØ×+Ñ+°6Ð+Ó:ˆð €Oð  ×+Ñ+°?Ð+ÓCˆØ€Or   )NNNN)rP   Úenumrf   rŽ   Úhuggingface_hubr   Úutilsr   Úutils.output_capturingr   Ú
get_loggerr   r©   ÚEnumr   r   rh   rj   rS   r�   r¯   r³   r   r   r   ú<module>rº      s±   ðñ Hã Û Û å 'å Ý Að 
ˆ×	Ñ	˜HÓ	%€ô"�4—9‘9ô "÷
zñ zòz÷*|]ñ |]ðB $(Ø&*Ø)-Ø'+ñ/#à˜D‘jð/#ð ˜t™ð/#ð   $™;ð	/#ð
  ™ó/#ódr   