%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /lib/python3/dist-packages/aptdaemon/__pycache__/
Upload File :
Create Path :
Current File : //lib/python3/dist-packages/aptdaemon/__pycache__/gtk3widgets.cpython-312.pyc

�

��kd������dZdZdZddlZddlZddlZddlZddlZddlZejdd�ejdd�ejd	d�ddl
Z
dd
lmZddlm
Z
ddlmZdd
lmZddlmZddlmZddlmZddl�ddlmZddlmZd�Zeed��\ZZGd�dej<�ZGd�de�Z Gd�de�Z!Gd�dejD�Z#Gd�d ejD�Z$Gd!�d"ejJ�Z&Gd#�d$ejN�Z(Gd%�d&ejR�Z*Gd'�d(ejV�Z,Gd)�d*ejZ�Z.Gd+�d,ej^�Z0Gd-�d.ej^�Z1Gd/�d0ejd�Z3Gd1�d2ej^�Z4Gd3�d4e1�Z5d5Z6Gd6�d7ejn�Z8Gd8�d9e1�Z9Gd:�d;e9�Z:y)<zE
This module provides widgets to use aptdaemon in a GTK application.
z%Sebastian Heinlein <devel@glatzor.de>)�AptConfigFileConflictDialog�AptCancelButton�AptConfirmDialog�AptProgressDialog�AptTerminalExpander�
AptStatusIcon�AptRoleIcon�AptStatusAnimation�AptRoleLabel�AptStatusLabel�AptMediumRequiredDialog�AptMessageDialog�AptErrorDialog�AptProgressBar�DiffView�AptTerminal�N�Vtez2.91�Gdkz3.0�Gtk)�GObject)�GLib)r)r)�Pango)r�)�client)�*)�inline_callbacks)�	deferablec�.�tjd|�S)N�	aptdaemon)�gettext�dgettext)�msgs �7/usr/lib/python3/dist-packages/aptdaemon/gtk3widgets.py�<lambda>r$;s��� � ��c�2���c�V�eZdZdZdej
jfd�Zd�Zd�Z	d�Z
y)rzi
    Provides a Gtk.Image which shows an icon representing the status of a
    aptdaemon transaction
    Nc��tjj|�||_d|_g|_|j
dd�|�|j|�yy�Nr)r�Image�__init__�
_icon_size�	icon_name�_signals�
set_alignment�set_transaction)�self�transaction�sizes   r#r+zAptStatusIcon.__init__FsT���	�	���4� ���������
����1�a� ��"�� � ��-�#r%c���|jD]}tj|��g|_|jj|j	d|j
��y)z Connect to the given transaction�status-changedN)r.r�
source_remove�append�connect�_on_status_changed�r1r2�sigs   r#r0zAptStatusIcon.set_transactionQsW���=�=�	$�C����s�#�	$���
��
�
���[�0�0�1A�15�1H�1H�J�	Kr%c��||_y)z.Set the icon size to gtk stock icon size valueN)r,)r1r3s  r#�
set_icon_sizezAptStatusIcon.set_icon_sizeYs	����r%c��t|�}|�tj}||jk7r$|j	||j
�||_yy)z3Set the status icon according to the changed statusN)�get_status_icon_name_from_enumr�STOCK_MISSING_IMAGEr-�set_from_icon_namer,)r1r2�statusr-s    r#r9z AptStatusIcon._on_status_changed]sI��2�6�:�	����/�/�I�����&��#�#�I�t���?�&�D�N�'r%)�__name__�
__module__�__qualname__�__doc__r�IconSize�DIALOGr+r0r=r9�r%r#rrAs-���$(�c�l�l�.A�.A�	.�K��'r%rc��eZdZdZd�Zd�Zy)rzh
    Provides a Gtk.Image which shows an icon representing the role of an
    aptdaemon transaction
    c��|jD]}tj|��g|_|jj|j	d|j
��|j||j�y)N�role-changed)r.rr6r7r8�_on_role_changed�roler:s   r#r0zAptRoleIcon.set_transactionlsl���=�=�	$�C����s�#�	$���
��
�
���[�0�0��15�1F�1F�H�	I����k�;�+;�+;�<r%c��t|�}|�tj}||jk7r$|j	||j
�||_yy)z"Show an icon representing the roleN)�get_role_icon_name_from_enumrr@r-rAr,)r1r2�	role_enumr-s    r#rMzAptRoleIcon._on_role_changedtsI��0��;�	����/�/�I�����&��#�#�I�t���?�&�D�N�'r%N)rCrDrErFr0rMrIr%r#rrgs���=�'r%rc�d�eZdZdZdej
jfd�Zd	d�Zd�Z	d�Z
d�Zd�Zy)
r	z_
    Provides a Gtk.Image which shows an animation representing the
    transaction status
    Nc���tj|||�g|_d|_d|_d|_t
t�}tt�}|j||�yr))
rr+�	animation�ticker�
frame_counter�iter�#get_status_animation_name_from_enum�STATUS_WAITINGr?�
set_animation)r1r2r3�name�fallbacks     r#r+zAptStatusAnimation.__init__�sU�����t�[�$�7������������	�2�>�B��1�.�A�����4��*r%c
��||jk(ry|�||_|j�g}tj|j�\}}tj
j
�}|��|j|�r�|j||d�}|j�|z}	|j�|z}
t|	�D];}t|
�D]+}|j|j||z||z||���-�=t|�dkDrD||_d|_|j#|jd�|j%�||_y|j#|�||_y|�5|j|�r$|j'||j�||_y|j'tj(�y)z7Show and start the animation of the given name and sizeNr)r-r,�stop_animationr�icon_size_lookup�	IconTheme�get_default�has_icon�	load_icon�
get_height�	get_width�ranger7�	subpixbuf�lenrTrW�set_from_pixbuf�start_animationrAr@)
r1r[r\r3rT�width�height�theme�pixbuf�rows�cols�r�cs
             r#rZz AptStatusAnimation.set_animation�s����4�>�>�!����"�D�O������	��.�.�t���?�����
�
�)�)�+�������t� 4��_�_�T�5�!�4�F��$�$�&��/�D��#�#�%��-�D��4�[�
F���t��F�A��$�$�V�%5�%5�a�%�i��V��6;�V�&E�F�F�
F��9�~��!�!*�����	��$�$�T�^�^�A�%6�7��$�$�&�"�D�N��$�$�V�,�!�D�N�
�
!�e�n�n�X�&>��#�#�H�d�o�o�>�%�D�N��#�#�C�$;�$;�<r%c�n�|jdk(r&tjd|j�|_yy)zStart the animationr��N)rUr�timeout_add�_advance�r1s r#rjz"AptStatusAnimation.start_animation�s+���;�;�!���*�*�3��
�
�>�D�K�r%c�p�|jdk7r'tj|j�d|_yy)zStop the animationrN)rUrr6rws r#r^z!AptStatusAnimation.stop_animation�s,���;�;�!�����t�{�{�+��D�K�r%c��|jd�durd|_y|jdz|_|jt|j�k\rd|_|j|j|j�y)zx
        Show the next frame of the animation and stop the animation if the
        widget is no longer visible
        �visibleFrrT)�get_propertyrUrWrhrTrirws r#rvzAptStatusAnimation._advance�sj��
���Y�'�5�0��D�K���I�I��M��	��9�9��D�N�N�+�+��D�I����T�^�^�D�I�I�6�7�r%c�T�t|�}t|�}|j||�y)zC
        Set the animation according to the changed status
        N)rXr?rZ)r1r2rBr[r\s     r#r9z%AptStatusAnimation._on_status_changed�s(��3�6�:��1�&�9�����4��*r%�NN)
rCrDrErFrrGrHr+rZrjr^rvr9rIr%r#r	r	~s7���$(�c�l�l�.A�.A�+�=�@?�
��+r%r	c�$�eZdZdZdd�Zd�Zd�Zy)r
�<
    Status label for the running aptdaemon transaction
    Nc��tj|�|jdd�|jtj
j�|jd�g|_|�|j|�yy�Nr�)
�GtkLabelr+r/�
set_ellipsizer�
EllipsizeMode�END�set_max_width_charsr.r0�r1r2s  r#r+zAptRoleLabel.__init__�sh�����$�����1�a� ����5�.�.�2�2�3�� � ��$���
��"�� � ��-�#r%c��|jD]}tj|��g|_|j||j�|jj|j
d|j��y)�;Connect the status label to the given aptdaemon transactionrLN)r.rr6rMrNr7r8r:s   r#r0zAptRoleLabel.set_transaction�sl���=�=�	$�C����s�#�	$���
����k�;�+;�+;�<��
�
���[�0�0��15�1F�1F�H�	Ir%c�8�|jt|��y)zSet the role text.N)�
set_markup�$get_role_localised_present_from_enum)r1r2rNs   r#rMzAptRoleLabel._on_role_changed�s�����<�T�B�Cr%�N)rCrDrErFr+r0rMrIr%r#r
r
�s���.�I�Dr%r
c�*�eZdZdZdd�Zd�Zd�Zd�Zy)rrNc��tjj|�|jdd�|j	t
jj�|jd�g|_	|�|j|�yyr�)r�Labelr+r/r�rr�r�r�r.r0r�s  r#r+zAptStatusLabel.__init__�sl���	�	���4� ����1�a� ����5�.�.�2�2�3�� � ��$���
��"�� � ��-�#r%c�2�|jD]}tj|��g|_|jj|j	d|j
��|jj|j	d|j��y)r�r5zstatus-details-changedN)r.rr6r7r8r9�_on_status_details_changedr:s   r#r0zAptStatusLabel.set_transaction�s����=�=�	$�C����s�#�	$���
��
�
������ 0�$�2I�2I�J�	L��
�
������ 8� $� ?� ?�
A�	Br%c�8�|jt|��y)z3Set the status text according to the changed statusN)r��get_status_string_from_enum�r1r2rBs   r#r9z!AptStatusLabel._on_status_changeds�����3�F�;�<r%c�&�|j|�y)z.Set the status text to the one reported by aptN)r�)r1r2�texts   r#r�z)AptStatusLabel._on_status_details_changeds������r%r�)rCrDrErFr+r0r9r�rIr%r#rr�s���.�	B�=�r%rc�0�eZdZdZdd�Zd�Zd�Zd�Zd�Zy)	rz`
    Provides a Gtk.Progress which represents the progress of an aptdaemon
    transactions
    Nc��tjj|�|jtj
j�|jd�|jd�g|_	|�|j|�yy)N� g�������?)r�ProgressBarr+r�rr�r��set_text�set_pulse_stepr.r0r�s  r#r+zAptProgressBar.__init__sh����� � ��&����5�.�.�2�2�3��
�
�c�����D�!���
��"�� � ��-�#r%c��|jD]}tj|��g|_|jj|j	d|j
��|jj|j	d|j��|jj|j	d|j��y)z;Connect the progress bar to the given aptdaemon transaction�finishedzprogress-changedzprogress-details-changedN)r.rr6r7r8�_on_finished�_on_progress_changed�_on_progress_detailsr:s   r#r0zAptProgressBar.set_transactions����=�=�	$�C����s�#�	$���
��
�
������
�D�,=�,=�>�	@��
�
������ 2�D�4M�4M�N�	P��
�
���[�0�0�1K�15�1J�1J�L�	Mr%c�X�|dkDr|j�y|j|dz�y)zR
        Update the progress according to the latest progress information
        �dgY@N)�pulse�set_fraction)r1r2�progresss   r#r�z#AptProgressBar._on_progress_changed%s'���c�>��J�J�L����h��.�/r%c��|dk(r|dk(r|jd�y|dk7rZ|jtd�tj|�tj|�tj|�fz�y|jtd�tj|�tj|�fz�y)zW
        Update the progress bar text according to the latest progress details
        rr�NzDownloaded %sB of %sB at %sB/s�Downloaded %sB of %sB)r��_r�get_size_string)r1r2�
items_done�items_total�
bytes_done�bytes_total�speed�etas        r#r�z#AptProgressBar._on_progress_details.s���
�!���q� 0��M�M�#����A�:��M�M�!�<�=�!�1�1�*�=�!�1�1�+�>�!�1�1�%�8�:�:�
;�

�M�M�!�3�4�!�1�1�*�=�!�1�1�+�>�@�@�
Ar%c�&�|jd�y)z9Set the progress to 100% when the transaction is completerN)r�)r1r2�exits   r#r�zAptProgressBar._on_finished@s�����!�r%r�)	rCrDrErFr+r0r�r�r�rIr%r#rrs"���.�
M�0�A�$r%rc�&�eZdZdd�Zd�Zd�Zd�Zy)�AptDetailsExpanderNc���tjj|td���||_g|_|j
d�|jd�|jrt�|_	nd|_	t�|_tj�|_
|jjtjj �|jj#tj$j&tj$j(�|jj+|j�|jj-d�tj.�}|j1|jddd�|jr|j1|jddd�|j+|�|�|j3|�yy)N�Details��labelFrtTr)r�Expanderr+r��
show_terminalr.�
set_sensitive�set_expandedr�terminal�AptDownloadsView�
download_view�ScrolledWindow�download_scrolled�set_shadow_type�
ShadowType�	ETCHED_IN�
set_policy�
PolicyType�NEVER�	AUTOMATIC�add�set_min_content_height�HBox�
pack_startr0)r1r2r��hboxs    r#r+zAptDetailsExpander.__init__Gs[�������d�!�I�,��7�%�����
����5�!����%� ����'�M�D�M� �D�M�-�/���!$�!3�!3�!5������.�.�s�~�~�/G�/G�H����)�)�#�.�.�*>�*>�*-�.�.�*B�*B�	D����"�"�4�#5�#5�6����5�5�c�:��x�x�z������.�.��d�A�>��=�=��O�O�D�M�M�4��q�9�������"�� � ��-�#r%c��|jD]}tj|��|jj|j	d|j
��|jj|j	d|j��|jr|jj|�|jj|�y)r�r5�terminal-attached-changedN)
r.rr6r7r8r9�_on_terminal_attached_changedr�r0r�r:s   r#r0z"AptDetailsExpander.set_transaction`s����=�=�	$�C����s�#�	$��
�
������ 0�$�2I�2I�J�	L��
�
������ ;� $� B� B�
D�	E��=�=��M�M�)�)�+�6����*�*�;�7r%c��|ttfvrS|jd�|jj	�|j
r|j
j
�yy|tk(ru|jj
�|j
r,|j
j	�|jd�y|jd�|jd�y|jj
�|j
r|j
j
�|jd�|jd�y)NTF)	�STATUS_DOWNLOADING�STATUS_DOWNLOADING_REPOr�r��showr��hide�STATUS_COMMITTINGr��r1�transrBs   r#r9z%AptDetailsExpander._on_status_changedms����(�*A�B�B����t�$��"�"�'�'�)��}�}��
�
�"�"�$��
�(�
(��"�"�'�'�)��}�}��
�
�"�"�$��"�"�4�(��!�!�%�(��"�"�5�)��"�"�'�'�)��}�}��
�
�"�"�$����u�%����e�$r%c�F�|r|jr|jd�yyy)z&Connect the terminal to the pty deviceTN)r�r��r1r2�attacheds   r#r�z0AptDetailsExpander._on_terminal_attached_changed�s ����
�
����t�$�&�8r%�NT)rCrDrEr+r0r9r�rIr%r#r�r�Es��.�28�%�*%r%r�c� �eZdZdd�Zd�Zd�Zy)rNc��tjj|�g|_t	j
�\|_|_tj|j�|_
|jdd�|jd�|jtjj|j��|�|j!|�yy)N�P�T)r�Terminalr+r.�pty�openpty�_master�_slave�os�ttyname�_ttyname�set_size�set_vexpand�set_pty�Pty�new_foreign_syncr0r�s  r#r+zAptTerminal.__init__�s��������d�#���
�$'�K�K�M�!���d�k��
�
�4�;�;�/��
��
�
�b�"����������S�W�W�-�-�d�l�l�;�<��"�� � ��-�#r%c��|jD]}tj|��|jj|j	d|j
��||_|jj|j�y)r�r�N)	r.rr6r7r8r��_transaction�set_terminalr�r:s   r#r0zAptTerminal.set_transaction�ss���=�=�	$�C����s�#�	$��
�
������ ;� $� B� B�
D�	E�(������&�&�t�}�}�5r%c�&�|j|�y)zShow the terminalN�r�r�s   r#r�z)AptTerminal._on_terminal_attached_changed�s�����8�$r%r�)rCrDrEr+r0r�rIr%r#rr�s��	.�6�%r%rc�0�eZdZdZdd�Zd�Zd�Zd�Zd�Zy)	rzZ
    Provides a Gtk.Button which allows to cancel a running aptdaemon
    transaction
    Nc��tjj|�|jd�|j	tj
�|j
d�g|_|�|j|�yyr�)	r�Buttonr+�
set_use_stock�	set_label�STOCK_CANCELr�r.r0r�s  r#r+zAptCancelButton.__init__�sb���
�
���D�!����4� ����s�'�'�(����4� ���
��"�� � ��-�#r%c�l�|jD]}tj|��g|_|jj|j	d|j
��|jj|j	d|j��|j	d|j|�y)r�r�zcancellable-changed�clickedN)r.rr6r7r8r��_on_cancellable_changed�_on_clickedr:s   r#r0zAptCancelButton.set_transaction�s����=�=�	$�C����s�#�	$���
��
�
������
�D�,=�,=�>�	@��
�
������ 5� $� <� <�
>�	?�	
���Y�� 0� 0�+�>r%c�&�|j|�y)zY
        Enable the button if cancel is allowed and disable it in the other case
        Nr�)r1r2�cancellables   r#r�z'AptCancelButton._on_cancellable_changed�s��	
���;�'r%c�&�|jd�y�NFr�r�s   r#r�zAptCancelButton._on_finished�s�����5�!r%c�F�|j�|jd�yr)�cancelr�)r1�buttonr2s   r#r�zAptCancelButton._on_clicked�s���������5�!r%r�)	rCrDrErFr+r0r�r�r�rIr%r#rr�s ���.�
?�(�"�"r%rc�N�eZdZdZeed��\ZZZdd�Z	d�Z
d�Zd�Zy)	r�z`A Gtk.TreeView which displays the progress and status of each dowload
    of a transaction.
    �Nc��tjj|�tjtj
tjtj
�}|j|�d|j_	|jd�i|_g|_|�|j|�tj�}tj j"|j_tj&t)d��}|j+|d�|j-|d|j.�tj0�}tj&t)d��}|j+|d�|j3||j4d�|j7|�|j7|�|j9|j:�y)NFT�File�markup�%)r�TreeViewr+�	ListStorer�TYPE_STRING�TYPE_INT�	set_model�props�headers_visible�set_rules_hint�
_download_mapr.r0�CellRendererTextrr�r��	ellipsize�TreeViewColumnr�r��
add_attribute�COL_TEXT�CellRendererProgress�set_cell_data_func�_data_progress�
append_column�set_tooltip_column�COL_URI)r1r2�model�cell_uri�column_download�
cell_progress�column_progresss       r#r+zAptDownloadsView.__init__�s_�������d�#��
�
�g�1�1�7�3C�3C�%�1�1�3�����u��%*��
�
�"����D�!������
��"�� � ��-��'�'�)��#(�#6�#6�#:�#:���� ��,�,�Q�v�Y�7���"�"�8�T�2��%�%�h��$�-�-�H��0�0�2�
��,�,�Q�s�V�4���"�"�=�$�7��*�*�=�$�:M�:M�+/�	1����?�+����?�+�������-r%c���|jD]}tj|��g|_|jj|j	d|j
��y)z<Connect the download view to the given aptdaemon transactionzprogress-download-changedN)r.rr6r7r8�_on_download_changedr:s   r#r0z AptDownloadsView.set_transaction�sW���=�=�	$�C����s�#�	$���
��
�
���[�0�0�1L�15�1J�1J�L�	Mr%c��	t|dz|z�}|tk(rd}|dkDrd}|dd}	|	dz
}	|tk(r:|	t	d�tj|�tj|�fzz
}	nP|tk(r9|dk7r%|	t	d�tj|�zz
}	n|	t	d�z
}	n|	t|�z
}	|	d	z
}	|j�}
|
sy	|j|}|
j||j|	�|
j||j|�y#t$rd}Y�� wxYw#t$r�|
j|	||f�}||j|<|j�}|r\|j!�|j#�z|j%�k(}
|
r&|j'|
j)|�dd
d
d
�YyYyYywxYw)z)Callback for a changed download progress.r����N�
<small>r�rzDownloaded %sB�
Downloaded�</small>F)�int�ZeroDivisionError�
DOWNLOAD_DONE�DOWNLOAD_FETCHINGr�rr��get_download_status_from_enum�	get_modelr�	set_valuer�COL_PROGRESS�KeyErrorr7�get_vadjustment�	get_value�
get_page_size�	get_upper�scroll_to_cell�get_path)r1r2�urirB�desc�	full_size�
downloaded�messager�r�r rW�adj�is_scrolled_downs              r#r&z%AptDownloadsView._on_download_changed�s���	��:��+�i�7�8�H��]�"��H��c�>��H��A�w�������&�&��Q�.�/��,�,�Z�8��,�,�Y�7�9�9�
:�D��}�
$��A�~���+�,��/�/�	�:�;�<����,��'���1�&�9�9�D��
������ ����	?��%�%�c�*�D�"
�O�O�D�$�-�-��6��O�O�D�$�"3�"3�X�>��]!�	��H�	��:�	I��<�<��x�� 5�6�D�&*�D���s�#��&�&�(�C���M�M�O�c�&7�&7�&9�9�S�]�]�_�L�!�#��'�'����t�,�d�E�5�%�I�$��	I�s$�D%�D7�%D4�3D4�7BG�Gc��|j||j�}|dk(r||j_y||j_y)Nr()r6r3rr��value)r1�column�cellr rW�datar�s       r#rzAptDownloadsView._data_progress+s7���?�?�4��):�):�;���r�>�'�D�J�J��'�D�J�J�r%r�)
rCrDrErF�listrfrr3rr+r0r&rrIr%r#r�r��s3���'+�5��8�n�#�H�l�G�.�4M�3?�j(r%r�c���eZdZdZdej
jejdfiZ		dd�Z	d�Z
d�Zd�Zd	�Z
e		dd
��Zed��Zd�Zd
�Zd�Zd�Zd�Zy)rz�
    Complete progress dialog for long taking aptdaemon transactions, which
    features a progress bar, cancel button, status icon and label
    r�rINc��tjj||��d|_||_|jd�|j
d�|j�jd�t|�|_
|j�j|jddd�tj�}|jd�|jd�t�|_|j|jddd�tj �}|jd�tj"�|_|j$j'dd�|j|j$ddd�tj �}|jd�t)�|_|j|j*ddd�t-�|_|j.j1dt2�|j|j.ddd�|j|ddd�|j|ddd�t5|��|_|j6j9d|j:�|j|j6ddd�|j�j|ddd�d|_g|_|jAd	�|jC�|j*jEd
d�tFjHjJtFjHjLz}	|jO�jQ|�|�|jU|�|j9d|jV�y#tR$r5|jO�jQtGjH|��Y�mwxYw)
N��parent�Fr�T)r��notify::expanded��^r(zdelete-event),r�Dialogr+�_expanded_size�debconf�set_border_width�
set_resizable�get_content_area�set_spacingr�
button_cancel�get_action_arear�r�r�icon�VBoxr��
label_roler/rr�rr�r9rYr��expanderr8�_on_expandedr�r.�	set_title�realize�set_size_requestr�
WMFunction�MOVE�RESIZE�
get_window�
set_functions�	TypeErrorr0�_on_dialog_delete_event)	r1r2rKr�rSr��vbox�
vbox_progress�	functionss	         r#r+zAptProgressDialog.__init__<s����
�
���D���0�"���������a� ����5�!�����+�+�A�.�,�[�9�������)�)�$�*<�*<�e�U�A�N��x�x�z����������a� ��M��	�����	�	�5�$��2��x�x�z��������)�)�+������%�%�a��+���������a�8����
�
��!�!�!�$�&�(��
�� � �����t�Q�?�#�%��
��
�
�%�%�d�N�;�� � ����U�D�!�<����
�u�d�A�6�����d�D�!�,�*�H�=��
��
�
���0�$�2C�2C�D�����
�
�t�T�1�5�����*�*�4��t�Q�?� �����
����r�������
�
�&�&�s�B�/��N�N�'�'�#�.�.�*?�*?�?�	�	G��O�O��+�+�I�6��"�� � ��-����^�T�%A�%A�B��
�	G��O�O��+�+�C�N�N�9�,E�F�	G�s�N�;O�Oc�8�|jj�yr�)rXr�)r1�dialog�events   r#rhz)AptProgressDialog._on_dialog_delete_eventps�����"�"�$�r%c���|j�sK|jjj�|j	�f|_|j
d�y|j
rn|j
d�|j
\}\}}||jjj�k7r|j�y|j||�y|j
d�|j�y)NFT)	�get_expandedr]r��get_visible�get_sizerRrU�_resize_to_show_details�resize)r1r]�param�term_visible�stored_width�
stored_heights      r#r^zAptProgressDialog._on_expandedts����$�$�&�#'�=�=�#9�#9�#E�#E�#G�#'�=�=�?�#4�D�����u�%�
�
 �
 ����t�$�:>�:M�:M�7�L�7�<���t�}�}�5�5�A�A�C�C��,�,�.����L�-�8����t�$��(�(�*r%c��|j�\}}|jj�j}|jj�j}|jj
j
�rm|jj
j�dz}|jj
j�dz}|j||z
|z||z
|z�y|j|dz|dz�y)a�Resize the window to show the expanded details.

        Unfortunately the expander only expands to the preferred size of the
        child widget (e.g showing all 80x24 chars of the Vte terminal) if
        the window is rendered the first time and the terminal is also visible.
        If the expander is expanded afterwards the window won't change its
        size anymore. So we have to do this manually. See LP#840942
        r�r�r�rtN)
rrr]�get_allocationrkrlr�rq�get_char_width�get_char_heightrt)r1�	win_width�
win_height�	exp_width�
exp_height�terminal_width�terminal_heights       r#rsz)AptProgressDialog._resize_to_show_details�s���!%�
�
���	�:��M�M�0�0�2�8�8�	��]�]�1�1�3�:�:�
��=�=�!�!�-�-�/�!�]�]�3�3�B�B�D�r�I�N�"�m�m�4�4�D�D�F��K�O��K�K���2�Y�>�'�*�4�z�A�
C�
�K�K�	�C���c�)9�:r%c��|tk(r6|jjj�r|j	�yyyr�)r�r]r�rqrsr�s   r#r9z$AptProgressDialog._on_status_changed�s9��
�'�'��
�
�&�&�2�2�4��(�(�*�5�
(r%c�,�|j|||||�S)axRun the transaction and show the progress in the dialog.

        Keyword arguments:
        attach -- do not start the transaction but instead only monitor
                  an already running one
        close_on_finished -- if the dialog should be closed when the
                  transaction is complete
        show_error -- show a dialog with the error message
        )�_run)r1�attach�close_on_finished�
show_error�
reply_handler�
error_handlers      r#�runzAptProgressDialog.run�s!���y�y��!2�J�&�
�7�	7r%c#��K�	|jjd|j||�}|jj	|�|r|jj���nE|jr|jjd���|jj���|j�|r|�yy#t$r}|r	||�n�Yd}~yd}~wwxYw�w)Nr��gnome)r�r8r�r.r7�syncrS�set_debconf_frontendr��show_all�	Exception)r1r�r�r�r�r�r;�errors        r#r�zAptProgressDialog._run�s�����	 ��#�#�+�+�J��8I�8I�,=�z�K�C��M�M� � ��%���'�'�,�,�.�.��<�<��+�+�@�@��I�I��'�'�+�+�-�-��M�M�O������
�	���e�$��%��	�s/�C(�B7C�;C(�	C%�C �C(� C%�%C(c�x�t|�}|j|�|jjd|z�y)z8Show the role of the transaction in the dialog interfacez<big><b>%s</b></big>N)r�r_r\r�)r1r2rQrNs    r#rMz"AptProgressDialog._on_role_changed�s0��3�I�>�����t�����"�"�#9�D�#@�Ar%c�$�|jD]}tj|��g|_|jj|j	d|j
��|jj|j
d|j��|jj|j
d|j��|jj|j
d|j��|j||j�|jj|�|jj|�|jj|�|jj|�||_y)z5Connect the dialog to the given aptdaemon transactionr5rLzmedium-requiredzconfig-file-conflictN)r.rr6r7�
connect_afterr9r8rM�_on_medium_required�_on_config_file_conflictrNr�r0rZr�r]r�r:s   r#r0z!AptProgressDialog.set_transaction�sC���=�=�	$�C����s�#�	$���
��
�
����%�%�&6�&*�&=�&=�
?�	@�	
�
�
���[�0�0��15�1F�1F�H�	I��
�
���[�0�0�1B�15�1I�1I�K�	L��
�
���[�0�0�1G�!�:�:�<�	=����k�;�+;�+;�<��
�
�%�%�k�2��	�	�!�!�+�.��
�
�"�"�;�/��
�
�%�%�k�2�'��r%c��t|||�}|j�}|j�|tjj
k(r|jj|�y|jj�yr�)	rr�r�r�ResponseType�OKr��provide_mediumr)r1r2�medium�driverm�ress      r#r�z%AptProgressDialog._on_medium_required�s^��(����=���j�j�l�����
��#�"�"�%�%�%����,�,�V�4����$�$�&r%c�
�t|||�}|j�}|j�|tjj
k(r|jj|d�y|jj|d�y)N�replace�keep)rr�r�rr��YESr��resolve_config_file_conflict)r1r2�old�newrmr�s      r#r�z*AptProgressDialog._on_config_file_conflict�sd��,�S�#�t�<���j�j�l�����
��#�"�"�&�&�&����:�:�3�	�J����:�:�3��Gr%c���|r|j�|tk(rB|r@t|jj|�}|j�|j�|j
d�y)Nr�)r��EXIT_FAILEDrr�r�r��emit)r1r2rB�closer��err_dias      r#r�zAptProgressDialog._on_finished�sN����I�I�K��[� �Z�$�T�%6�%6�%<�%<�d�C�G��K�K�M��L�L�N��	�	�*�r%)NNTT)FTTNN)rCrDrErFr�SignalFlags�	RUN_FIRST�	TYPE_NONE�__gsignals__r+rhr^rsr9rr�rr�rMr0r�r�r�rIr%r#rr3s����
��!4�!4�!>�!>�!(�!2�!2�B�!8�9�L�@D��2C�h�+�,;�(+��CG�.2�7��7�� �� �,B�(�*'�H�r%rc�"�eZdZdZ		dd�Zd�Zy)�_ExpandableDialogzDialog with an expander.Nc��|s*tjtjjf}tjj||��|j
d�|j|�|jd�|jd�|j�jd�|stj}tjj|tjj �}|j#dd�tj$�}	|	jd�|	jd�tj&�}
|
jd�|	j)|ddd�|	j)|
ddd�tj*�|_|j,j/d�|j,j#dd�|j,j1d�|
j)|j,ddd�|j�j)|	ddd�tj2|��|_|j4jd�|j4j7d�|j4j9d	|j:�d
|_|
j)|j4ddd�d}|rd|z}|r|r|dz
}||z
}|j,j?|�|r|j4jA|�y
|j4jCd�y
)
a3Return an _AptDaemonDialog instance.

        Keyword arguments:
        parent -- set the dialog transient for the given Gtk.Window
        stock_type -- type of the Dialog, defaults to Gtk.STOCK_DIALOG_QUESTION
        expanded_child -- Widget which should be expanded
        expander_label -- label for the expander
        title -- a news header like title of the dialog
        message -- the message which should be shown in the dialog
        buttons -- tuple containing button text/reponse id pairs, defaults
                   to a close button
        rJrOFrLrMrTr�rNNz<b><big>%s</big></b>z

)"r�STOCK_CLOSEr��CLOSErQr+r_�add_buttonsrUrTrVrW�STOCK_DIALOG_QUESTIONr*�new_from_stockrGrHr/r�r[r�r�r��set_selectable�
set_line_wrapr�r]�set_use_underliner8r^rRr�r�r�)r1rK�
stock_type�expanded_child�expander_label�titler?�buttonsrZ�	hbox_base�	vbox_leftr�s            r#r+z_ExpandableDialog.__init__sy�������(8�(8�(>�(>�?�G��
�
���D���0����r������'�"����5�!����a� �����+�+�B�/���2�2�J��y�y�'�'�
�C�L�L�4G�4G�H�����1�a� ��H�H�J�	����b�!��"�"�1�%��H�H�J�	����b�!����T�5�$��2����Y��d�A�6��Y�Y�[��
��
�
�!�!�$�'��
�
� � ��A�&��
�
� � ��&����T�Z�Z���a�8�����*�*�9�d�D�!�D����>�:��
��
�
�!�!�!�$��
�
�'�'��-��
�
���0�$�2C�2C�D�"������T�]�]�D�$��:����)�E�1�D��������G�O�D��
�
���d�#���M�M���n�-��M�M�'�'��.r%c�2�|j�rL|jd�|jr.	|j|jd|jd�yy|j
�|_|jd�y#tt
f$rYywxYw)NTrrF)rprUrRrt�
IndexErrorrgrr)r1r]rus   r#r^z_ExpandableDialog._on_expandedBs���� � �"����t�$��"�"���K�K�� 3� 3�A� 6��8K�8K�A�8N�O�#�#'�-�-�/�D�����u�%��	#�I�.����s�,B�B�B)NNNNNNN)rCrDrErFr+r^rIr%r#r�r�s��"�DH�HL�:/�x&r%r�c��eZdZdZdd�Zy)rz Dialog to ask for medium change.Nc���tjj||tjj��td�|z}td�|z}|j
d|�d|���|jtjtjjtd�tjj�|jtjj�y)N)rK�typezCD/DVD '%s' is requiredzXPlease insert the above CD/DVD into the drive '%s' to install software packages from it.z<big><b>z</b></big>

�	C_ontinue)
r�
MessageDialogr+�MessageType�INFOr�r�r�r�r��CANCELr��set_default_response)r1r�r�rKr�r<s      r#r+z AptMediumRequiredDialog.__init__Xs������"�"�4��(+���(<�(<�	#�	>��*�+�f�4���6�7�9>�?������d�C�D�����)�)�3�+;�+;�+B�+B��;���)9�)9�)<�)<�	>��!�!�#�"2�"2�"5�"5�6r%r��rCrDrErFr+rIr%r#rrTs
��*�7r%rc�6�eZdZdZd	d�Zd�Zd�Zd�Zd�Zd�Z	y)
rzODialog to confirm the changes that would be required by a
    transaction.
    Nc�6
�tjj||��|jtjtj
j�|jtd�tj
j�||_	||_
t|tj�r,|j�|jj!|�n|j!|�|j#d�|j%d�|j'�j)d�tj*j-tj.tj0j2�}|j5dd�tj6�}|j)d�|j%d�tj8�}|j)d�|j;|ddd�|j;|ddd�tj<�|_|j>jAd�|j>j5dd�|j;|j>ddd�|j'�j;|ddd�tjBtDjF�|_$tjJjM|jH�|_'|jNjQd�|jNjSd�tjT�|_+|jNjY|jV�tjZ�}|jVj;|d�|jVj]||j^d�tj`�}|jVj;|d�|jVj]||jbd�tjd�|_3|jfjitjjjltjjjl�|jfjotjpjr�|jfju|jN�|j;|jfddd�|jwtj
j�y)	aHReturn an AptConfirmDialog instance.

        Keyword arguments:
        trans -- the transaction of which the dependencies should be shown
        cache -- an optional apt.cache.Cache() instance to provide more details
                 about packages
        parent -- set the dialog transient for the given Gtk.Window
        rJr�TrLrMrFN)<rrQr+�
add_buttonr�r�r�r�r��cacher��
isinstancer�Windowr`�window�set_transient_forrUrTrVrWr*r�r�rGrHr/r�r[r�r�r�r��	TreeStorerr�	treestorer�new_with_model�treeview�set_headers_visiblerrrDr�CellRendererPixbufr�render_package_iconr�render_package_descr��scrolledr�r�r�r�r�r�r�r�)	r1r�r�rKrZr�r��	cell_icon�	cell_descs	         r#r+zAptConfirmDialog.__init__lsu��	�
�
���D���0�����(�(�#�*:�*:�*A�*A�B�����+���(8�(8�(;�(;�<���
���
��f�c�j�j�)��L�L�N��K�K�)�)�&�1��"�"�6�*����4� ����a� �����+�+�B�/��y�y�'�'��(A�(A�(+���(;�(;�=�����1�a� ��H�H�J�	����b�!��"�"�1�%��H�H�J�	����b�!����T�5�$��2����Y��d�A�6��Y�Y�[��
��
�
�!�!�$�'��
�
� � ��A�&����T�Z�Z���a�8�����*�*�9�d�D�!�D����w�':�':�;������3�3�D�N�N�C��
��
�
�)�)�%�0��
�
�$�$�T�*��(�(�*����
�
�#�#�D�K�K�0��*�*�,�	������y�%�0����&�&�y�$�2J�2J�'+�	-��(�(�*�	������y�$�/����&�&�y�$�2J�2J�'+�	-��*�*�,��
��
�
� � ����!9�!9�!$���!9�!9�	;��
�
�%�%�c�n�n�&>�&>�?��
�
���$�-�-�(����T�]�]�D�$��:��!�!�#�"2�"2�"9�"9�:r%c�z	�|jj�ttd�td�td�td�td�td�td�g�D]�\}}|jj
|s� |jj
dd	|zg�}|jj
|D]>}|j|�D](}|jj
|t|�g��*�@��td
�}t|j�dk(�r.|jjtjj��}|jj�|jj!|�|jj#d�|jj
t$rtd
�}n�|jj
t&rtd�}n�|jj
t(rtd�}n�|jj
t*rtd�}nz|jj
t,rtd�}nQ|jj
t.rtd�}n(|jj
t0rtd�}t|�dkr^|j3d�|j4j7tj8j:tj8j<�n^|jj?dd�nAtd�}|jj?dd�|jjA�|jjBr=|dz
}|td�tEjF|jjB�zz
}|jjHdkr>|dz
}|td�tEjF|jjH�zz
}nV|jjHdkDr=|dz
}|td�tEjF|jjH�zz
}|jJjMd�d|���y)z2Show a message and the dependencies in the dialog.�Install�	Reinstall�Remove�Purge�Upgrade�	DowngradezSkip upgradeNz	<b>%s</b>z0Please take a look at the list of changes below.rFz'Additional software has to be installedz*Additional software has to be re-installedz%Additional software has to be removedz$Additional software has to be purgedz&Additional software has to be upgradedz(Additional software has to be downgradedzUpdates will be skippedrLrPrtzAdditional changes are required�
z %sB will be downloaded in total.rz %sB of disk space will be freed.z!%sB more disk space will be used.z<b><big>z</big></b>

)'r��clear�	enumerater�r��dependenciesr7�map_package�strrh�
filter_newr�TreePath�	new_firstr��
expand_allr�set_show_expanders�PKGS_INSTALL�PKGS_REINSTALL�PKGS_REMOVE�
PKGS_PURGE�PKGS_UPGRADE�PKGS_DOWNGRADE�	PKGS_KEEPrUr�r�r�r�r�ra�collapse_all�downloadrr��spacer�r�)r1�indexr"�piter�pkg�object�filtered_storer�s        r#�
_show_changeszAptConfirmDialog._show_changes�s���������#�Q�y�\�%&�{�^�%&�x�[�%&�w�Z�%&�y�\�%&�{�^�%&�~�%6�
%8�9�	D�J�E�3��z�z�&�&�u�-����-�-�d�[�3�5F�4G�H���:�:�2�2�5�9�D�C�"&�"2�"2�3�"7�D�����-�-�e�c�&�k�]�C�D�D�	D�"�B�C���t�~�~��!�#�!�^�^�6�6����&�&�(�*�N��M�M�$�$�&��M�M�#�#�N�3��M�M�,�,�U�3��z�z�&�&�|�4��C�D�����(�(��8��F�G�����(�(��5��A�B�����(�(��4��@�A�����(�(��6��B�C�����(�(��8��D�E�����(�(��3��3�4���>�"�Q�&��"�"�5�)��
�
�(�(����)A�)A�),���)=�)=�?��
�
�.�.�s�C�8��7�8�E��M�M�*�*�3��4��M�M�&�&�(��:�:����4�K�C��A�8�9��*�*�4�:�:�+>�+>�?�@�
A�C��:�:���a���4�K�C��A�8�9��*�*�4�:�:�+;�+;�<�=�
>�C�
�Z�Z�
�
��
!��4�K�C��A�9�:��*�*�4�:�:�+;�+;�<�=�
>�C��
�
���e�S�I�Jr%c��|gS)aMap a package to a different object type, e.g. applications
        and return a list of those.

        By default return the package itself inside a list.

        Override this method if you don't want to store package names
        in the treeview.
        rI)r1r�s  r#r�zAptConfirmDialog.map_package�s���u�r%c��|j|�}|j�dk(rd|j_nd|j_d|j_y)z�Data func for the Gtk.CellRendererPixbuf which shows the package.

        Override this method if you want to show custom icons for
        a package or map it to applications.
        rFTzapplications-otherN)r:�	get_depthrrzr-)r1rDrEr rWrF�paths       r#r�z$AptConfirmDialog.render_package_icon�sE���~�~�d�#���>�>��q� �!&�D�J�J��!%�D�J�J��3��
�
�r%c�|�|j|d�}|sy	|jd�dd\}}	|r#|�d|�d|j|j�d�}	n|�d|j|j�d�}	|jd|	�y#t$r|}d}Y�gwxYw#t
tf$r|r	|�d|�d	�}	nd
|z}	Y�GwxYw)z�Data func for the Gtk.CellRendererText which shows the package.

        Override this method if you want to show more information about
        a package or map it to applications.
        rN�=r&z (z	)
<small>r+r)�)z%sr
)r6�split�
ValueErrorr��summaryr4rg�set_property)
r1rDrEr rWrFrC�pkg_name�pkg_versionr�s
          r#r�z$AptConfirmDialog.render_package_descs�������a�(����	�$)�K�K��$4�Q�q�$9�!�H�k�	'���k�4�:�:�h�+?�+G�+G�I���d�j�j��2�:�:�<��	
���(�D�)���	��H��K�	���)�$�	'��$,�k�:���h����		'�s#�B�AB�
B�B�B;�:B;c��|j�|j�tjj	|�Sr�)rr�rrQr�rws r#r�zAptConfirmDialog.runs*�������
�
���z�z�~�~�d�#�#r%r})
rCrDrErFr+rr�r�r�r�rIr%r#rrfs(���9;�v?K�B	�4�*�8$r%rc��eZdZdZdd�Zd�Zy)rzSDialog to resolve conflicts between local and shipped
    configuration files.
    Nc
�
�||_||_td�|z}td�}tjdd��}|jtjjtjj�|jtjj�t�|_|jjdd�|j|j�tj!||td�|||td�tj"j$td	�tj"j&f�
�|j)tj"j&�y)NzLReplace your changes in '%s' with a later version of the configuration file?zRIf you don't know why the file is there already, it is usually safe to replace it.T)�hexpand�vexpandr(rt�_Changes�_Keep�_Replace)rKr�r�r�r?r�)�	from_path�to_pathr�rr�r�r�r�r�r�r�r�diffviewrar�r�r+r��NOr�r�)r1rrrKr�r"r�s       r#r+z$AptConfigFileConflictDialog.__init__(s%��"�������,�-�/8�9���.�/���%�%�d�D�A�����C�N�N�4�4�c�n�n�6N�6N�O�� � ����!9�!9�:� �
��
��
�
�&�&�r�3�/����T�]�]�#��"�"�4��23�J�-�2:�).��,-�g�J��8H�8H�8K�8K�,-�j�M�,/�,<�,<�,@�,@�,B�		#�	C�	
�!�!�#�"2�"2�"6�"6�7r%c��|j�|jj|j|j�t
j
|�Sr�)r�r�	show_diffrrr�r�rws r#r�zAptConfigFileConflictDialog.run?s8���
�
���
�
���������=� �$�$�T�*�*r%r�)rCrDrErFr+r�rIr%r#rr"s���8�.+r%rzp^@@ \-(?P<from_start>[0-9]+)(?:,(?P<from_context>[0-9]+))? \+(?P<to_start>[0-9]+)(?:,(?P<to_context>[0-9]+))? @@c� �eZdZdZdZd�Zd�Zy)rz'Shows the difference between two files.u[…]
c��tj�|_tjj	||j��|jdd�|j
d�|jj�}tjjd�}|jd��|j|�tjjd�}|jdd�	�|j|�tjjd
�}|jdd�	�|j|�tjjd�}|jdd
�	�|j|�y)N)�buffer�editableF�default�Mono)�fontr�z#8ae234)r#�
background�removez#ef2929�numberz#eee)r�
TextBuffer�
textbuffer�TextViewr+r�set_cursor_visible�
get_tag_table�TextTagr��set_propertiesr�)r1�tags�tag_default�tag_add�
tag_remove�tag_nums      r#r+zDiffView.__init__Os,���.�.�*��������d�4�?�?��;����*�e�,�����&����,�,�.���k�k�o�o�i�0���"�"��"�/�������+�+�/�/�%�(�����F�*3�	�	5�������[�[�_�_�X�.�
��!�!�v�-6�	"�	8�������+�+�/�/�(�+�����F�*0�	�	2�����r%c����	t|�5}|j�}ddd�t|�5}|j�}ddd��fd�}d}�jj	�}tjd��D�]/}	|	jd�rRtjt|	�}
|
s�2t|
jd��}|dkDs�R||�jd	��g|	jd
�s|	jd�r��|	jd�r#|dz
}||t|�d
�|||	d	���|	jd�r#|dz
}||t|�d
�|||	d���|	jd�s��dtt|��z}|||d
�|||	d���2y#1swY���xYw#1swY���xYw#t$rYywxYw)z&Show the difference between two files.Nc����|j�}�jj||��jj|�jj	|�|�yr�)�
get_offsetr(�insert�apply_tag_by_name�get_iter_at_offset)rWr��tag�offsetr1s    �r#�insert_tagged_textz.DiffView.show_diff.<locals>.insert_tagged_textssL����_�_�&�F��O�O�"�"�4��.��O�O�-�-��T�_�_�7�7��?��
Gr%rrO)�linetermz@@�
from_startrr!z---z+++r�r&�-r%�+r�)�open�	readlines�IOErrorr(�get_start_iter�difflib�unified_diff�
startswith�re�match�REGEX_RANGEr,�group�ELLIPSISr�rh)r1rr�fp�
from_lines�to_linesr;�line_numberrW�linerH�spacess`           r#rzDiffView.show_difffs����	��i��
,�B��\�\�^�
�
,��g��
*�"��<�<�>��
*�	G������-�-�/���(�(��X��K�	6�D����t�$�����d�3����!�%�+�+�l�";�<����?�&�t�T�]�]�I�F�����'�4�?�?�5�+A������%��q� ��"�4��[�)9�8�D�"�4��y�9�����%��q� ��"�4��[�)9�8�D�"�4��x�8�����%��s�3�{�#3�4�4��"�4���:�"�4��u�5�+	6�%
,�
,��
*�
*���	��	�s>�G�F8�G�G�G�8G�=G�G�
G�	G�GN)rCrDrErFrKr+rrIr%r#rrIs��1��H��.+6r%rc��eZdZdZdd�Zy)�_DetailsExpanderMessageDialogz*
    Common base class for Apt*Dialog
    Nc	��tj�}|jtjjtjj�|jtjj�tj�}|jtjj�|j�}|j|�tj||t!d�||||��|j#�|r|j%|�y|j&j)d�y)N�_Details)rKr�r�r�r?r�F)rr�r�r�r�r�r�r�r)�
set_wrap_mode�WrapMode�WORD�
get_bufferr�r�r+r�r��insert_at_cursorr]�set_visible)	r1r�r<r��detailsrKr��textviewrs	         r#r+z&_DetailsExpanderMessageDialog.__init__�s����%�%�'�����C�N�N�4�4�c�n�n�6N�6N�O�� � ����!9�!9�:��<�<�>�����s�|�|�0�0�1��$�$�&�����X���"�"�4��23�J�-�2:�)-�t�.2�		#�	4�
	
�
�
����#�#�G�,��M�M�%�%�e�,r%r}r�rIr%r#rSrS�s���-r%rSc��eZdZdZdd�Zy)rzM
    Dialog for aptdaemon errors with details in an expandable text view
    Nc��t|j�}t|j�}tj	|||t
j|j|�yr�)�get_error_string_from_enum�code�get_error_description_from_enumrSr+r�STOCK_DIALOG_ERRORr\)r1r�rKr�r<s     r#r+zAptErrorDialog.__init__�sD��)�%�*�*�5��.�u�z�z�:��%�.�.��$��c�4�4�e�m�m�V�	Mr%r}r�rIr%r#rr�s
���Mr%r);rF�
__author__�__all__rDr r�r�rG�gi�require_version�apt_pkg�
gi.repositoryrrrrrrrOr�enums�deferr�defer.utilsrr�rGrf�	COLUMN_ID�COLUMN_PACKAGEr*rrr	r�r
rr�rr�r�r�rr�rrr�rQrr�r�rrrrIr)rrSrrIr%r#�<module>ros����*5�
�
����	�
�	�	�����5�&�!�����5�%� �����5�%� ��!��������"�!�2����a��>����#'�C�I�I�#'�L'�-�'�.N+��N+�bD�3�9�9�D�6�S�Y�Y��B7�S�_�_�7�t@%����@%�F%�#�,�,�%�8%"�c�j�j�%"�Pd(�s�|�|�d(�NL��
�
�L�^O&��
�
�O&�d7�c�/�/�7�$y$�s�z�z�y$�x +�"3� +�FG��H6�s�|�|�H6�V-�$5�-�2M�2�Mr%

Zerion Mini Shell 1.0