§
    ­Ÿžj”  ã                   ó.  — d Z ddlZddlZddlZddlZddlmZ  eej        d¦  «        rej         	                    d¬¦  «          eej
        d¦  «        rej
         	                    d¬¦  «         dZ G d„ d	¦  «        Zd
„ Zedk    r e¦   «          dS dS )u  
AutoPOE2 - GGPK Direct Data Extractor
CÃ´ng cá»¥ bÃ³c tÃ¡ch trá»±c tiáº¿p tá»‡p nhá»‹ phÃ¢n Content.ggpk cá»§a Path of Exile 2 (Zero-Risk, Read-Only).
Cho phÃ©p liá»‡t kÃª cÃ¢y thÆ° má»¥c, trÃ­ch xuáº¥t cÃ¡c gÃ³i bundle vÃ  file báº£ng dá»¯ liá»‡u ná»™i bá»™.
é    N)ÚPathÚreconfigurezutf-8)ÚencodingzGC:\Program Files (x86)\Grinding Gear Games\Path of Exile 2\Content.ggpkc                   ób   — e Zd Zefdefd„Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d„ Zd	efd
„Zdededefd„ZdS )ÚPoe2GgpkReaderÚ	ggpk_pathc                 ó0   — || _         d | _        d | _        d S ©N)r   ÚfileÚroot_offset)Úselfr   s     ú/C:\Projects\AutoPOE2\tools\extract_ggpk_data.pyÚ__init__zPoe2GgpkReader.__init__   s   € Ø"ˆŒØˆŒ	ØˆÔÐÐó    c                 óØ   — t           j                             | j        ¦  «        st	          d| j        › �¦  «        ‚t          | j        d¦  «        | _        |                      ¦   «          d S )Nu'   KhÃ´ng tÃ¬m tháº¥y Content.ggpk táº¡i: Úrb)ÚosÚpathÚexistsr   ÚFileNotFoundErrorÚopenr   Ú_read_root_header©r   s    r   r   zPoe2GgpkReader.open   s_   € ÝŒw�~Š~˜dœnÑ-Ô-ð 	`Ý#Ð$^ÈdÌnÐ$^Ð$^Ñ_Ô_Ð_Ý˜œ¨Ñ.Ô.ˆŒ	Ø×ÒÑ Ô Ð Ð Ð r   c                 óX   — | j         r"| j                              ¦   «          d | _         d S d S r
   )r   Úcloser   s    r   r   zPoe2GgpkReader.close    s3   € ØŒ9ð 	ØŒI�OŠOÑÔÐØˆDŒIˆIˆIð	ð 	r   c                 ó.   — |                       ¦   «          | S r
   )r   r   s    r   Ú	__enter__zPoe2GgpkReader.__enter__%   s   € Ø�	Š	‰ŒˆØˆr   c                 ó.   — |                       ¦   «          d S r
   )r   )r   Úexc_typeÚexc_valÚexc_tbs       r   Ú__exit__zPoe2GgpkReader.__exit__)   s   € Ø�
Š
‰Œˆˆˆr   c                 ó‚  ‡ — ‰ j                              d¦  «         t          j        d‰ j                              d¦  «        ¦  «        \  }}|dk    rt          d|› �¦  «        ‚t          j        d‰ j                              d¦  «        ¦  «        d         }ˆ fd„t          |¦  «        D ¦   «         }|d         ‰ _        d S )	Nr   ú<I4sé   s   GGPKu*   Tá»‡p khÃ´ng cÃ³ magic 'GGPK' há»£p lá»‡: ú<Ié   c                 óv   •— g | ]5}t          j        d ‰j                             d¦  «        ¦  «        d         ‘Œ6S )z<Qr%   r   )ÚstructÚunpackr   Úread)Ú.0Ú_r   s     €r   ú
<listcomp>z4Poe2GgpkReader._read_root_header.<locals>.<listcomp>2   s8   ø€ ÐZÐZÐZÀ•6”=  t¤y§~¢~°aÑ'8Ô'8Ñ9Ô9¸!Ô<ÐZÐZÐZr   )r   Úseekr)   r*   r+   Ú
ValueErrorÚranger   )r   Úlen_rootÚtagÚnum_childrenÚoffsetss   `    r   r   z Poe2GgpkReader._read_root_header,   s±   ø€ ØŒ	�Š�qÑÔÐÝœ f¨d¬i¯nªn¸QÑ.?Ô.?Ñ@Ô@‰ˆ�#Ø�'Š>ˆ>ÝÐOÈ#ÐOÐOÑPÔPÐPÝ”} T¨4¬9¯>ª>¸!Ñ+<Ô+<Ñ=Ô=¸aÔ@ˆØZÐZÐZÐZÅeÈLÑFYÔFYÐZÑZÔZˆØ" 1œ:ˆÔÐÐr   c                 óH   — | j         sg S |                      | j         ¦  «        S )u5   Liá»‡t kÃª cÃ¡c thÆ° má»¥c vÃ  tá»‡p gá»‘c trong GGPK)r   Ú_list_pdir_entriesr   s    r   Úlist_root_entriesz Poe2GgpkReader.list_root_entries5   s)   € àÔð 	ØˆIØ×&Ò& tÔ'7Ñ8Ô8Ð8r   Úpdir_offsetc                 óÊ  — | j                              |¦  «         t          j        d| j                              d¦  «        ¦  «        \  }}|dk    rg S t          j        d| j                              d¦  «        ¦  «        d         }t          j        d| j                              d¦  «        ¦  «        d         }| j                              d¦  «        }| j                              |dz  ¦  «                             d	d
¬¦  «                             d¦  «        }g }t          |¦  «        D �]8}	t          j        d| j                              d¦  «        ¦  «        \  }
}| j                              ¦   «         }| j                              |¦  «         t          j        d| j                              d¦  «        ¦  «        \  }}t          j        d| j                              d¦  «        ¦  «        d         }|dk    r®t          j        d| j                              d¦  «        ¦  «        d         }| j                              d¦  «        }| j                              |dz  ¦  «                             d	d
¬¦  «                             d¦  «        }| 	                    |d|||dœ¦  «         n¡|dk    r›| j                              d¦  «        }| j                              |dz  ¦  «                             d	d
¬¦  «                             d¦  «        }| 	                    |d||| j                              ¦   «         |d|dz  z   z
  dœ¦  «         | j                              |¦  «         �Œ:|S )Nr$   r%   s   PDIRr&   r'   r   é    é   úutf-16leÚreplace©Úerrorsú z<IQé   ÚDIR)ÚnameÚtypeÚoffsetÚlengthÚentriesó   FILEÚFILEé,   )rD   rE   rF   rG   Údata_offsetÚ	data_size)
r   r/   r)   r*   r+   ÚdecodeÚrstripr1   ÚtellÚappend)r   r9   rG   r3   Úname_lenÚentries_cntÚ_sha256Ú	_dir_nameÚresultsr-   Ú	name_hashrF   ÚposÚ	child_lenÚ	child_tagÚchild_name_lenÚchild_entriesÚ
_child_shaÚ
child_names                      r   r7   z!Poe2GgpkReader._list_pdir_entries;   sÿ  € ØŒ	�Š�{Ñ#Ô#Ð#Ý”m F¨D¬I¯NªN¸1Ñ,=Ô,=Ñ>Ô>‰ˆ�Ø�'Š>ˆ>ØˆIÝ”=  t¤y§~¢~°aÑ'8Ô'8Ñ9Ô9¸!Ô<ˆÝ”m D¨$¬)¯.ª.¸Ñ*;Ô*;Ñ<Ô<¸QÔ?ˆØ”)—.’. Ñ$Ô$ˆØ”I—N’N 8¨a¡<Ñ0Ô0×7Ò7¸
È9Ð7ÑUÔU×\Ò\Ð]cÑdÔdˆ	àˆÝ�{Ñ#Ô#ð 	 ñ 	 ˆAÝ &¤¨e°T´Y·^²^ÀBÑ5GÔ5GÑ HÔ HÑˆI�vØ”)—.’.Ñ"Ô"ˆCØŒI�NŠN˜6Ñ"Ô"Ð"Ý#)¤=°¸¼¿ºÈÑ9JÔ9JÑ#KÔ#KÑ ˆI�yÝ#œ]¨4°´·²ÀÑ1BÔ1BÑCÔCÀAÔFˆNØ˜GÒ#Ð#Ý &¤¨d°D´I·N²NÀ1Ñ4EÔ4EÑ FÔ FÀqÔ I�Ø!œYŸ^š^¨BÑ/Ô/�
Ø!œYŸ^š^¨N¸QÑ,>Ñ?Ô?×FÒFÀzÐZcÐFÑdÔd×kÒkÐlrÑsÔs�
Ø—’Ø&Ø!Ø$Ø'Ø,ð ð  ñ ô ð ð ð ˜gÒ%Ð%Ø!œYŸ^š^¨BÑ/Ô/�
Ø!œYŸ^š^¨N¸QÑ,>Ñ?Ô?×FÒFÀzÐZcÐFÑdÔd×kÒkÐlrÑsÔs�
Ø—’Ø&Ø"Ø$Ø'Ø#'¤9§>¢>Ñ#3Ô#3Ø!*¨j¸>ÈAÑ;MÑ.MÑ!Nð ð  ñ ô ð ð ŒI�NŠN˜3ÑÔÐÑØˆr   Úfile_offsetÚout_pathÚreturnc           	      óÄ  — | j                              |¦  «         t          j        d| j                              d¦  «        ¦  «        \  }}|dk    r"t          dt          |¦  «        › d|› �¦  «        ‚t          j        d| j                              d¦  «        ¦  «        d         }| j                              d	¦  «        }| j                              |d
z  ¦  «                             dd¬¦  «                             d¦  «        }d|d
z  z   }||z
  }	t          |¦  «        j
                             dd¬¦  «         t          |d¦  «        5 }
|	}d}|dk    rZt          ||¦  «        }| j                              |¦  «        }|sn-|
                     |¦  «         |t          |¦  «        z  }|dk    °Zddd¦  «         n# 1 swxY w Y   t!          d|› d|› d|	› d�¦  «         |	S )u;   TrÃ­ch xuáº¥t má»™t file tá»« GGPK sang Ä‘Ä©a báº±ng offsetr$   r%   rI   zOffset u     khÃ´ng pháº£i lÃ  record FILE: r&   r'   r   r;   r<   r=   r>   r?   rA   rK   T)ÚparentsÚexist_okÚwbi   Nu   [Extract] Ä�Ã£ trÃ­ch xuáº¥t: z -> ú (z bytes))r   r/   r)   r*   r+   r0   ÚhexrN   rO   r   ÚparentÚmkdirr   ÚminÚwriteÚlenÚprint)r   r_   r`   rY   rZ   r[   r]   r^   Ú
header_lenÚpayload_lenÚout_fÚ	remainingÚ
chunk_sizeÚto_readÚbufs                  r   Úextract_file_by_offsetz%Poe2GgpkReader.extract_file_by_offsete   s  € àŒ	�Š�{Ñ#Ô#Ð#Ý%œ}¨V°T´Y·^²^ÀAÑ5FÔ5FÑGÔGÑˆ	�9Ø˜ÒÐÝÐd¥s¨;Ñ'7Ô'7ÐdÐdÐYbÐdÐdÑeÔeÐeÝœ t¨T¬Y¯^ª^¸AÑ->Ô->Ñ?Ô?ÀÔBˆØ”Y—^’^ BÑ'Ô'ˆ
Ø”Y—^’^ N°QÑ$6Ñ7Ô7×>Ò>¸zÐR[Ð>Ñ\Ô\×cÒcÐdjÑkÔkˆ
à .°1Ñ"4Ñ4ˆ
Ø *Ñ,ˆåˆX‰ŒÔ×#Ò#¨D¸4Ð#Ñ@Ô@Ð@Ý�(˜DÑ!Ô!ð 		& UØ#ˆIØ$ˆJØ˜a’-�-Ý˜i¨Ñ4Ô4�Ø”i—n’n WÑ-Ô-�Øð ØØ—’˜CÑ Ô Ð Ø�S ™XœXÑ%�	ð ˜a’-�-ð		&ð 		&ð 		&ñ 		&ô 		&ð 		&ð 		&ð 		&ð 		&ð 		&ð 		&øøøð 		&ð 		&ð 		&ð 		&õ 	Ð_¨zÐ_Ð_¸xÐ_Ð_È;Ð_Ð_Ð_Ñ`Ô`Ð`ØÐs   ÅA%F<Æ<G ÇG N)Ú__name__Ú
__module__Ú__qualname__ÚDEFAULT_GGPK_PATHÚstrr   r   r   r   r"   r   r8   Úintr7   ru   © r   r   r   r      sÖ   € € € € € Ø(9ð  ð   #ð  ð  ð  ð  ð
!ð !ð !ðð ð ð
ð ð ðð ð ð&ð &ð &ð9ð 9ð 9ð(¨cð (ð (ð (ð (ðT°#ð Àð Èð ð ð ð ð ð r   r   c                  óÔ  — t          j        d¬¦  «        } |                      dt          d¬¦  «         |                      ddd¬	¦  «         |                      d
dd¬	¦  «         |                      ddd¬¦  «         |                      ¦   «         }t          d¦  «         t          d¦  «         t          d¦  «         t          j                             |j	        ¦  «        st          d|j	        › �¦  «         d S t          |j	        ¦  «        5 }t          d|j	        › �¦  «         |                     ¦   «         }t          dt          |¦  «        › d�¦  «         t          |¦  «        D ]æ\  }}d|d         › d�}|d         dk    rd|d         › �nd|d         d›d�}t          d|d z   d!›d"|d#›d$|d%         › d&|› d't          |d(         ¦  «        › �
¦  «         |j        rn|d         d)k    rb|d%                              d*¦  «        rGt          j                             |j        |d%         ¦  «        }|                     |d(         |¦  «         Œç	 d d d ¦  «         d S # 1 swxY w Y   d S )+Nz#AutoPOE2 GGPK Direct Data Extractor)Údescriptionz--ggpku!   Ä�Æ°á»�ng dáº«n file Content.ggpk)ÚdefaultÚhelpz--listÚ
store_trueu&   Liá»‡t kÃª cÃ¡c má»¥c gá»‘c trong GGPK)Úactionr€   z--extract-root-filesu/   TrÃ­ch xuáº¥t cÃ¡c tá»‡p cáº¥u hÃ¬nh text gá»‘cz	--out-dirz./assets/ggpk_extractedu   ThÆ° má»¥c xuáº¥t tá»‡pz1=================================================z1   AutoPOE2 - GGPK Direct Data Extractor         u   [Error] KhÃ´ng tÃ¬m tháº¥y: u   [GGPK] Ä�Ã£ má»Ÿ container: u   [Root Entries] TÃ¬m tháº¥y u    má»¥c:ú[rE   ú]rC   zentries=rH   zsize=rM   ú,z Bz  é   Ú02dz. Ú6sú rD   rf   z) @ rF   rJ   )z.txtz.jpgz.wav)ÚargparseÚArgumentParserÚadd_argumentry   Ú
parse_argsrm   r   r   r   Úggpkr   r8   rl   Ú	enumeraterg   Úextract_root_filesÚendswithÚjoinÚout_dirru   )	ÚparserÚargsÚreaderrH   ÚidxÚentÚtype_strÚextraÚdests	            r   Úmainrœ   �   sù  € ÝÔ$Ð1VÐWÑWÔW€FØ
×Ò˜Õ*;ÐBeÐÑfÔfÐfØ
×Ò˜¨Ð<dÐÑeÔeÐeØ
×ÒÐ.°|ÐJ{ÐÑ|Ô|Ð|Ø
×Ò˜Ð-FÐMfÐÑgÔgÐgà×ÒÑÔ€Då	Ð
=Ñ>Ô>Ð>Ý	Ð
=Ñ>Ô>Ð>Ý	Ð
=Ñ>Ô>Ð>åŒ7�>Š>˜$œ)Ñ$Ô$ð ÝÐ8¨T¬YÐ8Ð8Ñ9Ô9Ð9Øˆå	˜œ	Ñ	"Ô	"ð C fÝÐ8¨T¬YÐ8Ð8Ñ9Ô9Ð9Ø×*Ò*Ñ,Ô,ˆÝÐA­C°©L¬LÐAÐAÐAÑBÔBÐBÝ! 'Ñ*Ô*ð 	Cð 	C‰HˆC�Ø)˜3˜vœ;Ð)Ð)Ð)ˆHØ36°v´;À%Ò3GÐ3GÐ/˜s 9œ~Ð/Ð/Ð/ÐMkÐUXÐYdÔUeÐMkÐMkÐMkÐMkˆEÝÐb�s˜Q‘wÐbÐbÐb hÐbÐbÐb°C¸´KÐbÐbÀ5ÐbÐbÍcÐRUÐV^ÔR_ÑN`ÔN`ÐbÐbÑcÔcÐcàÔ&ð C¨3¨v¬;¸&Ò+@Ð+@ÀSÈÄ[×EYÒEYÐZrÑEsÔEsÐ+@Ý”w—|’| D¤L°#°f´+Ñ>Ô>�Ø×-Ò-¨c°(¬m¸TÑBÔBÐBøð	Cð	Cð Cð Cñ Cô Cð Cð Cð Cð Cð Cð Cð Cøøøð Cð Cð Cð Cð Cð Cs   ÄEIÉI!É$I!Ú__main__)Ú__doc__rŠ   r   r)   ÚsysÚpathlibr   ÚhasattrÚstdoutr   Ústderrry   r   rœ   rv   r|   r   r   ú<module>r¤      s  ððð ð €€€Ø 	€	€	€	Ø €€€Ø 
€
€
€
Ø Ð Ð Ð Ð Ð à
€7ˆ3Œ:�}Ñ%Ô%ð -Ø„J×Ò GÐÑ,Ô,Ð,Ø
€7ˆ3Œ:�}Ñ%Ô%ð -Ø„J×Ò GÐÑ,Ô,Ð,à^Ð ðkð kð kð kð kñ kô kð kðZCð Cð Cð< ˆzÒÐØ€D�F„F€F€F€Fð Ðr   