o
    >eN@                     @   s  U d dl Z d dlmZ d dlmZmZmZmZmZm	Z	m
Z
mZmZ d dlmZ d dlmZmZmZ d dlmZ d dlmZ eeee   Zi Zeeef ed< dd	d
Zdd Zdd Zdd Zdd Z G dd deZ!e
dedZ"e
dedZ#G dd dee" Z$dS )    N)bisect_left)	DictGenericList
NamedTupleOptionalTypeTypeVarcastoverload)Literal)	constants
exceptionsutil)	BaseImage)
PyPNGImageprecomputed_qr_blanksc                 K   s    t di |}||  | S )N )QRCodeadd_data
make_image)datakwargsqrr   r   L/var/www/html/humari/django-venv/lib/python3.10/site-packages/qrcode/main.pymake   s   
r   c                 C   s    t | dkrtd|  dd S )Nr   zInvalid box size (was z, expected larger than 0)int
ValueErrorsizer   r   r   _check_box_size    s   r!   c                 C   s   t | dk rtd|  d S )Nr   z=Invalid border value (was %s, expected 0 or larger than that)r   r   r   r   r   _check_border%   s
   r"   c                 C   sN   | d u rd S t | tstdt|  d| dk s| dkr%td|  dd S )NzInvalid mask pattern (was z, expected int)r      z(Mask pattern should be in range(8) (got ))
isinstancer   	TypeErrortyper   )mask_patternr   r   r   _check_mask_pattern,   s   
r)   c                 C   s   dd | D S )Nc                 S   s   g | ]}|d d  qS Nr   ).0rowr   r   r   
<listcomp>8   s    z!copy_2d_array.<locals>.<listcomp>r   )xr   r   r   copy_2d_array7   s   r/   c                   @   sd   e Zd ZU eed< eed< eed< eed< eed< eed< eed< eed< eed	< d
efddZdS )ActiveWithNeighborsNWNNEWmeESWSSEreturnc                 C      | j S r*   )r5   selfr   r   r   __bool__F   s   zActiveWithNeighbors.__bool__N)__name__
__module____qualname__bool__annotations__r>   r   r   r   r   r0   ;   s   
 r0   GenericImage)boundGenericImageLocalc                   @   sz  e Zd ZU eed< dZee ed< dej	ddddfdee
e  fddZed	efd
dZejd;ddZedd Zejdd Zdd Zd<ddZd=ddZdd Zdd Zd>ddZdd Zd>d d!Zd?d#d$Zed>ded d	efd%d&Ze	d>de
e d	efd'd&Zd>d(d&Zd)ed*ed	efd+d,Zd-d. Z d/d0 Z!d1d2 Z"d3d4 Z#d5d6 Z$d7d8 Z%d)ed*ed	e&fd9d:Z'dS )@r   modulesN_version
      image_factoryc                 C   sb   t | t| || _t|| _t|| _t|| _|| _|| _|d ur+t	|t
s+J |   d S r*   )r!   r"   versionr   error_correctionbox_sizeborderr(   rK   
issubclassr   clear)r=   rL   rM   rN   rO   rK   r(   r   r   r   __init__R   s   	


zQRCode.__init__r:   c                 C   s   | j d u r	|   tt| j S r*   )rH   best_fitr
   r   r<   r   r   r   rL   i   s   
zQRCode.versionc                 C   s$   |d urt |}t| || _d S r*   )r   r   check_versionrH   )r=   valuer   r   r   rL   o   s   

c                 C   r;   r*   )_mask_patternr<   r   r   r   r(   v   s   zQRCode.mask_patternc                 C   s   t | || _d S r*   )r)   rV   )r=   patternr   r   r   r(   z   s   
c                 C   s   g g| _ d| _d| _g | _dS )z*
        Reset the internal data.
        r   N)rG   modules_count
data_cache	data_listr<   r   r   r   rQ      s   
zQRCode.clear   c                 C   sR   t |tjr| j| n|r| jtj||d n	| jt| d| _dS )a  
        Add data to this QR Code.

        :param optimize: Data will be split into multiple chunks to optimize
            the QR size by finding to more compressed modes of at least this
            length. Set to ``0`` to avoid optimizing at all.
        )minimumN)r%   r   QRDatarZ   appendextendoptimal_data_chunksrY   )r=   r   optimizer   r   r   r      s   
zQRCode.add_dataTc                 C   sL   |s| j du r| j| j d | jdu r| d|   dS | d| j dS )z
        Compile the data into a QR Code array.

        :param fit: If ``True`` (or if a size has not been provided), find the
            best fit for the data to avoid data overflow errors.
        NstartF)rL   rS   r(   makeImplbest_mask_pattern)r=   fitr   r   r   r      s
   
zQRCode.makec                    s    j d d  _ j tv rtt j   _n5 fddt jD  _ dd   jd d  d jd        t jt j <  	||  j dkr[ 
|  jd u rkt j  j j _  j| d S )NrJ      c                    s   g | ]}d g j  qS r*   )rX   )r+   ir<   r   r   r-      s    z#QRCode.makeImpl.<locals>.<listcomp>r   r#   )rL   rX   r   r/   rG   rangesetup_position_probe_patternsetup_position_adjust_patternsetup_timing_patternsetup_type_infosetup_type_numberrY   r   create_datarM   rZ   map_data)r=   testr(   r   r<   r   rd      s(   




zQRCode.makeImplc                 C   s   t ddD ]u}|| dks| j|| krqt ddD ]_}|| dks)| j|| kr*qd|  kr4dkr:n n|dv sbd|  krDdkrJn n|dv sbd|  krTdkrnn nd|  kr`dkrnn nd| j||  || < qd	| j||  || < qqd S )
N   r      >   r   rt      rJ   TFri   rX   rG   )r=   r,   colrcr   r   r   rj      s     0z#QRCode.setup_position_probe_patternc                 C   s   |du rd}t | t |}t  }| jD ]}||jd |t|||j  || qt|}t	t j
| j ||| _| jdkrIt |t | jurX| j| jd | jS )zD
        Find the minimum size required to fit in the data.
        N   rJ   )   rb   )r   rT   mode_sizes_for_version	BitBufferrZ   putmodelenwriter   BIT_LIMIT_TABLErM   rL   r   DataOverflowErrorrS   )r=   rc   
mode_sizesbufferr   needed_bitsr   r   r   rS      s$   



zQRCode.best_fitc                 C   sJ   d}d}t dD ]}| d| t| j}|dks||kr"|}|}q|S )z7
        Find the most efficient mask pattern.
        r   rs   T)ri   rd   r   
lost_pointrG   )r=   min_lost_pointrW   rh   r   r   r   r   re      s   zQRCode.best_mask_patternc                 C   s   |du rddl }|j}| std| jdu r|   | j}|dd|d d   d  t|D ]%}|d	 t|D ]}| j	| | rL|d
 q=|d	 q=|d q2|dd|d d   d  |
  dS )zz
        Output the QR Code only using TTY colors.

        If the data has not been compiled yet, make it first.
        Nr   	Not a ttyz[1;47m ru   rJ   z[0m
z[1;47m  [40mz  z[1;47m  [0m
)sysstdoutisattyOSErrorrY   r   rX   r   ri   rG   flush)r=   outr   modcountrx   ry   r   r   r   	print_tty  s$   

zQRCode.print_ttyFc           	         s$  |du rt j}|r| stdjdu r  jdd dD }|r(d  r.|  dtf fdd	}t	j
 j
 d
D ]G}|r] rS|j
 d k rX|d |d t	j
 j
 D ]}|||||d |d>  }|||  qg|r|d |d qD|  dS )z
        Output the QR Code using ASCII characters.

        :param tty: use fixed TTY color codes (forces invert=True)
        :param invert: invert the ASCII characters (solid <-> transparent)
        Nr   c                 S   s   g | ]
}t |fd qS )cp437)bytesdecode)r+   coder   r   r   r-   5  s    z&QRCode.print_ascii.<locals>.<listcomp>)            Tr:   c                    sV    rj rt| |j  krdS t| |dk st| |kr!dS ttj|  | S )Nrz   r   )rO   maxminr
   r   rG   )r.   yinvertr   r=   r   r   
get_module;  s
   z&QRCode.print_ascii.<locals>.get_moduleru   rz   z[48;5;232mz[38;5;255mz[0m
)r   r   r   r   rY   r   rX   reverser   ri   rO   r   r   )	r=   r   ttyr   codesr   rx   ry   posr   r   r   print_ascii$  s2   



zQRCode.print_asciic                 K      d S r*   r   r=   rK   r   r   r   r   r   O  s   zQRCode.make_imagec                 K   r   r*   r   r   r   r   r   r   S  s   c                 K   s   t | j | jdu r|   |durt|tsJ n| j}|du r/ddlm}m	} |r-|nt
}|| j| j| jfd| ji|}|jrkt| jD ]#}t| jD ]}|jr\|j||| d qN| j| | ri||| qNqG|jrr|  |S )zu
        Make an image from the QR Code data.

        If the data has not been compiled yet, make it first.
        Nr   )ImagePilImageqrcode_modules)r   )r!   rN   rY   r   rP   r   rK   qrcode.image.pilr   r   r   rO   rX   rG   needs_drawrectri   needs_contextdrawrect_contextdrawrectneeds_processingprocess)r=   rK   r   r   r   imrx   ry   r   r   r   r   Y  s<   

r,   rw   c                 C   s0   |dko|t | jk o|dko|t | j| k S )Nr   )r   rG   )r=   r,   rw   r   r   r   is_constrained  s   zQRCode.is_constrainedc                 C   s   t d| jd D ]}| j| d d urq|d dk| j| d< qt d| jd D ]}| jd | d ur4q(|d dk| jd |< q(d S )Nrs   rt   ru   r   rv   )r=   rx   ry   r   r   r   rl     s   zQRCode.setup_timing_patternc                 C   s   t | j}tt|D ]\}|| }tt|D ]O}|| }| j| | d ur(qtddD ]9}tddD ]1}|dksN|dksN|dksN|dksN|dkrZ|dkrZd| j||  || < q4d| j||  || < q4q-qqd S )N   ru   r   TF)r   pattern_positionrL   ri   r   rG   )r=   r   rh   r,   jrw   rx   ry   r   r   r   rk     s(   z$QRCode.setup_position_adjust_patternc                 C   s   t | j}tdD ]}| o||? d@ dk}|| j|d  |d | j d d < q
tdD ]}| o:||? d@ dk}|| j|d | j d d  |d < q.d S )N   rz   r   rs   )r   BCH_type_numberrL   ri   rG   rX   )r=   rq   bitsrh   modr   r   r   rn     s   &&zQRCode.setup_type_numberc                 C   s"  | j d> |B }t|}tdD ]3}| o||? d@ dk}|dk r)|| j| d< q|dk r7|| j|d  d< q|| j| jd |  d< qtdD ];}| oT||? d@ dk}|dk rf|| jd | j| d < qH|dk rx|| jd d| d d < qH|| jd d| d < qH| | j| jd  d< d S )Nr      rz   rt   rs   	   )rM   r   BCH_type_infori   rG   rX   )r=   rq   r(   r   r   rh   r   r   r   r   rm     s"   
zQRCode.setup_type_infoc                 C   s  d}| j d }d}d}t|}t|}t| j d ddD ]b}	|	dkr'|	d8 }	|	|	d f}
	 |
D ]8}| j| | d u rhd}||k rK|| |? d@ dk}|||rS| }|| j| |< |d8 }|dkrh|d7 }d}q0||7 }|dk sv| j |kr~||8 }| }nq.qd S )	Nrr   rz   r#   r   r   rt   TF)rX   r   	mask_funcr   ri   rG   )r=   r   r(   incr,   bitIndex	byteIndexr   data_lenrw   	col_rangery   darkr   r   r   rp     s@   


zQRCode.map_datac                 C   s   | j du r	|   | js| jS t| j| jd  }dg| g| j }dg| j }| jD ]}||ttt | |  q+|dg| g| j 7 }|S )z
        Return the QR Code as a multidimensional array, including the border.

        To return the array without a border, set ``self.border`` to 0 first.
        Nru   F)	rY   r   rO   rG   r   r^   r
   r   rB   )r=   widthr   x_bordermoduler   r   r   
get_matrix	  s   

zQRCode.get_matrixc                 C   s`   g }t |d |d D ] }t |d |d D ]}|| ||o(t| j| |  qqt| S )Nrz   ru   )ri   r^   r   rB   rG   r0   )r=   r,   rw   contextrx   ry   r   r   r   active_with_neighbors  s   &zQRCode.active_with_neighbors)r:   N)r[   )Tr*   )NFF)(r?   r@   rA   ModulesTyperC   rH   r   r   r   ERROR_CORRECT_Mr   rD   rR   propertyrL   setterr(   rQ   r   r   rd   rj   rS   re   r   r   r   r   r   rF   rB   r   rl   rk   rn   rm   rp   r   r0   r   r   r   r   r   r   N   s^   
 




	



+
)-r   r*   )%r   bisectr   typingr   r   r   r   r   r   r	   r
   r   typing_extensionsr   qrcoder   r   r   qrcode.image.baser   qrcode.image.purer   rB   r   r   r   rC   r   r!   r"   r)   r/   r0   rD   rF   r   r   r   r   r   <module>   s$   
 ,
