�
I�g�z � � � d Z ddlmZmZmZ ddlmZmZmZ m
Z ddlm
Z
mZmZ ddlZ ej e� � ZddlmZ ddlmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z# ddl$m%Z% g d �Z& e!d
� � Z' e!d� � Z( e!d� � Z) e!d
� � Z*e' e!d� � z Z+ e!d� � Z, e!d� � Z- e!d� � Z. e ed� � � � Z/dZ0dZ1dZ2 e3 ee/� � � � Z4d)d�Z5d� Z6d� Z7dZ8dZ9dZ:d� Z;d� Z<d� Z
e5ddd �� � Z=e2d!z Z>d"� Z G d#� d$e?� � Z@ G d%� d&e@� � ZA eAe)� � ZB eAe)d'�(� � ZC eAe*d'�(� � ZDdS )*zC
passlib.utils.binary - binary data encoding/decoding/manipulation
� )�absolute_import�division�print_function)� b64encode� b64decode� b32decode� b32encode)�
b2a_base64�
a2b_base64�ErrorN)�exc)�PY3�
bascii_to_str�irange�imap�iter_byte_chars�join_byte_values�join_byte_elems�
nextgetter�suppress_cause�u�unicode�unicode_or_bytes_types)�memoized_property)�BASE64_CHARS�PADDED_BASE64_CHARS�
AB64_CHARS�HASH64_CHARS�BCRYPT_CHARS� HEX_CHARS�LOWER_HEX_CHARS�UPPER_HEX_CHARS�ALL_BYTE_VALUES�compile_byte_translation�ab64_encode�ab64_decode�b64s_encode�b64s_decoder r �Base64Engine�LazyBase64Engine�h64�h64big�bcrypt64z@ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/z@ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789./z@./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzz@./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789�=�0123456789abcdefABCDEF�0123456789ABCDEF�0123456789abcdef� � � � =c �` � |�t dd� }nFt |t � � rt |� � dk sJ �t t |� � � � }| � � � D ]�\ }}t |t � � rt |� � }t |t � � rd|cxk rdk sn J �t |t � � r|� d� � }t |t � � rt |� � dk sJ �|||<