+
    šh©jâj  ã                   óö   € R t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RI	H
t
 ^ RIHt RRutt ^ RIt^RIHtHt ^t ! R R4      tR t ! R	 R
4      t ! R R]4      tR#   ] d   t]t RtAL<RtAii ; i)z2
Configuration file (aka ``ssh_config``) support.
N)Úsha1)ÚStringIO)Úpartial)ÚCouldNotCanonicalizeÚConfigParseErrorc                   ó  a € ] tR t^.t o Rt]P                  ! R4      tR. RORR.R. ROR. ROR. R OR	. R!O/tR
 t	]
R 4       t]
R 4       t]
R 4       tR tR tR"R ltR tR tR tR tR tR tR tR tR tR tRtV tR# )#Ú	SSHConfigag  
Representation of config information as stored in the format used by
OpenSSH. Queries can be made via `lookup`. The format is described in
OpenSSH's ``ssh_config`` man page. This class is provided primarily as a
convenience to posix users (since the OpenSSH format is a de-facto
standard on posix) but should work fine on Windows too.

.. versionadded:: 1.6
z(\w+)(?:\s*=\s*|\s+)(.+)Úcontrolpathú%hÚhostnameÚidentityfileÚproxycommandÚ	proxyjumpú
match-execc                ó   € . V n         R# )a  
Create a new OpenSSH config object.

Note: the newer alternate constructors `from_path`, `from_file` and
`from_text` are simpler to use, as they parse on instantiation. For
example, instead of::

    config = SSHConfig()
    config.parse(open("some-path.config")

you could::

    config = SSHConfig.from_file(open("some-path.config"))
    # Or more directly:
    config = SSHConfig.from_path("some-path.config")
    # Or if you have arbitrary ssh_config text from some other source:
    config = SSHConfig.from_text("Host foo\n\tUser bar")
N©Ú_config)Úselfs   &ÚJ/var/www/html/bestweb/venv/lib/python3.14/site-packages/paramiko/config.pyÚ__init__ÚSSHConfig.__init__H   s   € ð& ˆŽó    c                ó6   € V P                  \        V4      4      # )zO
Create a new, parsed `SSHConfig` from ``text`` string.

.. versionadded:: 2.7
)Ú	from_filer   )ÚclsÚtexts   &&r   Ú	from_textÚSSHConfig.from_text]   s   € ð �}‰}œX d›^Ó,Ð,r   c                óˆ   € \        V4      ;_uu_ 4       pV P                  V4      uuRRR4       #   + '       g   i     R# ; i)zZ
Create a new, parsed `SSHConfig` from the file found at ``path``.

.. versionadded:: 2.7
N)Úopenr   )r   ÚpathÚflos   && r   Ú	from_pathÚSSHConfig.from_pathf   s'   € ô �$�ZŒZ˜3Ø—=‘= Ó%÷ �Z�Z‹Zús	   ”0°A	c                ó6   € V ! 4       pVP                  V4       V# )zX
Create a new, parsed `SSHConfig` from file-like object ``flo``.

.. versionadded:: 2.7
)Úparse)r   r!   Úobjs   && r   r   ÚSSHConfig.from_filep   s   € ñ ‹eˆØ�	‰	�#ŒØˆ
r   c                óÚ  € RR.R/ /pV EFÁ  pVP                  4       pV'       d   VP                  R4      '       d   K5  \        P                  ! V P                  V4      pV'       g   \        RP                  V4      4      hVP                  ^4      P                  4       pVP                  ^4      pVR9   dT   V P                  P                  V4       R/ /pVR8X  d   V P                  V4      VR&   Kë  V P                  V4      VR&   EK  VR8X  d%   VP                  4       R8X  d   R	VR,          V&   EK-  VP                  R
4      '       d   VP                  R
4      '       d   V^R pVR9   d@   WRR,          9   d#   VR,          V,          P                  V4       EK–  V.VR,          V&   EK¦  WRR,          9  g   EK¶  WbR,          V&   EKÄ  	  V P                  P                  V4       R	# )zv
Read an OpenSSH config from the given file object.

:param file_obj: a file-like object to read the config file from
ÚhostÚ*ÚconfigÚ#zUnparsable line {}Úmatchesr   ÚnoneNÚ")r)   Úmatchéÿÿÿÿ)r   ÚlocalforwardÚremoteforward)ÚstripÚ
startswithÚrer0   ÚSETTINGS_REGEXr   ÚformatÚgroupÚlowerr   ÚappendÚ
_get_hostsÚ_get_matchesÚendswith)r   Úfile_objÚcontextÚliner0   ÚkeyÚvalues   &&     r   r%   ÚSSHConfig.parse{   s©  € ð ˜C˜5 (¨BÐ/ˆÜˆDð —:‘:“<ˆDç˜4Ÿ?™?¨3×/Ò/Ùô —H’H˜T×0Ñ0°$Ó7ˆEßÜ&Ð';×'BÑ'BÀ4Ó'HÓIÐIØ—+‘+˜a“.×&Ñ&Ó(ˆCØ—K‘K “NˆEð Ð'Ô'Ø—‘×#Ñ# GÔ,Ø# R˜.�Ø˜&”=ð '+§o¡o°eÓ&<�G˜F“Oà)-×):Ñ):¸5Ó)A�G˜IÔ&à˜Ô&¨5¯;©;«=¸FÔ+Bð *.�˜Õ! #Ô&ð ×#Ñ# C×(Ò(¨U¯^©^¸C×-@Ò-@Ø! ! B˜K�Eð
 ÐKÔKØ hÕ/Ô/Ø Õ)¨#Õ.×5Ñ5°e×<à27°˜ Õ)¨#Ô.Ø¨Õ 1×1Ø-2˜HÕ% cÔ*ñ_ ðb 	�‰×Ñ˜GÖ$r   c                óŠ  € V P                  VR7      pRV9  d   WR&   VP                  RR4      R9   p\        VP                  R^4      4      pV'       dZ   VP                  R4      V8:  dD   VR,          P	                  4       pV P                  WV4      pWR&   V P                  WRRR	7      pV# V P                  WR
RR	7      pV# )a  
Return a dict (`SSHConfigDict`) of config options for a given hostname.

The host-matching rules of OpenSSH's ``ssh_config`` man page are used:
For each parameter, the first obtained value will be used.  The
configuration files contain sections separated by ``Host`` and/or
``Match`` specifications, and that section is only applied for hosts
which match the given patterns or keywords

Since the first obtained value for each parameter is used, more host-
specific declarations should be given near the beginning of the file,
and general defaults at the end.

The keys in the returned dict are all normalized to lowercase (look for
``"port"``, not ``"Port"``. The values are processed according to the
rules for substitution variable expansion in ``ssh_config``.

Finally, please see the docs for `SSHConfigDict` for deeper info on
features such as optional type conversion methods, e.g.::

    conf = my_config.lookup('myhost')
    assert conf['passwordauthentication'] == 'yes'
    assert conf.as_bool('passwordauthentication') is True

.. note::
    If there is no explicitly configured ``HostName`` value, it will be
    set to the being-looked-up hostname, which is as close as we can
    get to OpenSSH's behavior around that particular option.

:param str hostname: the hostname to lookup

.. versionchanged:: 2.5
    Returns `SSHConfigDict` objects instead of dict literals.
.. versionchanged:: 2.7
    Added canonicalization support.
.. versionchanged:: 2.7
    Added ``Match`` support.
.. versionchanged:: 3.3
    Added ``Match final`` support.
)r   r   ÚcanonicalizehostnameNÚcanonicalizemaxdotsÚ.ÚcanonicaldomainsT)Ú	canonicalÚfinalF)ÚyesÚalways)Ú_lookupÚgetÚintÚcountÚsplitÚcanonicalize)r   r   ÚoptionsÚcanonÚmaxdotsÚdomainss   &&    r   ÚlookupÚSSHConfig.lookup·   sÛ   € ðT —,‘,¨�,Ó1ˆð ˜WÔ$Ø"*�JÑà—‘Ð2°DÓ9Ð=NÑNˆÜ�g—k‘kÐ"7¸Ó;Ó<ˆß�X—^‘^ CÓ(¨GÔ3ð Ð0Õ1×7Ñ7Ó9ˆGØ×(Ñ(¨¸GÓDˆHà"*�JÑØ—l‘lØ¨T¸ð #ó ˆGð ˆð —l‘lØ¨U¸$ð #ó ˆGð ˆr   Nc                óú  aa€ Sf   \        4       oV P                   FÀ  pV P                  VP                  R. 4      V4      '       g.   V P	                  VP                  R. 4      VVVS4      '       g   KX  VR,          P                  4        FM  w  opSS9  d   Ve
   VR,          MTSS&   K!  SR8X  g   K*  SS,          P                  VV3R lV 4       4       KO  	  KÂ  	  V'       d   V P                  SV4      oS# )Nr)   r-   r+   ºNNNr   c              3   óF   <"  € T F  qSS,          9  g   K  Vx € K  	  R # 5i©N© )Ú.0ÚxrB   rT   s   & €€r   Ú	<genexpr>Ú$SSHConfig._lookup.<locals>.<genexpr>  s   øé € ð (Ù#(˜a°W¸Sµ\Ñ,AŸš£5ùs   ƒ!—
!)ÚSSHConfigDictr   Ú_pattern_matchesrO   Ú_does_matchÚitemsÚextendÚ_expand_variables)r   r   rT   rJ   rK   r@   rC   rB   s   &&f&&  @r   rN   ÚSSHConfig._lookupù   sî   ù€ àŠ?Ü#“oˆGð —|”|ˆGà×%Ñ% g§k¡k°&¸"Ó&=¸x×HÒHØ×#Ñ#Ø—K‘K 	¨2Ó.ØØØØ÷ò ñ Ø% hÕ/×5Ñ5Ö7‘
��UØ˜gÔ%ð
 05Ò/@ 5¨¦8Àe�G˜C“LØ˜NÖ*Ø˜C•L×'Ñ'õ (Ù#(ó(ö ó 8ñ $÷. ð ×,Ñ,¨W°hÓ?ˆGØˆr   c                ó0  € RpV FP  pRP                  W4      p\        Wb4      pVe   V^ ,          pM \        P                  ! V4      pV'       g   KN  Vu # 	  VP                  RR4      R8X  d   V# \        V4      h  \        P                   d     LKi ; i)a/  
Return canonicalized version of ``hostname``.

:param str hostname: Target hostname.
:param options: An `SSHConfigDict` from a previous lookup pass.
:param domains: List of domains (e.g. ``["paramiko.org"]``).

:returns: A canonicalized hostname if one was found, else ``None``.

.. versionadded:: 2.7
Fz{}.{}ÚcanonicalizefallbacklocalrL   )r8   Ú_addressfamily_host_lookupÚsocketÚgethostbynameÚgaierrorrO   r   )r   r   rT   rW   ÚfoundÚdomainÚ	candidateÚfamily_specifics   &&&&    r   rS   ÚSSHConfig.canonicalize  s¡   € ð ˆÛˆFØŸ™ xÓ8ˆIÜ8¸ÓLˆOØÒ*ð (¨Õ*‘ðÜ"×0Ò0°Ó;�E÷ ‰uð !Ò ñ% ð, �;‰;Ð2°EÓ:¸eÔCØˆOô # 8Ó,Ð,øô —‘ô Ùðús   ³A=Á=BÂBc                óp   € \        4       pV P                   F  pVP                  VR,          4       K  	  V# )zo
Return the set of literal hostnames defined in the SSH config (both
explicit hostnames and wildcard entries).
r)   )Úsetr   Úupdate)r   ÚhostsÚentrys   &  r   Úget_hostnamesÚSSHConfig.get_hostnamesE  s.   € ô
 “ˆØ—\”\ˆEØ�L‰L˜˜v�Ö'ñ "àˆr   c                ó  € \        VR 4      '       d   VP                  R4      pRpV F`  pVP                  R4      '       d'   \        P                  ! W$R,          4      '       d    R# \        P                  ! W$4      '       g   K^  RpKb  	  V# )rR   Ú,FÚ!ºé   NNT)ÚhasattrrR   r5   Úfnmatch)r   ÚpatternsÚtargetr0   Úpatterns   &&&  r   rd   ÚSSHConfig._pattern_matchesO  sv   € ä�8˜W×%Ò%Ø—~‘~ cÓ*ˆHØˆÛˆGà×!Ñ! #×&Ò&¬7¯?ª?Ø �÷,ò ,ò ô —’ ×1Ô1Ø’ñ  ð ˆr   c                ó@  € . pVR ,          p\         P                  ! 4       pV'       Edu   VP                  ^ 4      p	Rp
VP                  RR4      pVP                  RR4      pV	R,          V	R,          ríVR8X  d   V P	                  W94      '       d   R# VR8X  d   Tp
MÑVR	8X  d   R
# VR8X  d   T;'       g    TpV P                  Wï4      p
M£VR8X  d   V P                  Wâ4      p
MŠVR8X  d    T;'       g    TpV P                  VV4      p
MdVR8X  d   V P                  Wè4      p
MKVR8X  dE   V P                  WRRV4      p\        f   \        h\        P                  ! VRR
R7      P                  p
V
e   V P	                  W©4      '       d   R# VP                  V	4       EK}  V# )r[   Nr   ÚuserÚtypeÚparamrJ   FrK   ÚallTr)   ÚoriginalhostÚ	localuserÚexecr   Ústdout)ÚhideÚwarn)ÚgetpassÚgetuserÚpoprO   Ú_should_failrd   Ú	_tokenizeÚinvokeÚinvoke_import_errorÚrunÚokr;   )r   Ú
match_listÚtarget_hostnamerJ   rK   rT   ÚmatchedÚ
candidatesÚlocal_usernamerr   ÚpassedÚconfigured_hostÚconfigured_userÚtype_rŠ   Úhostvalrˆ   Úexec_cmds   &&&&&&            r   re   ÚSSHConfig._does_match`  s‡  € ð ˆØ •]ˆ
Ü ŸšÓ*ˆßˆjØ"Ÿ™ qÓ)ˆIØˆFð &Ÿk™k¨*°dÓ;ˆOØ%Ÿk™k¨&°$Ó7ˆOØ$ VÕ,¨i¸Õ.@�5ð ˜Ô#Ø×$Ñ$ Y×:Ò:Ù Ø˜ÔØ‘ð ˜%”Ùð ˜&”Ø)×<Ð<¨_�Ø×.Ñ.¨uÓ>‘Ø˜.Ô(Ø×.Ñ.¨uÓF‘Ø˜&”Ø&×8Ð8¨.�Ø×.Ñ.¨u°dÓ;‘Ø˜+Ô%Ø×.Ñ.¨uÓE‘Ø˜&”ØŸ>™>Ø¨l¸Eó�ô
 ’>Ü-Ð-äŸš H°8À$ÔG×JÑJ�àÒ! d×&7Ñ&7¸×&JÒ&JÙà�N‰N˜9×%àˆr   c                ó2   € VR ,          '       d   V# V'       * # )Únegater^   )r   Ú
would_passrr   s   &&&r   r•   ÚSSHConfig._should_fail˜  s   € Ø& x×0Ô0ˆzÐD¸*´nÐDr   c                óÎ  € V P                  V4      pV'       g   V# TpVR8w  d   VP                  RV4      pRV9   d   VR,          pM\        p\        P                  ! 4       pRV9   d   VR,          p	MTp	\
        P                  ! 4       P                  R4      ^ ,          p
\        W4      p\        P                  P                  R4      pW¢,           \        V4      ,           V	,           pR\        VP                  4       4      P                  4       RVRVR	V
R
VRVRVRV	RVRV/
pTpVP!                  4        F*  w  ppVV9  d   K  VP#                  V\%        V4      4      pK,  	  V# )aL  
Tokenize a string based on current config/hostname data.

:param config: Current config data.
:param target_hostname: Original target connection hostname.
:param key: Config key being tokenized (used to filter token list).
:param value: Config value being tokenized.

:returns: The tokenized version of the input ``value`` string.
r   Úportrˆ   rH   Ú~ú%Cú%dr
   ú%Lú%lú%nú%pú%rú%u)Ú_allowed_tokensrO   ÚSSH_PORTr’   r“   rm   ÚgethostnamerR   ÚLazyFqdnÚosr    Ú
expanduserÚreprr   ÚencodeÚ	hexdigestrf   ÚreplaceÚstr)r   r+   rœ   rB   rC   Úallowed_tokensÚconfigured_hostnamer¬   rˆ   Ú
remoteuserÚlocal_hostnameÚ
local_fqdnÚhomedirÚtohashÚreplacementsÚ	tokenizedÚfindr¿   s   &&&&&             r   r–   ÚSSHConfig._tokenize›  sa  € ð ×-Ñ-¨cÓ2ˆçØˆLð .ÐØ�*ÔØ"(§*¡*¨ZÐ9LÓ"MÐà�VÔØ˜&•>‰DäˆDÜ�ŠÓ ˆØ�VÔØ �‰JàˆJÜ×+Ò+Ó-×3Ñ3°CÓ8¸Õ;ˆÜ˜fÓ5ˆ
Ü—'‘'×$Ñ$ SÓ)ˆØÕ1´D¸³JÕ>ÀÕKˆð ”$�v—}‘}“Ó'×1Ñ1Ó3Ø�'ØÐ%à�.Ø�*ð �/Ø�$Ø�*à�$Ø�ð
ˆð$ ˆ	Ø)×/Ñ/Ö1‰MˆD�'Ø˜>Ô)ÙØ!×)Ñ)¨$´°G³Ó=ŠIñ 2ð
 Ðr   c                ó:   € V P                   P                  V. 4      # )a  
Given config ``key``, return list of token strings to tokenize.

.. note::
    This feels like it wants to eventually go away, but is used to
    preserve as-strict-as-possible compatibility with OpenSSH, which
    for whatever reason only applies some tokens to some config keys.
)ÚTOKENS_BY_CONFIG_KEYrO   ©r   rB   s   &&r   r¶   ÚSSHConfig._allowed_tokensÙ  s   € ð ×(Ñ(×,Ñ,¨S°"Ó5Ð5r   c                ó  € V F  pW,          f   K  \        V P                  WV4      p\        W,          \        4      '       d.   \	        W,          4       F  w  rVV! V4      W,          V&   K  	  Ko  V! W,          4      W&   K�  	  V# )a  
Return a dict of config options with expanded substitutions
for a given original & current target hostname.

Please refer to :doc:`/api/config` for details.

:param dict config: the currently parsed config
:param str hostname: the hostname whose config is being looked up
)r   r–   Ú
isinstanceÚlistÚ	enumerate)r   r+   rœ   ÚkÚ	tokenizerÚirC   s   &&&    r   rh   ÚSSHConfig._expand_variablesä  st   € ó ˆAØ�yÒ ÙÜ §¡°ÈÓKˆIÜ˜&�)¤T×*Ò*Ü )¨&­)Ö 4‘H�AÙ#,¨UÓ#3�F•I˜a“Ló !5ñ & f¥iÓ0�“	ñ ð ˆr   c                ó‚   €  \         P                  ! V4      #   \         d    \        RP	                  T4      4      hi ; i)z.
Return a list of host_names from host value.
zUnparsable host {})ÚshlexrR   Ú
ValueErrorr   r8   )r   r)   s   &&r   r<   ÚSSHConfig._get_hostsù  s?   € ð	FÜ—;’;˜tÓ$Ð$øÜô 	FÜ"Ð#7×#>Ñ#>¸tÓ#DÓEÐEð	Fús   ‚ ˜&>c                óä  a
€ . p\         P                  ! V4      pV'       d¦   RRRRRR/pVP                  ^ 4      pVP                  R4      '       d   RVR&   VR,          pWAR&   VR9   d   VP	                  V4       Kd  V'       g   \        RP                  V4      4      hVP                  ^ 4      VR&   VP	                  V4       K­  V Uu. uF  qUR,          NK  	  ppR	V9   d‡   Ro
\        \        V
3R lV4      4      \        \        V
3R lV4      4      r‡Rp	\        V4      '       d   Rp	M.R
V9   d(   VP                  R
4      VP                  R	4      8”  d   Rp	V	e   \        V	4      hV# u upi )zw
Parse a specific Match config line into a list-of-dicts for its values.

Performs some parse-time validation as well.
r‰   NrŠ   r¨   Fr~   Tr   r‹   rJ   z'Missing parameter to Match '{}' keywordc                 ó   <€ V S9   # r]   r^   ©r`   Ú	allowables   &€r   Ú<lambda>Ú(SSHConfig._get_matches.<locals>.<lambda>"  s	   ø€  a¨9¢nr   c                 ó   <€ V S9  # r]   r^   rÞ   s   &€r   rà   rá   #  s
   ø€  a¨yÒ&8r   z>Match does not allow 'all' mixed with anything but 'canonical'z-Match does not allow 'all' before 'canonical')r‹   rJ   rK   )r‹   rJ   )rÙ   rR   r”   r5   r;   r   r8   rÒ   ÚfilterÚanyÚindex)r   r0   r-   Útokensr£   r`   Úkeywordsrš   ÚbadÚerrrß   s   &&        @r   r=   ÚSSHConfig._get_matches  sY  ø€ ð ˆÜ—’˜UÓ#ˆßØ˜T 7¨D°(¸EÐBˆEØ—J‘J˜q“MˆEà×Ñ ×$Ò$Ø"&��h‘Ø˜b�	�Ø!�&‰MàÐ5Ô5Ø—‘˜uÔ%ÙßÜ&Ø=×DÑDÀUÓKóð ð $ŸZ™Z¨›]ˆE�'‰NØ�N‰N˜5Ö!ñ (/Ó/¡w !�f—I�I¡wˆÐ/Ø�HÔØ,ˆIä”VÔ4°hÓ?Ó@Ü”VÔ8¸(ÓCÓDð ð ˆCÜ�3�xŠxØV‘Ø Ô" r§x¡x°Ó'<¸r¿x¹xÈ»Ô'NØE�ØŠÜ& sÓ+Ð+Øˆùò 0s   ÃE-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°   r±   r²   r³   r´   rµ   )NFF)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r6   Úcompiler7   rÍ   r   Úclassmethodr   r"   r   r%   rX   rN   rS   rz   rd   re   r•   r–   r¶   rh   r<   r=   Ú__static_attributes__Ú__classdictcell__©Ú__classdict__s   @r   r   r   .   sÜ   ø‡ € ñð —Z’ZÐ ;Ó<€Nð
 	ÒGØ�T�FØÒAØÒ/ØÒ'ð 	ÒLð	Ðòð* ñ-ó ð-ð ñ&ó ð&ð ñó ðò:%òx@ôD!òF'-òRòò"6òpEò<ò|	6òò*F÷*ð *r   r   c                óf  € VP                  RR4      P                  4       pVR8X  d   R#  \        P                  pVR8X  d   \        P                  p\        P
                  ! V RV\        P                  \        P                  \        P                  4      #   \        P                   d     R# i ; i)aÑ  
Try looking up ``hostname`` in an IPv4 or IPv6 specific manner.

This is an odd duck due to needing use in two divergent use cases. It looks
up ``AddressFamily`` in ``options`` and if it is ``inet`` or ``inet6``,
this function uses `socket.getaddrinfo` to perform a family-specific
lookup, returning the result if successful.

In any other situation -- lookup failure, or ``AddressFamily`` being
unspecified or ``any`` -- ``None`` is returned instead and the caller is
expected to do something situation-appropriate like calling
`socket.gethostbyname`.

:param str hostname: Hostname to look up.
:param options: `SSHConfigDict` instance w/ parsed options.
:returns: ``getaddrinfo``-style tuples, or ``None``, depending.
Úaddressfamilyrä   NÚinet)
rO   r:   rm   ÚAF_INET6ÚAF_INETÚgetaddrinfoÚ
SOCK_DGRAMÚ
IPPROTO_IPÚAI_CANONNAMEro   )r   rT   Úaddress_familyÚfamilys   &&  r   rl   rl   /  s–   € ð$ —[‘[ °%Ó8×>Ñ>Ó@€NØ˜ÔÙðÜ—‘ˆØ˜VÔ#Ü—^‘^ˆFÜ×!Ò!ØØØÜ×ÑÜ×ÑÜ×Ñó
ð 	
øô �?‰?ô Úðús   «A+B ÂB0Â/B0c                   ó4   a € ] tR tRt o RtRR ltR tRtV tR# )r¹   iT  z/
Returns the host's fqdn on request as string.
Nc                ó,   € R V n         Wn        W n        R # r]   )Úfqdnr+   r)   )r   r+   r)   s   &&&r   r   ÚLazyFqdn.__init__Y  s   € ØˆŒ	ØŒØŽ	r   c                ó  € V P                   fj   R p\        V P                  V P                  4      pVe%   V F  pVw  rErgpV'       g   K  RV9   g   K  Tp M	  Vf   \        P
                  ! 4       pWn         V P                   # )NrH   )r  rl   r)   r+   rm   Úgetfqdn)	r   r  ÚresultsÚresÚafÚsocktypeÚprotoÚ	canonnameÚsas	   &        r   Ú__str__ÚLazyFqdn.__str__^  sy   € Ø�9‰9Òð ˆDÜ0°·±¸D¿K¹KÓHˆGØÒ"Û"�CØ9<Ñ6�B %°Bß ‘y S¨IÖ%5Ø(˜Ùñ	 #ð Š|Ü—~’~Ó'�àŒIØ�y‰yÐr   )r+   r  r)   r]   )	rë   rì   rí   rî   rï   r   r  rò   ró   rô   s   @r   r¹   r¹   T  s   ø‡ € ñô÷
ð r   r¹   c                   ó0   a € ] tR tRt o RtR tR tRtV tR# )rc   iz  ac  
A dictionary wrapper/subclass for per-host configuration structures.

This class introduces some usage niceties for consumers of `SSHConfig`,
specifically around the issue of variable type conversions: normal value
access yields strings, but there are now methods such as `as_bool` and
`as_int` that yield casted values instead.

For example, given the following ``ssh_config`` file snippet::

    Host foo.example.com
        PasswordAuthentication no
        Compression yes
        ServerAliveInterval 60

the following code highlights how you can access the raw strings as well as
usefully Python type-casted versions (recalling that keys are all
normalized to lowercase first)::

    my_config = SSHConfig()
    my_config.parse(open('~/.ssh/config'))
    conf = my_config.lookup('foo.example.com')

    assert conf['passwordauthentication'] == 'no'
    assert conf.as_bool('passwordauthentication') is False
    assert conf['compression'] == 'yes'
    assert conf.as_bool('compression') is True
    assert conf['serveraliveinterval'] == '60'
    assert conf.as_int('serveraliveinterval') == 60

.. versionadded:: 2.5
c                óh   € W,          p\        V\        4      '       d   V# VP                  4       R8H  # )ar  
Express given key's value as a boolean type.

Typically, this is used for ``ssh_config``'s pseudo-boolean values
which are either ``"yes"`` or ``"no"``. In such cases, ``"yes"`` yields
``True`` and any other value becomes ``False``.

.. note::
    If (for whatever reason) the stored value is already boolean in
    nature, it's simply returned.

.. versionadded:: 2.5
rL   )rÑ   Úboolr:   )r   rB   Úvals   && r   Úas_boolÚSSHConfigDict.as_boolœ  s.   € ð �iˆÜ�cœ4× Ò ØˆJØ�y‰y‹{˜eÑ#Ð#r   c                ó$   € \        W,          4      # )zÅ
Express given key's value as an integer, if possible.

This method will raise ``ValueError`` or similar if the value is not
int-appropriate, same as the builtin `int` type.

.. versionadded:: 2.5
)rP   rÎ   s   &&r   Úas_intÚSSHConfigDict.as_int¯  s   € ô �4•9‹~Ðr   r^   N)	rë   rì   rí   rî   rï   r  r  rò   ró   rô   s   @r   rc   rc   z  s   ø‡ € ñòB$÷&	ð 	r   rc   )rï   r‚   r’   rº   r6   rÙ   rm   Úhashlibr   Úior   Ú	functoolsr   r—   r˜   ÚImportErrorÚeÚssh_exceptionr   r   r·   r   rl   r¹   Údictrc   r^   r   r   Ú<module>r      sŒ   ðñ(ó Û Û 	Û 	Û Û Ý Ý Ý à" DÐ €ÐðÛ÷ Bð €÷~ñ ~òB"÷J#ñ #ôL>�Dö >øðk ô ØÕûðús   ³A% Á%A8Á,A3Á3A8