§
    —Çj‰6  ã                  óR  — d Z ddlmZ 	 ddlZn# e$ r dZY nw xY wddlZddlZddlmZ ddlm	Z	m
Z
 ddlmZmZmZmZ ddlmZmZmZmZmZ ddlmZ dd	lmZ dd
lmZ erddlmZ ddlmZ ddl m!Z! ddl"m#Z# dZ$ G d„ d¦  «        Z% edd¬¦  «         G d„ d¦  «        ¦   «         Z&dS )z2Pure-Python reader for the MaxMind DB file format.é    )ÚannotationsN)Ú	dataclass)ÚIPv4AddressÚIPv6Address)ÚIOÚTYPE_CHECKINGÚAnyÚAnyStr)Ú	MODE_AUTOÚMODE_FDÚ	MODE_FILEÚMODE_MEMORYÚ	MODE_MMAP)ÚDecoder)ÚInvalidDatabaseError)Ú
FileBuffer)ÚIterator)ÚPathLike)ÚSelf)ÚRecordl        c                  óÚ   — e Zd ZU dZdZdZded<   ded<   ded	<   d
ed<   ded<   ded<   ded<   efd6d„Zd7d„Z	d8d„Z
d9d„Zd:d„Zd;d"„Zd<d&„Zd=d(„Zd>d+„Zd?d.„Zefd@d0„ZdAd1„ZdAd2„ZdBd4„Zd5S )CÚReaderz…A pure Python implementation of a reader for the MaxMind DB format.

    IP addresses can be looked up using the ``get`` method.
    é   s   «ÍïMaxMind.comz bytes | FileBuffer | 'mmap.mmap'Ú_bufferÚintÚ_buffer_sizeÚboolÚclosedr   Ú_decoderÚMetadataÚ	_metadataÚ_record_sizeÚ_ipv4_startÚdatabaseúAnyStr | int | PathLike | IOÚmodeÚreturnÚNonec                óX  — |                       ||¦  «        }	 | j                             | j        t	          d| j        dz
  ¦  «        ¦  «        }|dk    rd|› d�}t          |¦  «        ‚|t          | j        ¦  «        z  }t          | j        |¦  «        }| 	                    |¦  «        \  }}t          |t          ¦  «        sd|› d�}t          |¦  «        ‚t          di |¤Ž| _        | j        j        | _        | j        dvrd	| j        › �}t          |¦  «        ‚| j        j        dk     rd
| j        j        › �}t          |¦  «        ‚| j        j        | j        z   }	|	| j        k    rd|› d�}t          |¦  «        ‚t          | j        | j        j        | j        z   ¦  «        | _        d| _        d}
| j        j        dk    r>d}t-          d¦  «        D ]*}|| j        j        k    r n|                      |d¦  «        }Œ+|}
|
| _        dS # t2          $ r |                      ¦   «          ‚ w xY w)a»  Reader for the MaxMind DB file format.

        Arguments:
            database: A path to a valid MaxMind DB file such as a GeoIP database
                      file, or a file descriptor in the case of MODE_FD.
            mode: mode to open the database with. Valid mode are:
                  * MODE_MMAP - read from memory map.
                  * MODE_FILE - read database as standard file.
                  * MODE_MEMORY - load database into memory.
                  * MODE_AUTO - tries MODE_MMAP and then MODE_FILE. Default.
                  * MODE_FD - the param passed via database is a file descriptor, not
                              a path. This mode implies MODE_MEMORY.

        r   i   éÿÿÿÿzError opening database file (z#). Is this a valid MaxMind DB file?z)Error reading metadata in database file (z).)é   é   é    úUnknown record size: zInvalid node count: z4). The search tree extends past the end of the file.Fé   é`   N© )Ú_load_bufferr   ÚrfindÚ_METADATA_START_MARKERÚmaxr   r   Úlenr   ÚdecodeÚ
isinstanceÚdictr    r!   Úrecord_sizer"   Ú
node_countÚsearch_tree_sizeÚ_DATA_SECTION_SEPARATOR_SIZEr   r   Ú
ip_versionÚrangeÚ
_read_noder#   ÚBaseExceptionÚclose)Úselfr$   r&   ÚfilenameÚmetadata_startÚmsgÚmetadata_decoderÚmetadataÚ_Útree_endÚ
ipv4_startÚnodes               úAC:\Projects\Historical\venv\Lib\site-packages\maxminddb/reader.pyÚ__init__zReader.__init__1   s¡  € ð& ×$Ò$ X¨tÑ4Ô4ˆðC	Ø!œ\×/Ò/ØÔ+Ý�A�tÔ(¨:Ñ5Ñ6Ô6ñô ˆNð
  Ò#Ð#ð7°Hð 7ð 7ð 7ð õ +Øñô ð ð �c $Ô"=Ñ>Ô>Ñ>ˆNÝ& t¤|°^ÑDÔDÐØ,×3Ò3°NÑCÔC‰MˆX�qå˜h­Ñ-Ô-ð ØNÀ(ÐNÐNÐN�Ý*Øñô ð õ &Ð1Ð1¨Ð1Ð1ˆDŒNØ $¤Ô :ˆDÔØÔ ¨Ð4Ð4ØA¨dÔ.?ÐAÐA�Ý*¨3Ñ/Ô/Ð/ØŒ~Ô(¨1Ò,Ð,ØH¨T¬^Ô-FÐHÐH�Ý*¨3Ñ/Ô/Ð/ð
 ”Ô/°$Ô2SÑSð ð ˜$Ô+Ò+Ð+ð8°Hð 8ð 8ð 8ð õ +¨3Ñ/Ô/Ð/å#Ø”Ø”Ô/°$Ô2SÑSñô ˆDŒMð  ˆDŒKàˆJØŒ~Ô(¨AÒ-Ð-ð �Ý˜r™œð 4ð 4�AØ˜tœ~Ô8Ò8Ð8Ø˜ØŸ?š?¨4°Ñ3Ô3�D�DØ!�
Ø)ˆDÔÐÐøÝð 	ð 	ð 	à�JŠJ‰LŒLˆLØð	øøøs   ˜G/H	 È	 H)c                ó   — | j         S )z8Return the metadata associated with the MaxMind DB file.)r!   ©rC   s    rM   rH   zReader.metadata�   s
   € àŒ~Ðó    Ú
ip_addressústr | IPv6Address | IPv4AddressúRecord | Nonec                ó6   — |                       |¦  «        \  }}|S )z›Return the record for the ip_address in the MaxMind DB.

        Arguments:
            ip_address: an IP address in the standard string notation

        )Úget_with_prefix_len)rC   rR   ÚrecordrI   s       rM   Úgetz
Reader.get‘   s    € ð ×.Ò.¨zÑ:Ô:‰ˆ�ØˆrQ   útuple[Record | None, int]c                ó˜  — t          |t          ¦  «        rt          j        |¦  «        }n|}	 t	          |j        ¦  «        }n$# t          $ r}d}t          |¦  «        |‚d}~ww xY w|j        dk    r%| j	        j
        dk    rd|› d�}t          |¦  «        ‚|                      |¦  «        \  }}|r|                      |¦  «        |fS d|fS )z¤Return a tuple with the record and the associated prefix length.

        Arguments:
            ip_address: an IP address in the standard string notation

        z/argument 1 must be a string or ipaddress objectNr/   é   zError looking up zD. You attempted to look up an IPv6 address in an IPv4-only database.)r8   ÚstrÚ	ipaddressrR   Ú	bytearrayÚpackedÚAttributeErrorÚ	TypeErrorÚversionr!   r>   Ú
ValueErrorÚ_find_address_in_treeÚ_resolve_data_pointer)rC   rR   ÚaddressÚpacked_addressÚexrF   ÚpointerÚ
prefix_lens           rM   rV   zReader.get_with_prefix_len›   s  € õ �j¥#Ñ&Ô&ð 	!ÝÔ*¨:Ñ6Ô6ˆGˆGà ˆGð	)Ý& w¤~Ñ6Ô6ˆNˆNøÝð 	)ð 	)ð 	)ØCˆCÝ˜C‘.”. bÐ(øøøøð	)øøøð Œ?˜aÒÐ D¤NÔ$=ÀÒ$BÐ$Bð< Jð <ð <ð <ð õ Øñô ð ð !%× :Ò :¸>Ñ JÔ JÑˆ�*àð 	CØ×-Ò-¨gÑ6Ô6¸
ÐBÐBØ�ZÐÐs   ®A Á
A$ÁAÁA$r   c                ó0   — |                       ddd¦  «        S )Nr   )Ú_generate_childrenrP   s    rM   Ú__iter__zReader.__iter__¿   s   € Ø×&Ò& q¨!¨QÑ/Ô/Ð/rQ   rL   ÚdepthÚip_accc              #  ó  K  — |dk    r|| j         k    rd S | j        j        }||k    ra| j        j        dk    rdnd}|||z
  z  }|t          k    r|dk    r|dz  }t          j        ||f¦  «        |                      |¦  «        fV — d S ||k     ru|                      |d¦  «        }|dz  }|dz  }|  	                    |||¦  «        E d {V —† |                      |d¦  «        }|  	                    |||dz  ¦  «        E d {V —† d S d S )Nr   r/   é€   r-   r0   é   )
r#   r!   r;   r>   Ú_IPV4_MAX_NUMr]   Ú
ip_networkre   r@   rl   )rC   rL   rn   ro   r;   ÚbitsÚleftÚrights           rM   rl   zReader._generate_childrenÂ   si  è è € Ø�QŠ;ˆ;˜4 4Ô#3Ò3Ð3àˆFà”^Ô.ˆ
Ø�*ÒÐØœ.Ô3°qÒ8Ð8�3�3¸bˆDØ�t˜e‘|Ñ#ˆFØ�Ò&Ð&¨4°3ª;¨;Ø˜‘�åÔ$ f¨e _Ñ5Ô5Ø×*Ò*Øñô ðð ð ð ð ð ð �JÒÐØ—?’? 4¨Ñ+Ô+ˆDØ�q‰LˆFØ�Q‰JˆEØ×.Ò.¨t°U¸FÑCÔCÐCÐCÐCÐCÐCÐCÐCØ—O’O D¨!Ñ,Ô,ˆEØ×.Ò.¨u°e¸VÀa¹ZÑHÔHÐHÐHÐHÐHÐHÐHÐHÐHÐHð ÐrQ   r_   r^   útuple[int, int]c                óJ  — t          |¦  «        dz  }|                      |¦  «        }| j        j        }d}||k     rD||k     r>d||dz	           d|dz  z
  z	  z  }|                      ||¦  «        }|dz   }||k     r||k     °>||k    rd|fS ||k    r||fS d}t          |¦  «        ‚)Né   r   rr   é   é   zInvalid node in search tree)r6   Ú_start_noder!   r;   r@   r   )rC   r_   Ú	bit_countrL   r;   ÚiÚbitrF   s           rM   rd   zReader._find_address_in_treeÛ   sÓ   € Ý˜‘K”K !‘Oˆ	Ø×Ò 	Ñ*Ô*ˆØ”^Ô.ˆ
àˆØ�)Šmˆm  zÒ 1Ð 1Ø�v˜a 1™f”~¨¨a°!©e©Ñ4Ñ5ˆCØ—?’? 4¨Ñ-Ô-ˆDØ�A‘ˆAð �)Šmˆm  zÒ 1Ð 1ð
 �:ÒÐà�a�4ˆKØ�*ÒÐØ˜�7ˆNà+ˆÝ" 3Ñ'Ô'Ð'rQ   Úlengthc                ó@   — | j         j        dk    r|dk    r| j        S dS )Nr/   r-   r   )r!   r>   r#   )rC   r�   s     rM   r}   zReader._start_nodeï   s(   € ØŒ>Ô$¨Ò)Ð)¨f¸ªl¨lØÔ#Ð#ØˆqrQ   Únode_numberÚindexc                ó  — | j         }|dk    ru|dz  }|r5|dz   }t                               | j        ||dz   …         d¦  «        }|dz  S t                               | j        ||dz   …         d¦  «        }|dz	  |dz  d	z  z  S |d
k    r6|dz  |dz  z   }t                               | j        ||dz   …         d¦  «        S |dk    r6|dz  |dz  z   }t                               | j        ||dz   …         d¦  «        S d|› �}t	          |¦  «        ‚)Nr,   r|   r{   r[   Úbigiÿÿÿrz   éð   é   r+   r/   r-   r.   )r"   r   Ú
from_bytesr   r   )rC   rƒ   r„   r:   Úbase_offsetÚoffsetrW   rF   s           rM   r@   zReader._read_nodeô   s8  € ØÔ'ˆØ˜"ÒÐð &¨™/ˆKØð +Ø$ q™�ÝŸš¨¬°V¸fÀq¹jÐ5HÔ(IÈ5ÑQÔQ�Ø 
Ñ*Ð*Ý—^’^ D¤L°¸{ÈQ¹Ð1NÔ$OÐQVÑWÔWˆFØ˜a‘K V¨d¡]°rÑ$9Ñ:Ð:Ø˜"ÒÐØ  1‘_ u¨q¡yÑ0ˆFÝ—>’> $¤,¨v¸À¹
Ð/BÔ"CÀUÑKÔKÐKØ˜"ÒÐØ  1‘_ u¨q¡yÑ0ˆFÝ—>’> $¤,¨v¸À¹
Ð/BÔ"CÀUÑKÔKÐKØ3 kÐ3Ð3ˆÝ" 3Ñ'Ô'Ð'rQ   ri   r   c                ó°   — || j         j        z
  | j         j        z   }|| j        k    rd}t	          |¦  «        ‚| j                             |¦  «        \  }}|S )Nz,The MaxMind DB file's search tree is corrupt)r!   r;   r<   r   r   r   r7   )rC   ri   ÚresolvedrF   ÚdatarI   s         rM   re   zReader._resolve_data_pointer	  sZ   € Ø˜Tœ^Ô6Ñ6¸¼Ô9XÑXˆà�tÔ(Ò(Ð(Ø@ˆCÝ& sÑ+Ô+Ð+à”M×(Ò(¨Ñ2Ô2‰	ˆˆqØˆrQ   r\   c                ó”  — |t           k    rt          s|t          k    r‚t          |d¦  «        5 }t          j        |                     ¦   «         dt          j        ¬¦  «        | _        | j                             ¦   «         | _        d d d ¦  «         n# 1 swxY w Y   |}�n(|t           t          fv r5t          |¦  «        | _        | j                             ¦   «         | _        |}nã|t          k    rZt          |d¦  «        5 }|                     ¦   «         }|| _        t          |¦  «        | _        d d d ¦  «         n# 1 swxY w Y   |}n~|t          k    r^|                     ¦   «         | _        t          | j        ¦  «        | _        t          |d¦  «        r|j        }n)dt#          |¦  «        › d�}nd|› d�}t%          |¦  «        ‚|S )	NÚrbr   )ÚaccessÚnameú<ú>zUnsupported open mode (z]). Only MODE_AUTO, MODE_FILE, MODE_MEMORY and MODE_FD are supported by the pure Python Reader)r   Úmmapr   ÚopenÚfilenoÚACCESS_READr   Úsizer   r   r   r   Úreadr6   r   Úhasattrr’   Útyperc   )rC   r$   r&   Údb_filerD   ÚbufrF   s          rM   r2   zReader._load_buffer  s.  € ð •IÒÐ¥$Ð¨4µ9Ò+<Ð+<Ý�h Ñ%Ô%ð 8¨Ý#œy¨¯ªÑ)9Ô)9¸1ÅTÔEUÐVÑVÔV�”Ø$(¤L×$5Ò$5Ñ$7Ô$7�Ô!ð8ð 8ð 8ñ 8ô 8ð 8ð 8ð 8ð 8ð 8ð 8øøøð 8ð 8ð 8ð 8ð  ˆH‰HØ•i¥Ð+Ð+Ð+Ý% hÑ/Ô/ˆDŒLØ $¤× 1Ò 1Ñ 3Ô 3ˆDÔØˆHˆHØ•[Ò Ð Ý�h Ñ%Ô%ð -¨Ø—l’l‘n”n�Ø"�”Ý$'¨¡H¤H�Ô!ð-ð -ð -ñ -ô -ð -ð -ð -ð -ð -ð -øøøð -ð -ð -ð -ð  ˆHˆHØ•WŠ_ˆ_Ø#Ÿ=š=™?œ?ˆDŒLÝ # D¤LÑ 1Ô 1ˆDÔå�x Ñ(Ô(ð 1Ø#œ=��à0�t H™~œ~Ð0Ð0Ð0��ð¨$ð ð ð ð õ
 Øñô ð ð ˆs$   ®ABÂBÂBÄ 0D<Ä<E ÅE c                ó¨   — t          j        t          ¦  «        5  | j                             ¦   «          ddd¦  «         n# 1 swxY w Y   d| _        dS )zšClose the MaxMind DB file and returns the resources to the system.

        Calling this method while reads are in progress may cause exceptions.
        NT)Ú
contextlibÚsuppressr`   r   rB   r   rP   s    rM   rB   zReader.close:  s‹   € õ
 Ô ¥Ñ0Ô0ð 	!ð 	!ØŒL×ÒÑ Ô Ð ð	!ð 	!ð 	!ñ 	!ô 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!øøøð 	!ð 	!ð 	!ð 	!ð ˆŒˆˆs   šA Á AÁAc                ó.   — |                       ¦   «          d S )N)rB   )rC   rI   s     rM   Ú__exit__zReader.__exit__D  s   € Ø�
Š
‰ŒˆˆˆrQ   r   c                ó6   — | j         rd}t          |¦  «        ‚| S )Nz%Attempt to reopen a closed MaxMind DB)r   rc   )rC   rF   s     rM   Ú	__enter__zReader.__enter__G  s"   € ØŒ;ð 	"Ø9ˆCÝ˜S‘/”/Ð!ØˆrQ   N)r$   r%   r&   r   r'   r(   )r'   r    )rR   rS   r'   rT   )rR   rS   r'   rY   )r'   r   )rL   r   rn   r   ro   r   r'   r   )r_   r^   r'   rx   )r�   r   r'   r   )rƒ   r   r„   r   r'   r   )ri   r   r'   r   )r$   r%   r&   r   r'   r\   )r'   r(   )r'   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r=   r4   Ú__annotations__r   rN   rH   rX   rV   rm   rl   rd   r}   r@   re   r2   rB   r£   r¥   r1   rQ   rM   r   r       s¹  € € € € € € ðð ð
 $&Ð Ø7Ðà-Ð-Ð-Ñ-ØÐÐÑØ€L€L�LØÐÐÑØÐÐÑØÐÐÑØÐÐÑð
 ðZð Zð Zð Zð Zðxð ð ð ðð ð ð ð" ð " ð " ð " ðH0ð 0ð 0ð 0ðIð Ið Ið Ið2(ð (ð (ð (ð(ð ð ð ð
(ð (ð (ð (ð*ð ð ð ð CLð%ð %ð %ð %ð %ðNð ð ð ðð ð ð ðð ð ð ð ð rQ   r   T)Úkw_onlyÚfrozenc                  ó°   — e Zd ZU dZded<   	 ded<   	 ded<   	 ded<   	 ded	<   	 ded
<   	 ded<   	 ded<   	 ded<   	 edd„¦   «         Zedd„¦   «         ZdS )r    z#Metadata for the MaxMind DB reader.r   Úbinary_format_major_versionÚbinary_format_minor_versionÚbuild_epochr\   Údatabase_typezdict[str, str]Údescriptionr>   z	list[str]Ú	languagesr;   r:   r'   c                ó   — | j         dz  S )zThe size of a node in bytes.r[   )r:   rP   s    rM   Únode_byte_sizezMetadata.node_byte_sizew  s   € ð Ô 1Ñ$Ð$rQ   c                ó    — | j         | j        z  S )zThe size of the search tree.)r;   rµ   rP   s    rM   r<   zMetadata.search_tree_size|  s   € ð Œ Ô!4Ñ4Ð4rQ   N)r'   r   )r¦   r§   r¨   r©   rª   Úpropertyrµ   r<   r1   rQ   rM   r    r    N  sç   € € € € € € à-Ð-à$Ð$Ð$Ñ$ðð
 %Ð$Ð$Ñ$ðð
 ÐÐÑØ<àÐÐÑØFàÐÐÑØBà€O€O�Oðð ÐÐÑØ;à€O€O�OØ.àÐÐÑØ6àð%ð %ð %ñ „Xð%ð ð5ð 5ð 5ñ „Xð5ð 5ð 5rQ   r    )'r©   Ú
__future__r   r•   ÚImportErrorr    r]   Údataclassesr   r   r   Útypingr   r   r	   r
   Úmaxminddb.constr   r   r   r   r   Úmaxminddb.decoderr   Úmaxminddb.errorsr   Úmaxminddb.filer   Úcollections.abcr   Úosr   Útyping_extensionsr   Úmaxminddb.typesr   rs   r   r    r1   rQ   rM   ú<module>rÄ      sí  ðØ 8Ð 8à "Ð "Ð "Ð "Ð "Ð "ðØ€K€K€K€KøØð ð ð Ø€D€D€Dðøøøð Ð Ð Ð Ø Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !Ø .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1à QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QØ %Ð %Ð %Ð %Ð %Ð %Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø %Ð %Ð %Ð %Ð %Ð %àð 'Ø(Ð(Ð(Ð(Ð(Ð(ØÐÐÐÐÐà&Ð&Ð&Ð&Ð&Ð&à&Ð&Ð&Ð&Ð&Ð&à€ðkð kð kð kð kñ kô kð kð\	 €�4 Ð%Ñ%Ô%ð05ð 05ð 05ð 05ð 05ñ 05ô 05ñ &Ô%ð05ð 05ð 05s   Š �˜