+
    ¢THi[  ã                   ó¦   € R t ^ RIHt ^ RIHu Ht ^ RIHt R.t	 ! R R]P                  ]P                  ]P                  ]P                  4      tR# )zÃPHPass Portable Crypt

phppass located - http://www.openwall.com/phpass/
algorithm described - http://www.openwall.com/articles/PHP-Users-Passwords

phpass context - blowfish, bsdi_crypt, phpass
)Úmd5N)Úh64Úphpassc                   ó¤   a € ] tR t^t o RtR tRt]P                  t	^;t
t]P                  t^t^t^tRtRtRtRRRR/t]R 4       tR tR	 tR
tV tR# )r   a  This class implements the PHPass Portable Hash, and follows the :ref:`password-hash-api`.

It supports a fixed-length salt, and a variable number of rounds.

The :meth:`~passlib.ifc.PasswordHash.using` method accepts the following optional keywords:

:type salt: str
:param salt:
    Optional salt string.
    If not specified, one will be autogenerated (this is recommended).
    If specified, it must be 8 characters, drawn from the regexp range ``[./0-9A-Za-z]``.

:type rounds: int
:param rounds:
    Optional number of rounds to use.
    Defaults to 19, must be between 7 and 30, inclusive.
    This value is logarithmic, the actual number of iterations used will be :samp:`2**{rounds}`.

:type ident: str
:param ident:
    phpBB3 uses ``H`` instead of ``P`` for its identifier,
    this may be set to ``H`` in order to generate phpBB3 compatible hashes.
    it defaults to ``P``.

:type relaxed: bool
:param relaxed:
    By default, providing an invalid value for one of the other
    keywords will result in a :exc:`ValueError`. If ``relaxed=True``,
    and the error can be corrected, a :exc:`~passlib.exc.PasslibHashWarning`
    will be issued instead. Correctable errors include ``rounds``
    that are too small or too large, and ``salt`` strings that are too long.

    .. versionadded:: 1.6
Úlog2ú$P$ú$H$ÚPÚHc                óÎ   € V P                  V4      w  r#V^ ,          VR,          VR,          repT ! T\        P                  ! VP                  R4      4      TT;'       g    RR7      # )é    :é   é	   N:r   NNÚasciiN)ÚidentÚroundsÚsaltÚchecksum)Ú_parse_identr   Údecode_int6Úencode)ÚclsÚhashr   Údatar   r   Úchks   &&     Ú9/usr/lib/python3/dist-packages/passlib/handlers/phpass.pyÚfrom_stringÚphpass.from_stringQ   s\   € à×&Ñ& tÓ,‰ˆØ  �G T¨#¥Y°°Rµ�cˆÙØÜ—?’? 6§=¡=°Ó#9Ó:ØØ—[�[˜Dô	
ð 	
ó    c                óÔ   € R P                  V P                  \        P                  ! V P                  4      P                  R4      V P                  V P                  ;'       g    R4      # )z{}{}{}{}r   Ú )Úformatr   r   Úencode_int6r   Údecoder   r   )Úselfs   &r   Ú	to_stringÚphpass.to_string\   sM   € Ø× Ñ Ø�J‰JÜ�OŠO˜DŸK™KÓ(×/Ñ/°Ó8Ø�I‰IØ�M‰M×Ð˜Ró	
ð 	
r   c                ó–  € \        V\        4      '       d   VP                  R 4      p^V P                  ,          p\	        V P
                  P                  R4      V,           4      P                  4       p^ pWB8  d+   \	        W1,           4      P                  4       pV^,          pK0  \        P                  ! V4      P                  R4      # )zutf-8r   )
Ú
isinstanceÚstrr   r   r   r   Údigestr   Úencode_bytesr#   )r$   ÚsecretÚreal_roundsÚresultÚrs   &&   r   Ú_calc_checksumÚphpass._calc_checksumd   s–   € ä�fœc×"Ò"Ø—]‘] 7Ó+ˆFØ˜4Ÿ;™;Õ&ˆÜ�T—Y‘Y×%Ñ% gÓ.°Õ7Ó8×?Ñ?ÓAˆØˆØŒoÜ˜�Ó)×0Ñ0Ó2ˆFØ��FŠAÜ×Ò Ó'×.Ñ.¨wÓ7Ð7r   © N)r   r   r   )r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__ÚnameÚsetting_kwdsÚuhÚHASH64_CHARSÚchecksum_charsÚmin_salt_sizeÚmax_salt_sizeÚ
salt_charsÚdefault_roundsÚ
min_roundsÚ
max_roundsÚrounds_costÚdefault_identÚident_valuesÚident_aliasesÚclassmethodr   r%   r0   Ú__static_attributes__Ú__classdictcell__)Ú__classdict__s   @r   r   r      sˆ   ø‡ € ñ!ðH €DØ.€LØ—_‘_€Nð %&Ð%€M�MØ—‘€Jð €NØ€JØ€JØ€Kð €MØ!€LØ˜%  eÐ,€Mð ñ
ó ð
ò
÷
8ð 
8r   )r7   Úhashlibr   Úpasslib.utils.handlersÚutilsÚhandlersr:   Úpasslib.utils.binaryr   Ú__all__ÚHasManyIdentsÚ	HasRoundsÚHasSaltÚGenericHandlerr   r2   r   r   Ú<module>rU      sL   ðñõ ç #Ð #Ý $ð ð€ô
[8ˆR×Ñ˜rŸ|™|¨R¯Z©Z¸×9JÑ9Jö [8r   