£Á°èZ¨Ä…–K§‚«“ô4“ÒÙ´dîfUÙÃÅ WKbyÊ¦•êŽ…È®FÒ¿ÊÎóCozá¬S@6{Í:›œêZÌ:Š•_%:¢¾¾~;‘Ã~èŠ©ÊÇí`ÔÑ©úë™µ'5I¿fš×WO%ø9¾«¾DK|€ùÍD”Ýs]nHÕ¶ê×Ó¼ãžªéUWŸÈË%DÒÕ¬ï‘]/Åcx  ‰ï2ß]ä6G[]S£ÔÏ¯rs{úëóµmÒï#UQxo·õÞCe]"±/aÙ&Eã4ú9Jé_ÞåëdãöKë)AÞ                  ¯¹ægƒÛowÐø^d™ý½ßB7áyMä9ÜÖUã
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
<html>
3

  \H                 @   s   d dl Z d dlZd dlmZ d dlmZ ej	ej
 d Ze ZG dd deddZddd	Zdd
dZeddddZeddddZeddddZeddddZg Zx:eeeefD ]*ZedeZereeejkreje qW [[dS )    N)SystemRandom)
namedtuplez./c               @   s   e Zd Zdd ZdS )_Methodc             C   s   dj | jS )Nz<crypt.METHOD_{}>)formatname)self r   /usr/lib64/python3.6/crypt.py__repr__   s    z_Method.__repr__N)__name__
__module____qualname__r
   r   r   r   r	   r      s   r   z name ident salt_chars total_sizec             C   sH   | d krt d } | jr"dj| jnd}|djdd t| jD 7 }|S )Nr   z${}$ c             s   s   | ]}t jtV  qd S )N)_srZchoice
_saltchars).0charr   r   r	   	<genexpr>   s    zmksalt.<locals>.<genexpr>)methodsZidentr   joinrangeZ
salt_chars)methodsr   r   r	   mksalt   s
    r   c             C   s&   |d kst |trt|}tj| |S )N)
isinstancer   r   _cryptcrypt)ZwordZsaltr   r   r	   r   #   s    
r   ZCRYPT      ZMD51   "   ZSHA2565   ?   ZSHA5126j   r   )N)N)r   stringZ_stringZrandomr   Z_SystemRandomcollectionsr   Z_namedtupleZascii_lettersZdigitsr   r   r   r   r   ZMETHOD_CRYPTZ
METHOD_MD5ZMETHOD_SHA256ZMETHOD_SHA512r   _methodZ_resultlenZ
total_sizeappendr   r   r   r	   <module>   s$   	


