o
    hA                     @   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
 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)Generic
NamedTupleOptional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   >/var/www/html/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>4   s    z!copy_2d_array.<locals>.<listcomp>r   )xr   r   r   copy_2d_array3   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'   )r2   selfr   r   r   __bool__B   s   zActiveWithNeighbors.__bool__N)__name__
__module____qualname__bool__annotations__r;   r   r   r   r   r-   7   s   
 r-   GenericImage)boundGenericImageLocalc                   @   s|  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%   rH   
issubclassr   clear)r:   rI   rJ   rK   rL   rH   r%   r   r   r   __init__N   s   	


zQRCode.__init__r7   c                 C   s   | j d u r	|   tt| j S r'   )rE   best_fitr   r   r9   r   r   r   rI   e   s   
zQRCode.versionc                 C   s$   |d urt |}t| || _d S r'   )r   r   check_versionrE   )r:   valuer   r   r   rI   k   s   

c                 C   r8   r'   )_mask_patternr9   r   r   r   r%   r   s   zQRCode.mask_patternc                 C   s   t | || _d S r'   )r&   rS   )r:   patternr   r   r   r%   v   s   
c                 C   s   g g| _ d| _d| _g | _dS )z*
        Reset the internal data.
        r   N)rD   modules_count
data_cache	data_listr9   r   r   r   rN   {   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   QRDatarW   appendextendoptimal_data_chunksrV   )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)rI   rP   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 )NrG      c                    s   g | ]}d g j  qS r'   )rU   )r(   ir9   r   r   r*      s    z#QRCode.makeImpl.<locals>.<listcomp>r   r    )rI   rU   r   r,   rD   rangesetup_position_probe_patternsetup_position_adjust_patternsetup_timing_patternsetup_type_infosetup_type_numberrV   r   create_datarJ   rW   map_data)r:   testr%   r   r9   r   ra      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   rq      rG   TFrf   rU   rD   )r:   r)   colrcr   r   r   rg      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   rG   )   r_   )r   rQ   mode_sizes_for_version	BitBufferrW   putmodelenwriter   BIT_LIMIT_TABLErJ   rI   r   DataOverflowErrorrP   )r:   r`   
mode_sizesbufferr   needed_bitsr   r   r   rP      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   rp   T)rf   ra   r   
lost_pointrD   )r:   min_lost_pointrT   re   r   r   r   r   rb      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 rr   rG   z[0m
z[1;47m  [40mz  z[1;47m  [0m
)sysstdoutisattyOSErrorrV   r   rU   r~   rf   rD   flush)r:   outr   modcountru   rv   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*   /  s    z&QRCode.print_ascii.<locals>.<listcomp>)            Tr7   c                    sV    rj rt| |j  krdS t| |dk st| |kr!dS ttj|  | S )Nrw   r   )rL   maxminr   r   rD   )r+   yinvertr   r:   r   r   
get_module5  s
   z&QRCode.print_ascii.<locals>.get_modulerr   rw   z[48;5;232mz[38;5;255mz[0m
)r   r   r   r   rV   r   rU   reverser   rf   rL   r~   r   )	r:   r   ttyr   codesr   ru   rv   posr   r   r   print_ascii  s2   



zQRCode.print_asciic                 K      d S r'   r   r:   rH   r   r   r   r   r   I     zQRCode.make_imagec                 K   r   r'   r   r   r   r   r   r   N  r   c                 K   s$  | ds| ds| ds| dr| jtjkrtdt| j | jdu r,|   |dur8t	|t
s7J n| j}|du rMddlm}m} |rK|nt}|| j| j| jfd	| ji|}|jrt| jD ]#}t| jD ]}|jrz|j||| d
 ql| j| | r||| qlqe|jr|  |S )zu
        Make an image from the QR Code data.

        If the data has not been compiled yet, make it first.
        embedded_image_pathembedded_imageembeded_image_pathembeded_imagezOError correction level must be ERROR_CORRECT_H if an embedded image is providedNr   )ImagePilImageqrcode_modules)r   )getrJ   r
   ERROR_CORRECT_Hr   r   rK   rV   r   rM   r   rH   qrcode.image.pilr   r   r   rL   rU   rD   needs_drawrectrf   needs_contextdrawrect_contextdrawrectneeds_processingprocess)r:   rH   r   r   r   imru   rv   r   r   r   r   S  sT   

r)   rt   c                 C   s0   |dko|t | jk o|dko|t | j| k S )Nr   )r}   rD   )r:   r)   rt   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 )Nrp   rq   rr   r   rs   )r:   ru   rv   r   r   r   ri     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   rr   r   TF)r   pattern_positionrI   rf   r}   rD   )r:   r   re   r)   jrt   ru   rv   r   r   r   rh     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   rw   r   rp   )r   BCH_type_numberrI   rf   rD   rU   )r:   rn   bitsre   modr   r   r   rk     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      rw   rq   rp   	   )rJ   r   BCH_type_inforf   rD   rU   )r:   rn   r%   r   r   re   r   r   r   r   rj     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 )	Nro   rw   r    r   r   rq   TF)rU   r   	mask_funcr}   rf   rD   )r:   r   r%   incr)   bitIndex	byteIndexr   data_lenrt   	col_rangerv   darkr   r   r   rm     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.
        Nrr   F)	rV   r   rL   rD   r}   r[   r   listr?   )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 )Nrw   rr   )rf   r[   r   r?   rD   r-   )r:   r)   rt   contextru   rv   r   r   r   active_with_neighbors  s   &zQRCode.active_with_neighbors)r7   N)rX   )Tr'   )NFF)(r<   r=   r>   ModulesTyper@   rE   r   r   r
   ERROR_CORRECT_Mr$   rA   rO   propertyrI   setterr%   rN   r   r   ra   rg   rP   rb   r   r   r   r	   r   rC   r?   r   ri   rh   rk   rj   rm   r   r-   r   r   r   r   r   r   J   sh   
 




	



+
3)r   r'   )#r   bisectr   typingr   r   r   r   r   r   r	   qrcoder
   r   r   qrcode.image.baser   qrcode.image.purer   r   r?   r   r   dictr   r@   r   r   r   r&   r,   r-   rA   rC   r   r   r   r   r   <module>   s"   
 $

