§
    ‰
ÂjB`  ã                  óÈ   — U d dl mZ 	 d dlZd dlZd dlZd dlZd dlZd dlZd dl	m
Z
 ddlmZ  ej        e¦  «        ZdZdZdZdZd	ed
<   dZdZdZdd„Z G d„ de¦  «        ZdS )é    )ÚannotationsN)ÚAnyé   )ÚInvoiceGdtCaptchaMixinaµ  
// 1. Mask navigator.webdriver
Object.defineProperty(navigator, 'webdriver', {
    get: () => undefined,
});

// 2. Inject realistic window.chrome runtime
window.chrome = {
    runtime: {},
    app: {},
    loadTimes: function() {},
    csi: function() {}
};

// 3. Emulate platform, languages and realistic plugins
Object.defineProperty(navigator, 'platform', {
    get: () => 'Win32',
});

Object.defineProperty(navigator, 'languages', {
    get: () => ['vi-VN', 'vi', 'en-US', 'en'],
});

Object.defineProperty(navigator, 'plugins', {
    get: () => [1, 2, 3, 4, 5],
});

// 4. Overwrite notification permissions query
if (window.navigator && window.navigator.permissions) {
    const origQuery = window.navigator.permissions.query;
    window.navigator.permissions.query = (params) => (
        params && params.name === 'notifications' ?
            Promise.resolve({ state: Notification.permission }) :
            origQuery(params)
    );
}
zimg[alt='captcha'])zimg[alt='captcha'] + buttonz'[class*='Captcha__ImageWrapper'] buttonzimg + buttonztuple[str, ...]ÚCAPTCHA_REFRESH_SELECTORSé   i,  é   Úsrcú
str | NoneÚreturnc                ó  — ddl }| rd| vrdS 	 |                     |                      dd¦  «        d         ¦  «                             d¦  «        S # t          $ r&}t
                               d|¦  «         Y d}~dS d}~ww xY w)uW   Giáº£i mÃ£ SVG tá»« thuá»™c tÃ­nh src dáº¡ng data URI base64 cá»§a tháº» <img> captcha.r   Nzbase64,r   úutf-8u,   [GDT_AUTH] Lá»—i decode SVG tá»« img.src: %s)Úbase64Ú	b64decodeÚsplitÚdecodeÚ	ExceptionÚloggerÚwarning)r
   r   Úb64_errs      úOC:\Projects\DSCons\app\modules\invoices\infrastructure\adapters\gdt\gdt_auth.pyÚextract_svg_from_img_srcr   N   s�   € à€M€M€Màð �) 3Ð&Ð&ØˆtðØ×Ò §	¢	¨)°QÑ 7Ô 7¸Ô :Ñ;Ô;×BÒBÀ7ÑKÔKÐKøÝð ð ð Ý�ŠÐEÀwÑOÔOÐOØˆtˆtˆtˆtˆtøøøøðøøøs   ŽAA Á
B ÁA;Á;B c                  óB   — e Zd Zdd	„Zdd„Z	 ddd„Z	 ddd„Z	 ddd„ZdS )ÚInvoiceGdtAuthMixinÚpager   ÚmodalÚcap_imgÚold_srcÚstrr   Úboolc                ó  — t           D ]ù}	 |                     |¦  «        j        }|                     ¦   «         r|                     ¦   «         sŒF|                     ¦   «          n3# t          $ r&}t                               d||¦  «         Y d}~Œ†d}~ww xY wt          t          ¦  «        D ];}|                     t          ¦  «         |                     d¦  «        pd|k    r  dS Œ<t                               d|¦  «         ŒúdS )u(  Báº¥m nÃºt Ä‘á»•i áº£nh captcha vÃ  XÃ�C NHáº¬N src thá»±c sá»± thay Ä‘á»•i.

        Thá»­ láº§n lÆ°á»£t CAPTCHA_REFRESH_SELECTORS; tráº£ True ngay khi áº£nh Ä‘á»•i, False náº¿u khÃ´ng
        selector nÃ o lÃ m Ä‘á»•i áº£nh (luá»“ng gá»�i pháº£i dá»«ng, khÃ´ng Ä‘á»�c láº¡i áº£nh cÅ©).
        u)   [GDT_AUTH] KhÃ´ng báº¥m Ä‘Æ°á»£c '%s': %sNr
   Ú Tu9   [GDT_AUTH] Báº¥m '%s' nhÆ°ng áº£nh captcha khÃ´ng Ä‘á»•i.F)r   ÚlocatorÚfirstÚcountÚ
is_visibleÚclickr   r   ÚdebugÚrangeÚCAPTCHA_REFRESH_POLL_TIMESÚwait_for_timeoutÚCAPTCHA_REFRESH_POLL_MSÚget_attributer   )	Úselfr   r   r   r   ÚselectorÚbtnÚ	click_errÚ_s	            r   Ú_refresh_captcha_imagez*InvoiceGdtAuthMixin._refresh_captcha_image\   s  € õ 2ð 	bð 	bˆHðØ—m’m HÑ-Ô-Ô3�Ø—y’y‘{”{ð ¨#¯.ª.Ñ*:Ô*:ð ØØ—	’	‘”��øÝð ð ð Ý—’ÐHÈ(ÐT]Ñ^Ô^Ð^Ø����øøøøðøøøõ Õ5Ñ6Ô6ð  ð  �Ø×%Ò%Õ&=Ñ>Ô>Ð>Ø×)Ò)¨%Ñ0Ô0Ð6°B¸7ÒBÐBØ˜4˜4˜4ð Cå�NŠNÐVÐX`ÑaÔaÐaÐaØˆus   ‹AA#ÁA#Á#
BÁ-BÂBÚlatest_captchaúdict[str, Any]útuple[str | None, str | None]c                óÎ  — ddl }ddl}ddlm} t	          ¦   «         }d| _        t          dt          dz   ¦  «        D �]§}	|                     d¦  «        pd}
t          |
¦  «        p| 
                    d¦  «        }|r:|                     |                     d¦  «        ¦  «                             ¦   «         nd}|rè||vrä|                     |¦  «          ||¦  «        }|                      |¦  «        }d	|                     |¦  «                             d¦  «        › �}|                      ||¬
¦  «        \  }}|rFdt'          |¦  «        cxk    rdk    r,n n)t(                               d|	t          ||¦  «         ||fc S t(                               d|	t          |¦  «         |	t          k    r n6|                      ||||
¦  «        st(                               d¦  «          n�Œ©dS )u
  Ä�á»�c captcha trÃªn modal; tá»‘i Ä‘a CAPTCHA_MAX_IMAGES áº£nh KHÃ�C NHAU.

        - Má»—i áº£nh chá»‰ Ä‘Æ°á»£c gá»­i cho AI Ä‘Ãºng 1 láº§n (so dáº¥u vÃ¢n tay SVG) -> khÃ´ng tá»‘n tiá»�n Ä‘á»�c láº¡i
          áº£nh cÅ© vÃ  khÃ´ng tá»± lá»«a mÃ¬nh ráº±ng Ä‘Ã£ "Ä‘á»•i áº£nh".
        - Sá»‘ kÃ½ tá»± suy ra tá»« SVG (count_captcha_glyphs) Ä‘Æ°á»£c dÃ¹ng Ä‘á»ƒ loáº¡i báº£n Ä‘á»�c thiáº¿u/thá»«a.
        - Náº¿u khÃ´ng Ä‘á»•i Ä‘Æ°á»£c áº£nh -> dá»«ng sá»›m, tráº£ (None, None) Ä‘á»ƒ há»§y phiÃªn (KHÃ”NG submit).
        r   Nr   )Úcount_captcha_glyphsr
   r"   Úsvgr   zdata:image/png;base64,)Úexpected_lené   é   uI   âœ… [GDT_AUTH] Giáº£i mÃ£ Captcha thÃ nh cÃ´ng á»Ÿ áº£nh %d/%d: [%s] (%s)uU   âš ï¸� [GDT_AUTH] áº¢nh %d/%d: AI chÆ°a Ä‘á»“ng thuáº­n ('%s'). Ä�á»•i áº£nh má»›i...uŒ   ðŸ›¡ï¸� [GDT_AUTH] KhÃ´ng Ä‘á»•i Ä‘Æ°á»£c áº£nh captcha (nÃºt Ä‘á»•i áº£nh khÃ´ng pháº£n há»“i). Dá»«ng Ä‘á»ƒ khÃ´ng Ä‘á»�c láº¡i áº£nh cÅ©.)NN)r   ÚhashlibÚgdt_captchar8   ÚsetÚ_last_captcha_errorr)   ÚCAPTCHA_MAX_IMAGESr-   r   ÚgetÚsha1ÚencodeÚ	hexdigestÚaddÚ_render_svg_to_pngÚ	b64encoder   Ú_solve_with_ai_gatewayÚlenr   Úinfor   r3   )r.   r   r   r   r4   r   r=   r8   ÚseenÚcap_tryr
   r9   Úfingerprintr:   Ú	png_bytesÚdata_uriÚsolvedÚ	prov_names                     r   Ú_acquire_captcha_valuez*InvoiceGdtAuthMixin._acquire_captcha_valuer   s:  € ð 	ˆˆˆØˆˆˆà5Ð5Ð5Ð5Ð5Ð5å™œˆØ#'ˆÔ Ý˜QÕ 2°QÑ 6Ñ7Ô7ð !	ñ !	ˆGØ×'Ò'¨Ñ.Ô.Ð4°"ˆCÝ*¨3Ñ/Ô/ÐL°>×3EÒ3EÀeÑ3LÔ3LˆCØKNÐX˜'Ÿ,š, s§z¢z°'Ñ':Ô':Ñ;Ô;×EÒEÑGÔGÐGÐTXˆKàð �{¨$Ð.Ð.Ø—’˜Ñ%Ô%Ð%Ø3Ð3°CÑ8Ô8�Ø ×3Ò3°CÑ8Ô8�	Øa°F×4DÒ4DÀYÑ4OÔ4O×4VÒ4VÐW^Ñ4_Ô4_ÐaÐa�Ø$(×$?Ò$?ÀÐWcÐ$?Ñ$dÔ$dÑ!�˜	Øð -˜a¥3 v¡;¤;Ð3Ð3Ò3Ð3°!Ò3Ð3Ð3Ð3Ð3Ý—K’KØcØÝ*ØØ!ñô ð ð " 9Ð,Ð,Ð,Ð,Ý—’ØkØÝ&Øñ	ô ð ð Õ,Ò,Ð,Ø�Ø×.Ò.¨t°U¸GÀSÑIÔIð Ý—’ð cñô ð ð �ñ	ð
 ˆzó    NÚtax_codeÚusernameÚpasswordÚextra_configúdict[str, Any] | Nonec                ó  ‡ ‡‡‡‡— ddl }ddl}ddlmŠ ˆˆ ˆˆˆfd„}	 d}	 ddl}	|	                     ¦   «         }n# t          $ r Y nw xY w|rr|                     ¦   «         r^|j         	                    d¬¦  «        5 }
|
 
                    |¦  «                             d¬¦  «        cddd¦  «         S # 1 swxY w Y   dS  |¦   «         S # t          $ r/}t                               d	|› �¦  «         d
d|›�dœcY d}~S d}~ww xY w)uŠ   XÃ¡c thá»±c vá»›i Cá»•ng Tá»•ng Cá»¥c Thuáº¿ thÃ´ng qua Playwright headless Chromium vá»›i AIHawk Stealth Ä‘á»ƒ vÆ°á»£t WAF F5 BIG-IP ASM.r   N)Úsync_playwrightc                 óî
  •‡‡‡—  ‰¦   «         5 } | j                              dg d¢¬¦  «        }	 |                     ddddœdd	dd
ddddœ¬¦  «        }|                     t          ¦  «         |                     ¦   «         }d d dœŠd ŠdŠd }ˆˆˆfd„}|                     d|¦  «         |                     ddd¬¦  «         |                     d¦  «        j	        }| 
                    ¦   «         r)|                     ¦   «          |                     d¦  «         |                     d¦  «                             d¦  «        j	        }| 
                    ¦   «         s|                     d¦  «        j	        }| 
                    ¦   «         r)|                     ¦   «          |                     d¦  «         |                     d¦  «        j        }|                     d¦  «        j	        }	|                     d ¦  «        j	        }
|                     d!¦  «        j	        }|                     d"¦  «        j        }|                     t          ¦  «        j	        }|                     ¦   «         s|                     d#¦  «        j	        }‰                     |||‰¦  «        \  }}|sbt#          ‰d$d ¦  «        pd%Šd&t$          › d'‰› d(�Št&                               d)‰¦  «         d*‰d+d,œ|                     ¦   «          cd d d ¦  «         S |}|	                     d-¦  «         	 |	                     ‰d.¬/¦  «         n'# t0          $ r |	                     ‰d.¬/¦  «         Y nw xY w|
                     d-¦  «         	 |
                     ‰d.¬/¦  «         n'# t0          $ r |
                     ‰d.¬/¦  «         Y nw xY w|                     d-¦  «         	 |                     |d0¬/¦  «         n'# t0          $ r |                     |d0¬/¦  «         Y nw xY w|                     d¦  «         |                     ¦   «          |                     d1¦  «         ‰s…	 |                     d2¦  «        j	        }| 
                    ¦   «         r*|                     ¦   «                              ¦   «         }|r|Šn# t8          $ r Y nw xY wt&                               d3‰¦  «         ‰r`|                     ¦   «         }d4                     d5„ |D ¦   «         ¦  «        }d6‰|||d7‰› d8�d9œ|                     ¦   «          cd d d ¦  «         S d:d;‰› d<|› d=�d>œ|                     ¦   «          cd d d ¦  «         S # |                     ¦   «          w xY w# 1 swxY w Y   d S )?NT)z---disable-blink-features=AutomationControlledz--disable-infobarsz--no-sandboxz--disable-setuid-sandboxz--disable-dev-shm-usagez--disable-web-securityz--ignore-certificate-errors)ÚheadlessÚargsúoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36iV  i   )ÚwidthÚheightzvi-VNzAsia/Ho_Chi_Minhz#vi-VN,vi;q=0.9,en-US;q=0.8,en;q=0.7zA"Chromium";v="133", "Google Chrome";v="133", "Not-A.Brand";v="99"z?0z	"Windows")zAccept-Languagez	Sec-Ch-UazSec-Ch-Ua-MobilezSec-Ch-Ua-Platform)Ú
user_agentÚviewportÚlocaleÚtimezone_idÚignore_https_errorsÚextra_http_headers)Úkeyr9   u0   KhÃ´ng xÃ¡c thá»±c Ä‘Æ°á»£c vá»›i Cá»•ng Thuáº¿.c                óþ  •— | j         }d|v ra| j        dk    rV	 |                      ¦   «         }|                     d¦  «        ‰d<   |                     d¦  «        ‰d<   n# t          $ r Y nw xY wd|v r‹	 |                      ¦   «         }| j        dk    r,|                     d¦  «        p|                     d¦  «        Šd S |                     d	¦  «        p|                     d
¦  «        pdŠd S # t          $ r Y d S w xY wd S )Nz/api/captchaéÈ   rh   Úcontentr9   z#/api/security-taxpayer/authenticateÚtokenÚid_tokenÚmessageÚerroru   Lá»—i xÃ¡c thá»±c Cá»•ng Thuáº¿)ÚurlÚstatusÚjsonrB   r   )Úresprp   ÚdataÚcaptured_jwtÚlast_err_msgr4   s      €€€r   Úhandle_responsez[InvoiceGdtAuthMixin._authenticate_via_playwright.<locals>._do_auth.<locals>.handle_response×   s6  ø€ à"œh˜Ø)¨SÐ0Ð0°T´[ÀCÒ5GÐ5Gð%Ø'+§y¢y¡{¤{ Ø8<¿ºÀ¹¼ ¨uÑ 5Ø8<¿ºÀÑ8KÔ8K ¨uÑ 5Ð 5øÝ#,ð %ð %ð %Ø $ ð%øøøð AÀCÐGÐGð%Ø'+§y¢y¡{¤{ Ø#'¤;°#Ò#5Ð#5Ø37·8²8¸GÑ3DÔ3DÐ3\ÈÏÊÐQ[ÑH\ÔH\ L L Là37·8²8¸IÑ3FÔ3Fð  4AÈ$Ï(Ê(ÐSZÑJ[ÔJ[ð  4Að  `A L L LøÝ#,ð %ð %ð %Ø $  ð%øøøð HÐGs+   ™AA Á
A+Á*A+Á3A	C, Â>,C, Ã,
C:Ã9C:Úresponseú https://hoadondientu.gdt.gov.vn/i¸ˆ  Únetworkidle)ÚtimeoutÚ
wait_untilzH.ant-modal-close, button.close, [aria-label='Close'], .ant-modal-close-xiX  z(header, nav, .ant-layout-header, .headeru   text=Ä�Äƒng nháº­pu=   button:has-text('Ä�Äƒng nháº­p'), a:has-text('Ä�Äƒng nháº­p')iè  z.ant-modal-contentz,#username, input[formcontrolname='username']z,#password, input[formcontrolname='password']z(#cvalue, input[formcontrolname='cvalue']u7   button:has-text('Ä�Äƒng nháº­p'), button[type='submit']Úimgr@   uH   AI khÃ´ng thá»ƒ giáº£i mÃ£ Captcha vá»›i Ä‘á»™ tin cáº­y tuyá»‡t Ä‘á»‘i.uC   AI khÃ´ng Ä‘á»“ng thuáº­n káº¿t quáº£ Ä‘á»�c Captcha sau tá»‘i Ä‘a u    áº£nh (uM   ). Chá»§ Ä‘á»™ng há»§y phiÃªn, KHÃ”NG gá»­i Ä‘Äƒng nháº­p lÃªn Cá»•ng Thuáº¿.u   ðŸ›¡ï¸� [GDT_AUTH] %sÚai_errorF)rq   rn   Úis_auth_errorr"   é#   )Údelayé(   i   zj.ant-form-item-explain-error, .ant-alert-message, .ant-notification-notice-description, .ant-message-erroru¤   [GDT_AUTH] PhiÃªn thá»­ xÃ¡c thá»±c Cá»•ng Thuáº¿ duy nháº¥t káº¿t thÃºc. Pháº£n há»“i: '%s'. KhÃ´ng thá»­ láº¡i trong phiÃªn nÃ y Ä‘á»ƒ chá»‘ng khÃ³a tÃ i khoáº£n.z; c                ó4   — g | ]}|d          › d|d         › �‘ŒS )Únameú=Úvalue© )Ú.0Úcs     r   ú
<listcomp>zVInvoiceGdtAuthMixin._authenticate_via_playwright.<locals>._do_auth.<locals>.<listcomp>L  s/   € Ð2`Ð2`Ð2`ÐST°a¸´iÐ3NÐ3NÀ!ÀGÄ*Ð3NÐ3NÐ2`Ð2`Ð2`rT   ÚsuccessõA   XÃ¡c thá»±c vÃ  vÆ°á»£t Captcha Cá»•ng Thuáº¿ thÃ nh cÃ´ng (MST: ú).)rq   rl   Úcookie_headerÚcookiesÚsolved_captcharn   Ú
auth_errorõ)   Cá»•ng Tá»•ng Cá»¥c Thuáº¿ pháº£n há»“i: u    (Ä�Ã£ thá»­ qua AI Vision: [ú]).©rq   rn   )ÚchromiumÚlaunchÚnew_contextÚadd_init_scriptÚAIHAWK_STEALTH_JSÚnew_pageÚonÚgotor#   r$   r&   r'   r+   ÚlastÚCAPTCHA_IMG_SELECTORr%   rS   ÚgetattrrA   r   r   ÚcloseÚfillÚpress_sequentiallyÚAttributeErrorÚtypeÚ
inner_textÚstripr   r�   Újoin)ÚpÚbrowserÚcontextr   Úlast_solved_cvaluerw   Ú	close_btnÚ	login_navr   Ú
user_inputÚ
pass_inputÚ	cap_inputÚ
submit_btnr   ÚcvalueÚprovÚ	modal_errÚerr_textr�   rŽ   ru   rv   r4   rW   r.   r[   rU   rV   s                       @@@€€€€€r   Ú_do_authzBInvoiceGdtAuthMixin._authenticate_via_playwright.<locals>._do_auth³   s9  øøøø€ Ø �Ñ"Ô"ð g$ aØœ*×+Ò+Ø!ðð ð ð ,ñ ô �ðZ$Ø%×1Ò1ð $UØ+/¸3Ð!?Ð!?Ø&Ø$6Ø,0à/TØ)lØ04Ø2=ð	,ð ,ð 2ñ ô �Gð ×+Ò+Õ,=Ñ>Ô>Ð>Ø"×+Ò+Ñ-Ô-�Dà-1¸$Ð%?Ð%?�NØ#'�LØ#U�LØ)-Ð&ð%ð %ð %ð %ð %ð %ð %ð* —G’G˜J¨Ñ8Ô8Ð8Ø—I’IÐ@È%Ð\i�IÑjÔjÐjð !%§¢Ð-wÑ xÔ xÔ ~�IØ ×+Ò+Ñ-Ô-ð 3Ø!ŸšÑ)Ô)Ð)Ø×-Ò-¨cÑ2Ô2Ð2ð !%§¢Ð-WÑ XÔ X× `Ò `ÐauÑ vÔ vÔ |�IØ$×/Ò/Ñ1Ô1ð xØ$(§L¢LÐ1pÑ$qÔ$qÔ$w˜	Ø ×+Ò+Ñ-Ô-ð 4Ø!ŸšÑ)Ô)Ð)Ø×-Ò-¨dÑ3Ô3Ð3à ŸLšLÐ)=Ñ>Ô>ÔC�EØ!&§¢Ð/]Ñ!^Ô!^Ô!d�JØ!&§¢Ð/]Ñ!^Ô!^Ô!d�JØ %§¢Ð.XÑ YÔ YÔ _�IØ!&§¢Ð/hÑ!iÔ!iÔ!n�Jð $ŸmšmÕ,@ÑAÔAÔG�GØ"Ÿ=š=™?œ?ð =Ø"'§-¢-°Ñ"6Ô"6Ô"<˜à#'×#>Ò#>¸tÀUÈGÐUcÑ#dÔ#d‘L�F˜Dà!ð å# DÐ*?ÀÑFÔFð jØið %ð
|Õbtð |ð |Ø ,ð|ð |ð |ð %õ ŸšÐ'>ÀÑMÔMÐMà&0Ø'3Ø-2ð ð  ðD —M’M‘O”O�OðOg$ð g$ð g$ð g$ñ g$ô g$ð g$ð g$ðV *0Ð&ð —O’O BÑ'Ô'Ð'ð<Ø"×5Ò5°hÀbÐ5ÑIÔIÐIÐIøÝ)ð <ð <ð <Ø"Ÿš¨¸˜Ñ;Ô;Ð;Ð;Ð;ð<øøøð —O’O BÑ'Ô'Ð'ð<Ø"×5Ò5°hÀbÐ5ÑIÔIÐIÐIøÝ)ð <ð <ð <Ø"Ÿš¨¸˜Ñ;Ô;Ð;Ð;Ð;ð<øøøð —N’N 2Ñ&Ô&Ð&ð9Ø!×4Ò4°VÀ2Ð4ÑFÔFÐFÐFøÝ)ð 9ð 9ð 9Ø!Ÿš v°R˜Ñ8Ô8Ð8Ð8Ð8ð9øøøð ×)Ò)¨#Ñ.Ô.Ð.ð ×$Ò$Ñ&Ô&Ð&Ø×)Ò)¨$Ñ/Ô/Ð/ð (ð ð!Ø(-¯ªð  7cñ  )dô  )dô  )j˜IØ(×3Ò3Ñ5Ô5ð <Ø+4×+?Ò+?Ñ+AÔ+A×+GÒ+GÑ+IÔ+I Ø#+ð !<Ø3; LøøÝ(ð !ð !ð !Ø ˜Dð!øøøõ Ÿšð CØ(ñô ð ð
 $ð Ø")§/¢/Ñ"3Ô"3˜Ø(,¯	ª	Ð2`Ð2`ÐX_Ð2`Ñ2`Ô2`Ñ(aÔ(a˜à&/Ø%1Ø-:Ø'.Ø.@Ø'wÐksÐ'wÐ'wÐ'wð ð  ð —M’M‘O”O�OðOg$ð g$ð g$ð g$ñ g$ô g$ð g$ð g$ðF '3ð (VÐS_ð  (Vð  (Vð  Qð  (Vð  (Vð  (Vð ð  ð
 —M’M‘O”O�OðOg$ð g$ð g$ð g$ñ g$ô g$ð g$ð g$øðN —M’M‘O”O�O�OøøøðOg$ð g$ð g$ð g$øøøð g$ð g$ð g$ð g$ð g$ð g$sÔ   �U*¯J-UËU*Ë=UÌL-Ì,UÌ-!MÍUÍMÍUÍ*NÎUÎ!N&Î#UÎ%N&Î&UÎ?OÏUÏ!O;Ï8UÏ:O;Ï;AUÐ?ARÒUÒ
R%Ò"UÒ$R%Ò%AUÔU*Ô%UÔ0U*ÕU'Õ'U*Õ*U.Õ1U.r   )Úmax_workersé<   )r{   z+[GDT_AUTH] Playwright browser auth failed: Úconnection_erroru9   Lá»—i xÃ¡c thá»±c trÃ¬nh duyá»‡t tá»± Ä‘á»™ng tá»›i GDT: r”   )r   Úconcurrent.futuresÚplaywright.sync_apir[   ÚasyncioÚget_running_loopÚRuntimeErrorÚ
is_runningÚfuturesÚThreadPoolExecutorÚsubmitÚresultr   r   ro   )r.   rU   rV   rW   rX   r   Ú
concurrentr¶   Úloopr¼   ÚpoolÚexcr[   s   ````        @r   Ú_authenticate_via_playwrightz0InvoiceGdtAuthMixin._authenticate_via_playwright§   sú  øøøøø€ ð 	ˆˆˆØ!Ð!Ð!Ð!Ø7Ð7Ð7Ð7Ð7Ð7ðh	$ð h	$ð h	$ð h	$ð h	$ð h	$ð h	$ð h	$ð h	$ðV	ØˆDðØ���Ø×/Ò/Ñ1Ô1��øÝð ð ð Ø�ðøøøð ð "˜ŸšÑ)Ô)ð "ØÔ'×:Ò:ÀqÐ:ÑIÔIð DÈTØŸ;š; xÑ0Ô0×7Ò7ÀÐ7ÑCÔCðDð Dð Dð Dñ Dô Dð Dð Dð Dð Dð Dð Døøøð Dð Dð Dð Dð Dð Dð  �x‘z”zÐ!øÝð 	ð 	ð 	Ý�LŠLÐLÀsÐLÐLÑMÔMÐMà,Ø^ÐWZÐ^Ð^ðð ð ð ð ð ð ð øøøøð	øøøsg   žC ¡: ¹C º
AÁC ÁAÁ4C Á;)B1Â$C Â1B5Â5C Â8B5Â9C Â>	C Ã
DÃ$C<Ã6DÃ<Dc           	     ó
  — 	 |                       ||||¬¦  «        }|                     d¦  «        dv r|S t                               d|                     d¦  «        ¦  «         n2# t          $ r%}t                               d|¦  «         Y d}~nd}~ww xY wt          j        ¦   «         }d|_        t
          j        |_	        dd	d
dddœ}d}	t          dd¦  «        D �]!}
	 |                      |¬¦  «        \  }}n># t          $ r1}t                               d|› �¦  «         dd|›�dœcY d}~c S d}~ww xY wt          j        ||||dœ¦  «                             d¦  «        }	 t          j                             d||d¬¦  «        }t          j                             |d|¬¦  «        5 }t          j        |                     ¦   «                              d¦  «        ¦  «        }|                     d¦  «        p|                     d¦  «        }d|||d |› d!�d"œcddd¦  «         c S # 1 swxY w Y   �ŒY# t          j        j        $ r—}|                     ¦   «                              dd#¬$¦  «        }	 t          j        |¦  «        }|                     d%¦  «        p|                     d&¦  «        p|}n# t          $ r |}Y nw xY w|}	d'd(|› d)|› d*�dœcY d}~c S d}~wt          $ r}d+d,|›�dœcY d}~c S d}~ww xY wd'd(|	› �dœS )-u˜   Tá»± Ä‘á»™ng vÆ°á»£t Captcha báº±ng AI Vision OCR vÃ  xÃ¡c thá»±c vá»›i Cá»•ng Tá»•ng Cá»¥c Thuáº¿ (Æ°u tiÃªn Playwright browser session Ä‘á»ƒ qua WAF).©rU   rV   rW   rX   rq   )r‹   r‘   r~   z?[GDT_AUTH] Playwright auth returned %s, falling back to HTTP...zA[GDT_AUTH] Playwright auth exception: %s. Falling back to HTTP...NFzapplication/jsonr_   z!application/json, text/plain, */*ry   zhttps://hoadondientu.gdt.gov.vn)zContent-Typez
User-AgentÚAcceptÚRefererÚOriginu4   KhÃ´ng thá»ƒ káº¿t ná»‘i Cá»•ng Tá»•ng Cá»¥c Thuáº¿.r   é   )rX   u%   [GDT_AUTH] Lá»—i giáº£i mÃ£ Captcha: r~   u(   Lá»—i giáº£i mÃ£ Captcha qua AI Vision: r”   )rV   rW   r²   Úckeyr   zBhttps://hoadondientu.gdt.gov.vn/api/security-taxpayer/authenticateÚPOST)rt   ÚheadersÚmethodr	   )r{   rª   rl   rm   r‹   rŒ   r�   )rq   rl   rt   r�   rn   Úignore)Úerrorsrn   ro   r‘   r’   u    (Ä�Ã£ vÆ°á»£t Captcha AI: [r“   r¹   u8   Lá»—i káº¿t ná»‘i máº¡ng tá»›i hoadondientu.gdt.gov.vn: )rÈ   rB   r   r   r   ÚsslÚcreate_default_contextÚcheck_hostnameÚ	CERT_NONEÚverify_moder)   Ú_solve_gdt_captcharr   ÚdumpsrD   ÚurllibÚrequestÚRequestÚurlopenÚloadsÚreadr   ro   Ú	HTTPError)r.   rU   rV   rW   rX   ÚresÚpw_errÚctxrÑ   Ú
last_errorÚattemptrÏ   r²   ÚeÚauth_payloadÚgdt_reqÚgdt_respÚ	resp_datarl   ÚheÚerr_bodyÚerr_jsonÚmsgrÇ   s                           r   Ú_authenticate_gdt_portalz,InvoiceGdtAuthMixin._authenticate_gdt_portalr  s‹  € ð	hØ×3Ò3Ø!Ø!Ø!Ø)ð	 4ñ ô ˆCð �wŠw�xÑ Ô Ð$IÐIÐIØ�
Ý�NŠNÐ\Ð^a×^eÒ^eÐfnÑ^oÔ^oÑpÔpÐpÐpøÝð 	hð 	hð 	hÝ�NŠNÐ^Ð`fÑgÔgÐgÐgÐgÐgÐgÐgøøøøð	høøøõ Ô(Ñ*Ô*ˆØ"ˆÔÝœ-ˆŒð /ð LØ9Ø9Ø7ð
ð 
ˆð Lˆ
õ ˜Q ‘{”{ð 7	ñ 7	ˆGðØ#×6Ò6ÀLÐ6ÑQÔQ‘��f�føÝð ð ð Ý—’ÐJÀqÐJÐJÑKÔKÐKà(ØOÈ!ÐOÐOðð ð ð ð ð ð ð ð ð øøøøðøøøõ  œ:à (Ø (Ø$Ø ð	ð ñô ÷ Šf�W‰oŒoð ð$Ý œ.×0Ò0ØXØ%Ø#Ø!ð	 1ñ ô �õ ”^×+Ò+Ø R°ð ,ñ ô ð àÝ $¤
¨8¯=ª=©?¬?×+AÒ+AÀ'Ñ+JÔ+JÑ KÔ K�IØ%ŸMšM¨'Ñ2Ô2ÐO°i·m²mÀJÑ6OÔ6O�Eà"+Ø!&Ø )Ø*0Ø#sÐgoÐ#sÐ#sÐ#sðð ðð ð ð ñ ô ð ð ð ð ð ð ð ð øøøð ð ð ð ñ øõ ”<Ô)ð ð ð ØŸ7š7™9œ9×+Ò+¨G¸HÐ+ÑEÔE�ð#Ý#œz¨(Ñ3Ô3�HØ"Ÿ,š, yÑ1Ô1ÐV°X·\²\À'Ñ5JÔ5JÐVÈh�C�CøÝ ð #ð #ð #Ø"�C�C�Cð#øøøð !�
à*ØwÈ3ÐwÐwÐlrÐwÐwÐwðð ð ð ð ð ð ð ð ð øøøøõ ð ð ð à0ØaÐZ]ÐaÐaðð ð ð ð ð ð ð ð ð øøøøðøøøð #ØOÀ:ÐOÐOð
ð 
ð 	
sµ   ‚1A# ´.A# Á#
BÁ-BÂBÃC8Ã8
D3Ä$D.Ä&D3Ä.D3Å#AH3Æ(A/H&ÈH3È&H*	È*H3È-H*	È.H3È3K:É)KÉ1A J2Ê1KÊ2KÊ>KË KËKËK:ËK:Ë&K5Ë-K:Ë5K:Úservice_typec           	     ó¶  — |r|r|sdddœS |pi }|dk    r[|                       ||||¬¦  «        }|d         dk    r	dd|› d	�dœS |                     dd
¦  «        |                     dd¦  «        dœS |dk    rÜ|                     dd¦  «        }t          |                     dd¦  «        ¦  «        }	|                     dd¦  «        }
	 |
rt          j        ||	¦  «        }nt          j        ||	¦  «        }|                     ||¦  «         |                     ¦   «          dd|› d|› d|	› d�dœS # t          $ r}d
d|› d|	› d|›d�dœcY d}~S d}~ww xY wdd|› �dœS )u”   Kiá»ƒm tra thá»­ nghiá»‡m káº¿t ná»‘i trá»±c tiáº¿p tá»›i Cá»•ng Tá»•ng Cá»¥c Thuáº¿ (vÆ°á»£t Captcha tá»± Ä‘á»™ng báº±ng AI) hoáº·c HÃ²m thÆ° IMAP.ro   u_   Vui lÃ²ng nháº­p Ä‘áº§y Ä‘á»§ TÃªn Ä‘Äƒng nháº­p vÃ  Máº­t kháº©u Ä‘á»ƒ kiá»ƒm tra káº¿t ná»‘i.r”   Ú
gdt_portalrÊ   rq   r‹   uP   Káº¿t ná»‘i vÃ  xÃ¡c thá»±c thÃ nh cÃ´ng qua Cá»•ng Tá»•ng Cá»¥c Thuáº¿ cho MST u:    (Ä�Ã£ vÆ°á»£t Captcha tá»± Ä‘á»™ng báº±ng AI Vision OCR).r‘   rn   u    Lá»—i xÃ¡c thá»±c Cá»•ng Thuáº¿.Ú
email_imapÚimap_serverzimap.gmail.comÚ	imap_portiá  Úuse_sslTu;   Káº¿t ná»‘i vÃ  Ä‘Äƒng nháº­p thÃ nh cÃ´ng hÃ²m thÆ° IMAP (u   ) táº¡i mÃ¡y chá»§ ú:ú.u$   Lá»—i Ä‘Äƒng nháº­p hÃ²m thÆ° IMAP (z): uW   . Vui lÃ²ng kiá»ƒm tra Ä�á»‹a chá»‰ Email vÃ  Máº­t kháº©u á»©ng dá»¥ng (App Password).Nu/   Loáº¡i dá»‹ch vá»¥ khÃ´ng Ä‘Æ°á»£c há»— trá»£: )	rñ   rB   ÚintÚimaplibÚ	IMAP4_SSLÚIMAP4ÚloginÚlogoutr   )r.   rò   rU   rV   rW   rX   ÚextraÚauth_resÚserverÚportrø   ÚmailrÇ   s                r   Útest_connectionz#InvoiceGdtAuthMixin.test_connectionÖ  sv  € ð ð 	 8ð 	°8ð 	à!Ø|ðð ð ð
 Ð" ˆà˜<Ò'Ð'Ø×4Ò4Ø!Ø!Ø!Ø"ð	 5ñ ô ˆHð ˜Ô! YÒ.Ð.à'ð  wÐrzð   wð   wð   wðð ð ð 'Ÿlšl¨8°\ÑBÔBØ'Ÿ|š|¨IÐ7YÑZÔZðð ð ð
 ˜\Ò)Ð)Ø—Y’Y˜}Ð.>Ñ?Ô?ˆFÝ�u—y’y ¨cÑ2Ô2Ñ3Ô3ˆDØ—i’i 	¨4Ñ0Ô0ˆGðØð 7Ý"Ô,¨V°TÑ:Ô:�D�Då"œ=¨°Ñ6Ô6�DØ—
’
˜8 XÑ.Ô.Ð.Ø—’‘”�à'ð  KÐ]eð   Kð   Kð  {Að   Kð   Kð  DHð   Kð   Kð   Kðð ð øõ ð ð ð à*ð  wÀfð   wð   wÈtð   wð   wÐX[ð   wð   wð   wðð ð ð ð ð ð ð øøøøðøøøð ØWÈÐWÐWð
ð 
ð 	
s   ÃA%D- Ä-
EÄ7EÅEÅE)
r   r   r   r   r   r   r   r   r   r    )
r   r   r   r   r   r   r4   r5   r   r6   )N)
rU   r   rV   r   rW   r   rX   rY   r   r5   )rò   r   rU   r   rV   r   rW   r   rX   rY   r   r5   )Ú__name__Ú
__module__Ú__qualname__r3   rS   rÈ   rñ   r  r‡   rT   r   r   r   [   s£   € € € € € ðð ð ð ð,3ð 3ð 3ð 3ðt /3ðIð Ið Ið Ið Ið` /3ðb
ð b
ð b
ð b
ð b
ðT /3ð;
ð ;
ð ;
ð ;
ð ;
ð ;
ð ;
rT   r   )r
   r   r   r   )Ú
__future__r   rü   rr   ÚloggingrÕ   Úurllib.errorrÜ   Úurllib.requestÚtypingr   r>   r   Ú	getLoggerr  r   r™   ÚGDT_MAX_AUTH_ATTEMPTSrž   r   Ú__annotations__rA   r,   r*   r   r   r‡   rT   r   ú<module>r     s-  ðØ "Ð "Ð "Ð "Ð "Ð "Ð "à 7ð €€€Ø €€€Ø €€€Ø 
€
€
€
Ø Ð Ð Ð Ø Ð Ð Ð Ø Ð Ð Ð Ð Ð à /Ð /Ð /Ð /Ð /Ð /à	ˆÔ	˜8Ñ	$Ô	$€ð$Ð ðL Ð ð ,Ð ð.Ð ð ð ð ñ ð
 Ð ØÐ ØÐ ð
ð 
ð 
ð 
ðv
ð v
ð v
ð v
ð v
Ð0ñ v
ô v
ð v
ð v
ð v
rT   