§
    Ã!¢js  ã                  óž   — d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	m
Z
  ed¬¦  «         G d	„ d
¦  «        ¦   «         Z G d„ d¦  «        ZdS )z<Read-only GGPK container walker (GGPK / PDIR / FILE / FREE).é    )ÚannotationsN)Ú	dataclass)ÚPath)ÚBinaryIOÚIteratorT)Úfrozenc                  óz   — e Zd ZU ded<   ded<   ded<   ded<   ded<   d	Zded
<   d	Zded<   d	Zded<   dZded<   dS )Ú	GgpkEntryÚstrÚnameÚtagÚintÚoffsetÚrecord_lengthÚbytesÚsha256r   Údata_offsetÚ	data_sizeÚchild_countÚ ÚpathN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__r   r   r   r   © ó    ú?C:\Projects\AutoPOE2\src\assistant_tool\ggpk_extract\ggpk_fs.pyr
   r
   
   s€   € € € € € € à€I€I�IØ€H€H�HØ€K€K�KØÐÐÑØ€M€M�MØ€KÐÐÐÑØ€IÐÐÐÑØ€KÐÐÐÑØ€D€N€N€N�N€N€Nr   r
   c                  ó’   — e Zd Zd(d„Zd)d„Zd)d„Zd*d	„Zd)d
„Zed+d„¦   «         Z	d)d„Z
d,d„Zd-d„Z	 	 	 	 d.d/d„Zd0d1d"„Zd2d%„Zd3d'„ZdS )4ÚGgpkFsÚ	ggpk_pathú
str | Pathc                óJ   — t          |¦  «        | _        d | _        d| _        d S )Nr   )r   r   Ú_fhÚroot_offset)Úselfr!   s     r   Ú__init__zGgpkFs.__init__   s$   € Ý˜‘O”OˆŒ	Ø$(ˆŒØ !ˆÔÐÐr   ÚreturnÚNonec                óÂ   — | j                              ¦   «         st          d| j         › �¦  «        ‚t          | j         d¦  «        | _        |                      ¦   «          d S )NzContent.ggpk not found: Úrb)r   Úis_fileÚFileNotFoundErrorÚopenr$   Ú
_read_root©r&   s    r   r.   zGgpkFs.open   s[   € ØŒy× Ò Ñ"Ô"ð 	LÝ#Ð$J¸t¼yÐ$JÐ$JÑKÔKÐKÝ˜œ	 4Ñ(Ô(ˆŒØ�ŠÑÔÐÐÐr   c                óX   — | j         �"| j                              ¦   «          d | _         d S d S ©N)r$   Úcloser0   s    r   r3   zGgpkFs.close#   s/   € ØŒ8ÐØŒH�NŠNÑÔÐØˆDŒHˆHˆHð  Ðr   ú'GgpkFs'c                ó.   — |                       ¦   «          | S r2   )r.   r0   s    r   Ú	__enter__zGgpkFs.__enter__(   s   € Ø�	Š	‰ŒˆØˆr   c                ó.   — |                       ¦   «          d S r2   )r3   )r&   Úexc_typeÚexcÚtbs       r   Ú__exit__zGgpkFs.__exit__,   s   € Ø�
Š
‰Œˆˆˆr   r   c                ó<   — | j         €t          d¦  «        ‚| j         S )NzGGPK is not open)r$   ÚRuntimeErrorr0   s    r   ÚfilezGgpkFs.file/   s    € àŒ8ÐÝÐ1Ñ2Ô2Ð2ØŒxˆr   c                ó”  ‡— | j         Š‰                     d¦  «         t          j        d‰                     d¦  «        ¦  «        \  }}|dk    rt          d|›�¦  «        ‚t          j        d‰                     d¦  «        ¦  «        d         }ˆfd„t          |¦  «        D ¦   «         }|st          d	¦  «        ‚|d         | _        d S )
Nr   ú<I4sé   s   GGPKzInvalid GGPK magic: ú<Ié   c                ól   •— g | ]0}t          j        d ‰                     d¦  «        ¦  «        d         ‘Œ1S )z<QrA   r   ©ÚstructÚunpackÚread©Ú.0Ú_Úfhs     €r   ú
<listcomp>z%GgpkFs._read_root.<locals>.<listcomp><   s4   ø€ ÐQÐQÐQ¸!•6”=  r§w¢w¨q¡z¤zÑ2Ô2°1Ô5ÐQÐQÐQr   zGGPK root has no children)r>   ÚseekrF   rG   rH   Ú
ValueErrorÚranger%   )r&   Úlengthr   Ú
n_childrenÚoffsetsrL   s        @r   r/   zGgpkFs._read_root5   sÂ   ø€ ØŒYˆØ
�Š�‰
Œ
ˆ
Ý”m F¨B¯GªG°A©J¬JÑ7Ô7‰ˆ�Ø�'Š>ˆ>ÝÐ;°CÐ;Ð;Ñ<Ô<Ð<Ý”] 4¨¯ª°©¬Ñ4Ô4°QÔ7ˆ
ØQÐQÐQÐQ½uÀZÑ?PÔ?PÐQÑQÔQˆØð 	:ÝÐ8Ñ9Ô9Ð9Ø" 1œ:ˆÔÐÐr   r   r   r
   c           	     óD  — | j         }|                     |¦  «         t          j        d|                     d¦  «        ¦  «        \  }}|                     dd¦  «        }|dk    rt          dd||d¬	¦  «        S |d
k    rÅt          j        d|                     d¦  «        ¦  «        d         }t          j        d|                     d¦  «        ¦  «        d         }|                     d¦  «        }|                     |dz  ¦  «                             dd¦  «                             d¦  «        }	t          |	d||||¬¦  «        S |dk    r·t          j        d|                     d¦  «        ¦  «        d         }|                     d¦  «        }|                     |dz  ¦  «                             dd¦  «                             d¦  «        }	d|dz  z   }
||
z
  }t          |	d||||                     ¦   «         |¬¦  «        S t          d|›dt          |¦  «        › �¦  «        ‚)Nr@   rA   ÚasciiÚreplaces   FREEr   ÚFREEr   )r   r   r   r   r   ó   PDIRrB   rC   r   é    é   zutf-16leú ÚPDIR)r   r   r   r   r   r   s   FILEé,   ÚFILE)r   r   r   r   r   r   r   zUnknown GGPK tag z at )r>   rN   rF   rG   rH   Údecoder
   ÚrstripÚtellrO   Úhex)r&   r   rL   rQ   r   Útag_sÚname_lenr   Úshar   Ú
header_lenr   s               r   Ú
read_entryzGgpkFs.read_entryA   s  € ØŒYˆØ
�Š�‰ŒˆÝ”m F¨B¯GªG°A©J¬JÑ7Ô7‰ˆ�Ø—
’
˜7 IÑ.Ô.ˆØ�'Š>ˆ>Ý "¨&¸ÈvÐ^aÐbÑbÔbÐbØ�'Š>ˆ>Ý”} T¨2¯7ª7°1©:¬:Ñ6Ô6°qÔ9ˆHÝ œ-¨¨b¯gªg°a©j¬jÑ9Ô9¸!Ô<ˆKØ—'’'˜"‘+”+ˆCØ—7’7˜8 a™<Ñ(Ô(×/Ò/°
¸IÑFÔF×MÒMÈfÑUÔUˆDÝØØØØ$ØØ'ðñ ô ð ð �'Š>ˆ>Ý”} T¨2¯7ª7°1©:¬:Ñ6Ô6°qÔ9ˆHØ—'’'˜"‘+”+ˆCØ—7’7˜8 a™<Ñ(Ô(×/Ò/°
¸IÑFÔF×MÒMÈfÑUÔUˆDØ# h°¡lÑ2ˆJØ Ñ+ˆIÝØØØØ$ØØŸGšG™IœIØ#ðñ ô ð õ ÐE¨SÐEÐE½¸F¹¼ÐEÐEÑFÔFÐFr   Úpdir_offsetúIterator[GgpkEntry]c              #  ó0  ‡	K  — | j         Š	‰	                     |¦  «         t          j        d‰	                     d¦  «        ¦  «        \  }}|dk    rd S t          j        d‰	                     d¦  «        ¦  «        d         }t          j        d‰	                     d¦  «        ¦  «        d         }‰	                     d¦  «         ‰	                     |dz  ¦  «         ˆ	fd	„t          |¦  «        D ¦   «         }|D ]\  }}|                      |¦  «        V — Œd S )
Nr@   rA   rX   rB   rC   r   rY   rZ   c                ó`   •— g | ]*}t          j        d ‰                     d¦  «        ¦  «        ‘Œ+S )z<IQé   rE   rI   s     €r   rM   z,GgpkFs.iter_dir_children.<locals>.<listcomp>p   s/   ø€ ÐTÐTÐT¸A•f”m E¨2¯7ª7°2©;¬;Ñ7Ô7ÐTÐTÐTr   )r>   rN   rF   rG   rH   rP   rg   )
r&   rh   rQ   r   rd   r   Ú
child_ptrsÚ
_name_hashÚ	child_offrL   s
            @r   Úiter_dir_childrenzGgpkFs.iter_dir_childrenf   s  øè è € ØŒYˆØ
�Š�ÑÔÐÝ”m F¨B¯GªG°A©J¬JÑ7Ô7‰ˆ�Ø�'Š>ˆ>ØˆFÝ”=  r§w¢w¨q¡z¤zÑ2Ô2°1Ô5ˆÝ”m D¨"¯'ª'°!©*¬*Ñ5Ô5°aÔ8ˆØ
�Š�‰ŒˆØ
�Š�˜1‘ÑÔÐØTÐTÐTÐTÅÀ{ÑASÔASÐTÑTÔTˆ
Ø%/ð 	-ð 	-Ñ!ˆJ˜	Ø—/’/ )Ñ,Ô,Ð,Ð,Ð,Ð,ð	-ð 	-r   Nr   r   Ú
dir_offsetú
int | NoneÚprefixr   Ú	max_depthÚdepthc              #  óp  K  — |€| j         n|}|                      |¦  «        D ]’}|r|› d|j        › �n|j        }t          |j        |j        |j        |j        |j        |j        |j	        |j
        |¬¦	  «	        V — |j        dk    r.|�||k     r&|                      |j        |||dz   ¦  «        E d {V —† Œ“d S )Nú/)	r   r   r   r   r   r   r   r   r   r\   é   )r%   rp   r   r
   r   r   r   r   r   r   r   Úwalk)r&   rq   rs   rt   ru   ÚstartÚchildr   s           r   ry   zGgpkFs.walkt   s  è è € ð %/Ð$6�Ô Ð ¸JˆØ×+Ò+¨EÑ2Ô2ð 	Oð 	OˆEØ/5ÐE�fÐ+Ð+˜uœzÐ+Ð+Ð+¸5¼:ˆDÝØ”ZØ”IØ”|Ø#Ô1Ø”|Ø!Ô-Øœ/Ø!Ô-Øð
ñ 
ô 
ð 
ð 
ð 
ð Œy˜FÒ"Ð"¨	Ð(9¸UÀYÒ=NÐ=NØŸ9š9 U¤\°4¸ÀEÈAÁIÑNÔNÐNÐNÐNÐNÐNÐNÐNøð	Oð 	Or   rC   Úrelative_pathúGgpkEntry | Nonec                óÐ   — |                      dd¦  «                             d¦  «        }|                      |¬¦  «        D ]%}|j                              dd¦  «        |k    r|c S Œ&d S )Nú\rw   )rt   )rV   Ústripry   r   )r&   r|   rt   ÚwantÚents        r   ÚfindzGgpkFs.findŒ   sr   € Ø×$Ò$ T¨3Ñ/Ô/×5Ò5°cÑ:Ô:ˆØ—9’9 y�9Ñ1Ô1ð 	ð 	ˆCØŒx×Ò  cÑ*Ô*¨dÒ2Ð2Ø�
�
�
ð 3àˆtr   Úentryr   c                óÂ   — |j         dk    rt          |j        › d�¦  «        ‚| j                             |j        ¦  «         | j                             |j        ¦  «        S ©Nr^   z is not a FILE)r   rO   r   r>   rN   r   rH   r   )r&   r„   s     r   Úread_payloadzGgpkFs.read_payload“   sU   € ØŒ9˜ÒÐÝ ¤
Ð:Ð:Ð:Ñ;Ô;Ð;ØŒ	�Š�uÔ(Ñ)Ô)Ð)ØŒy�~Š~˜eœoÑ.Ô.Ð.r   Únbytesc                óÞ   — |j         dk    rt          |j        › d�¦  «        ‚| j                             |j        ¦  «         | j                             t          ||j        ¦  «        ¦  «        S r†   )	r   rO   r   r>   rN   r   rH   Úminr   )r&   r„   rˆ   s      r   Úread_payload_prefixzGgpkFs.read_payload_prefix™   s_   € ØŒ9˜ÒÐÝ ¤
Ð:Ð:Ð:Ñ;Ô;Ð;ØŒ	�Š�uÔ(Ñ)Ô)Ð)ØŒy�~Š~�c &¨%¬/Ñ:Ô:Ñ;Ô;Ð;r   )r!   r"   )r(   r)   )r(   r4   )r(   r   )r   r   r(   r
   )rh   r   r(   ri   )Nr   Nr   )
rq   rr   rs   r   rt   rr   ru   r   r(   ri   )rC   )r|   r   rt   rr   r(   r}   )r„   r
   r(   r   )r„   r
   rˆ   r   r(   r   )r   r   r   r'   r.   r3   r6   r;   Úpropertyr>   r/   rg   rp   ry   rƒ   r‡   r‹   r   r   r   r    r       sF  € € € € € ð"ð "ð "ð "ð
ð ð ð ðð ð ð ð
ð ð ð ðð ð ð ð ðð ð ñ „Xðð

&ð 
&ð 
&ð 
&ð#Gð #Gð #Gð #GðJ-ð -ð -ð -ð  "&ØØ $ØðOð Oð Oð Oð Oð0ð ð ð ð ð/ð /ð /ð /ð<ð <ð <ð <ð <ð <r   r    )Ú__doc__Ú
__future__r   rF   Údataclassesr   Úpathlibr   Útypingr   r   r
   r    r   r   r   ú<module>r’      sà   ðØ BÐ BØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø !Ð !Ð !Ð !Ð !Ð !Ø Ð Ð Ð Ð Ð Ø %Ð %Ð %Ð %Ð %Ð %Ð %Ð %ð €�$ÐÑÔð	ð 	ð 	ð 	ð 	ñ 	ô 	ñ Ôð	ðF<ð F<ð F<ð F<ð F<ñ F<ô F<ð F<ð F<ð F<r   