§
    )¢jT;  ã                  ó  — d Z 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m	Z	m
Z
 ddlmZmZ ddlmZ ddlmZmZ  eej        d¦  «        rej                             d	¬
¦  «          eej        d¦  «        rej                             d	¬
¦  «         dZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#g d¢Z$d.d„Z%e	 G d „ d!¦  «        ¦   «         Z&e	 G d"„ d#¦  «        ¦   «         Z'd/d0d'„Z(d1d*„Z)d1d+„Z*d2d,„Z+e,d-k    r e- e+¦   «         ¦  «        ‚dS )3u�  
AutoPOE2 - Client Build Fingerprint (TASK-RE-PIPELINE-2026 / Invariant INV-BUILD-01)

Ä�á»‘i xá»©ng 1:1 vá»›i `src/core/memory/pe_fingerprint.cpp` (C++23 Core Engine).
Ä�á»�c PE header + báº£ng section cá»§a PathOfExile.exe TRá»°C TIáº¾P Tá»ª Ä�Ä¨A:
  - KHÃ”NG cáº§n attach tiáº¿n trÃ¬nh, KHÃ”NG cáº§n quyá»�n Administrator.
  - KHÃ”NG cáº§n game Ä‘ang cháº¡y (cháº¡y Ä‘Æ°á»£c trong CI / User Mode).

VAI TRÃ’ TRONG PIPELINE RE (PhÆ°Æ¡ng Ã¡n C):
  Má»�i tri thá»©c reverse engineering (static root RVA, AOB signature, offset
  component) Báº®T BUá»˜C Ä‘Æ°á»£c khÃ³a theo build fingerprint. KhÃ´ng cÃ³ báº±ng chá»©ng
  khá»›p build thÃ¬ KHÃ”NG Ä‘Æ°á»£c dÃ¹ng tri thá»©c cÅ© (chá»‘ng silent-bypass).

Báº°NG CHá»¨NG THá»°C Ä�á»ŠA (10/09/2026, bin/Release/memprobe_report.txt):
  BUILD CÅ¨  (5 phiÃªn): .text VSize=0x2E840BE, .rdata VA=0x2E86000, .data VA=0x3A03000
  BUILD Má»šI (1 phiÃªn): .text VSize=0x2E83B6E, .rdata VA=0x2E85000, .data VA=0x3A02000
  -> .data dá»‹ch -0x1000 lÃ m 8 static root RVA hardcode lá»‡ch hoÃ n toÃ n,
     cáº£ 4 AOB pattern [MISS], vÃ  player_addr = 0x0.

CÃ¡ch dÃ¹ng:
  python tools/re_pipeline/fingerprint.py                 # in fingerprint client
  python tools/re_pipeline/fingerprint.py --json data/builds/<BUILD_ID>.json
  python tools/re_pipeline/fingerprint.py --exe "D:\Games\...\PathOfExile.exe"

Xem: docs/development/25_static_reverse_engineering_pipeline_and_offset_registry.md
é    )ÚannotationsN)Ú	dataclassÚfield)ÚdatetimeÚtimezone)ÚPath)ÚListÚOptionalÚreconfigureúutf-8©ÚencodingiMZ  iPE  id†  i  é    é@   i    i   @l        é8   é<   l   %#D’s”_ l   ³   l   ÿÿÿÿ )zJC:\Program Files (x86)\Grinding Gear Games\Path of Exile 2\PathOfExile.exezNC:\Program Files (x86)\Grinding Gear Games\Path of Exile 2\PathOfExile_x64.exezDC:\Program Files\Grinding Gear Games\Path of Exile 2\PathOfExile.exezMC:\Program Files (x86)\Steam\steamapps\common\Path of Exile 2\PathOfExile.exezRC:\Program Files (x86)\Steam\steamapps\common\Path of Exile 2\PathOfExileSteam.exez(D:\Games\Path of Exile 2\PathOfExile.exeÚcurrentÚintÚdataÚbytesÚreturnc                óR   — | t           z  }|D ]}||z  }|t          z  t           z  }Œ|S )uH   FNV-1a 64-bit. Pháº£i cho káº¿t quáº£ identical vá»›i Fnv1a() trong C++.)Ú_UINT64_MASKÚ	FNV_PRIME)r   r   ÚhÚbytes       ú5C:\Projects\AutoPOE2\tools\re_pipeline\fingerprint.pyÚfnv1ar   S   s9   € à•,Ñ€AØð +ð +ˆØ	ˆT‰	ˆØ•‰]�lÑ*ˆˆØ€Hó    c                  ó    — e Zd ZU dZdZded<   dZded<   dZded<   dZded	<   dZ	ded
<   dZ
ded<   edd„¦   «         Zedd„¦   «         Zdd„ZdS )ÚSectionInfouL   Má»™t section trong báº£ng section cá»§a PE (Ä‘á»‘i xá»©ng C++ SectionInfo).Ú ÚstrÚnamer   r   Úvirtual_addressÚvirtual_sizeÚraw_sizeÚraw_pointerÚcharacteristicsr   Úboolc                ó:   — t          | j        t          z  ¦  «        S ©N)r*   r)   ÚIMAGE_SCN_MEM_EXECUTE©Úselfs    r   Ú
executablezSectionInfo.executableg   s   € å�DÔ(Õ+@Ñ@ÑAÔAÐAr   c                ó:   — t          | j        t          z  ¦  «        S r,   )r*   r)   ÚIMAGE_SCN_MEM_WRITEr.   s    r   ÚwritablezSectionInfo.writablek   s   € å�DÔ(Õ+>Ñ>Ñ?Ô?Ð?r   Údictc           	     ó�   — | j         d| j        d›�d| j        d›�d| j        d›�d| j        d›�d| j        d›�| j        | j        dœS )NÚ0xÚX©r$   r%   r&   r'   r(   r)   r0   r3   r8   r.   s    r   Úto_dictzSectionInfo.to_dicto   st   € à”IØ< DÔ$8Ð<Ð<Ð<Ø6 Ô!2Ð6Ð6Ð6Ø.˜Tœ]Ð.Ð.Ð.Ø4 Ô 0Ð4Ð4Ð4Ø< DÔ$8Ð<Ð<Ð<Øœ/Øœð	
ð 	
ð 		
r   N)r   r*   ©r   r4   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r$   Ú__annotations__r%   r&   r'   r(   r)   Úpropertyr0   r3   r9   © r   r   r!   r!   \   sØ   € € € € € € àVÐVà€D€N€N€N�NØ€OÐÐÐÑØ€LÐÐÐÑØ€HÐÐÐÑØ€KÐÐÐÑØ€OÐÐÐÑàðBð Bð Bñ „XðBð ð@ð @ð @ñ „Xð@ð

ð 

ð 

ð 

ð 

ð 

r   r!   c                  óú   — e Zd ZU dZdZded<   dZded<   dZded<   dZded	<   dZ	ded
<   dZ
ded<   dZded<   dZded<    ee¬¦  «        Zded<   dZded<   dZded<   ed!d„¦   «         Zd"d„Zd#d„Zd$d„Zd%d„Zd S )&ÚClientBuildIduY   Ä�á»‹nh danh duy nháº¥t cá»§a má»™t báº£n build client (Ä‘á»‘i xá»©ng C++ ClientBuildId).Fr*   Úvalidr   r   ÚmachineÚnumber_of_sectionsÚtime_date_stampÚsize_of_imageÚsize_of_headersÚ	file_sizer"   r#   Úpath)Údefault_factoryzList[SectionInfo]ÚsectionsÚfile_sha256Úerrorr   c                ó   — | j         d›S )uI   MÃ£ ngáº¯n dÃ¹ng lÃ m khÃ³a chÃ­nh cá»§a Offset Registry (vd '6A9E477A').Ú08X)rG   r.   s    r   Úshort_idzClientBuildId.short_idŒ   s   € ð Ô&Ð,Ð,Ð,r   c                óZ  — t           }t          |t          j        d| j        ¦  «        ¦  «        }t          |t          j        d| j        ¦  «        ¦  «        }| j        D ]Ë}t          ||j                             dd¦  «        ¦  «        }t          |t          j        d|j	        ¦  «        ¦  «        }t          |t          j        d|j
        ¦  «        ¦  «        }t          |t          j        d|j        ¦  «        ¦  «        }t          |t          j        d|j        ¦  «        ¦  «        }ŒÌ|S )ub  BÄƒm FNV-1a trÃªn báº£ng section.

        THá»¨ Tá»° BYTE PHáº¢I KHá»šP 100% vá»›i C++ ClientBuildId::SectionLayoutHash():
          numberOfSections (uint16 LE) -> sizeOfImage (uint32 LE) ->
          má»—i section: name (ASCII, khÃ´ng null) -> virtualAddress -> virtualSize
          -> rawSize -> characteristics (má»—i trÆ°á»�ng uint32 LE).
        ú<Hú<IÚasciiÚreplace)ÚFNV_OFFSET_BASISr   ÚstructÚpackrF   rH   rM   r$   Úencoder%   r&   r'   r)   )r/   r   Úsections      r   Úsection_layout_hashz!ClientBuildId.section_layout_hash‘   sø   € õ ˆÝ�!•V”[  tÔ'>Ñ?Ô?Ñ@Ô@ˆÝ�!•V”[  tÔ'9Ñ:Ô:Ñ;Ô;ˆØ”}ð 	Eð 	EˆGÝ�a˜œ×,Ò,¨W°iÑ@Ô@ÑAÔAˆAÝ�a�œ T¨7Ô+BÑCÔCÑDÔDˆAÝ�a�œ T¨7Ô+?Ñ@Ô@ÑAÔAˆAÝ�a�œ T¨7Ô+;Ñ<Ô<Ñ=Ô=ˆAÝ�a�œ T¨7Ô+BÑCÔCÑDÔDˆAˆAØˆr   Úotherú'ClientBuildId'c                ó¶   — | j         r|j         sdS | j        |j        k    o9| j        |j        k    o)|                      ¦   «         |                     ¦   «         k    S )NF)rD   rG   rH   r]   )r/   r^   s     r   Úsame_build_aszClientBuildId.same_build_as¤   sg   € ØŒzð 	 ¤ð 	Ø�5àÔ  EÔ$9Ò9ð JØÔ" eÔ&9Ò9ðJà×(Ò(Ñ*Ô*¨e×.GÒ.GÑ.IÔ.IÒIð	
r   r$   úOptional[SectionInfo]c                ó8   — | j         D ]}|j        |k    r|c S Œd S r,   )rM   r$   )r/   r$   r\   s      r   Úfind_sectionzClientBuildId.find_section­   s3   € Ø”}ð 	ð 	ˆGØŒ|˜tÒ#Ð#Ø���ð $àˆtr   r4   c                óp  — d| j         | j        | j        d| j        d›�| j        d| j        d›�| j        r8t          j        | j        t          j	        ¬¦  «         
                    d¦  «        ndd| j        d›�d| j        d›�| j        | j        d|                      ¦   «         d	›�d
„ | j        D ¦   «         dœS )Nzautopoe2.client_build_id/v1r6   Ú04XrQ   )Útzz%d/%m/%Y %H:%M:%Sr"   r7   Ú016Xc                ó6   — g | ]}|                      ¦   «         ‘ŒS rA   )r9   )Ú.0Úss     r   ú
<listcomp>z)ClientBuildId.to_dict.<locals>.<listcomp>È   s    € Ð<Ð<Ð<¨˜Ÿš™œÐ<Ð<Ð<r   )ÚschemarD   Úbuild_idrK   rE   rF   rG   Útime_date_stamp_utcrH   rI   rJ   rN   r]   rM   )rD   rR   rK   rE   rF   rG   r   Úfromtimestampr   ÚutcÚstrftimerH   rI   rJ   rN   r]   rM   r.   s    r   r9   zClientBuildId.to_dict³   så   € à3Ø”ZØœØ”IØ.˜DœLÐ.Ð.Ð.Ø"&Ô"9Ø> DÔ$8Ð>Ð>Ð>ð
 Ô'ð•Ô& tÔ';ÅÄÐMÑMÔM×VÒVØ'ñô ð ð à8 $Ô"4Ð8Ð8Ð8Ø< DÔ$8Ð<Ð<Ð<ØœØÔ+Ø#I¨×(@Ò(@Ñ(BÔ(BÐ#IÐ#IÐ#IØ<Ð<¨d¬mÐ<Ñ<Ô<ð)
ð 
ð 	
r   N)r   r#   ©r   r   )r^   r_   r   r*   )r$   r#   r   rb   r:   )r;   r<   r=   r>   rD   r?   rE   rF   rG   rH   rI   rJ   rK   r   ÚlistrM   rN   rO   r@   rR   r]   ra   rd   r9   rA   r   r   rC   rC   |   sK  € € € € € € àcÐcà€EÐÐÐÑØ€GÐÐÐÑØÐÐÐÐÑØ€OÐÐÐÑØ€MÐÐÐÑØ€OÐÐÐÑØ€IÐÐÐÑØ€D€N€N€N�NØ"' %¸Ð"=Ñ"=Ô"=€HÐ=Ð=Ð=Ñ=Ø€KÐÐÐÑØ€E€O€O€O�Oàð-ð -ð -ñ „Xð-ðð ð ð ð&
ð 
ð 
ð 
ðð ð ð ð
ð 
ð 
ð 
ð 
ð 
r   rC   ÚexplicitúOptional[str]úOptional[Path]c                óº   — | r't          | ¦  «        }|                     ¦   «         r|ndS t          D ])}t          |¦  «        }|                     ¦   «         r|c S Œ*dS )uF   Ä�á»‹nh vá»‹ PathOfExile.exe (Ä‘á»‘i xá»©ng C++ LocatePoe2Executable).N)r   Úis_fileÚDEFAULT_CANDIDATE_PATHS)ru   Ú	candidateÚraws      r   Úlocate_poe2_executabler}   Ì   st   € àð :Ý˜‘N”Nˆ	Ø%×-Ò-Ñ/Ô/Ð9ˆyˆy°TÐ9å&ð ð ˆÝ˜‘I”Iˆ	Ø×ÒÑÔð 	ØÐÐÐð	àˆ4r   rK   r   c                óH  — t          t          | ¦  «        ¬¦  «        }|                      ¦   «         sd| › �|_        |S 	 |                      ¦   «         }n## t
          $ r}d|› �|_        |cY d}~S d}~ww xY wt          |¦  «        |_        t          |¦  «        dk     r	d|_        |S t          j	        d|d¦  «        \  }|t          k    r	d	|_        |S t          j	        d
|d¦  «        \  }|dk    s|dz   t          |¦  «        k    r	d|_        |S t          j	        d||¦  «        \  }}}}	}
}}}|t          k    r	d|_        |S |t          k    r	d|_        |S |dk    s|dk    rd|› �|_        |S |dk     r	d|_        |S ||_        ||_        |	|_        |dz   }t          j	        d||¦  «        \  }|t           k    rd|d›d�|_        |S |t"          z   dz   t          |¦  «        k    r	d|_        |S t          j	        d||t$          z   ¦  «        \  |_        t          j	        d||t"          z   ¦  «        \  |_        ||z   }t+          |¦  «        D ]Ì}||dz  z   }|dz   t          |¦  «        k    r(d|› d�|_        |j                             ¦   «          |c S |||dz   …         }t          j	        d||dz   ¦  «        \	  }}}}}}}}}|j                             t3          |                     d¦  «                             d d!¦  «        |||||¬"¦  «        ¦  «         ŒÍd#|_        |S )$uE   Parse DOS/COFF/Optional header + báº£ng section. KhÃ´ng bÄƒm (nhanh).)rK   u   KhÃ´ng tÃ¬m tháº¥y tá»‡p: u   KhÃ´ng Ä‘á»�c Ä‘Æ°á»£c tá»‡p: Nr   u-   Tá»‡p quÃ¡ nhá»�, khÃ´ng pháº£i PE há»£p lá»‡rT   r   u,   DOS header khÃ´ng há»£p lá»‡ (magic != 'MZ')z<ir   é   u(   e_lfanew trá»� ra ngoÃ i pháº¡m vi tá»‡pz	<IHHIIIHHu   PE signature khÃ´ng há»£p lá»‡u8   Machine khÃ´ng pháº£i AMD64 (POE2 lÃ  tiáº¿n trÃ¬nh x64)é`   u'   Sá»‘ lÆ°á»£ng section báº¥t thÆ°á»�ng: é   u   sizeOfOptionalHeader quÃ¡ nhá»�u-   Optional header khÃ´ng pháº£i PE32+ (magic=0xr7   ú)é   u/   Optional header trá»� ra ngoÃ i pháº¡m vi tá»‡prU   é(   u3   Báº£ng section bá»‹ cáº¯t ngáº¯n (thiáº¿u section #é   z
<IIIIIIHHIó    rV   rW   )r$   r%   r&   r'   r(   r)   T)rC   r#   ry   rO   Ú
read_bytesÚOSErrorÚlenrJ   rY   Úunpack_fromÚIMAGE_DOS_SIGNATUREÚIMAGE_NT_SIGNATUREÚIMAGE_FILE_MACHINE_AMD64rE   rF   rG   ÚPE32_PLUS_MAGICÚ_SIZE_OF_HEADERS_OFFSETÚ_SIZE_OF_IMAGE_OFFSETrH   rI   ÚrangerM   ÚclearÚappendr!   ÚrstripÚdecoderD   )rK   Úbuildr   ÚexcÚ	dos_magicÚe_lfanewÚ	signaturerE   rF   rG   Ú_ptr_symÚ_num_symÚsize_of_optional_headerÚ_characteristicsÚoptional_startÚoptional_magicÚsection_table_startÚindexÚoffsetÚraw_namer&   r%   Úsize_of_raw_dataÚpointer_to_raw_dataÚ
_ptr_relocÚ_ptr_linenumÚ
_num_relocÚ_num_linenumr)   s                                r   Úload_pe_headersr«   Ù   sÎ  € å�s 4™yœyÐ)Ñ)Ô)€Eà�<Š<‰>Œ>ð Ø9°4Ð9Ð9ˆŒØˆðØ�ŠÑ Ô ˆˆøÝð ð ð Ø<°sÐ<Ð<ˆŒØˆˆˆˆˆˆøøøøðøøøõ ˜$‘i”i€E„Oå
ˆ4�y„y�2‚~€~ØEˆŒØˆåÔ% d¨D°!Ñ4Ô4�L€YØÕ'Ò'Ð'ØDˆŒØˆåÔ$ T¨4°Ñ6Ô6�K€XØ�1‚}€}˜ 2™­¨D©	¬	Ò1Ð1Ø@ˆŒØˆõ 	Ô˜;¨¨hÑ7Ô7ñ	ØØØØØØØØð Õ&Ò&Ð&Ø6ˆŒØˆØÕ*Ò*Ð*ØPˆŒØˆØ˜QÒÐÐ"4°rÒ"9Ð"9ØTÐ@RÐTÐTˆŒØˆØ Ò"Ð"Ø7ˆŒØˆà€E„MØ1€EÔØ+€EÔà ‘]€NÝÔ*¨4°°~ÑFÔFÑ€^Ø�Ò(Ð(ØYÀnÐYÐYÐYÐYˆŒØˆØÕ/Ñ/°!Ñ3µc¸$±i´iÒ?Ð?ØGˆŒØˆå#Ô/Øˆd�NÕ%:Ñ:ñô Ñ€UÔõ  &Ô1Øˆd�NÕ%<Ñ<ñ ô  Ñ€UÔð )Ð+BÑBÐÝÐ)Ñ*Ô*ð 
ð 
ˆØ$ u¨r¡zÑ1ˆØ�B‰;�˜T™œÒ"Ð"ØXÐPUÐXÐXÐXˆEŒKØŒN× Ò Ñ"Ô"Ð"ØˆLˆLˆLà˜ ¨!¡Ð+Ô,ˆõ Ô˜|¨T°6¸A±:Ñ>Ô>ñ
	
ØØØØØØØØØð 	Œ×ÒÝØ—_’_ WÑ-Ô-×4Ò4°W¸iÑHÔHØ /Ø)Ø)Ø/Ø /ðñ ô ñ		
ô 		
ð 		
ð 		
ð €E„KØ€Ls   ¿A Á
A4ÁA/Á)A4Á/A4c                óB  ‡— t          | ¦  «        }|j        s|S t          j        ¦   «         }|                      d¦  «        5 Št          ˆfd„d¦  «        D ]}|                     |¦  «         Œ	 ddd¦  «         n# 1 swxY w Y   |                     ¦   «         |_        |S )u@   Parse header + SHA-256 toÃ n tá»‡p (dÃ¹ng khi ghi build record).Úrbc                 ó.   •— ‰                       d¦  «        S )Ni   )Úread)Úhandles   €r   ú<lambda>z+load_pe_headers_with_hash.<locals>.<lambda>O  s   ø€  &§+¢+¨kÑ":Ô":€ r   r   N)	r«   rD   ÚhashlibÚsha256ÚopenÚiterÚupdateÚ	hexdigestrN   )rK   r–   ÚhasherÚchunkr°   s       @r   Úload_pe_headers_with_hashrº   G  sæ   ø€ å˜DÑ!Ô!€EØŒ;ð ØˆåŒ^ÑÔ€FØ	�Š�4‰Œð !˜FÝÐ:Ð:Ð:Ð:¸CÑ@Ô@ð 	!ð 	!ˆEØ�MŠM˜%Ñ Ô Ð Ð ð	!ð!ð !ð !ñ !ô !ð !ð !ð !ð !ð !ð !øøøð !ð !ð !ð !ð ×(Ò(Ñ*Ô*€EÔØ€Ls   Á,A;Á;A?ÂA?c                 óè  — t          j        d¬¦  «        } |                      dd d¬¦  «         |                      dd d¬¦  «         |                      dd	d
¬¦  «         |                      ¦   «         }t	          |j        ¦  «        }|€t          dt          j        ¬¦  «         dS |j	        rt          |¦  «        nt          |¦  «        }|j        s%t          d|j        › �t          j        ¬¦  «         dS |                     ¦   «         }t          d¦  «         t          d|j        › �¦  «         t          d|j        › �¦  «         t          d|j        d›d|d         › d�¦  «         t          d|j        d›d�¦  «         t          d|j        › �¦  «         t          d|j        d›�¦  «         t          d|j        d›�¦  «         t          d |j        d!›d"�¦  «         t          d#|                     ¦   «         d$›�¦  «         |j        rt          d%|j        › �¦  «         t          d&¦  «         |j        D ]>}t          d'|j        d(›d)|j        d›d*|j        d›d+|j        d›d,|j        d›�
¦  «         Œ?|j        rqtA          |j        ¦  «        }|j!         "                    d-d-¬.¦  «         | #                    t?          j$        |dd/¬0¦  «        d1z   d2¬3¦  «         t          d4|› �¦  «         d5S )6Nz0AutoPOE2 Client Build Fingerprint (INV-BUILD-01))Údescriptionz--exeu   Ä�Æ°á»�ng dáº«n PathOfExile.exe)ÚdefaultÚhelpz--jsonuG   Ghi build record ra JSON (khuyáº¿n nghá»‹: data/builds/<BUILD_ID>.json)z--hashÚ
store_trueu    BÄƒm SHA-256 toÃ n tá»‡p (~78MB))Úactionr¾   uJ   [ERROR] KhÃ´ng tÃ¬m tháº¥y PathOfExile.exe. DÃ¹ng --exe <Ä‘Æ°á»�ng dáº«n>.)Úfiler�   u   [ERROR] Parse PE tháº¥t báº¡i: é   z8=== AutoPOE2 Client Build Fingerprint (INV-BUILD-01) ===z  Path              : z  BuildId           : z  TimeDateStamp     : 0xrQ   z (ro   z UTC)z  Machine           : 0xrf   z (AMD64)z  NumberOfSections  : z  SizeOfImage       : 0xr7   z  SizeOfHeaders     : 0xz  FileSize          : ú,z bytesz  SectionLayoutHash : 0xrh   z  FileSHA256        : z  Sections:z    z<9z VA=0xz	 VSize=0xz RawSize=0xz Char=0xT)ÚparentsÚexist_okF)ÚindentÚensure_asciiú
r   r   u   [OK] Ä�Ã£ ghi build record -> r   )%ÚargparseÚArgumentParserÚadd_argumentÚ
parse_argsr}   ÚexeÚprintÚsysÚstderrÚhashrº   r«   rD   rO   r9   rK   rR   rG   rE   rF   rH   rI   rJ   r]   rN   rM   r$   r%   r&   r'   r)   Újsonr   ÚparentÚmkdirÚ
write_textÚdumps)ÚparserÚargsÚexe_pathr–   Úpayloadr\   Úout_paths          r   ÚmainrÜ   U  s¶  € ÝÔ$ØFðñ ô €Fð ×Ò˜¨Ð4UÐÑVÔVÐVØ
×ÒØØØVð ñ ô ð ð
 ×ÒØ˜Ð,Nð ñ ô ð ð ×ÒÑÔ€Då% d¤hÑ/Ô/€HØÐÝØXÝ”ð	
ñ 	
ô 	
ð 	
ð ˆqà37´9Ð[Õ% hÑ/Ô/Ð/Å/ÐRZÑB[ÔB[€EØŒ;ð ÝÐ=°´Ð=Ð=ÅCÄJÐOÑOÔOÐOØˆqà�mŠm‰oŒo€GÝ	Ð
DÑEÔEÐEÝ	Ð
/ 5¤:Ð
/Ð
/Ñ0Ô0Ð0Ý	Ð
3 5¤>Ð
3Ð
3Ñ4Ô4Ð4Ý	ð	2 5Ô#8Ð?ð 	2ð 	2ØÐ)Ô*ð	2ð 	2ð 	2ñô ð õ 
Ð
@ U¤]Ð
@Ð
@Ð
@Ð
@ÑAÔAÐAÝ	Ð
= 5Ô#;Ð
=Ð
=Ñ>Ô>Ð>Ý	Ð
< UÔ%8Ð
<Ð
<Ð
<Ñ=Ô=Ð=Ý	Ð
> UÔ%:Ð
>Ð
>Ð
>Ñ?Ô?Ð?Ý	Ð
< 5¤?Ð
<Ð
<Ð
<Ð
<Ñ=Ô=Ð=Ý	Ð
G U×%>Ò%>Ñ%@Ô%@Ð
GÐ
GÐ
GÑHÔHÐHØÔð <ÝÐ: uÔ'8Ð:Ð:Ñ;Ô;Ð;Ý	ˆ-ÑÔÐØ”>ð 
ð 
ˆÝð4�7”<ÐHð 4ð 4¨'Ô*AÐHð 4ð 4ØÔ+ÐSð4ð 4Ø<CÔ<LÐSð4ð 4àÔ-Ð3ð4ð 4ñ	
ô 	
ð 	
ð 	
ð „yð ;Ý˜œ	‘?”?ˆØŒ×Ò d°TÐÑ:Ô:Ð:Ø×ÒÝŒJ�w q°uÐ=Ñ=Ô=ÀÑDÈwð 	ñ 	
ô 	
ð 	
õ 	Ð9¨xÐ9Ð9Ñ:Ô:Ð:àˆ1r   Ú__main__)r   r   r   r   r   r   r,   )ru   rv   r   rw   )rK   r   r   rC   rs   ).r>   Ú
__future__r   rÉ   r²   rÒ   rY   rÏ   Údataclassesr   r   r   r   Úpathlibr   Útypingr	   r
   ÚhasattrÚstdoutr   rÐ   r‹   rŒ   r�   rŽ   ÚIMAGE_SCN_CNT_CODEÚIMAGE_SCN_CNT_INITIALIZED_DATAr-   ÚIMAGE_SCN_MEM_READr2   r�   r�   rX   r   r   rz   r   r!   rC   r}   r«   rº   rÜ   r;   Ú
SystemExitrA   r   r   ú<module>rè      s|  ððð ð6 #Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø €€€Ø €€€Ø 
€
€
€
Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø Ð Ð Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !Ð !Ð !à
€7ˆ3Œ:�}Ñ%Ô%ð -Ø„J×Ò GÐÑ,Ô,Ð,Ø
€7ˆ3Œ:�}Ñ%Ô%ð -Ø„J×Ò GÐÑ,Ô,Ð,ð
 Ð ØÐ Ø!Ð Ø€àÐ Ø!+Ð Ø"Ð ØÐ Ø Ð ð Ð ØÐ ð &Ð Ø€	Ø!€ðð ð Ð ðð ð ð ð ð
ð 
ð 
ð 
ð 
ñ 
ô 
ñ „ð
ð> ðL
ð L
ð L
ð L
ð L
ñ L
ô L
ñ „ðL
ð^
ð 
ð 
ð 
ð 
ðkð kð kð kð\ð ð ð ð<ð <ð <ð <ð~ ˆzÒÐØ
ˆ*�T�T‘V”VÑ
Ô
Ðð Ðr   