§
    Ù
Âj”1  ã                   óÊ  — d Z ddlZddlmc mZ ddlZddlm	Z	m
Z
mZ ddlZddlmZmZmZ dZdedeeef         fd„Zd	„ Zd
„ Zd„ Zd„ Zd„ Z G d„ d¦  «        Zd„ Zd„ Z G d„ d¦  «        Z G d„ d¦  «        Z G d„ d¦  «        Z  G d„ d¦  «        Z!de"de"fd„Z#dZ$d&d„Z%d„ Z&d „ Z'd!„ Z(ej)        j*        ej)         +                    d"d#d$g¦  «        d%„ ¦   «         ¦   «         Z,dS )'uŸ  
Kiá»ƒm thá»­ báº£n vÃ¡ sá»± cá»‘ Ä‘á»“ng bá»™ hoÃ¡ Ä‘Æ¡n 04/10/2026 08:15 (GMT+7) - tráº¡ng thÃ¡i AI_ERROR.

NguyÃªn nhÃ¢n gá»‘c (Ä‘Ã£ kháº£o sÃ¡t DOM tháº­t cá»§a Cá»•ng Thuáº¿):
1. Selector "Ä‘á»•i áº£nh captcha" cÅ© `.anticon-reload, span:has(svg), ...` khá»›p nháº§m nÃºt Ä�Ã“NG MODAL
   (`span.ant-modal-close-x` chá»©a <svg>) -> áº£nh khÃ´ng bao giá»� Ä‘á»•i, AI Ä‘á»�c láº¡i Ä‘Ãºng 1 áº£nh 3 láº§n.
   NÃºt Ä‘á»•i áº£nh tháº­t: `<div class="Captcha__ImageWrapper..."><img alt="captcha"><button ...>`.
2. áº¢nh captcha cÃ³ 2 Ä‘Æ°á»�ng nhiá»…u (`<path fill="none" stroke=...>`) lÃ m model Ä‘á»�c lá»‡ch (O/Q, X/K).
   SVG cÃ³ Ä‘Ãºng 1 `<path fill=...>` cho má»—i kÃ½ tá»± -> biáº¿t trÆ°á»›c Ä‘á»™ dÃ i, loáº¡i nhiá»…u trÆ°á»›c khi OCR.
3. `ai_error` (chÆ°a há»� gá»­i Ä‘Äƒng nháº­p lÃªn Cá»•ng Thuáº¿) bá»‹ Ä‘áº¿m nhÆ° lá»—i xÃ¡c thá»±c -> cÃ³ thá»ƒ ngáº¯t máº¡ch
   (circuit breaker) oan toÃ n bá»™ lá»‹ch Ä‘á»“ng bá»™.
é    N)Ú	AsyncMockÚ	MagicMockÚpatch)ÚInvoiceGdtCaptchaMixinÚclean_captcha_svgÚcount_captcha_glyphsa	  <svg xmlns="http://www.w3.org/2000/svg" width="200" height="40" viewBox="0,0,200,40"><path fill="#333" d="M160 10L170 10L170 30L160 30Z"/><path fill="#333" d="M10 10L20 10L20 30L10 30Z"/><path fill="#333" d="M40 10L50 10L50 30L40 30Z"/><path d="M5 20C60 5,120 35,195 15" stroke="#666" fill="none"/><path d="M5 30C60 15,120 5,195 25" stroke="#888" fill="none"/><path fill="#444" d="M70 10L80 10L80 30L70 30Z"/><path fill="#222" d="M100 10L110 10L110 30L100 30Z"/><path fill="#222" d="M130 10L140 10L140 30L130 30Z"/></svg>ÚpngÚreturnc                 óH  — | d d…         }d}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}x}}t          j        d| d	d
…         ¦  «        S )Né   s   ‰PNG

©ú==)z%(py1)s == %(py4)s)Úpy1Úpy4zassert %(py6)sÚpy6z>IIé   é   )Ú
@pytest_arÚ_call_reprcompareÚ	_safereprÚAssertionErrorÚ_format_explanationÚstructÚunpack)r	   Ú@py_assert0Ú@py_assert3Ú@py_assert2Ú@py_format5Ú@py_format7s         ú>C:\Projects\DSCons\tests\test_gdt_captcha_refresh_and_noise.pyÚ	_png_sizer!   )   sÉ   € Øˆr�ˆrŒ7Ð*Ð*Ð*ˆ7Ð*Ò*Ð*Ð*Ð*Õ*Ô*Ð*Ð*Ð*Ð*ˆ7Ð*Ð*Ñ*Ô*Õ*Ô*ˆ7Ñ*Ô*Õ*Ô*Ð*Ñ*Ô*Ð*Ð*Ñ*Ð*Ð*Ð*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*ÝŒ=˜  B r E¤
Ñ+Ô+Ð+ó    c                  óü  — t          t          ¦  «        } d}|| v}|s—t          j        d|fd|| f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        | ¦  «        rt          j        | ¦  «        nddœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚d x}}d}|| v}|s—t          j        d|fd|| f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        | ¦  «        rt          j        | ¦  «        nddœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚d x}}| j
        }d	} ||¦  «        }d
}||k    }	|	sÐt          j        d|	fd||f¦  «        dt          j        ¦   «         v st          j        | ¦  «        rt          j        | ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }
dd|
iz  }t          t          j	        |¦  «        ¦  «        ‚d x}x}x}x}	}g }| j        }d} ||¦  «        }	|	}|	r| j        }d} ||¦  «        }|}|�sfddt          j        ¦   «         v st          j        | ¦  «        rt          j        | ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |	¦  «        dœz  }|                     |¦  «         |	r’ddt          j        ¦   «         v st          j        | ¦  «        rt          j        | ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }|                     |¦  «         t          j        |d¦  «        i z  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚d x}x}x}x}x}	x}x}}d S )Nzfill="none")únot in)z%(py1)s not in %(py3)sÚcleaned©r   Úpy3úassert %(py5)sÚpy5zstroke=ú<pathé   r   ©zK%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.count
}(%(py4)s)
} == %(py9)s©Úpy0Úpy2r   r   Úpy9úassert %(py11)sÚpy11z<svgú</svg>zE%(py8)s
{%(py8)s = %(py4)s
{%(py4)s = %(py2)s.startswith
}(%(py6)s)
})r/   r   r   Úpy8zI%(py16)s
{%(py16)s = %(py12)s
{%(py12)s = %(py10)s.endswith
}(%(py14)s)
})Úpy10Úpy12Úpy14Úpy16r   zassert %(py19)sÚpy19)r   Ú
SAMPLE_SVGr   r   r   Ú@py_builtinsÚlocalsÚ_should_repr_global_namer   r   ÚcountÚ
startswithÚendswithÚappendÚ_format_boolop)r%   r   r   Ú@py_format4Ú@py_format6Ú@py_assert1r   Ú@py_assert5Ú@py_assert8Ú@py_assert7Ú@py_format10Ú@py_format12Ú@py_assert11Ú@py_assert13Ú@py_assert15Ú@py_format9Ú@py_format17Ú@py_format18Ú@py_format20s                      r    Ú8test_clean_captcha_svg_strips_noise_strokes_keeps_glyphsrR   1   s¡  € Ý¥
Ñ+Ô+€GØÐ'ˆ= Ð'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'ˆ= Ð'Ñ'Ô'Õ'Ô'ˆ=Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô' Ñ'Ô'Ð'Õ'Ô' Ñ'Ô'Ð'Ð'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'ØÐ#ˆ9˜GÐ#Ð#Ð#Ð#Õ#Ô#Ð#Ð#Ð#Ð#ˆ9˜GÐ#Ñ#Ô#Õ#Ô#ˆ9Ñ#Ô#Ð#Õ#Ô#Ñ#Ô#Ð#Ð#Õ#Ô#˜GÑ#Ô#Ð#Õ#Ô#˜GÑ#Ô#Ð#Ð#Ð#Ð#Ñ#Ð#Ð#Ð#Ð#Ð#Ñ#Ð#Õ#Õ#Ô#Ð#Ñ#Ô#Ñ#Ô#Ð#Ð#Ð#Ð#Ð#ØŒ=Ð&˜Ð&ˆ=ˆ=˜Ñ!Ô!Ð& QÐ&Ð! QÒ&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&Ð! QÐ&Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&ˆ7Ñ&Ô&Ð&Õ&Ô&ˆ7Ñ&Ô&Ð&Ð&Õ&Ô&ˆ=Ñ&Ô&Õ&Ô&˜Ñ&Ô&Õ&Ô&Ð!Ñ&Ô&Õ&Ô& QÑ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&ØDÐDˆ7ÔÐD˜fÐDÐÐ˜fÑ%Ô%ÐDÐ%ÐDÐ%ÐD¨'Ô*:ÐD¸8ÐDÐ*:Ð*:¸8Ñ*DÔ*DÐDÐ*DÐDÐDÑDÐDÐDÕDÔDÑDÔDÐDÐDÕDÔDˆ7ÑDÔDÐDÕDÔDˆ7ÑDÔDÐDÐDÕDÔDÐÑDÔDÕDÔD˜fÑDÔDÕDÔDÐ%ÑDÔDÐDÐDÑDÐDÐD×DÒDÐDÑDÔDÐDÐ%ÐDÐDÐDÕDÔDÑDÔDÐDÐDÕDÔD¨'ÑDÔDÐDÕDÔD¨'ÑDÔDÐDÐDÕDÔDÐ*:ÑDÔDÕDÔD¸8ÑDÔDÕDÔDÐ*DÑDÔDÐDÐDÑDÐDÐD×DÒDÐDÑDÔDÐDÕDÔDÐDÐDÑDÔDÐDÑDÐDÐDÐDÐDÐDÑDÐDÕDÕDÔDÐDÑDÔDÑDÔDÐDÐDÐDÐDÐDÐDÐDÐDÐDÐDÐDÐDÐDÐDÐDÐDÐDÐDÐDr"   c                  ó^  — d} t          | ¦  «        }|j        }d} ||¦  «        }d}||k    }|sÐt          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd	|iz  }t          t          j	        |¦  «        ¦  «        ‚d x}x}x}x}}d
}	|	|v }
|
s—t          j        d|
fd|	|f¦  «        t          j        |	¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚d x}	}
d S )Nz§<svg width="200" height="40"><path fill='none' stroke='#777' d='M0 0L1 1'></path><path stroke="#333" d="M0 0L1 1" fill="none" /><path fill="#111" d="M1 1L2 2Z"/></svg>r*   é   r   r,   r%   r-   r1   r2   zfill="#111")Úin)z%(py1)s in %(py3)sr&   r(   r)   )
r   r>   r   r   r;   r<   r=   r   r   r   )Úsvgr%   rE   r   rF   rG   rH   rI   rJ   r   r   rC   rD   s                r    Ú>test_clean_captcha_svg_handles_attribute_order_and_closing_tagrW   9   sÿ  € ð	ð õ   Ñ$Ô$€GØŒ=Ð&˜Ð&ˆ=ˆ=˜Ñ!Ô!Ð& QÐ&Ð! QÒ&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&Ð! QÐ&Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&ˆ7Ñ&Ô&Ð&Õ&Ô&ˆ7Ñ&Ô&Ð&Ð&Õ&Ô&ˆ=Ñ&Ô&Õ&Ô&˜Ñ&Ô&Õ&Ô&Ð!Ñ&Ô&Õ&Ô& QÑ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&ØÐ#ˆ=˜GÐ#Ð#Ð#Ð#Õ#Ô#Ð#Ð#Ð#Ð#ˆ=˜GÐ#Ñ#Ô#Õ#Ô#ˆ=Ñ#Ô#Ð#Õ#Ô#Ñ#Ô#Ð#Ð#Õ#Ô#˜GÑ#Ô#Ð#Õ#Ô#˜GÑ#Ô#Ð#Ð#Ð#Ð#Ñ#Ð#Ð#Ð#Ð#Ð#Ñ#Ð#Õ#Õ#Ô#Ð#Ñ#Ô#Ñ#Ô#Ð#Ð#Ð#Ð#Ð#Ð#Ð#r"   c                  óæ  — t          t          ¦  «        } d}| |k    }|süt          j        d|fd| |f¦  «        dt	          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        nddt	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        | ¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚d x} x}}d	}t          |¦  «        }d }||u }|sÇt          j        d
|fd||f¦  «        dt	          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }	t          t          j	        |	¦  «        ¦  «        ‚d x}x}x}}d}t          |¦  «        }d }||u }|sÇt          j        d
|fd||f¦  «        dt	          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }	t          t          j	        |	¦  «        ¦  «        ‚d x}x}x}}d S )Nr+   r   ©z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr   r:   ©r.   r   r'   r   úassert %(py8)sr4   z'<svg><path fill="#111" d="M0 0"/></svg>©Úis)z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} is %(py7)s)r.   r/   r   Úpy7zassert %(py9)sr0   Ú )
r   r:   r   r   r;   r<   r=   r   r   r   )
r   rF   Ú@py_assert4r   rN   rE   r   Ú@py_assert6Ú@py_format8rI   s
             r    Ú+test_count_captcha_glyphs_from_filled_pathsrc   F   s0  € Ý¥
Ñ+Ô+Ð0¨qÐ0Ð+¨qÒ0Ð0Ð0Ð0Õ0Ô0Ð0Ð0Ð0Ð0Ð+¨qÐ0Ñ0Ô0Ð0Õ0Ô0Ñ0Ô0Ð0Ð0Õ0Ô0ÕÑ0Ô0Ð0Õ0Ô0ÕÑ0Ô0Ð0Ð0Ð0Õ0Ô0Ñ0Ô0Ð0Ð0Õ0Ô0¥
Ñ0Ô0Ð0Õ0Ô0¥
Ñ0Ô0Ð0Ð0Õ0Ô0Ð+Ñ0Ô0Õ0Ô0¨qÑ0Ô0Ð0Ð0Ñ0Ð0Ð0Ð0Ð0Ð0Ñ0Ð0Õ0Õ0Ô0Ð0Ñ0Ô0Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0à IÐRÕÐ IÑJÔJÐRÈdÐRÐJÈdÐRÐRÐRÐRÕRÔRÐRÐRÐRÐRÐJÈdÐRÑRÔRÐRÕRÔRÑRÔRÐRÐRÕRÔRÕÑRÔRÐRÕRÔRÕÑRÔRÐRÐRÕRÔRÐ IÑRÔRÕRÔRÐJÑRÔRÕRÔRÈdÑRÔRÐRÐRÑRÐRÐRÐRÐRÐRÑRÐRÕRÕRÔRÐRÑRÔRÑRÔRÐRÐRÐRÐRÐRÐRÐRÐRÐRØ "Ð+Õ Ñ#Ô#Ð+ tÐ+Ð# tÐ+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+Ð# tÐ+Ñ+Ô+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+ÕÑ+Ô+Ð+Õ+Ô+ÕÑ+Ô+Ð+Ð+Õ+Ô+ Ñ+Ô+Õ+Ô+Ð#Ñ+Ô+Õ+Ô+ tÑ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+r"   c                  óx  — t          ¦   «         } |                      t          ¦  «        }t          |¦  «        \  }}g }d}||k    }|}|r
d}||k    }	|	}|�sXt	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        dœz  }
dd|
iz  }| 
                    |¦  «         |r‹t	          j        d|	fd	||f¦  «        d
t          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        nd
t	          j	        |¦  «        dœz  }dd|iz  }| 
                    |¦  «         t	          j        |d¦  «        i z  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚d x}x}x}x}x}	}d S )NiX  éx   )ú>=)z%(py2)s >= %(py5)sÚwidth)r/   r)   z%(py7)sr^   )z%(py9)s >= %(py12)sÚheight)r0   r6   z%(py14)sr7   r   úassert %(py17)sÚpy17)r   Ú_render_svg_to_pngr:   r!   r   r   r;   r<   r=   r   rA   rB   r   r   )Úsolverr	   rg   rh   rE   r`   r   r   rK   Ú@py_assert10rD   rb   Ú@py_format13Ú@py_format15Ú@py_format16rP   s                   r    Ú(test_render_svg_is_denoised_and_upscaledrq   M   s  € Ý#Ñ%Ô%€FØ
×
#Ò
#¥JÑ
/Ô
/€CÝ˜c‘N”N�M€Eˆ6à)Ð)�CÐ)ˆ5�CŠ<Ð)Ð)Ð)Ð)Ð) cÐ)˜F cšMÐ)Ð)Ð)Ð)Ñ)Õ)Ô)Ð)Ð)Ð)Ð)ˆ5�CÐ)Ñ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô)ˆ5Ñ)Ô)Ð)Õ)Ô)ˆ5Ñ)Ô)Ð)Ð)Õ)Ô)�CÑ)Ô)Ð)Ð)Ñ)Ð)Ð)Ð)Ð)Ð)Ñ)Ð)Ð)×)Ò)Ð)Ñ)Ô)Ð)Ð)Ð)Õ)Ô)Ð)Ð)Ð)Ð)˜F cÐ)Ñ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô)˜FÑ)Ô)Ð)Õ)Ô)˜FÑ)Ô)Ð)Ð)Õ)Ô) cÑ)Ô)Ð)Ð)Ñ)Ð)Ð)Ð)Ð)Ð)Ñ)Ð)Ð)×)Ò)Ð)Ñ)Ô)Ð)Õ)Ô)Ð)Ð)Ñ)Ô)Ð)Ñ)Ð)Ð)Ð)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ð)r"   c                 ó¸  — t          ¦   «         }|j        } |t          ¦  «        }|j        }t          t          ¦  «        } ||¦  «        }||k    }|�sùt	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        dt          j        ¦   «         v st	          j        t          ¦  «        rt	          j	        t          ¦  «        ndt	          j	        |¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        dt          j        ¦   «         v st	          j        t          ¦  «        rt	          j	        t          ¦  «        nddt          j        ¦   «         v st	          j        t          ¦  «        rt	          j	        t          ¦  «        ndt	          j	        |¦  «        t	          j	        |¦  «        dœ
z  }dd|iz  }	t          t	          j        |	¦  «        ¦  «        ‚d	x}x}x}x}x}}d	S )
u[   áº¢nh render tá»« SVG gá»‘c pháº£i giá»‘ng há»‡t áº£nh render tá»« SVG Ä‘Ã£ loáº¡i nhiá»…u.r   )zÂ%(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s._render_svg_to_png
}(%(py3)s)
} == %(py15)s
{%(py15)s = %(py9)s
{%(py9)s = %(py7)s._render_svg_to_png
}(%(py13)s
{%(py13)s = %(py10)s(%(py11)s)
})
}rl   r:   r   )
r.   r/   r'   r)   r^   r0   r5   r2   Úpy13Úpy15ri   rj   N)r   rk   r:   r   r   r   r;   r<   r=   r   r   r   )
Úmonkeypatchrl   rE   r`   rG   Ú@py_assert12Ú@py_assert14ra   rp   rP   s
             r    Útest_render_uses_cleaned_svgrx   U   sƒ  € å#Ñ%Ô%€FØÔ$ð Ð$Ð$¥ZÑ0Ô0ð °FÔ4Mð Ý�*Ñ%Ô%ðÐ4MÐ4MØ%ñ5ô 5ð Ð0ð 5ò ð ð ñ õ ìðð ð ð Ð0ð 5ð ñ ô ð õ ìñô ð ð õ ìð ñ ô ð õ ìð ñ ô ð ð õ ìð %ñ ô ð õ ìñô ð ð õ ìõ &0ñ ô ð õ ìõ &0ñ ô ð ð õ ìð 1ñ ô ð õ ìñô ð ð õ ìð 5;ñ ô ð õ ìð 5;ñ ô ð ð õ ìð 5Nñ ô ð õ ìñô ð ð õ ìõ 	ñô ð õ ìõ 	ñô ð ð ð õ ìñô ð ð õ ìõ %ñô ð õ ìõ %ñô ð ð õ ìð 	&ñô õ ìð5ñ ô ð ð ñ ð ð ð ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð r"   c                   ó   — e Zd Zd„ Zdd„ZdS )Ú_Gatewayc                 ó0   — || _         g | _        g | _        d S ©N)ÚanswersÚcallsÚprompts)Úselfr}   s     r    Ú__init__z_Gateway.__init__a   s   € ØˆŒØˆŒ
ØˆŒˆˆr"   ç      N@c                 óÞ   — ddl m}m} | j                             |j        ¦  «         | j                             |j        ¦  «          || j        |j                 |j        |j	        ¬¦  «        S )Nr   )ÚAiProviderTypeÚ
AiResponse)ÚcontentÚ
model_usedÚprovider_used)
Úapp.core.ai.domain.modelsr„   r…   r~   rA   Úcanonical_model_idr   Úpromptr}   Ú
OPENROUTER)r€   ÚreqÚtimeoutr„   r…   s        r    Úanalyze_vision_syncz_Gateway.analyze_vision_syncf   s}   € ØHÐHÐHÐHÐHÐHÐHÐHàŒ
×Ò˜#Ô0Ñ1Ô1Ð1ØŒ×Ò˜CœJÑ'Ô'Ð'ØˆzØ”L Ô!7Ô8ØÔ-Ø(Ô3ð
ñ 
ô 
ð 	
r"   N)r‚   )Ú__name__Ú
__module__Ú__qualname__r�   r�   © r"   r    rz   rz   `   s7   € € € € € ðð ð ð
	
ð 	
ð 	
ð 	
ð 	
ð 	
r"   rz   c                 ó0  ‡— ddl m} dd lmc mc mc m} |\  }}}t          |d|d|di¦  «        Š|                      |dˆfd„¦  «         t          ¦   «          
                    dd¬	¦  «        \  }}d}||k    }	|	s—t          j        d
|	fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }
dd|
iz  }t#          t          j        |¦  «        ¦  «        ‚d x}	}‰j        }	|||g}|	|k    }|sªt          j        d
|fd|	|f¦  «        dt          j        ¦   «         v st          j        ‰¦  «        rt          j        ‰¦  «        ndt          j        |	¦  «        t          j        |¦  «        dœz  }dd|iz  }t#          t          j        |¦  «        ¦  «        ‚d x}	x}}d„ ‰j        D ¦   «         }	t+          |	¦  «        }|s•ddt          j        ¦   «         v st          j        t*          ¦  «        rt          j        t*          ¦  «        ndt          j        |	¦  «        t          j        |¦  «        dœz  }t#          t          j        |¦  «        ¦  «        ‚d x}	}d S )Nr   ©ÚCAPTCHA_READER_MODELSÚKXMB51ÚKXM51Úget_ai_gatewayc                  ó   •— ‰ S r|   r“   ©Úgws   €r    ú<lambda>zBtest_consensus_rejects_reading_with_wrong_length.<locals>.<lambda>y   ó   ø€ ¸"€ r"   údata:image/png;base64,AAAAr+   ©Úexpected_lenr   ©z%(py0)s == %(py3)sÚvalue©r.   r'   r(   r)   )z-%(py2)s
{%(py2)s = %(py0)s.calls
} == %(py5)srœ   ©r.   r/   r)   úassert %(py7)sr^   c              3   ó   K  — | ]}d |v V — Œ	dS )Ú6Nr“   )Ú.0Úps     r    ú	<genexpr>zCtest_consensus_rejects_reading_with_wrong_length.<locals>.<genexpr>�   s&   è è € Ð,Ð,˜Aˆs�aˆxÐ,Ð,Ð,Ð,Ð,Ð,r"   z,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}Úall©r.   r/   r   )Ú<app.modules.invoices.infrastructure.adapters.gdt.gdt_captchar–   Ú"app.core.ai.infrastructure.gatewayÚcoreÚaiÚinfrastructureÚgatewayrz   Úsetattrr   Ú_solve_with_ai_gatewayr   r   r;   r<   r=   r   r   r   r~   r   r¬   )ru   r–   Úgw_modÚaÚbÚcr£   Úproviderr   rE   rC   rD   r`   r   rb   r   rœ   s                   @r    Ú0test_consensus_rejects_reading_with_wrong_lengthr»   r   s  ø€ ØbÐbÐbÐbÐbÐbØ7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7à#�G€A€qˆ!å	�1�h  7¨A¨xÐ8Ñ	9Ô	9€BØ×Ò˜Ð 0°*°*°*°*Ñ=Ô=Ð=å,Ñ.Ô.×EÒEØ$°1ð Fñ ô �O€Eˆ8ð Ðˆ5�HÒÐÐÐÕÔÐÐÐÐˆ5�HÐÑÔÐÕÔÑÔÐÐÕÔˆ5ÑÔÐÕÔˆ5ÑÔÐÐÕÔ�HÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØŒ8Ð ˜˜1˜a�yÐ ˆ8�yÒ Ð Ð Ð Õ Ô Ð Ð Ð Ð ˆ8�yÐ Ñ Ô Ð Õ Ô Ñ Ô Ð Ð Õ Ô ˆ2Ñ Ô Ð Õ Ô ˆ2Ñ Ô Ð Ð Õ Ô ˆ8Ñ Ô Õ Ô �yÑ Ô Ð Ð Ñ Ð Ð Ð Ð Ð Ñ Ð Õ Õ Ô Ð Ñ Ô Ñ Ô Ð Ð Ð Ð Ð Ð Ð à,Ð, ¤Ð,Ñ,Ô,Ð,�3Ð,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,�3Ñ,Ô,Ð,Õ,Ô,�3Ñ,Ô,Ð,Ð,Õ,Ô,Ð,Ñ,Ô,Õ,Ô,Ð,Ñ,Ô,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,r"   c                 ó.  ‡— ddl m} dd lmc mc mc m} |\  }}}t          |d|d|di¦  «        Š|                      |dˆfd„¦  «         t          ¦   «          
                    dd¬	¦  «        \  }}d }||u }	|	s—t          j        d
|	fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }
dd|
iz  }t#          t          j        |¦  «        ¦  «        ‚d x}	}d S )Nr   r•   r˜   r—   r™   c                  ó   •— ‰ S r|   r“   r›   s   €r    r�   zGtest_consensus_wrong_length_agreement_is_not_accepted.<locals>.<lambda>Š   rž   r"   rŸ   r+   r    r\   ©z%(py0)s is %(py3)sr£   r¤   r(   r)   )r®   r–   r¯   r°   r±   r²   r³   rz   r´   r   rµ   r   r   r;   r<   r=   r   r   r   )ru   r–   r¶   r·   r¸   r¹   r£   Ú_r   rE   rC   rD   rœ   s               @r    Ú5test_consensus_wrong_length_agreement_is_not_acceptedrÀ   „   sx  ø€ ØbÐbÐbÐbÐbÐbØ7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7à#�G€A€qˆ!Ý	�1�g˜q '¨1¨hÐ7Ñ	8Ô	8€BØ×Ò˜Ð 0°*°*°*°*Ñ=Ô=Ð=å%Ñ'Ô'×>Ò>Ø$°1ð ?ñ ô �H€Eˆ1ð Ðˆ5�Dˆ=ÐÐÐÕÔÐÐÐÐˆ5�DÐÑÔÐÕÔÑÔÐÐÕÔˆ5ÑÔÐÕÔˆ5ÑÔÐÐÕÔ�DÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐr"   c                   ó   — e Zd Zd„ ZdS )Ú	_FakePagec                 ó   — d S r|   r“   )r€   Úmss     r    Úwait_for_timeoutz_FakePage.wait_for_timeout–   s   € Øˆr"   N)r�   r‘   r’   rÅ   r“   r"   r    rÂ   rÂ   •   s#   € € € € € ðð ð ð ð r"   rÂ   c                   óB   — e Zd Zd„ Zed„ ¦   «         Zd„ Zd„ Zd„ Zd„ Z	dS )Ú_FakeImgc                 ó   — || _         d S r|   ©Ústate)r€   rÊ   s     r    r�   z_FakeImg.__init__›   s   € ØˆŒ
ˆ
ˆ
r"   c                 ó   — | S r|   r“   ©r€   s    r    Úfirstz_FakeImg.firstž   ó   € àˆr"   c                 ó   — dS )NrT   r“   rÌ   s    r    r>   z_FakeImg.count¢   s   € Øˆqr"   c                 ó   — dS )NTr“   rÌ   s    r    Ú
is_visiblez_FakeImg.is_visible¥   s   € Øˆtr"   c                 ó   — | j         d         S )NÚsrcrÉ   )r€   Únames     r    Úget_attributez_FakeImg.get_attribute¨   s   € ØŒz˜%Ô Ð r"   c                 óF   — | j         d                              d¦  «         d S )NÚclicksÚimg)rÊ   rA   rÌ   s    r    Úclickz_FakeImg.click«   s#   € ØŒ
�8Ô×#Ò# EÑ*Ô*Ð*Ð*Ð*r"   N)
r�   r‘   r’   r�   ÚpropertyrÍ   r>   rÑ   rÕ   rÙ   r“   r"   r    rÇ   rÇ   š   sz   € € € € € ðð ð ð ðð ñ „Xððð ð ðð ð ð!ð !ð !ð+ð +ð +ð +ð +r"   rÇ   c                   ó<   — e Zd Zd„ Zed„ ¦   «         Zd„ Zd„ Zd„ ZdS )Ú_FakeLocatorc                 ó0   — || _         || _        || _        d S r|   )ÚselectorrÊ   Úrefresh_selectors)r€   rÞ   rÊ   rß   s       r    r�   z_FakeLocator.__init__°   s   € Ø ˆŒØˆŒ
Ø!2ˆÔÐÐr"   c                 ó   — | S r|   r“   rÌ   s    r    rÍ   z_FakeLocator.firstµ   rÎ   r"   c                 ó2   — | j         | j        d         v rdndS )NÚpresentrT   r   )rÞ   rÊ   rÌ   s    r    r>   z_FakeLocator.count¹   s   € Ø”M T¤Z°	Ô%:Ð:Ð:ˆqˆqÀÐAr"   c                 ó2   — |                       ¦   «         dk    S )Nr   )r>   rÌ   s    r    rÑ   z_FakeLocator.is_visible¼   s   € Ø�zŠz‰|Œ|˜aÒÐr"   c                 óæ   — | j         d                              | j        ¦  «         | j        | j        v r=| j         d                              d¦  «         | j         d         d         | j         d<   d S d S )Nr×   Úimagesr   rÓ   )rÊ   rA   rÞ   rß   ÚpoprÌ   s    r    rÙ   z_FakeLocator.click¿   sp   € ØŒ
�8Ô×#Ò# D¤MÑ2Ô2Ð2ØŒ=˜DÔ2Ð2Ð2ØŒJ�xÔ ×$Ò$ QÑ'Ô'Ð'Ø $¤
¨8Ô 4°QÔ 7ˆDŒJ�uÑÐÐð 3Ð2r"   N)	r�   r‘   r’   r�   rÚ   rÍ   r>   rÑ   rÙ   r“   r"   r    rÜ   rÜ   ¯   sn   € € € € € ð3ð 3ð 3ð
 ðð ñ „XððBð Bð Bð ð  ð  ð8ð 8ð 8ð 8ð 8r"   rÜ   c                   ó   — e Zd Zd„ Zd„ ZdS )Ú
_FakeModalc                 ó"   — || _         || _        d S r|   )rÊ   rß   )r€   rÊ   rß   s      r    r�   z_FakeModal.__init__Ç   s   € ØˆŒ
Ø!2ˆÔÐÐr"   c                 ó’   — |                      d¦  «        rd|vrt          | j        ¦  «        S t          || j        | j        ¦  «        S )NrØ   Úbutton)r?   rÇ   rÊ   rÜ   rß   )r€   rÞ   s     r    Úlocatorz_FakeModal.locatorË   sI   € Ø×Ò˜uÑ%Ô%ð 	(¨(¸(Ð*BÐ*BÝ˜DœJÑ'Ô'Ð'Ý˜H d¤j°$Ô2HÑIÔIÐIr"   N)r�   r‘   r’   r�   rì   r“   r"   r    rè   rè   Æ   s7   € € € € € ð3ð 3ð 3ðJð Jð Jð Jð Jr"   rè   Útextc                 óÀ   — dd l }t                               dd| › d�¦  «        }d|                     |                     ¦   «         ¦  «                             ¦   «         z   S )Nr   r3   z<!--z	--></svg>zdata:image/svg+xml;base64,)Úbase64r:   ÚreplaceÚ	b64encodeÚencodeÚdecode)rí   rï   rV   s      r    Ú_b64_svg_srcrô   Ñ   sY   € Ø€M€M€Må
×
Ò
˜XÐ'=¨dÐ'=Ð'=Ð'=Ñ
>Ô
>€CØ'¨&×*:Ò*:¸3¿:º:¹<¼<Ñ*HÔ*H×*OÒ*OÑ*QÔ*QÑQÐQr"   zimg[alt='captcha'] + buttonTc                 óš   — | d         t          | ¦  «        g t          ddhdœ}t          ||rt          hnt          ¦   «         ¦  «        }||fS )Nr   z.ant-modal-close-xúspan:has(svg))rÓ   rå   r×   râ   )ÚlistÚREAL_REFRESHrè   Úset)rå   Úrefresh_worksrÊ   Úmodals       r    Ú_make_modalrü   Û   sV   € à�aŒyÝ�v‘,”,Øå Ð"6¸ÐHðð €Eõ �u°ÐH�|˜n˜nÅ3Á5Ä5ÑIÔI€EØ�%ˆ<Ðr"   c                  óN  — ddl m}  t          t          d¦  «        t          d¦  «        g¦  «        \  }}|                     d¦  «        } | ¦   «                              t          ¦   «         |||d         ¦  «        }d}||u }|s—t          j        d|fd	||f¦  «        d
t          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd
t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}}|d         d         }	|	t          k    }|s¦t          j        d|fd|	t          f¦  «        t          j        |	¦  «        dt          j
        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}	}d„ |d         D ¦   «         }t!          |¦  «        }
|
 }|s•ddt          j
        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        |¦  «        t          j        |
¦  «        dœz  }t          t          j        |¦  «        ¦  «        ‚d x}x}
}d S )Nr   ©ÚInvoiceGdtAuthMixinÚAÚBúimg[alt='captcha']rÓ   Tr\   r¾   Úchangedr¤   r(   r)   r×   r   )z%(py1)s == %(py3)srø   r&   c              3   ó*   K  — | ]}d |v p|dk    V — ŒdS )Úcloserö   Nr“   )r©   r¹   s     r    r«   zEtest_refresh_clicks_captcha_button_not_modal_close.<locals>.<genexpr>ï   s0   è è € ÐQÐQ¸A�7˜a�<Ð7 1¨Ò#7ÐQÐQÐQÐQÐQÐQr"   z0assert not %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}Úanyr­   )Ú9app.modules.invoices.infrastructure.adapters.gdt.gdt_authrÿ   rü   rô   rì   Ú_refresh_captcha_imagerÂ   r   r   r;   r<   r=   r   r   r   rø   r  )rÿ   rû   rÊ   Úcap_imgr  r   rE   rC   rD   r   r   rF   s               r    Ú2test_refresh_clicks_captcha_button_not_modal_closer
  ç   s×  € Ø]Ð]Ð]Ð]Ð]Ð]å¥¨SÑ 1Ô 1µ<ÀÑ3DÔ3DÐEÑFÔF�L€Eˆ5Ø�mŠmÐ0Ñ1Ô1€GØ!Ð!Ñ#Ô#×:Ò:½9¹;¼;ÈÈwÐX]Ð^cÔXdÑeÔe€GØÐˆ7�dˆ?ÐÐÐÕÔÐÐÐÐˆ7�dÐÑÔÐÕÔÑÔÐÐÕÔˆ7ÑÔÐÕÔˆ7ÑÔÐÐÕÔ�dÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØ�Œ?˜1ÔÐ-Ð¥Ò-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Ð¥Ð-Ñ-Ô-Õ-Ô-ÐÑ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô-¥Ñ-Ô-Ð-Õ-Ô-¥Ñ-Ô-Ð-Ð-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-ØQÐQÀÀxÄÐQÑQÔQÐQ�sÐQÑQÔQÐQÐQÐQÐQÐQÐQÐQÐQÕQÔQÑQÔQÐQÐQÕQÔQ�sÑQÔQÐQÕQÔQ�sÑQÔQÐQÐQÕQÔQÐQÑQÔQÕQÔQÐQÑQÔQÐQÐQÑQÐQÕQÕQÔQÐQÑQÔQÑQÔQÐQÐQÐQÐQÐQÐQÐQÐQÐQr"   c           	      óò	  ‡‡‡— ddl m} t          t          d¦  «        t          d¦  «        t          d¦  «        t          d¦  «        g¦  «        \  }} |¦   «         }g g cŠŠt	          g d¢¦  «        Šd%ˆˆˆfd„	}|                      |d	d
„ ¦  «         |                      |d|¦  «         |                     t          ¦   «         ||                     d¦  «        dd i¦  «        \  }}d}||k    }	|	s—t          j
        d|	fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }
dd|
iz  }t          t          j        |¦  «        ¦  «        ‚d x}	}g }	t#          ‰¦  «        }d}||k    }|}|r(t%          ‰¦  «        }t#          |¦  «        }d}||k    }|}|�sjt          j
        d|fd||f¦  «        dt          j        ¦   «         v st          j        t"          ¦  «        rt          j        t"          ¦  «        nddt          j        ¦   «         v st          j        ‰¦  «        rt          j        ‰¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }|	                     |¦  «         |�rAt          j
        d|fd||f¦  «        dt          j        ¦   «         v st          j        t"          ¦  «        rt          j        t"          ¦  «        nddt          j        ¦   «         v st          j        t$          ¦  «        rt          j        t$          ¦  «        nddt          j        ¦   «         v st          j        ‰¦  «        rt          j        ‰¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd |iz  }|	                     |¦  «         t          j        |	d¦  «        i z  }d!d"|iz  }t          t          j        |¦  «        ¦  «        ‚d x}x}	x}x}x}x}x}x}}g d#¢}‰|k    }	|	s—t          j
        d|	fd‰|f¦  «        d$t          j        ¦   «         v st          j        ‰¦  «        rt          j        ‰¦  «        nd$t          j        |¦  «        dœz  }
dd|
iz  }t          t          j        |¦  «        ¦  «        ‚d x}	}d S )&Nr   rþ   r   r  ÚCÚD)©NNr  )r—   Ú	consensusc                 óv   •— ‰                      | ¦  «         ‰                      |¦  «         t          ‰¦  «        S r|   )rA   Únext)Údata_urir¡   r}   Ú	seen_lensÚ	seen_uriss     €€€r    Ú
fake_solvezCtest_acquire_captcha_solves_each_new_image_once.<locals>.fake_solveú   s7   ø€ Ø×Ò˜Ñ"Ô"Ð"Ø×Ò˜Ñ&Ô&Ð&Ý�G‰}Œ}Ðr"   rk   c                 ó*   — |                       ¦   «         S r|   ©rò   ©rV   s    r    r�   zAtest_acquire_captcha_solves_each_new_image_once.<locals>.<lambda>ÿ   ó   € ÀÇ
Â
ÁÄ€ r"   rµ   r  rV   r—   r   r¢   r£   r¤   r(   r)   é   )z0%(py5)s
{%(py5)s = %(py2)s(%(py3)s)
} == %(py8)sÚlenr  )r/   r'   r)   r4   z%(py10)sr5   )zV%(py18)s
{%(py18)s = %(py12)s(%(py16)s
{%(py16)s = %(py13)s(%(py14)s)
})
} == %(py21)srù   )r6   rs   r7   r8   Úpy18Úpy21z%(py23)sÚpy23zassert %(py26)sÚpy26)r+   r+   r+   r  r|   )r  rÿ   rü   rô   Úiterr´   Ú_acquire_captcha_valuerÂ   rì   r   r   r;   r<   r=   r   r   r   r  rù   rA   rB   )ru   rÿ   rû   rÊ   Úauthr  r£   Úprovr   rE   rC   rD   r`   rH   ra   r   rM   Ú@py_assert17Ú@py_assert20Ú@py_assert19rN   Ú@py_format11Ú@py_format22Ú@py_format24Ú@py_format25Ú@py_format27r}   r  r  s                             @@@r    Ú/test_acquire_captcha_solves_each_new_image_oncer,  ò   s›  øøø€ Ø]Ð]Ð]Ð]Ð]Ð]å¥¨SÑ 1Ô 1µ<ÀÑ3DÔ3DÅlÐSVÑFWÔFWÕYeÐfiÑYjÔYjÐkÑlÔl�L€Eˆ5ØÐÑ Ô €DØ˜rÐ€IˆyÝÐHÐHÐHÑIÔI€Gðð ð ð ð ð ð ð ð
 ×Ò˜Ð2Ð4LÐ4LÑMÔMÐMØ×Ò˜Ð6¸
ÑCÔCÐCà×-Ò-Ý‰Œ�U˜EŸMšMÐ*>Ñ?Ô?À%ÈÀñô �K€Eˆ4ð Ðˆ5�HÒÐÐÐÕÔÐÐÐÐˆ5�HÐÑÔÐÕÔÑÔÐÐÕÔˆ5ÑÔÐÕÔˆ5ÑÔÐÐÕÔ�HÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØ;Ð;�3ˆy‰>Œ>Ð;˜QÐ;ˆ>˜QÒÐ;Ð;Ð;Ð;Ð;¥s¨9¡~¤~Ð;¥3 ~Ñ#6Ô#6Ð;¸!Ð;Ð#6¸!Ò#;Ð;Ð;Ð;Ð;Ñ;Õ;Ô;Ð;Ð;Ð;Ð;ˆ>˜QÐ;Ñ;Ô;Ð;Õ;Ô;Ñ;Ô;Ð;Ð;Õ;Ô;�3Ñ;Ô;Ð;Õ;Ô;�3Ñ;Ô;Ð;Ð;Ð;Õ;Ô;Ñ;Ô;Ð;Ð;Õ;Ô;ˆyÑ;Ô;Ð;Õ;Ô;ˆyÑ;Ô;Ð;Ð;Õ;Ô;ˆ>Ñ;Ô;Õ;Ô;˜QÑ;Ô;Ð;Ð;Ñ;Ð;Ð;Ð;Ð;Ð;Ñ;Ð;Ð;×;Ò;Ð;Ñ;Ô;Ð;Ð;Ñ;Õ;Ô;Ð;Ð;Ð;Ð;Ð#6¸!Ð;Ñ;Ô;Ð;Õ;Ô;Ñ;Ô;Ð;Ð;Õ;Ô;¥3Ñ;Ô;Ð;Õ;Ô;¥3Ñ;Ô;Ð;Ð;Ð;Õ;Ô;Ñ;Ô;Ð;Ð;Õ;Ô;¥sÑ;Ô;Ð;Õ;Ô;¥sÑ;Ô;Ð;Ð;Ð;Õ;Ô;Ñ;Ô;Ð;Ð;Õ;Ô;¨9Ñ;Ô;Ð;Õ;Ô;¨9Ñ;Ô;Ð;Ð;Õ;Ô; ~Ñ;Ô;Õ;Ô;Ð#6Ñ;Ô;Õ;Ô;¸!Ñ;Ô;Ð;Ð;Ñ;Ð;Ð;Ð;Ð;Ð;Ñ;Ð;Ð;×;Ò;Ð;Ñ;Ô;Ð;Õ;Ô;Ð;Ð;Ñ;Ô;Ð;Ñ;Ð;Ð;Ð;Ð;Ð;Ñ;Ð;Õ;Õ;Ô;Ð;Ñ;Ô;Ñ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ø!˜	˜	Ð!ˆ9˜	Ò!Ð!Ð!Ð!Õ!Ô!Ð!Ð!Ð!Ð!ˆ9˜	Ð!Ñ!Ô!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!ˆ9Ñ!Ô!Ð!Õ!Ô!ˆ9Ñ!Ô!Ð!Ð!Õ!Ô!˜	Ñ!Ô!Ð!Ð!Ñ!Ð!Ð!Ð!Ð!Ð!Ñ!Ð!Õ!Õ!Ô!Ð!Ñ!Ô!Ñ!Ô!Ð!Ð!Ð!Ð!Ð!Ð!Ð!r"   c                 óÖ  ‡— ddl m} t          t          d¦  «        t          d¦  «        gd¬¦  «        \  }} |¦   «         }g Šdˆfd„	}|                      |dd	„ ¦  «         |                      |d
|¦  «         |                     t          ¦   «         ||                     d¦  «        dd i¦  «        \  }}d }||u }	|	s—t          j	        d|	fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }
dd|
iz  }t          t          j        |¦  «        ¦  «        ‚d x}	}t!          ‰¦  «        }d}||k    }|sòt          j	        d|fd||f¦  «        dt          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        nddt          j        ¦   «         v st          j        ‰¦  «        rt          j        ‰¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d x}x}}d S )Nr   rþ   r   r  F)rú   c                 ó2   •— ‰                      | ¦  «         dS )Nr  )rA   )r  r¡   r~   s     €r    r  zVtest_acquire_captcha_never_resolves_same_image_when_refresh_broken.<locals>.fake_solve  s   ø€ Ø�Š�XÑÔÐØˆzr"   rk   c                 ó*   — |                       ¦   «         S r|   r  r  s    r    r�   zTtest_acquire_captcha_never_resolves_same_image_when_refresh_broken.<locals>.<lambda>  r  r"   rµ   r  rV   r\   r¾   r£   r¤   r(   r)   rT   r   rY   r  r~   rZ   r[   r4   r|   )r  rÿ   rü   rô   r´   r!  rÂ   rì   r   r   r;   r<   r=   r   r   r   r  )ru   rÿ   rû   rÊ   r"  r  r£   r¿   r   rE   rC   rD   rF   r`   r   rN   r~   s                   @r    ÚBtest_acquire_captcha_never_resolves_same_image_when_refresh_brokenr0  
  sÄ  ø€ Ø]Ð]Ð]Ð]Ð]Ð]å¥¨SÑ 1Ô 1µ<ÀÑ3DÔ3DÐEÐUZÐ[Ñ[Ô[�L€Eˆ5ØÐÑ Ô €DØ€Eðð ð ð ð ð ð ×Ò˜Ð2Ð4LÐ4LÑMÔMÐMØ×Ò˜Ð6¸
ÑCÔCÐCà×*Ò*Ý‰Œ�U˜EŸMšMÐ*>Ñ?Ô?À%ÈÀñô �H€Eˆ1ð Ðˆ5�Dˆ=ÐÐÐÕÔÐÐÐÐˆ5�DÐÑÔÐÕÔÑÔÐÐÕÔˆ5ÑÔÐÕÔˆ5ÑÔÐÐÕÔ�DÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÝˆu‰:Œ:Ð˜Ðˆ:˜Š?ÐÐÐÕÔÐÐÐÐˆ:˜ÐÑÔÐÕÔÑÔÐÐÕÔ�3ÑÔÐÕÔ�3ÑÔÐÐÐÕÔÑÔÐÐÕÔˆuÑÔÐÕÔˆuÑÔÐÐÕÔˆ:ÑÔÕÔ˜ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐÐÐr"   Ú
top_statusÚ
auth_errorÚai_errorc              ƒ   ó0  K  — ddl m} t          ¦   «         }| ddddddœgd	œ|j        _        d
|j        _         ||dd
¬¦  «        }t          dt          ¬¦  «        5 }dddœ|_        |                     d¬¦  «        ƒ d {V —†}d d d ¦  «         n# 1 swxY w Y   |j         	                    ¦   «          |j
         	                    ¦   «          |j        }d}||u }|sªt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }	dd|	iz  }
t%          t          j        |
¦  «        ¦  «        ‚d x}x}}|j        }d} ||¦  «        }d}||u}|sÐt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }d d!|iz  }t%          t          j        |¦  «        ¦  «        ‚d x}x}x}x}}|                     ¦   «          d S )"Nr   )ÚInvoiceAutoSyncSchedulerServiceua   AI khÃ´ng thá»ƒ giáº£i mÃ£ Captcha vá»›i Ä‘á»™ tin cáº­y tuyá»‡t Ä‘á»‘i sau 3 láº§n Ä‘á»•i áº£nh.Ú
gdt_portalÚ
0202111150r3  u#   AI khÃ´ng thá»ƒ giáº£i mÃ£ Captcha.)ÚserviceÚtax_codeÚstatusÚmessage)r:  r;  Ú
connectorsé   zcontact@dinhsonconstruction.com)Úinvoice_serviceÚalert_emailÚmax_consecutive_auth_failureszGapp.modules.core.application.alert_service.BrevoEmailService.send_email)Únew_callableTz<ai-err@brevo.com>)ÚsuccessÚ
message_idz01:00)Útrigger_slotFr\   )z1%(py2)s
{%(py2)s = %(py0)s.is_paused
} is %(py5)sÚ	schedulerr¥   r¦   r^   Úcircuit_breaker_tripped)úis not)zM%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s)
} is not %(py9)sÚresr-   r1   r2   )ÚGapp.modules.invoices.application.invoice_processing.auto_sync_schedulerr5  r   Úrun_gdt_tax_syncÚreturn_valueÚincrement_auth_failuresr   r   Úexecute_scheduled_syncÚassert_not_calledÚdeactivate_sync_configÚ	is_pausedr   r   r;   r<   r=   r   r   r   ÚgetÚassert_called_once)r1  r5  ÚsvcrE  Ú	mock_sendrH  rE   r`   r   rD   rb   rF   rG   rH   rI   rJ   s                   r    Ú>test_ai_error_does_not_increment_auth_failures_or_trip_breakerrU  "  s�  è è € ð
ð ð ð ð ð õ ‰+Œ+€CàØvð (Ø(Ø$Ø@ð	ð ð
ð)ð )€CÔÔ%ð 01€CÔÔ,à/Ð/ØØ5Ø&'ðñ ô €Iõ
 
ØQÝð
ñ 
ô 
ð Kð 
Ø-1ÐAUÐ!VÐ!Vˆ	ÔØ×4Ò4À'Ð4ÑJÔJÐJÐJÐJÐJÐJÐJˆðKð Kð Kñ Kô Kð Kð Kð Kð Kð Kð Køøøð Kð Kð Kð Kð Ô×1Ò1Ñ3Ô3Ð3ØÔ×0Ò0Ñ2Ô2Ð2ØÔÐ' %Ð'Ð %Ð'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'Ð %Ð'Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'ˆ9Ñ'Ô'Ð'Õ'Ô'ˆ9Ñ'Ô'Ð'Ð'Õ'Ô'ÐÑ'Ô'Õ'Ô' %Ñ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'ØŒ7Ð9Ð,Ð9ˆ7ˆ7Ð,Ñ-Ô-Ð9°TÐ9Ð-°TÐ9Ð9Ð9Ð9Õ9Ô9Ð9Ð9Ð9Ð9Ð-°TÐ9Ñ9Ô9Ð9Õ9Ô9Ñ9Ô9Ð9Ð9Õ9Ô9ˆ3Ñ9Ô9Ð9Õ9Ô9ˆ3Ñ9Ô9Ð9Ð9Õ9Ô9ˆ7Ñ9Ô9Õ9Ô9Ð,Ñ9Ô9Õ9Ô9Ð-Ñ9Ô9Õ9Ô9°TÑ9Ô9Ð9Ð9Ñ9Ð9Ð9Ð9Ð9Ð9Ñ9Ð9Õ9Õ9Ô9Ð9Ñ9Ô9Ñ9Ô9Ð9Ð9Ð9Ð9Ð9Ð9Ð9Ð9Ð9Ð9Ð9Ø× Ò Ñ"Ô"Ð"Ð"Ð"s   Á'BÂBÂB)T)-Ú__doc__Úbuiltinsr;   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter   r   Úunittest.mockr   r   r   Úpytestr®   r   r   r   r:   ÚbytesÚtupleÚintr!   rR   rW   rc   rq   rx   rz   r»   rÀ   rÂ   rÇ   rÜ   rè   Ústrrô   rø   rü   r
  r,  r0  ÚmarkÚanyioÚparametrizerU  r“   r"   r    ú<module>rd     sÀ  ððð ð € € € € € € € € € € € € €€€€Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5à €€€ðð ð ð ð ð ð ð ð ð ð	ð ð,�5ð ,˜U 3¨ 8œ_ð ,ð ,ð ,ð ,ðEð Eð Eð
$ð 
$ð 
$ð,ð ,ð ,ð*ð *ð *ðð ð ð
ð 
ð 
ð 
ð 
ñ 
ô 
ð 
ð$-ð -ð -ð$ð ð ð"ð ð ð ð ñ ô ð ð
+ð +ð +ð +ð +ñ +ô +ð +ð*8ð 8ð 8ð 8ð 8ñ 8ô 8ð 8ð.Jð Jð Jð Jð Jñ Jô Jð JðR�sð R˜sð Rð Rð Rð Rð -€ð	ð 	ð 	ð 	ðRð Rð Rð"ð "ð "ð0ð ð ð0 „Ôð „×Ò˜¨°jÐ'AÑBÔBð$#ð $#ñ CÔBñ Ôð$#ð $#ð $#r"   