
    Je!r                         d Z ddlmZ ddlZddlmZ ddlmZmZm	Z	m
Z
mZmZ ddlmZmZmZ ddlmZmZmZmZmZmZmZmZmZ ddlmZ dd	lmZmZ dd
l m!Z! ddl"m#Z#m$Z$m%Z% ddl&m'Z' ddl(m)Z)  G d de!      Z*y)z
This module contains the marker panel.

Adapted from pyqode/core/panels/folding.py of the
`PyQode project <https://github.com/pyQode/pyQode>`_.
Original file:
<https://github.com/pyQode/pyqode.core/blob/master/pyqode/core/panels/folding.py>
    )ceilN)IntervalTree)SignalQSizeQPointFQRectFQRectQt)QApplicationQStyleOptionViewItemQStyle)	
QTextBlockQColorQFontMetricsFQPainterQLinearGradientQPenQPaletteQResizeEventQCursor)FoldingRegion)TextDecorationDRAW_ORDERS)Panel)
TextHelperDelayJobRunnerdrift_color)ima)QStylePalettec                       e Zd ZdZ eee      Z e       Z e       Z	e
d        Zej                  d        Ze
d        Zej                  d        Ze
d        Zej                  d        Zd Zd	 Zd
 Z	 d&dZ fdZd Zd Zd Zd Zd Zd Zd Zd Z fdZd Z fdZd Zd Z d Z!d Z"d Z#d Z$d Z%d Z&d  Z'd! Z(d" Z)d# Z*d$ Z+d% Z, xZ-S )'FoldingPanela  
    Displays the document outline and lets the user collapse/expand blocks.

    The data represented by the panel come from the Language Server Protocol
    invoked via the CodeEditor. This panel stores information about both
    folding regions and their folding state.
    c                     | j                   S )z
        Defines whether the panel will use native indicator icons or
        use custom ones.

        If you want to use custom indicator icons, you must first
        set this flag to False.
        )native_iconsselfs    J/usr/lib/python3/dist-packages/spyder/plugins/editor/panels/codefolding.pyr#   zFoldingPanel.native_icons8   s            c                     || _         | j                  rG| j                  j                  D ]-  }	 ||j                  j	                  | j
                        _        / y y # t        $ r Y =w xY wN)_native_iconseditorclonesmodesget	__class__r#   KeyErrorr%   valueclones      r&   r#   zFoldingPanel.native_iconsC   sa    ";;++ CHEKKOODNN3@    s   *A	A('A(c                     | j                   S )a6  
        Gets/sets the icons for the fold indicators.

        The list of indicators is interpreted as follow::

            (COLLAPSED_OFF, COLLAPSED_ON, EXPANDED_OFF, EXPANDED_ON)

        To use this property you must first set `native_icons` to False.

        :returns: tuple(str, str, str, str)
        )_indicators_iconsr$   s    r&   indicators_iconszFoldingPanel.indicators_iconsO   s     %%%r'   c                    t        |      dk7  rt        d      || _        | j                  rG| j                  j                  D ]-  }	 ||j
                  j                  | j                        _        / y y # t        $ r Y =w xY w)N   z5The list of custom indicators must contains 4 strings)
len
ValueErrorr5   r+   r,   r-   r.   r/   r6   r0   r1   s      r&   r6   zFoldingPanel.indicators_icons^   s    u:? ' ( (!&;;++ ;@ KKOO((8    s   *A55	B Bc                     | j                   S )z
        True to highlight the caret scope automatically.

        (Similar to the ``Highlight blocks in Qt Creator``.

        Default is False.
        )_highlight_caretr$   s    r&   highlight_caret_scopez"FoldingPanel.highlight_caret_scopen   s     $$$r'   c                    || j                   k7  r|| _         | j                  r|r7d| _        | j                  j                  j	                  | j
                         n6d| _        | j                  j                  j                  | j
                         | j                  j                  D ]-  }	 ||j                  j                  | j                        _        / y y y # t        $ r Y >w xY w)N)r<   r+   
_block_nbrcursorPositionChangedconnect_highlight_caret_scope
disconnectr,   r-   r.   r/   r=   r0   r1   s      r&   r=   z"FoldingPanel.highlight_caret_scopey   s    D)))$)D!{{&(DOKK55==335 ')DOKK55@@335![[// EDI  NN,,A  * $  s   ,*C	C'&C'c                    t        j                  |        d| _        d| _        d| _        d| _        d| _        d| _        g | _        i | _	        | j                  d       d| _        d | _        d | _        d | _        d | _        d | _        d | _        d | _        d | _        d | _        d| _        d| _        t/        d      | _        t3               | _        t7        d d       | _        i | _        i | _        i | _        i | _         y )NF)zfolding.arrow_right_offzfolding.arrow_right_onzfolding.arrow_down_offzfolding.arrow_down_onr?      T   )delay)!r   __init__r*   r5   r@   r<   r=   _indic_size_scope_decos_block_decossetMouseTracking
scrollable_mouse_over_line_current_scope_prev_cursorcontext_menuaction_collapseaction_expandaction_collapse_allaction_expand_all_original_background_display_folding_key_pressedr   _highlight_runnerr   current_treer   rootfolding_regionsfolding_statusfolding_levelsfolding_nestingr$   s    r&   rI   zFoldingPanel.__init__   s   t""
  %%*" d# $"  #!#' !%$(! %!!/c!:(N!$-	!  !r'   c                 x    |y|\  | _         | _        | _        | _        | _        | _        | j                          y)z$Update folding panel folding ranges.N)r[   r\   r]   r`   r_   r^   update)r%   folding_infos     r&   update_foldingzFoldingPanel.update_folding   s>     6B	3	DI		t3		d1r'   c                    t        | j                  j                               }t        t	        |j                               t	        |j                                     }|j                         dkD  r|j                  d       |S )z=Returns the widget size hint (based on the editor font size) rF   )r   r+   fontr   r   heightwidthsetWidth)r%   fm	size_hints      r&   sizeHintzFoldingPanel.sizeHint   s^    4;;++-.$ryy{+T"))+->?	??r!r"r'   c                 z   || j                   v r,| j                  |   }| j                   |   }| j                  |k(  }|s| j                  ||||       |rZ|r| j                  ||||       | j                  D ]"  }	| j                  |	   }
|
j
                  |k(  s" y  | j                  ||       y |st        | j                  j                               D ]c  }	| j                  |	   }
|
j
                  |k(  s"| j                  j                  |	       | j                  j                  j                  |
       ~
 y  y y y r)   )r]   r^   rO   _draw_fold_indicatorrL   block_add_fold_decorationlistkeyspopr+   decorationsremove)r%   line_numbertop_positionro   paintermouse_hover	collapsedline_end
mouse_over	deco_linedecos              r&   _draw_collapsed_indicatorz&FoldingPanel._draw_collapsed_indicator   sC   $...++K8I++K8H..+=J)) *iB--$j)WF
 "&!2!2 ?I,,Y7DzzU* ? --eX> !%d&7&7&<&<&>!? 
I,,Y7D zzU*))--i8//66t< 
 !- /r'   c                 `   t         t        |   |       t        |       }| j                  sg| j
                  s[t        | j                  j                               r7| j                  j                  D ]  }|\  }}}| j                  ||||d         y | j                  F| j                  j                         j                  | j                        }	 | j                  ||       | j                  j                  D ]  \  }}}| j                  ||||d        y # t         t"        f$ r Y Gw xY w)NT)ry   F)superr!   
paintEventr   rX   rY   anyr^   valuesr+   visible_blocksr   rO   documentfindBlockByNumber_draw_fold_region_backgroundr:   r0   )r%   eventrx   inforw   rv   ro   r/   s          r&   r   zFoldingPanel.paintEvent   s3    	lD,U34.$$T->->4&&--/0 KK66 3D7;4L+u22#\5T 3 33
   ,KK((*<<%%'E11%A 150J0J 	N,L+u**\5'u + N	N )  s   D D-,D-c                    t        | j                        }|j                         }| j                  |   }|dkD  r|j	                  |      }nd}|j	                  |      }||z
  }|dk(  r| j                         j                         }| j                         j                         }	| j                  t        d||	|      |       y)z
        Draw the fold region when the mouse is over and non collapsed
        indicator.

        :param top: Top position
        :param block: Current block.
        :param painter: QPainter
        r   N)
r   r+   blockNumberr]   line_pos_from_numberrl   rg   rh   
_draw_rectr   )
r%   ro   rx   thstartendtopbottomhws
             r&   r   z)FoldingPanel._draw_fold_region_background  s     $!!#""5)19))%0CC((-SL6&&(AMMO!!#q#q!,g6r'   c                    | j                   j                  }t        |j                         |j	                               }t
        j                  dk(  rT|j                  d|j                  d             |j                  d|j                  d             |j                  d      }nS|j                  d|j                  d             |j                  d|j                  d             |j                  d      }|j                  ||       |j                  t        |             |j                  |j                         t        dd      z   |j	                         t        dd      z
         |j                  |j                         t        dd      z   |j!                         t        dd      z
         |j                  |j	                         t        dd      z   |j!                         t        dd      z
         |j                  |j                         t        dd      z   |j                         t        dd      z
         y)z
        Draw the background rectangle using the current style primitive color.

        :param rect: The fold zone rect to draw

        :param painter: The widget's painter.
        darwinr   d      n      N)r+   sideareas_colorr   topLefttopRightsysplatform
setColorAtlighterdarkerfillRectsetPenr   drawLiner   
bottomLeftbottomRight)r%   rectrx   cgradoutlines         r&   r   zFoldingPanel._draw_rect$  s    KK''t||~t}}?<<8#OOAqyy~.OOAqyy~.hhsmGOOAqyy~.OOAqyy~.hhsmGt$tG}% A' A'	( 	* A'))+ A'	( 	 A'))+ A'	( 	 A'* A'	(r'   c                    t        d|| j                         j                         | j                         j                               }| j                  rGt               }||_        t        j                  t        j                  z  t        j                  z  |_        |s#|xj                  t        j                  z  c_        |r|xj                  t        j                  t        j                  z  t        j                  z  z  c_        |j                   j#                  t$        j&                  | j!                         j)                                |j                  j+                  dd       | j-                         j/                  t        j0                  |||        yd}|sd}|r|dz  }t3        j4                  | j6                  |         j9                  ||       y)a  
        Draw the fold indicator/trigger (arrow).

        :param top: Top position
        :param mouse_over: Whether the mouse is over the indicator
        :param collapsed: Whether the trigger is collapsed or not.
        :param painter: QPainter
        r      r   N)r	   rl   rh   rg   r*   r   r   r   State_Active
State_ItemState_Childrenstate
State_OpenState_MouseOverState_EnabledState_SelectedpalettesetBrushr   Window	highlight	translatestyledrawPrimitivePE_IndicatorBranchr   iconr5   paint)r%   r   r|   rz   rx   r   optindexs           r&   rn   z!FoldingPanel._draw_fold_indicatorI  sg    QT]]_224]]_++-/&(CCH,,**+../CI 		V...			f44$223$334 5	 $$X__%)\\^%=%=%?AHHr1%JJL&&v'@'@'*GT; E
HHT++E2399'4Hr'   c                     |j                         }|| j                  vrW| j                  D ]H  }| j                  |   }||kD  s||k  s| j                  j                         j	                  |      } |S  |S )z6Find parent scope, if the block is not a fold trigger.)r   r]   r+   r   r   )r%   ro   
block_line
start_lineend_lines        r&   find_parent_scopezFoldingPanel.find_parent_scopen  s    &&(
T111"22 
//
;j(!J. $ 4 4 6 H H&!( r'   c                     | j                   D ]'  }| j                  j                  j                  |       ) g | j                   dd y)z'Clear scope decorations (on the editor)N)rK   r+   rt   ru   r%   r~   s     r&   _clear_scope_decoszFoldingPanel._clear_scope_decos{  s?    %% 	1DKK##**40	1!!r'   c                     | j                   j                  }|j                         dk  rt        |d      }|S t        |d      }|S )z
        Gets the base scope highlight color (derivated from the editor
        background)

        For lighter themes will be a darker color,
        and for darker ones will be a lighter color
           r   i   )r+   r   	lightnessr   )r%   colors     r&   _get_scope_highlight_colorz'FoldingPanel._get_scope_highlight_color  sH     ++??s"s+E   s+Er'   c                 ~   | j                         }t        j                  d      }t        | j                  j                         t        d|dz
        ||      }|j                  |       |j                  dd       | j                  j                  j                  |       | j                  j                  |       y)	z
        Create a decoration and add it to the editor.

        Args:
            start (int) start line of the decoration
            end (int) end line of the decoration
        codefoldingr   r   )r   r   
draw_orderTF)clearN)r   r   r.   r   r+   r   maxset_backgroundset_full_widthrt   addrK   append)r%   r   r   r   r   ds         r&   _decorate_blockzFoldingPanel._decorate_block  s     //1 __]3
4;;//1&)!UQY&7$'&02 	
	U+##A&  #r'   c                     |j                         }| j                  |   }||f}| j                  | j                  |k7  r?|| _        | j                          |\  }}| j                  |   s| j                  ||       yyy)zu
        Highlights the current fold scope.

        :param block: Block that starts the current fold scope.
        N)r   r]   rP   r   r^   r   )r%   ro   r   r   scoper   r   s          r&   _highlight_blockzFoldingPanel._highlight_block  s     &&(
''
3X&'4+>+>%+G"'D##%JE3&&u-$$UC0 . ,Hr'   c                    t         t        |   |       t        | j                        }|j                  |j                         j                               }|dk\  rk| j                  j                         j                  |      }| j                  |      }|j                         }|| j                  v r| j                  ,t        j                  t!        t"        j$                               | j                  |j                         k7  r4| j                  (|j                         | _        	 | j'                  |       n<|j                         | _        	 | j*                  j-                  | j&                  |       || _        n5| j*                  j1                          d| _        t        j2                          | j5                          yy# t(        $ r Y Zw xY w# t(        $ r Y iw xY w)z
        Detect mouser over indicator and highlight the current scope in the
        editor (up and down decoration arround the foldable text when the mouse
        is over an indicator).

        :param event: event
        r   N)r   r!   mouseMoveEventr   r+   line_nbr_from_positionposyr   r   r   r   r]   rO   r   setOverrideCursorr   r
   PointingHandCursorr   r0   rZ   request_job_highight_blockcancel_requestsrestoreOverrideCursorrepaint)r%   r   r   linero   rv   r/   s         r&   r   zFoldingPanel.mouseMoveEvent  s    	lD07$((919KK((*<<TBE**51E++-Kd222((0 22 5 568))U->->-@@--9 -2,=,=,?D)--e4 -2,=,=,?D)..:: 115: (-$ &&668(,%224LLNI   $   $  s$   ,G	 &G 		GG	G$#G$c                 2    d| _         | j                          y )NT)rX   r   )r%   r   s     r&   
enterEventzFoldingPanel.enterEvent  s     $r'   c                 N   t         t        |   |       t        j                          | j
                  j                          | j                  s| j                          d| _	        d| _
        nd| _        | j                          | j                  j                          d| _        y)z
        Removes scope decorations and background from the editor and the panel
        if highlight_caret_scope, else simply update the scope decorations to
        match the caret scope.
        Nr?   F)r   r!   
leaveEventr   r   rZ   r   r=   r   rO   rP   r@   rC   r+   r   rX   )r%   r   r/   s     r&   r   zFoldingPanel.leaveEvent  s     	lD,U3**,..0))##%$(D!"&D DO'') %r'   c                    |j                         }| j                  j                  |dz   |      }t        j                  d      }t        ||      }|j                  j                  j                  | j                         ||_
        ||_        |j                          |j                  t        | j                         d             |j!                  | j                                |j#                  t%        t&        j(                               || j*                  |<   | j                  j,                  j/                  |       y)zc
        Add fold decorations (boxes arround a folded block in the editor
        widget).
        r   r   )r   r   N)r   r+   get_text_regionr   r.   r   signalsclickedrB   _on_fold_deco_clickedtooltipro   select_lineset_outliner   r   r   set_foregroundr   r   COLOR_TEXT_4rL   rt   r   )r%   ro   r   r   textr   r~   s          r&   rp   z!FoldingPanel._add_fold_decoration  s    
 &&(
{{**:>8D __]3
e
;$$T%?%?@
++-s4 	5D;;=>F=#=#=>?(,*%##D)r'   c                     |j                         |k  rU|j                         rE|j                  d       |j                         }|j                         |k  r|j                         rE|S )NFr   isValid
setVisiblenext)r%   ro   r   s      r&   _get_block_until_linez"FoldingPanel._get_block_until_line  sV    !X-%--/U#JJLE !X-%--/ r'   c                     |j                         |k  rU|j                         rE|j                  d       |j                         }|j                         |k  r|j                         rE|S )z3Fold region spanned by *start_line* and *end_line*.Fr   r%   ro   r   r   s       r&   fold_regionzFoldingPanel.fold_region  sV    !H,U#JJLE !H, r'   c                 ^   |dz
  | j                   v rU| j                   |dz
     }| j                   j                  |dz
         | j                  j                  j	                  |       |j                         |k  r|j                         r|j                         }|j                  d       d}|| j                  v r:||k7  r5| j                  |   }| j                  |   rd}| j                  ||dz
        }|r|j                         }|j                         |k  r|j                         ryyyy)z5Unfold region spanned by *start_line* and *end_line*.r   TFN)rL   rs   r+   rt   ru   r   r   r   r]   r^   r  r   )r%   ro   r   r   r~   current_lineget_next	block_ends           r&   unfold_regionzFoldingPanel.unfold_region  s   >T...$$Z!^4D!!*q.1KK##**40!H, ,,.LT"H 4 44$
2 00>	&&|4$H 66ui!mLE

 !H,,,r'   c                    |j                         }|| j                  vry| j                  |   }| j                  |   rA| j                  |||       d| j                  |<   | j                  E| j                  ||       n2| j                  |||       d| j                  |<   | j                          | j                          y)z
        Toggle a fold trigger block (expand or collapse it).

        :param block: The QTextBlock to expand/collapse
        NFT)	r   r]   r^   r	  rO   r   r  r   _refresh_editor_and_scrollbarsr  s       r&   toggle_fold_triggerz FoldingPanel.toggle_fold_trigger4  s     &&(
T111''
3z*uj(;.3D
+$$0$$Z:UJ9.2D
+##%++-r'   c                     | j                   E| j                  j                         j                  | j                         }| j	                  |       yy)z+Folds/unfolds the pressed indicator if any.N)rO   r+   r   r   r  )r%   r   ro   s      r&   mousePressEventzFoldingPanel.mousePressEventI  sG      ,KK((*<<%%'E$$U+ -r'   c                 :    | j                  |j                         y)z<Unfold a folded block that has just been clicked by the userN)r  ro   r   s     r&   r   z"FoldingPanel._on_fold_deco_clickedP  s      ,r'   c                    |r| j                   j                  j                  | j                         | j                  r6| j                   j
                  j                  | j                         d| _        | j                   j                  j                  | j                         y| j                   j                  j                  | j                         | j                  r6| j                   j
                  j                  | j                         d| _        | j                   j                  j                  | j                         y)zV
        On state changed we (dis)connect to the cursorPositionChanged signal
        r?   N)r+   sig_key_pressedrB   _on_key_pressedr<   rA   rC   r@   new_text_set_clear_block_decorD   )r%   r   s     r&   on_state_changedzFoldingPanel.on_state_changedT  s     KK''//0D0DE$$1199//1"$KK$$,,T-C-CDKK''2243G3GH$$11<<//1"$KK$$//0F0FGr'   c                    |j                         t        j                  t        j                  hv }| j                  j                         }|j                         r#|j                         t        j                  k(  rd}|j                         s|rd| _	        |j                         r!|j                         |j                         f}n|j                         f}|D ]r  }| j                  j                         j                  |      }|j                         dz   }|| j                   v sO| j"                  |   s_| j                   |   }|sq|j                         st%        | j                        j'                  ||      }	|	j                         |j                         kD  r|j                         }
n|	j                         }
|	j                         |j                         k  r|j                         }n|	j                         }|	j)                  |
       |	j)                  ||	j*                         | j                  j-                  |	       u d| _	        yy)z
        Override key press to select the current scope if the user wants
        to deleted a folded scope (without selecting it).
        Tr   FN)keyr
   
Key_DeleteKey_Backspacer+   
textCursorhasSelection
Key_Returnr   rY   selectionStartselectionEndpositionr   	findBlockr   r]   r^   r   select_linessetPosition
KeepAnchorsetTextCursor)r%   r   delete_requestcursorpositions_to_checkr   ro   r   r   tcr   r   s               r&   r  zFoldingPanel._on_key_pressedg  s   
 8H8H(II'') yy{bmm+!%::<> $D""$&,&;&;&=&,&9&9&;&=" '-oo&7%:") 6,,.88="..014
$"6"66++J7#33J?H%&*=*=*?'4AA&2,,.1F1F1HH$*$9$9$;E$&$5$5$7E??,v/B/B/DD"("5"5"7C"$//"3Cu-sBMM:11"5'6( !&D9 *r'   c                 p   t        | j                        j                          | j                  j                          | j                  j	                         }|j                  |j                         dz          | j                  j                  t        | j                  j	                         |             y)ap  
        Refrehes editor content and scollbars.

        We generate a fake resize event to refresh scroll bar.

        We have the same problem as described here:
        http://www.qtcentre.org/threads/44803 and we apply the same solution
        (don't worry, there is no visual effect, the editor does not grow up
        at all, even with a value = 500)
        r   N)	r   r+   mark_whole_doc_dirtyr   sizeri   rh   resizeEventr   )r%   ss     r&   r  z+FoldingPanel._refresh_editor_and_scrollbars  sw     	4;;446KK	

1779q=!T[[-=-=-? CDr'   c                 J   | j                          | j                  j                         j                         }|j	                         ra|j                         }|| j                  v r"| j                  |   }| j                  |||       |j                         }|j	                         ra| j                          | j                  j                         }|j                  |j                         | j                  j                  |       | j                  j                          y)zd
        Collapses all triggers and makes all blocks with fold level > 0
        invisible.
        N)r  r+   r   
firstBlockr   r   r]   r  r   r  r  movePositionStartr$  collapse_all_triggeredemit)r%   ro   rv   r   r(  s        r&   collapse_allzFoldingPanel.collapse_all  s    
 	 $$&113mmo++-Kd222//<  X>JJLE mmo 	++-[[##%
!!!"%##((*r'   c                     | j                   D ]6  }| j                   |   }| j                  j                  j                  |       8 i | _         y)z#Clear the folded block decorations.N)rL   r+   rt   ru   )r%   r}   r~   s      r&   r  zFoldingPanel._clear_block_deco  sI    ** 	1I$$Y/DKK##**40	1 r'   c                    | j                   j                         j                         }|j                         ra|j	                         }|| j
                  v r"| j
                  |   }| j                  |||       |j                         }|j                         ra| j                          | j                          | j                  j                          y)zExpands all fold triggers.N)r+   r   r/  r   BlockNumberr]   r	  r   r  r  expand_all_triggeredr3  )r%   ro   rv   r   s       r&   
expand_allzFoldingPanel.expand_all  s    $$&113mmo++-Kd222//<""5+x@JJLE mmo 	 ++-!!&&(r'   c                    | j                   j                         }|j                         }| j                  |k7  r|| j	                  |j                               }|j                         }|| j                  v r/|j                         | _        	 | j                  |       || _        y| j                          || _        y# t        $ r
 Y || _        yw xY w)z
        Highlight the scope of the current caret position.

        This get called only if :attr:`
        spyder.widgets.panels.FoldingPanel.highlight_care_scope` is True.
        N)r+   r  r   r@   r   ro   r]   rO   r   r0   r   )r%   r&  	block_nbrro   rv   s        r&   rC   z#FoldingPanel._highlight_caret_scope  s     '')&&(	??i'**6<<>:E++-Kd222(-(9(9(;%))%0 $ '')#     $s   B> >	CC)F).__name__
__module____qualname____doc__r   r   booltrigger_state_changedr2  r8  propertyr#   setterr6   r=   rI   rd   rl   r   r   r   r   rn   r   r   r   r   r   r   r   r   rp   r  r  r	  r  r  r   r  r  r  r4  r  r9  rC   __classcell__)r/   s   @r&   r!   r!   )   sU    #:t4#X!8! ! 	 	 & &   % % !! "*%"N 8=#JN@7.#(J#IJ"$&1$/b&&*(%,.*,-H&'&RE"+&)$r'   r!   )+r?  mathr   r   intervaltreer   qtpy.QtCorer   r   r   r   r	   r
   qtpy.QtWidgetsr   r   r   
qtpy.QtGuir   r   r   r   r   r   r   r   r   "spyder.plugins.editor.panels.utilsr   $spyder.plugins.editor.api.decorationr   r   spyder.api.panelr   "spyder.plugins.editor.utils.editorr   r   r   spyder.utils.icon_managerr   spyder.utils.paletter   r!    r'   r&   <module>rQ     s[     
 & A A E E! ! !
 = L "= = ) .u
$5 u
$r'   