� J�g�i���ddlZddlmZmZmZmZddlmZddlm Z m Z m Z m Z ddl mZddlmZddlmZmZdd lmZGd �d e��ZGd �d ��Zedd��ZGd�de��ZGd�d��ZGd�d��ZGd�d��ZGd�d��ZGd�de��ZGd�d��ZGd�dee��ZdS)�N)� NamedTuple�Sequence�List�NewType�)� FPDFException)�Align�XPos�YPos�WrapMode)�VectorImageInfo)� preload_image)�MultiLineBreak� FORM_FEED)�get_scale_factorc�$�eZdZUeed<eed<dS)�Extents�left�rightN)�__name__� __module__� __qualname__�float�__annotations__���`/home/asafur/pinokio/api/open-webui.git/app/env/lib/python3.11/site-packages/fpdf/text_region.pyrrs"������� �K�K�K� �L�L�L�L�Lrrc�4��eZdZdZ�fd�Zd�Zd�Zd�Z�xZS)�TextRegionMixinz>Mix-in to be added to FPDF() in order to support text regions.c�b��|���t��j|i|��dS�N)�clear_text_region�super�__init__)�self�args�kwargs� __class__s �rr$zTextRegionMixin.__init__s7��� ��� � � ������$�)�&�)�)�)�)�)rc��||_dSr!��%_TextRegionMixin__current_text_region�r%�regions r�register_text_regionz$TextRegionMixin.register_text_regions��%+��"�"�"rc��|j|kSr!r*r,s r�is_current_text_regionz&TextRegionMixin.is_current_text_regions���)�V�3�3rc��d|_dSr!r*�r%s rr"z!TextRegionMixin.clear_text_region"s��%)��"�"�"r) rrr�__doc__r$r.r0r"� __classcell__�r(s@rrrsk�������H�H�*�*�*�*�*�,�,�,�4�4�4�*�*�*�*�*�*�*rr� Paragraphc�D�eZdZUdZeed<eed<dZeed<dZ eed<dS)� LineWrapperz�Connects each TextLine with the Paragraph it was written to. This allows to access paragraph specific attributes like top/bottom margins when rendering the line. �line� paragraphF� first_line� last_lineN) rrrr3rrr6r;�boolr<rrrr8r8*sS��������� �N�N�N������J������I�t�����rr8c��eZdZd�Zd�ZdS)�Bulletc�>�||_||_||_d|_dS)NF)� fragments� text_line�r_margin� rendered_flag)r%�bullet_fragmentsrB�bullet_r_margins rr$zBullet.__init__7s'�� *���"���'�� �"����rc�L�d}|jD]}||���z }�|S�Nr)rA� get_width)r%�fragments_width�frags r�get_fragments_widthzBullet.get_fragments_widthBs4�����N� 0� 0�D� �t�~�~�/�/� /�O�O��rN)rrrr$rLrrrr?r?6s2������ #� #� #�����rr?c ��eZdZ ddedededed ed ef d �Zd �Zd �Z d�Z ddefd�Z dedefd�Z dd�Z deefd�ZdS)r6Nr�F� top_margin� bottom_margin�indent� bullet_string�skip_leading_spaces�wrapmodec �h�||_|j|_|r\tj|��}|tjtjtjtjfvrtd|j �d����||_ |� |j |_ n||_ ||_ ||_ ||_| |_| �|jj|_nt#j| ��|_g|_|�dt'd��z|jjz }|r)t+g|�||���|�R�|_dSd|_dS)N�AText_align must be 'LEFT', 'CENTER', 'RIGHT', or 'JUSTIFY', not '�'.��mm)�_region�pdfr �coerce�L�C�R�J� ValueError�value� text_align� line_heightrOrPrQrSrTr �_text_fragmentsr�kr?�generate_bullet_frags_and_tl�bullet) r%r-rcrdrOrPrQrFrRrSrTs rr$zParagraph.__init__JsN���� ��:��� � ���j�1�1�J��%�'�5�7�E�G�U�W�!E�E�E� �l�Xb�Xh�l�l�l����%��� � �%�1�D� � �*�D� �$���*����� �#6�� � � � �L�1�D�M�M�$�O�H�5�5�D�M�!��� � "� �"2�4�"8�"8�8�4�8�:�E�O� � � ���2�2�=�/�R�R������D�K�K�K� �D�K�K�Krc��d|j�d|j�d|j�d|j�d|j�d|j�dt |j���d�S) NzParagraph(text_align=z, line_height=z , top_margin=z, bottom_margin=z, skip_leading_spaces=z , wrapmode=z, #text_fragments=�))rcrdrOrPrSrT�lenrer2s r�__str__zParagraph.__str__ys��� =�D�O� =� =�4�CS� =� =�bf�bq� =� =�"�0� =� =�HL�H`� =� =�mq�mz� =� =� #�D�$8� 9� 9� =� =� =� rc��|Sr!rr2s r� __enter__zParagraph.__enter__�s��� rc�8�|j���dSr!)rZ� end_paragraph�r%�exc_type� exc_value� tracebacks r�__exit__zParagraph.__exit__�s�� � �"�"�$�$�$�$�$r�textc� �|jjstd���|j�|���dd��}|j�|d���}|r |D] }||_� |j�|��dS)N�3No font set, you need to call set_font() beforehand� rNF��markdown) r[� font_familyr�normalize_text�replace�_preload_font_styles�linkre�extend)r%rvr��normalized_stringrArKs r�writezParagraph.write�s����x�#� W�� U�V�V� V� �H�3�3�D�9�9�A�A�$��K�K���H�1�1�2C�e�1�T�T� � � !�!� !� !�� �� � � ��#�#�I�.�.�.�.�.rrFc ��|sdS|j�|��}|jjstd���|j�|d���}d}|D]}||���z }�t ||jj|jj|j |z |z z|jjf|j p|jj p tj |j |j|jp |jj���}|���}||fS)NrxFrzr)� max_width�margins�alignrTrdrS)r[r}r|rrrIrrZ�c_marginrQrcr r]rTrdrS�get_line)r%rRrFrErJrK�bullet_line_break�bullet_text_lines rrgz&Paragraph.generate_bullet_frags_and_tl�s#��� ��4���/�/� �>�>� ��x�#� W�� U�V�V� V��8�8�8��QV�8�W�W����$� 0� 0�D� �t�~�~�/�/� /�O�O�*� ��l�,���!�T�[�?�%B�_�%T�U���!���/�G�T�\�%<�G����]��(� $� 8�!0��|�/�  �  �  ��-�5�5�7�7���!1�1�1rc��|jjstd���|�|jj|jz}|j�dd���d}||jz|jd<|j� |��dS)Nrx� Frzr� font_size_pt) r[r|r� font_sizerdrrf�graphics_statere�append)r%�h�fragments r�lnz Paragraph.ln�s����x�#� W�� U�V�V� V� �9���"�T�%5�5�A��8�0�0���0�F�F�q�I��23�h�j�.����/� ��#�#�H�-�-�-�-�-r�returnc ��g}t|j|jj|jj|jz|jjf|jp|jjp tj ||j |j |j p |jj ���}g|_|� ��}d}|�=|�t|||�����d}|� ��}|�=|r*|d}t|j||jd���}||d<|S)N)r�r�r��print_shrTrdrST)r;F�����)r;r<)rrerZrIr[r�rQrcr r]rTrdrSr�r�r8r9r;)r%r�� text_lines�multi_line_breakrBr;�lasts r� build_lineszParagraph.build_lines�s&��� �)� � ��l�,��X�&���4�d�h�6G�H��/�G�T�\�%<�G�����]��(� $� 8�!0��|�/�  �  �  �� "���$�-�-�/�/� �� ��#� � � �k�)�T�j�Q�Q�Q� R� R� R��J�(�1�1�3�3�I��#� � "��b�>�D��� �4�D�O�t����D�"�J�r�N��r) NNrrrNrNFNr!)rrrr�strr=r r$rlrnrur�rgr�rr8r�rrrr6r6Is+��������� ����$)�!�-�-� � -� � -��-��-�"�-��-�-�-�-�^ � � ����%�%�%� /� /�#� /� /� /� /�2�#�2�PU�2�2�2�2�4.�.�.�.��t�K�'8������rc�D�eZdZ d dededefd�Zd�Zd �ZdS) �ImageParagraphNFr�width�height� fill_widthc �p�||_||_|rQtj|��}|tjtjtjfvrtd|j�d����||_ ||_ ||_ ||_ ||_ ||_| |_| |_| |_| |_dx|_|_dS)Nz1Align must be 'LEFT', 'CENTER', or 'RIGHT', not 'rW)r-�namer r\r]r^r_rarbr�r�r�r��keep_aspect_ratiorOrPr��title�alt_text�img�info) r%r-r�r�r�r�r�r�rOrPr�r�r�s rr$zImageParagraph.__init__�s����� ��� � � ��L��'�'�E��U�W�e�g�u�w�7�7�7� �W�� �W�W�W������ ��� ��� �$���!2���$���*����� ��� � �� �#�#���4�9�9�9rc�t�t|jjj|j��\|_|_|_|Sr!)rr-r[� image_cacher�r�r�r2s r� build_linezImageParagraph.build_line�s5��*7� �K�O� '���* �* �&�� �4�8�T�Y�� rc�4�|jstd���t|jt��}|jr|j}n|jd|jjjz }|j r|j }n1|jd|jjjz }||ks|j r|}n|}|js||z|z }||krdS|} |j r>|j tj kr | ||z z } n |j tjkr | ||z dz z } |rM|jj�|j|j|j| d|||j|j|j|j�� � S|jj�|j|j|j| d|||j|j|jd|j�� � S)Nz;ImageParagraph.build_line() must be called before render().r��wrX) r��svgr��x�yr�r�r�r�r�r�) r�r�r�r�r�r�r�r�r�r��dimsr�)r�� RuntimeError� isinstancer�r r�r-r[rfr�r�r�r r_r^� _vector_imager�r�r�r�r�� _raster_image) r%�col_left� col_width� max_height�is_svgr��native_hr��native_wr�s r�renderzImageParagraph.render�s����x� ��M��� ��D�I��7�7�� �;� :�� �A�A��y��~�� ��(9�9�H� �:� �� �A�A��y��~�� ��(9�9�H��)�#�#�t��#�������{� (��H� �x�'�A� �z�>�>��4� �� �:� )��z�U�W�$�$��Y��]�"�����u�w�&�&��i�!�m�q�(�(�� � ��;�?�0�0��Y��H��Y������Y��j���"&�"8�1� � � ��{��,�,��������������*��]��"�4�-�  �  � r� NNNFFrrNNN)rrrrr=r$r�r�rrrr�r��s������� ��� ���� ���!$�!$� � !$� � !$��!$�!$�!$�!$�F���9 �9 �9 �9 �9 rr�c ����eZdZddddddddd�dededed ef�fd �Zd �Zd �Zd �Z dde fd�Z dd�Z dded efd�Z d�Z ddededefd�Z�xZS)�ParagraphCollectorMixinN�LEFTg�?F)rvrcrdr�rSrTr��img_fill_widthrdr�rSrTc���||_tj|��|_|jtjtjtjtjfvrtd|jj �d����||_ ||_ tj|��|_ ||_g|_d|_t#��j|g| �Ri| ��|r|�|��|r|�|| ���dSdS)NrVrW)r�)r[r r\rcr]r^r_r`rarbrdr�r rTrS� _paragraphs�_active_paragraphr#r$r��image) r%r[rvrcrdr�rSrTr�r�r&r'r(s �rr$z ParagraphCollectorMixin.__init__:s �������,�z�2�2��� �?�5�7�E�G�U�W�e�g�"F� F� F��m�TX�Tc�Ti�m�m�m��� �'��� �� � ���1�1�� �#6�� ����!%���������.�t�.�.�.�v�.�.�.� � � �J�J�t� � � � � 7� �J�J�s�~�J� 6� 6� 6� 6� 6� 7� 7rc��|j�|��rtd|jj�d����|jj|_|j���d|j_|j�|��|S)NzUnable to enter the same z context recursively.r) r[r0rr(r�page�_page�_push_local_stackr.r2s rrnz!ParagraphCollectorMixin.__enter__Zs��� �8� *� *�4� 0� 0� ��Z�D�N�,C�Z�Z�Z��� ��X�]�� � ��"�"�$�$�$���� � ��%�%�d�+�+�+�� rc��|j���|j|j_|j���|���dSr!)r[r"r�r��_pop_local_stackr�rqs rruz ParagraphCollectorMixin.__exit__esF�� ��"�"�$�$�$�� ��� � ��!�!�#�#�#� � � � � � � � rc���|jdkrtd���|j�?t||j|j���}|j�|��d|_dSdS)N�EXPLICITzaConflicts with active paragraph. Either close the current paragraph or write your text inside it.)r-rcrS�AUTO�r�rr6rcrSr�r�)r%�ps r�_check_paragraphz(ParagraphCollectorMixin._check_paragraphks��� � !�Z� /� /��s��� � � !� )����?�$(�$<����A� � � #� #�A� &� &� &�%+�D� "� "� "� *� )rrvc�n�|���|jd�|��dS�Nr�)r�r�r�)r%rvr�s rr�zParagraphCollectorMixin.writeys6�� ������ ����"�"�4�(�(�(�(�(rc�n�|���|jd�|��dSr�)r�r�r�)r%r�s rr�zParagraphCollectorMixin.ln}s6�� ������ �������"�"�"�"�"rrrNc ���|jdkrtd���t||p|j||p|j| |||||�� � } |j�| ��d|_| S)a Args: text_align (Align, optional): the horizontal alignment of the paragraph. line_height (float, optional): factor by which the line spacing will be different from the font height. (Default: by region) top_margin (float, optional): how much spacing is added above the paragraph. No spacing will be added at the top of the paragraph if the current y position is at (or above) the top margin of the page. (Default: 0.0) bottom_margin (float, optional): those two values determine how much spacing is added below the paragraph. No spacing will be added at the bottom if it would result in overstepping the bottom margin of the page. (Default: 0.0) indent (float, optional): determines the indentation of the paragraph. (Default: 0.0) bullet_string (str, optional): determines the fragments and text lines of the bullet. (Default: "") bullet_r_margin (float, optional): determines the spacing between the bullet and the bulleted line skip_leading_spaces (float, optional): removes all space characters at the beginning of each line. (Default: False) wrapmode (WrapMode): determines the way text wrapping is handled. (Default: None) r��Unable to nest paragraphs.) r-rcrdrSrTrOrPrQrRrFr�) r%rcrdrSrOrPrQrRrFrTr�s rr:z!ParagraphCollectorMixin.paragraph�s���6 � !�Z� /� /�� <�=�=� =� ��!�4�T�_�#� 3� O�t�7O��!�'��'�+� � � �� �����"�"�"�!+����rc�@�|jstd���d|_dS)NzNo active paragraph to end.)r�rr2s rrpz%ParagraphCollectorMixin.end_paragraph�s*���%� ?�� =�>�>� >�!%����rr�r�r�c ���|jdkrtd���|jr|���t|||||||||| | | �� � } |j�| ��dS)Nr�r�) r�r�r�r�r�rOrPr�r�r�)r�rrpr�r�r�) r%r�r�r�r�r�r�rOrPr�r�r�r�s rr�zParagraphCollectorMixin.image�s��� � !�Z� /� /�� <�=�=� =� � !� !� � � � � � � � � ����!�/�!�'���� � � �� �����"�"�"�"�"rr!) NNFrrrrNNNr�)rrrrr=r r$rnrur�r�r�r�r:rpr�r4r5s@rr�r�9s�������� �� ��$)�!� ��7�7�7� � 7��7�"�7��7�7�7�7�7�7�@ � � ���� ,� ,� ,�)�)�#�)�)�)�)�#�#�#�#� ��$)������!�+�+�"� +��+�+�+�+�Z&�&�&���� ���� ��� #� #�� #� � #� � #� #� #� #� #� #� #� #rr�c�6�eZdZdZd�Zd�Zd�Zd�Zd�Zd�Z dS) � TextRegionz3Abstract base class for all text region subclasses.c��t���)aZ Return the horizontal extents of the current line. Columnar regions simply return the boundaries of the column. Regions with non-vertical boundaries need to check how the largest font-height in the current line actually fits in there. For that reason we include the current y and the line height. ��NotImplementedError)r%r�r�s r�current_x_extentszTextRegion.current_x_extents�s��"�#�#�#rc��|jr4|jj|jjkr|jxj|jz c_|�|jjd��\}}|jj|jjz }||jjz }|�|||z |��}|r1|j}|r(|jj|z|kr|jxj|z c_|SrH) rOr[r��t_marginr�r��b_marginr�rP)r%r:r�� col_right�bottomr��rendered�margins r�_render_image_paragraphz"TextRegion._render_image_paragraph�s��� � � /�D�H�J���1B�$B�$B� �H�J�J�)�.� .�J�J�"�4�4�T�X�Z��C�C���)����d�h�/�/���d�h�j�(� ��#�#�H�i�(�.B�J�O�O�� � %��,�F�� %�4�8�:��.�&�8�8��� � �f�$� � ��rc �(�|sdS||j_d}d}d}|D�]p}t|t��r|�|��r|dz }�3�n<|j}d} |j} | j} |jD] } | j rd} n�| rD|j r=| s;| j r4|jj|jj kr|jxj| j z c_|jj|j z|kr|}�n�|}|j }|�|jjd��\} }|jj| ks|jj|kr | |j_|jxj| jz c_| r�| js�| ���| jz}|jxj|zc_|j�| j| jj dt,jt0jd���d| _|jxj|z c_|j�||j dt,jt0jd���|jxj| jzc_|jr8| j}|r/| r-|jj|z|kr|jxj| jz c_|dz }|jrn��r|r|d|�=|S)NrrFT)r��border�new_x�new_y�fill)r[r�r�r�r�r9r:rhrA� charactersr;rOr�r�r�r�rQrDrLrC�_render_styled_text_linerBr r�r �TOP�NEXTr<rP�trailing_form_feed)r%r��topr��prev_line_height�last_line_height�rendered_lines� tl_wrapperrB� text_rendered� cur_paragraph� cur_bulletrKr�r��bullet_indent_shiftr�s r�_render_column_lineszTextRegion._render_column_lines�s��� ��1���� �������$�@ �@ �J��*�n�5�5�? ��/�/� �;�;��"�a�'�N�N��E�&�O� � %� � *� 4� �*�1� �%�/���D����(,� ����"�;�"�-�;�'�;�&�0� ;� �� �T�X�%6�6�6��H�J�J�-�":�:�J�J��8�:� � 0�0�6�9�9�'7�$��E�#3� �#,�#3� �&*�&<�&<�T�X�Z��&K�&K�#��)��8�:��(�(�D�H�J�)�,C�,C�!)�D�H�J��� � �m�2�2� � ��6�j�&>�6�"�6�6�8�8�:�;N�N�(��H�J�J�"5�5�J�J��H�5�5�"�,�$�.�5� �"�i�"�h�"� 6����04�J�,��H�J�J�"5�5�J�J���1�1���&���)��)�� 2������ � �m�2�2� � ��'�B�*�8�F��B�-�B�T�X�Z�&�5H�F�4R�4R��� � �m�&A�A� � ��!�#���/���E�� � ,��?�N�?�+��rc��g}|jD]s}t|t��r*|���}|�|���A|�|j��}|s�^|�|���t|Sr!)r�r�r�r�r�r�r�r�)r%r�r:r9� cur_liness r� collect_lineszTextRegion.collect_lines=s���� ��)� -� -�I��)�^�4�4� -� �+�+�-�-���!�!�$�'�'�'�'�%�1�1�$�-�@�@� � ����!�!�)�,�,�,�,��rc��t���r!r�r2s rr�zTextRegion.renderJs��!�#�#�#rc��|�|jj|��\}}|jj|kr|jj|kr |jj}||z }|Sr!)r�r[r�r�)r%r��start�end�ress rrIzTextRegion.get_widthMsS���+�+�D�H�J��?�?� ��s� �8�:�� � �$�(�*�s�"2�"2��H�J�E��E�k��� rN) rrrr3r�r�r�r�r�rIrrrr�r��sx������=�=�$�$�$� � � �J �J �J �X � � �$�$�$�����rr�c�0��eZdZdZddd��fd� Zd�Z�xZS)�TextColumnarMixinz*Enable a TextRegion to perform page breaksN)�l_marginrCc����t��j|i|��|�|jn||_|j}|�|jn||_|j|jz }|�||��dSr!)r#r$rrCr��_set_left_right) r%r[rrCr&r'rrr(s �rr$zTextColumnarMixin.__init__Xst��������$�)�&�)�)�)�(0�(8�� � �h�� ��}��(0�(8�� � �h�� ���� �%�� ���T�5�)�)�)�)�)rc���|� |jjn|}|�|jj|jjz n|}||kr"t |jj�d|�d|�d����t||��|_dS)Nz(): Right limit (z) lower than left limit (z).) r[rr�rCrr(rr�extents)r%rrs rrz!TextColumnarMixin._set_left_right`s���$(�L�t�x� � �d��49�M����d�h�/�/�/�u�� �D�=�=���>�*�I�I� %�I�I�@D�I�I�I��� ��t�U�+�+�� � � r)rrrr3r$rr4r5s@rrrUs\�������4�4�,0�4�*�*�*�*�*�*�*�,�,�,�,�,�,�,rrc�X��eZdZdddd�dededef�fd�Z�fd �Zd �Zd �Z d �Z d �Z �xZ S)� TextColumnsr� F)�ncols�gutter�balancerrrc����t��j|g|�Ri|��d|_||_||_|jj|jjz }||dz |zz |z }|jj} t| | |z��g|_ td|��D]5} | ||zz } |j � t| | |z�����6t|j j|j j��|_dS)Nrr)r#r$� _cur_column�_ncolsrr rrr�_cols�ranger��maxr[r�r��_first_page_top) r%r[rrrr&r'�total_wr��c_left�ir(s �rr$zTextColumns.__init__ls��� ������.�t�.�.�.�v�.�.�.������ ��� ��,�$�t�|�'8�8����� �V�3�3�u�<� ���"���f�f�y�&8�9�9�:�� ��q�%��� C� C�A� �i�&�(� (�F� �J� � �g�f�f�y�.@�A�A� B� B� B� B�"�4�8�#4�d�h�j�A�A����rc����t�����t|jj|jj��|_|jr(d|_|j |jj |j_ |SrH) r#rnrr[r�r�rrrrrr�)r%r(s �rrnzTextColumns.__enter__�sa��� ��������"�4�8�#4�d�h�j�A�A��� �<� ;� �D� ���D�$4�5�:�D�H�J�� rc��|jr'|jd�t��dS|�t��dSr�)r�r�rr2s r� new_columnzTextColumns.new_column�sG�� � � "� � �R� � &� &�y� 1� 1� 1� 1� 1� �J�J�y� !� !� !� !� !rc��d}|jj}|jr�|}|sdStd�|D����}||jz }||z } || kr]d}||z}t jt|��|jz ��dz} |djj | z} | |kr|| z}||kr|}d}t|j |j��D]�} |sdS| |j kr| |_ |� dd��\} }|jj | ks|jj |kr | |j_ |r'| |jdz kr|jj|jjz }|�|||��}|r|jj|z}||kr|}��|r||j_dSdS)z?Rendering a set of lines in one or several columns on one page.FNc3�.K�|]}|jjV��dSr!)r9r�)�.0�ls r� <genexpr>z1TextColumns._render_page_lines.<locals>.<genexpr>�s&����?�?�q�Q�V�]�?�?�?�?�?�?rTg�?rr)r[r�r�sumr�math�ceilrkr9r�rrr�r�r�r�r�)r%r�r�r�� balancing�next_y� page_bottom� tot_height� col_height� avail_height�lines_per_column� mult_height�cr�r�r�r�s r�_render_page_lineszTextColumns._render_page_lines�s���� ����� �<� &�!�K�� ����?�?�J�?�?�?�?�?�J�#�d�k�1�J�!�C�<�L��L�(�(� � ��z�)��#'�9�S��_�_�t�{�-J�#K�#K�c�#Q� �(��m�0�7�:J�J� ���+�+� �;�.�F��K�'�'�(�F� %�I��t�'���5�5� #� #�A�� �����D�$�$�$�#$�� �"&�"8�"8��A�">�">� �H�i��x�z�H�$�$��� �i�(?�(?�%��� �� 8�Q�4�;��?�3�3����d�h�&7�7��#�8�8��S�&�Q�Q� �� #��� �%5�5���6�>�>�"�F�� � ��D�H�J�J�J� � rc��|jsdS|���}|sdS|jj|jjz }t |jj|jj��}|�|||��|rT|j� |jj��}|sdSd|_ |�||jj|��|�RdSdSrH) r�r�r[r�r�rr�r�r/�_perform_page_break_if_need_ber)r%r�r(�first_page_top� page_breaks rr�zTextColumns.render�s����� � �F��'�'�)�)� �� � �F��h�j�4�8�#4�4� ��T�X�.��� �;�;�� ��� �N�K�H�H�H�� I���@�@����L�L�J�� ��� �D� � � #� #�J��� �K� H� H� H� � I� I� I� I� Irc�4�|j|j\}}||fSr!)rr)r%r�r�rrs rr�zTextColumns.current_x_extents�s���j��!1�2� ��e��U�{�r) rrr�intrr=r$rnrr/r�r�r4r5s@rr r ks�������� ��� B�B�B�� B� � B� � B�B�B�B�B�B�.�����"�"�"� / �/ �/ �bI�I�I�$������rr ) r$�typingrrrr�errorsr�enumsr r r r �image_datastructuresr � image_parsingr� line_breakrr�utilrrrr6r8r?r�r�r�rr rrr�<module>r=s��� � � � �6�6�6�6�6�6�6�6�6�6�6�6�!�!�!�!�!�!�.�.�.�.�.�.�.�.�.�.�.�.�1�1�1�1�1�1�(�(�(�(�(�(�1�1�1�1�1�1�1�1�"�"�"�"�"�"������j���� *�*�*�*�*�*�*�*�$ �G�K�� &� &� � � � � � �*� � � ���������&E�E�E�E�E�E�E�E�Pe �e �e �e �e �e �e �e �P[#�[#�[#�[#�[#�[#�[#�[#�|{�{�{�{�{�(�{�{�{�|,�,�,�,�,�,�,�,�,k�k�k�k�k�*�/�k�k�k�k�kr
Memory