From 881684f10363d2fc26ceda8bd037bd73f1ab2491 Mon Sep 17 00:00:00 2001 From: Nis Wechselberg Date: Mon, 12 May 2014 18:57:15 +0200 Subject: [PATCH] Added sublime config --- .../Default/Add Line Before.sublime-macro | 6 + .../Default/Add Line in Braces.sublime-macro | 6 + sublime-text/Default/Add Line.sublime-macro | 4 + sublime-text/Default/Context.sublime-menu | 13 + .../Default/Default (Linux).sublime-keymap | 650 ++++++++++++++ .../Default/Default (Linux).sublime-mousemap | 100 +++ .../Default/Default (OSX).sublime-keymap | 624 ++++++++++++++ .../Default/Default (OSX).sublime-mousemap | 98 +++ .../Default/Default (Windows).sublime-keymap | 641 ++++++++++++++ .../Default (Windows).sublime-mousemap | 131 +++ sublime-text/Default/Default.sublime-commands | 118 +++ .../Default/Delete Left Right.sublime-macro | 4 + .../Default/Delete Line.sublime-macro | 5 + .../Default/Delete to BOL.sublime-macro | 5 + .../Default/Delete to EOL.sublime-macro | 5 + .../Default/Delete to Hard BOL.sublime-macro | 5 + .../Default/Delete to Hard EOL.sublime-macro | 5 + .../Default/Distraction Free.sublime-settings | 8 + .../Default/Find Results.hidden-tmLanguage | 50 ++ .../Default/Find in Files.sublime-menu | 8 + sublime-text/Default/Icon.png | Bin 0 -> 1689 bytes sublime-text/Default/Ignored Packages.cache | 1 + ...Indentation Rules - Comments.tmPreferences | 13 + ...ation Rules - Comments.tmPreferences.cache | Bin 0 -> 74 bytes .../Default/Indentation Rules.tmPreferences | 19 + .../Indentation Rules.tmPreferences.cache | Bin 0 -> 173 bytes sublime-text/Default/Indentation.sublime-menu | 17 + sublime-text/Default/Main.sublime-menu | 809 ++++++++++++++++++ sublime-text/Default/Meta Info Summary.cache | Bin 0 -> 8922 bytes sublime-text/Default/Minimap.sublime-settings | 5 + .../Preferences (Linux).sublime-settings | 5 + .../Preferences (OSX).sublime-settings | 9 + .../Preferences (Windows).sublime-settings | 4 + .../Default/Preferences.sublime-settings | 336 ++++++++ .../Regex Format Widget.sublime-settings | 0 .../Default/Regex Widget.sublime-settings | 3 + .../Default/Side Bar Mount Point.sublime-menu | 4 + sublime-text/Default/Side Bar.sublime-menu | 11 + sublime-text/Default/Startup.cache | Bin 0 -> 119862 bytes .../Default/Symbol List.tmPreferences | 17 + .../Default/Symbol List.tmPreferences.cache | Bin 0 -> 172 bytes sublime-text/Default/Syntax Summary.cache | Bin 0 -> 2619 bytes sublime-text/Default/Syntax.sublime-menu | 6 + sublime-text/Default/Tab Context.sublime-menu | 8 + .../Default/Widget Context.sublime-menu | 7 + sublime-text/Default/Widget.sublime-settings | 15 + sublime-text/Default/comment.py | 233 +++++ sublime-text/Default/comment.pyc | Bin 0 -> 6283 bytes sublime-text/Default/copy_path.py | 10 + sublime-text/Default/copy_path.pyc | Bin 0 -> 814 bytes sublime-text/Default/delete_word.py | 73 ++ sublime-text/Default/delete_word.pyc | Bin 0 -> 2390 bytes sublime-text/Default/detect_indentation.py | 62 ++ sublime-text/Default/detect_indentation.pyc | Bin 0 -> 2900 bytes sublime-text/Default/duplicate_line.py | 11 + sublime-text/Default/duplicate_line.pyc | Bin 0 -> 760 bytes sublime-text/Default/echo.py | 5 + sublime-text/Default/echo.pyc | Bin 0 -> 464 bytes sublime-text/Default/exec.py | 229 +++++ sublime-text/Default/exec.pyc | Bin 0 -> 7114 bytes sublime-text/Default/fold.py | 125 +++ sublime-text/Default/fold.pyc | Bin 0 -> 4342 bytes sublime-text/Default/font.py | 45 + sublime-text/Default/font.pyc | Bin 0 -> 1685 bytes sublime-text/Default/goto_line.py | 33 + sublime-text/Default/goto_line.pyc | Bin 0 -> 1481 bytes sublime-text/Default/indentation.py | 168 ++++ sublime-text/Default/indentation.pyc | Bin 0 -> 5650 bytes sublime-text/Default/kill_ring.py | 107 +++ sublime-text/Default/kill_ring.pyc | Bin 0 -> 3608 bytes sublime-text/Default/mark.py | 43 + sublime-text/Default/mark.pyc | Bin 0 -> 2250 bytes sublime-text/Default/new_templates.py | 53 ++ sublime-text/Default/new_templates.pyc | Bin 0 -> 2481 bytes sublime-text/Default/open_file_settings.py | 12 + sublime-text/Default/open_file_settings.pyc | Bin 0 -> 1047 bytes sublime-text/Default/open_in_browser.py | 13 + sublime-text/Default/open_in_browser.pyc | Bin 0 -> 927 bytes sublime-text/Default/paragraph.py | 211 +++++ sublime-text/Default/paragraph.pyc | Bin 0 -> 5829 bytes sublime-text/Default/save_on_focus_lost.py | 10 + sublime-text/Default/save_on_focus_lost.pyc | Bin 0 -> 774 bytes sublime-text/Default/scroll.py | 13 + sublime-text/Default/scroll.pyc | Bin 0 -> 1112 bytes sublime-text/Default/send2trash/__init__.py | 14 + sublime-text/Default/send2trash/__init__.pyc | Bin 0 -> 339 bytes sublime-text/Default/send2trash/plat_osx.py | 44 + sublime-text/Default/send2trash/plat_other.py | 154 ++++ .../Default/send2trash/plat_other.pyc | Bin 0 -> 4326 bytes sublime-text/Default/send2trash/plat_win.py | 55 ++ sublime-text/Default/set_unsaved_view_name.py | 70 ++ .../Default/set_unsaved_view_name.pyc | Bin 0 -> 1864 bytes sublime-text/Default/side_bar.py | 84 ++ sublime-text/Default/side_bar.pyc | Bin 0 -> 4769 bytes sublime-text/Default/sort.py | 184 ++++ sublime-text/Default/sort.pyc | Bin 0 -> 6182 bytes sublime-text/Default/swap_line.py | 110 +++ sublime-text/Default/swap_line.pyc | Bin 0 -> 3033 bytes sublime-text/Default/switch_file.py | 42 + sublime-text/Default/switch_file.pyc | Bin 0 -> 1404 bytes sublime-text/Default/transform.py | 38 + sublime-text/Default/transform.pyc | Bin 0 -> 2383 bytes sublime-text/Default/transpose.py | 102 +++ sublime-text/Default/transpose.pyc | Bin 0 -> 3634 bytes .../Default/trim_trailing_white_space.py | 19 + .../Default/trim_trailing_white_space.pyc | Bin 0 -> 1399 bytes .../User/Default (Linux).sublime-keymap | 2 + .../User/Default (OSX).sublime-keymap | 2 + .../User/Default (Windows).sublime-keymap | 2 + .../User/Preferences.sublime-settings | 3 + 110 files changed, 6156 insertions(+) create mode 100644 sublime-text/Default/Add Line Before.sublime-macro create mode 100644 sublime-text/Default/Add Line in Braces.sublime-macro create mode 100644 sublime-text/Default/Add Line.sublime-macro create mode 100644 sublime-text/Default/Context.sublime-menu create mode 100644 sublime-text/Default/Default (Linux).sublime-keymap create mode 100644 sublime-text/Default/Default (Linux).sublime-mousemap create mode 100644 sublime-text/Default/Default (OSX).sublime-keymap create mode 100644 sublime-text/Default/Default (OSX).sublime-mousemap create mode 100644 sublime-text/Default/Default (Windows).sublime-keymap create mode 100644 sublime-text/Default/Default (Windows).sublime-mousemap create mode 100644 sublime-text/Default/Default.sublime-commands create mode 100644 sublime-text/Default/Delete Left Right.sublime-macro create mode 100644 sublime-text/Default/Delete Line.sublime-macro create mode 100644 sublime-text/Default/Delete to BOL.sublime-macro create mode 100644 sublime-text/Default/Delete to EOL.sublime-macro create mode 100644 sublime-text/Default/Delete to Hard BOL.sublime-macro create mode 100644 sublime-text/Default/Delete to Hard EOL.sublime-macro create mode 100644 sublime-text/Default/Distraction Free.sublime-settings create mode 100644 sublime-text/Default/Find Results.hidden-tmLanguage create mode 100644 sublime-text/Default/Find in Files.sublime-menu create mode 100644 sublime-text/Default/Icon.png create mode 100644 sublime-text/Default/Ignored Packages.cache create mode 100644 sublime-text/Default/Indentation Rules - Comments.tmPreferences create mode 100644 sublime-text/Default/Indentation Rules - Comments.tmPreferences.cache create mode 100644 sublime-text/Default/Indentation Rules.tmPreferences create mode 100644 sublime-text/Default/Indentation Rules.tmPreferences.cache create mode 100644 sublime-text/Default/Indentation.sublime-menu create mode 100644 sublime-text/Default/Main.sublime-menu create mode 100644 sublime-text/Default/Meta Info Summary.cache create mode 100644 sublime-text/Default/Minimap.sublime-settings create mode 100644 sublime-text/Default/Preferences (Linux).sublime-settings create mode 100644 sublime-text/Default/Preferences (OSX).sublime-settings create mode 100644 sublime-text/Default/Preferences (Windows).sublime-settings create mode 100644 sublime-text/Default/Preferences.sublime-settings create mode 100644 sublime-text/Default/Regex Format Widget.sublime-settings create mode 100644 sublime-text/Default/Regex Widget.sublime-settings create mode 100644 sublime-text/Default/Side Bar Mount Point.sublime-menu create mode 100644 sublime-text/Default/Side Bar.sublime-menu create mode 100644 sublime-text/Default/Startup.cache create mode 100644 sublime-text/Default/Symbol List.tmPreferences create mode 100644 sublime-text/Default/Symbol List.tmPreferences.cache create mode 100644 sublime-text/Default/Syntax Summary.cache create mode 100644 sublime-text/Default/Syntax.sublime-menu create mode 100644 sublime-text/Default/Tab Context.sublime-menu create mode 100644 sublime-text/Default/Widget Context.sublime-menu create mode 100644 sublime-text/Default/Widget.sublime-settings create mode 100644 sublime-text/Default/comment.py create mode 100644 sublime-text/Default/comment.pyc create mode 100644 sublime-text/Default/copy_path.py create mode 100644 sublime-text/Default/copy_path.pyc create mode 100644 sublime-text/Default/delete_word.py create mode 100644 sublime-text/Default/delete_word.pyc create mode 100644 sublime-text/Default/detect_indentation.py create mode 100644 sublime-text/Default/detect_indentation.pyc create mode 100644 sublime-text/Default/duplicate_line.py create mode 100644 sublime-text/Default/duplicate_line.pyc create mode 100644 sublime-text/Default/echo.py create mode 100644 sublime-text/Default/echo.pyc create mode 100644 sublime-text/Default/exec.py create mode 100644 sublime-text/Default/exec.pyc create mode 100644 sublime-text/Default/fold.py create mode 100644 sublime-text/Default/fold.pyc create mode 100644 sublime-text/Default/font.py create mode 100644 sublime-text/Default/font.pyc create mode 100644 sublime-text/Default/goto_line.py create mode 100644 sublime-text/Default/goto_line.pyc create mode 100644 sublime-text/Default/indentation.py create mode 100644 sublime-text/Default/indentation.pyc create mode 100644 sublime-text/Default/kill_ring.py create mode 100644 sublime-text/Default/kill_ring.pyc create mode 100644 sublime-text/Default/mark.py create mode 100644 sublime-text/Default/mark.pyc create mode 100644 sublime-text/Default/new_templates.py create mode 100644 sublime-text/Default/new_templates.pyc create mode 100644 sublime-text/Default/open_file_settings.py create mode 100644 sublime-text/Default/open_file_settings.pyc create mode 100644 sublime-text/Default/open_in_browser.py create mode 100644 sublime-text/Default/open_in_browser.pyc create mode 100644 sublime-text/Default/paragraph.py create mode 100644 sublime-text/Default/paragraph.pyc create mode 100644 sublime-text/Default/save_on_focus_lost.py create mode 100644 sublime-text/Default/save_on_focus_lost.pyc create mode 100644 sublime-text/Default/scroll.py create mode 100644 sublime-text/Default/scroll.pyc create mode 100644 sublime-text/Default/send2trash/__init__.py create mode 100644 sublime-text/Default/send2trash/__init__.pyc create mode 100644 sublime-text/Default/send2trash/plat_osx.py create mode 100644 sublime-text/Default/send2trash/plat_other.py create mode 100644 sublime-text/Default/send2trash/plat_other.pyc create mode 100644 sublime-text/Default/send2trash/plat_win.py create mode 100644 sublime-text/Default/set_unsaved_view_name.py create mode 100644 sublime-text/Default/set_unsaved_view_name.pyc create mode 100644 sublime-text/Default/side_bar.py create mode 100644 sublime-text/Default/side_bar.pyc create mode 100644 sublime-text/Default/sort.py create mode 100644 sublime-text/Default/sort.pyc create mode 100644 sublime-text/Default/swap_line.py create mode 100644 sublime-text/Default/swap_line.pyc create mode 100644 sublime-text/Default/switch_file.py create mode 100644 sublime-text/Default/switch_file.pyc create mode 100644 sublime-text/Default/transform.py create mode 100644 sublime-text/Default/transform.pyc create mode 100644 sublime-text/Default/transpose.py create mode 100644 sublime-text/Default/transpose.pyc create mode 100644 sublime-text/Default/trim_trailing_white_space.py create mode 100644 sublime-text/Default/trim_trailing_white_space.pyc create mode 100644 sublime-text/User/Default (Linux).sublime-keymap create mode 100644 sublime-text/User/Default (OSX).sublime-keymap create mode 100644 sublime-text/User/Default (Windows).sublime-keymap create mode 100644 sublime-text/User/Preferences.sublime-settings diff --git a/sublime-text/Default/Add Line Before.sublime-macro b/sublime-text/Default/Add Line Before.sublime-macro new file mode 100644 index 0000000..a1164e7 --- /dev/null +++ b/sublime-text/Default/Add Line Before.sublime-macro @@ -0,0 +1,6 @@ +[ + {"command": "move_to", "args": {"to": "hardbol"}}, + {"command": "insert", "args": {"characters": "\n"}}, + {"command": "move", "args": {"by": "lines", "forward": false}}, + {"command": "reindent", "args": {"force_indent": false}} +] diff --git a/sublime-text/Default/Add Line in Braces.sublime-macro b/sublime-text/Default/Add Line in Braces.sublime-macro new file mode 100644 index 0000000..aaf8218 --- /dev/null +++ b/sublime-text/Default/Add Line in Braces.sublime-macro @@ -0,0 +1,6 @@ +[ + {"command": "insert", "args": {"characters": "\n\n"} }, + {"command": "move", "args": {"by": "lines", "forward": false} }, + {"command": "move_to", "args": {"to": "hardeol", "extend": false} }, + {"command": "reindent", "args": {"single_line": true} } +] diff --git a/sublime-text/Default/Add Line.sublime-macro b/sublime-text/Default/Add Line.sublime-macro new file mode 100644 index 0000000..6d746e7 --- /dev/null +++ b/sublime-text/Default/Add Line.sublime-macro @@ -0,0 +1,4 @@ +[ + {"command": "move_to", "args": {"to": "hardeol"}}, + {"command": "insert", "args": {"characters": "\n"}} +] diff --git a/sublime-text/Default/Context.sublime-menu b/sublime-text/Default/Context.sublime-menu new file mode 100644 index 0000000..61a9de2 --- /dev/null +++ b/sublime-text/Default/Context.sublime-menu @@ -0,0 +1,13 @@ +[ + { "command": "copy" }, + { "command": "cut" }, + { "command": "paste" }, + { "caption": "-", "id": "selection" }, + { "command": "select_all" }, + { "caption": "-", "id": "file" }, + { "command": "open_in_browser", "caption": "Open in Browser" }, + { "command": "open_dir", "args": {"dir": "$file_path", "file": "$file_name"}, "caption": "Open Containing Folder…" }, + { "command": "copy_path", "caption": "Copy File Path" }, + { "command": "reveal_in_side_bar", "caption": "Reveal in Side Bar" }, + { "caption": "-", "id": "end" } +] diff --git a/sublime-text/Default/Default (Linux).sublime-keymap b/sublime-text/Default/Default (Linux).sublime-keymap new file mode 100644 index 0000000..0903204 --- /dev/null +++ b/sublime-text/Default/Default (Linux).sublime-keymap @@ -0,0 +1,650 @@ +[ + { "keys": ["ctrl+q"], "command": "exit" }, + + { "keys": ["ctrl+shift+n"], "command": "new_window" }, + { "keys": ["ctrl+shift+w"], "command": "close_window" }, + { "keys": ["ctrl+o"], "command": "prompt_open_file" }, + { "keys": ["ctrl+shift+t"], "command": "reopen_last_file" }, + { "keys": ["alt+o"], "command": "switch_file", "args": {"extensions": ["cpp", "cxx", "cc", "c", "hpp", "hxx", "h", "ipp", "inl", "m", "mm"]} }, + { "keys": ["ctrl+n"], "command": "new_file" }, + { "keys": ["ctrl+s"], "command": "save" }, + { "keys": ["ctrl+shift+s"], "command": "prompt_save_as" }, + { "keys": ["ctrl+f4"], "command": "close_file" }, + { "keys": ["ctrl+w"], "command": "close" }, + + { "keys": ["ctrl+k", "ctrl+b"], "command": "toggle_side_bar" }, + { "keys": ["f11"], "command": "toggle_full_screen" }, + { "keys": ["shift+f11"], "command": "toggle_distraction_free" }, + + { "keys": ["backspace"], "command": "left_delete" }, + { "keys": ["shift+backspace"], "command": "left_delete" }, + { "keys": ["ctrl+shift+backspace"], "command": "left_delete" }, + { "keys": ["delete"], "command": "right_delete" }, + { "keys": ["enter"], "command": "insert", "args": {"characters": "\n"} }, + { "keys": ["shift+enter"], "command": "insert", "args": {"characters": "\n"} }, + { "keys": ["keypad_enter"], "command": "insert", "args": {"characters": "\n"} }, + { "keys": ["shift+keypad_enter"], "command": "insert", "args": {"characters": "\n"} }, + + { "keys": ["ctrl+z"], "command": "undo" }, + { "keys": ["ctrl+shift+z"], "command": "redo" }, + { "keys": ["ctrl+y"], "command": "redo_or_repeat" }, + { "keys": ["ctrl+u"], "command": "soft_undo" }, + { "keys": ["ctrl+shift+u"], "command": "soft_redo" }, + + { "keys": ["shift+delete"], "command": "cut" }, + { "keys": ["ctrl+insert"], "command": "copy" }, + { "keys": ["shift+insert"], "command": "paste" }, + + // These two key bindings should replace the above three if you'd prefer + // the traditional X11 behavior of shift+insert pasting from the primary + // selection. The above CUA keys are the default, to match most GTK + // applications. + //{ "keys": ["shift+insert"], "command": "paste", "args": {"clipboard": "selection"} }, + //{ "keys": ["shift+delete"], "command": "right_delete" }, + + { "keys": ["ctrl+x"], "command": "cut" }, + { "keys": ["ctrl+c"], "command": "copy" }, + { "keys": ["ctrl+v"], "command": "paste" }, + { "keys": ["ctrl+shift+v"], "command": "paste_and_indent" }, + + { "keys": ["left"], "command": "move", "args": {"by": "characters", "forward": false} }, + { "keys": ["right"], "command": "move", "args": {"by": "characters", "forward": true} }, + { "keys": ["up"], "command": "move", "args": {"by": "lines", "forward": false} }, + { "keys": ["down"], "command": "move", "args": {"by": "lines", "forward": true} }, + { "keys": ["shift+left"], "command": "move", "args": {"by": "characters", "forward": false, "extend": true} }, + { "keys": ["shift+right"], "command": "move", "args": {"by": "characters", "forward": true, "extend": true} }, + { "keys": ["shift+up"], "command": "move", "args": {"by": "lines", "forward": false, "extend": true} }, + { "keys": ["shift+down"], "command": "move", "args": {"by": "lines", "forward": true, "extend": true} }, + + { "keys": ["ctrl+left"], "command": "move", "args": {"by": "words", "forward": false} }, + { "keys": ["ctrl+right"], "command": "move", "args": {"by": "word_ends", "forward": true} }, + { "keys": ["ctrl+shift+left"], "command": "move", "args": {"by": "words", "forward": false, "extend": true} }, + { "keys": ["ctrl+shift+right"], "command": "move", "args": {"by": "word_ends", "forward": true, "extend": true} }, + + { "keys": ["alt+left"], "command": "move", "args": {"by": "subwords", "forward": false} }, + { "keys": ["alt+right"], "command": "move", "args": {"by": "subword_ends", "forward": true} }, + { "keys": ["alt+shift+left"], "command": "move", "args": {"by": "subwords", "forward": false, "extend": true} }, + { "keys": ["alt+shift+right"], "command": "move", "args": {"by": "subword_ends", "forward": true, "extend": true} }, + + { "keys": ["alt+shift+up"], "command": "select_lines", "args": {"forward": false} }, + { "keys": ["alt+shift+down"], "command": "select_lines", "args": {"forward": true} }, + + { "keys": ["pageup"], "command": "move", "args": {"by": "pages", "forward": false} }, + { "keys": ["pagedown"], "command": "move", "args": {"by": "pages", "forward": true} }, + { "keys": ["shift+pageup"], "command": "move", "args": {"by": "pages", "forward": false, "extend": true} }, + { "keys": ["shift+pagedown"], "command": "move", "args": {"by": "pages", "forward": true, "extend": true} }, + + { "keys": ["home"], "command": "move_to", "args": {"to": "bol", "extend": false} }, + { "keys": ["end"], "command": "move_to", "args": {"to": "eol", "extend": false} }, + { "keys": ["shift+home"], "command": "move_to", "args": {"to": "bol", "extend": true} }, + { "keys": ["shift+end"], "command": "move_to", "args": {"to": "eol", "extend": true} }, + { "keys": ["ctrl+home"], "command": "move_to", "args": {"to": "bof", "extend": false} }, + { "keys": ["ctrl+end"], "command": "move_to", "args": {"to": "eof", "extend": false} }, + { "keys": ["ctrl+shift+home"], "command": "move_to", "args": {"to": "bof", "extend": true} }, + { "keys": ["ctrl+shift+end"], "command": "move_to", "args": {"to": "eof", "extend": true} }, + + { "keys": ["ctrl+up"], "command": "scroll_lines", "args": {"amount": 1.0 } }, + { "keys": ["ctrl+down"], "command": "scroll_lines", "args": {"amount": -1.0 } }, + + { "keys": ["ctrl+pagedown"], "command": "next_view" }, + { "keys": ["ctrl+pageup"], "command": "prev_view" }, + + { "keys": ["ctrl+tab"], "command": "next_view_in_stack" }, + { "keys": ["ctrl+shift+tab"], "command": "prev_view_in_stack" }, + + { "keys": ["ctrl+a"], "command": "select_all" }, + { "keys": ["ctrl+shift+l"], "command": "split_selection_into_lines" }, + { "keys": ["escape"], "command": "single_selection", "context": + [ + { "key": "num_selections", "operator": "not_equal", "operand": 1 } + ] + }, + { "keys": ["escape"], "command": "clear_fields", "context": + [ + { "key": "has_next_field", "operator": "equal", "operand": true } + ] + }, + { "keys": ["escape"], "command": "clear_fields", "context": + [ + { "key": "has_prev_field", "operator": "equal", "operand": true } + ] + }, + { "keys": ["escape"], "command": "hide_panel", "args": {"cancel": true}, + "context": + [ + { "key": "panel_visible", "operator": "equal", "operand": true } + ] + }, + { "keys": ["escape"], "command": "hide_overlay", "context": + [ + { "key": "overlay_visible", "operator": "equal", "operand": true } + ] + }, + { "keys": ["escape"], "command": "hide_auto_complete", "context": + [ + { "key": "auto_complete_visible", "operator": "equal", "operand": true } + ] + }, + + { "keys": ["tab"], "command": "insert_best_completion", "args": {"default": "\t", "exact": true} }, + { "keys": ["tab"], "command": "insert_best_completion", "args": {"default": "\t", "exact": false}, + "context": + [ + { "key": "setting.tab_completion", "operator": "equal", "operand": true } + ] + }, + { "keys": ["tab"], "command": "replace_completion_with_next_completion", "context": + [ + { "key": "last_command", "operator": "equal", "operand": "insert_best_completion" }, + { "key": "setting.tab_completion", "operator": "equal", "operand": true } + ] + }, + { "keys": ["tab"], "command": "reindent", "context": + [ + { "key": "setting.auto_indent", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "preceding_text", "operator": "regex_match", "operand": "^$", "match_all": true }, + { "key": "following_text", "operator": "regex_match", "operand": "^$", "match_all": true } + ] + }, + { "keys": ["tab"], "command": "indent", "context": + [ + { "key": "text", "operator": "regex_contains", "operand": "\n" } + ] + }, + { "keys": ["tab"], "command": "next_field", "context": + [ + { "key": "has_next_field", "operator": "equal", "operand": true } + ] + }, + { "keys": ["tab"], "command": "commit_completion", "context": + [ + { "key": "auto_complete_visible" }, + { "key": "setting.auto_complete_commit_on_tab" } + ] + }, + + { "keys": ["shift+tab"], "command": "insert", "args": {"characters": "\t"} }, + { "keys": ["shift+tab"], "command": "unindent", "context": + [ + { "key": "setting.shift_tab_unindent", "operator": "equal", "operand": true } + ] + }, + { "keys": ["shift+tab"], "command": "unindent", "context": + [ + { "key": "preceding_text", "operator": "regex_match", "operand": "^[\t ]*" } + ] + }, + { "keys": ["shift+tab"], "command": "unindent", "context": + [ + { "key": "text", "operator": "regex_contains", "operand": "\n" } + ] + }, + { "keys": ["shift+tab"], "command": "prev_field", "context": + [ + { "key": "has_prev_field", "operator": "equal", "operand": true } + ] + }, + + { "keys": ["ctrl+]"], "command": "indent" }, + { "keys": ["ctrl+["], "command": "unindent" }, + + { "keys": ["insert"], "command": "toggle_overwrite" }, + + { "keys": ["ctrl+l"], "command": "expand_selection", "args": {"to": "line"} }, + { "keys": ["ctrl+d"], "command": "find_under_expand" }, + { "keys": ["ctrl+k", "ctrl+d"], "command": "find_under_expand_skip" }, + { "keys": ["ctrl+shift+space"], "command": "expand_selection", "args": {"to": "scope"} }, + { "keys": ["ctrl+shift+m"], "command": "expand_selection", "args": {"to": "brackets"} }, + { "keys": ["ctrl+m"], "command": "move_to", "args": {"to": "brackets"} }, + { "keys": ["ctrl+shift+j"], "command": "expand_selection", "args": {"to": "indentation"} }, + { "keys": ["ctrl+shift+a"], "command": "expand_selection", "args": {"to": "tag"} }, + + { "keys": ["alt+."], "command": "close_tag" }, + + { "keys": ["ctrl+alt+q"], "command": "toggle_record_macro" }, + { "keys": ["ctrl+alt+shift+q"], "command": "run_macro" }, + + { "keys": ["ctrl+enter"], "command": "run_macro_file", "args": {"file": "Packages/Default/Add Line.sublime-macro"} }, + { "keys": ["ctrl+shift+enter"], "command": "run_macro_file", "args": {"file": "Packages/Default/Add Line Before.sublime-macro"} }, + { "keys": ["enter"], "command": "commit_completion", "context": + [ + { "key": "auto_complete_visible" }, + { "key": "setting.auto_complete_commit_on_tab", "operand": false } + ] + }, + + { "keys": ["ctrl+p"], "command": "show_overlay", "args": {"overlay": "goto", "show_files": true} }, + { "keys": ["ctrl+shift+p"], "command": "show_overlay", "args": {"overlay": "command_palette"} }, + { "keys": ["ctrl+alt+p"], "command": "prompt_select_project" }, + { "keys": ["ctrl+r"], "command": "show_overlay", "args": {"overlay": "goto", "text": "@"} }, + { "keys": ["ctrl+g"], "command": "show_overlay", "args": {"overlay": "goto", "text": ":"} }, + { "keys": ["ctrl+;"], "command": "show_overlay", "args": {"overlay": "goto", "text": "#"} }, + + { "keys": ["ctrl+i"], "command": "show_panel", "args": {"panel": "incremental_find", "reverse":false} }, + { "keys": ["ctrl+shift+i"], "command": "show_panel", "args": {"panel": "incremental_find", "reverse":true} }, + { "keys": ["ctrl+f"], "command": "show_panel", "args": {"panel": "find"} }, + { "keys": ["ctrl+h"], "command": "show_panel", "args": {"panel": "replace"} }, + { "keys": ["ctrl+shift+h"], "command": "replace_next" }, + { "keys": ["f3"], "command": "find_next" }, + { "keys": ["shift+f3"], "command": "find_prev" }, + { "keys": ["ctrl+f3"], "command": "find_under" }, + { "keys": ["ctrl+shift+f3"], "command": "find_under_prev" }, + { "keys": ["alt+f3"], "command": "find_all_under" }, + { "keys": ["ctrl+e"], "command": "slurp_find_string" }, + { "keys": ["ctrl+shift+e"], "command": "slurp_replace_string" }, + { "keys": ["ctrl+shift+f"], "command": "show_panel", "args": {"panel": "find_in_files"} }, + { "keys": ["f4"], "command": "next_result" }, + { "keys": ["shift+f4"], "command": "prev_result" }, + + { "keys": ["f6"], "command": "toggle_setting", "args": {"setting": "spell_check"} }, + { "keys": ["ctrl+f6"], "command": "next_misspelling" }, + { "keys": ["ctrl+shift+f6"], "command": "prev_misspelling" }, + + { "keys": ["ctrl+shift+up"], "command": "swap_line_up" }, + { "keys": ["ctrl+shift+down"], "command": "swap_line_down" }, + + { "keys": ["ctrl+backspace"], "command": "delete_word", "args": { "forward": false } }, + { "keys": ["ctrl+shift+backspace"], "command": "run_macro_file", "args": {"file": "Packages/Default/Delete to Hard BOL.sublime-macro"} }, + + { "keys": ["ctrl+delete"], "command": "delete_word", "args": { "forward": true } }, + { "keys": ["ctrl+shift+delete"], "command": "run_macro_file", "args": {"file": "Packages/Default/Delete to Hard EOL.sublime-macro"} }, + + { "keys": ["ctrl+/"], "command": "toggle_comment", "args": { "block": false } }, + { "keys": ["ctrl+shift+/"], "command": "toggle_comment", "args": { "block": true } }, + + { "keys": ["ctrl+j"], "command": "join_lines" }, + { "keys": ["ctrl+shift+d"], "command": "duplicate_line" }, + + { "keys": ["ctrl+`"], "command": "show_panel", "args": {"panel": "console", "toggle": true} }, + + { "keys": ["alt+/"], "command": "auto_complete" }, + { "keys": ["alt+/"], "command": "replace_completion_with_auto_complete", "context": + [ + { "key": "last_command", "operator": "equal", "operand": "insert_best_completion" }, + { "key": "auto_complete_visible", "operator": "equal", "operand": false }, + { "key": "setting.tab_completion", "operator": "equal", "operand": true } + ] + }, + + { "keys": ["ctrl+alt+shift+p"], "command": "show_scope_name" }, + + { "keys": ["f7"], "command": "build" }, + { "keys": ["ctrl+b"], "command": "build" }, + { "keys": ["ctrl+shift+b"], "command": "build", "args": {"variant": "Run"} }, + { "keys": ["ctrl+break"], "command": "exec", "args": {"kill": true} }, + + { "keys": ["ctrl+t"], "command": "transpose" }, + + { "keys": ["f9"], "command": "sort_lines", "args": {"case_sensitive": false} }, + { "keys": ["ctrl+f9"], "command": "sort_lines", "args": {"case_sensitive": true} }, + + // Auto-pair quotes + { "keys": ["\""], "command": "insert_snippet", "args": {"contents": "\"$0\""}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\)|]|\\}|>|$)", "match_all": true }, + { "key": "preceding_text", "operator": "not_regex_contains", "operand": "[\"a-zA-Z0-9_]$", "match_all": true }, + { "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.double", "match_all": true } + ] + }, + { "keys": ["\""], "command": "insert_snippet", "args": {"contents": "\"${0:$SELECTION}\""}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true } + ] + }, + { "keys": ["\""], "command": "move", "args": {"by": "characters", "forward": true}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^\"", "match_all": true } + ] + }, + { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "Packages/Default/Delete Left Right.sublime-macro"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "preceding_text", "operator": "regex_contains", "operand": "\"$", "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^\"", "match_all": true } + ] + }, + + // Auto-pair single quotes + { "keys": ["'"], "command": "insert_snippet", "args": {"contents": "'$0'"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\)|]|\\}|>|$)", "match_all": true }, + { "key": "preceding_text", "operator": "not_regex_contains", "operand": "['a-zA-Z0-9_]$", "match_all": true }, + { "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.single", "match_all": true } + ] + }, + { "keys": ["'"], "command": "insert_snippet", "args": {"contents": "'${0:$SELECTION}'"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true } + ] + }, + { "keys": ["'"], "command": "move", "args": {"by": "characters", "forward": true}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^'", "match_all": true } + ] + }, + { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "Packages/Default/Delete Left Right.sublime-macro"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "preceding_text", "operator": "regex_contains", "operand": "'$", "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^'", "match_all": true } + ] + }, + + // Auto-pair brackets + { "keys": ["("], "command": "insert_snippet", "args": {"contents": "($0)"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\)|]|;|\\}|$)", "match_all": true } + ] + }, + { "keys": ["("], "command": "insert_snippet", "args": {"contents": "(${0:$SELECTION})"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true } + ] + }, + { "keys": [")"], "command": "move", "args": {"by": "characters", "forward": true}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^\\)", "match_all": true } + ] + }, + { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "Packages/Default/Delete Left Right.sublime-macro"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "preceding_text", "operator": "regex_contains", "operand": "\\($", "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^\\)", "match_all": true } + ] + }, + + // Auto-pair square brackets + { "keys": ["["], "command": "insert_snippet", "args": {"contents": "[$0]"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\)|]|;|\\}|$)", "match_all": true } + ] + }, + { "keys": ["["], "command": "insert_snippet", "args": {"contents": "[${0:$SELECTION}]"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true } + ] + }, + { "keys": ["]"], "command": "move", "args": {"by": "characters", "forward": true}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^\\]", "match_all": true } + ] + }, + { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "Packages/Default/Delete Left Right.sublime-macro"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "preceding_text", "operator": "regex_contains", "operand": "\\[$", "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^\\]", "match_all": true } + ] + }, + + // Auto-pair curly brackets + { "keys": ["{"], "command": "insert_snippet", "args": {"contents": "{$0}"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\)|]|\\}|$)", "match_all": true } + ] + }, + { "keys": ["{"], "command": "insert_snippet", "args": {"contents": "{${0:$SELECTION}}"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true } + ] + }, + { "keys": ["}"], "command": "move", "args": {"by": "characters", "forward": true}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^\\}", "match_all": true } + ] + }, + { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "Packages/Default/Delete Left Right.sublime-macro"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "preceding_text", "operator": "regex_contains", "operand": "\\{$", "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^\\}", "match_all": true } + ] + }, + + { "keys": ["enter"], "command": "run_macro_file", "args": {"file": "Packages/Default/Add Line in Braces.sublime-macro"}, "context": + [ + { "key": "setting.auto_indent", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "preceding_text", "operator": "regex_contains", "operand": "\\{$", "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^\\}", "match_all": true } + ] + }, + { "keys": ["shift+enter"], "command": "run_macro_file", "args": {"file": "Packages/Default/Add Line in Braces.sublime-macro"}, "context": + [ + { "key": "setting.auto_indent", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "preceding_text", "operator": "regex_contains", "operand": "\\{$", "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^\\}", "match_all": true } + ] + }, + + { + "keys": ["alt+shift+1"], + "command": "set_layout", + "args": + { + "cols": [0.0, 1.0], + "rows": [0.0, 1.0], + "cells": [[0, 0, 1, 1]] + } + }, + { + "keys": ["alt+shift+2"], + "command": "set_layout", + "args": + { + "cols": [0.0, 0.5, 1.0], + "rows": [0.0, 1.0], + "cells": [[0, 0, 1, 1], [1, 0, 2, 1]] + } + }, + { + "keys": ["alt+shift+3"], + "command": "set_layout", + "args": + { + "cols": [0.0, 0.33, 0.66, 1.0], + "rows": [0.0, 1.0], + "cells": [[0, 0, 1, 1], [1, 0, 2, 1], [2, 0, 3, 1]] + } + }, + { + "keys": ["alt+shift+4"], + "command": "set_layout", + "args": + { + "cols": [0.0, 0.25, 0.5, 0.75, 1.0], + "rows": [0.0, 1.0], + "cells": [[0, 0, 1, 1], [1, 0, 2, 1], [2, 0, 3, 1], [3, 0, 4, 1]] + } + }, + { + "keys": ["alt+shift+8"], + "command": "set_layout", + "args": + { + "cols": [0.0, 1.0], + "rows": [0.0, 0.5, 1.0], + "cells": [[0, 0, 1, 1], [0, 1, 1, 2]] + } + }, + { + "keys": ["alt+shift+9"], + "command": "set_layout", + "args": + { + "cols": [0.0, 1.0], + "rows": [0.0, 0.33, 0.66, 1.0], + "cells": [[0, 0, 1, 1], [0, 1, 1, 2], [0, 2, 1, 3]] + } + }, + { + "keys": ["alt+shift+5"], + "command": "set_layout", + "args": + { + "cols": [0.0, 0.5, 1.0], + "rows": [0.0, 0.5, 1.0], + "cells": + [ + [0, 0, 1, 1], [1, 0, 2, 1], + [0, 1, 1, 2], [1, 1, 2, 2] + ] + } + }, + { "keys": ["ctrl+1"], "command": "focus_group", "args": { "group": 0 } }, + { "keys": ["ctrl+2"], "command": "focus_group", "args": { "group": 1 } }, + { "keys": ["ctrl+3"], "command": "focus_group", "args": { "group": 2 } }, + { "keys": ["ctrl+4"], "command": "focus_group", "args": { "group": 3 } }, + { "keys": ["ctrl+shift+1"], "command": "move_to_group", "args": { "group": 0 } }, + { "keys": ["ctrl+shift+2"], "command": "move_to_group", "args": { "group": 1 } }, + { "keys": ["ctrl+shift+3"], "command": "move_to_group", "args": { "group": 2 } }, + { "keys": ["ctrl+shift+4"], "command": "move_to_group", "args": { "group": 3 } }, + { "keys": ["ctrl+0"], "command": "focus_side_bar" }, + + { "keys": ["alt+1"], "command": "select_by_index", "args": { "index": 0 } }, + { "keys": ["alt+2"], "command": "select_by_index", "args": { "index": 1 } }, + { "keys": ["alt+3"], "command": "select_by_index", "args": { "index": 2 } }, + { "keys": ["alt+4"], "command": "select_by_index", "args": { "index": 3 } }, + { "keys": ["alt+5"], "command": "select_by_index", "args": { "index": 4 } }, + { "keys": ["alt+6"], "command": "select_by_index", "args": { "index": 5 } }, + { "keys": ["alt+7"], "command": "select_by_index", "args": { "index": 6 } }, + { "keys": ["alt+8"], "command": "select_by_index", "args": { "index": 7 } }, + { "keys": ["alt+9"], "command": "select_by_index", "args": { "index": 8 } }, + { "keys": ["alt+0"], "command": "select_by_index", "args": { "index": 9 } }, + + { "keys": ["f2"], "command": "next_bookmark" }, + { "keys": ["shift+f2"], "command": "prev_bookmark" }, + { "keys": ["ctrl+f2"], "command": "toggle_bookmark" }, + { "keys": ["ctrl+shift+f2"], "command": "clear_bookmarks" }, + { "keys": ["alt+f2"], "command": "select_all_bookmarks" }, + + { "keys": ["ctrl+shift+k"], "command": "run_macro_file", "args": {"file": "Packages/Default/Delete Line.sublime-macro"} }, + + { "keys": ["alt+q"], "command": "wrap_lines" }, + + { "keys": ["ctrl+k", "ctrl+u"], "command": "upper_case" }, + { "keys": ["ctrl+k", "ctrl+l"], "command": "lower_case" }, + + { "keys": ["ctrl+k", "ctrl+space"], "command": "set_mark" }, + { "keys": ["ctrl+k", "ctrl+a"], "command": "select_to_mark" }, + { "keys": ["ctrl+k", "ctrl+w"], "command": "delete_to_mark" }, + { "keys": ["ctrl+k", "ctrl+x"], "command": "swap_with_mark" }, + { "keys": ["ctrl+k", "ctrl+y"], "command": "yank" }, + { "keys": ["ctrl+k", "ctrl+k"], "command": "run_macro_file", "args": {"file": "Packages/Default/Delete to Hard EOL.sublime-macro"} }, + { "keys": ["ctrl+k", "ctrl+backspace"], "command": "run_macro_file", "args": {"file": "Packages/Default/Delete to Hard BOL.sublime-macro"} }, + { "keys": ["ctrl+k", "ctrl+g"], "command": "clear_bookmarks", "args": {"name": "mark"} }, + { "keys": ["ctrl+k", "ctrl+c"], "command": "show_at_center" }, + + { "keys": ["ctrl++"], "command": "increase_font_size" }, + { "keys": ["ctrl+="], "command": "increase_font_size" }, + { "keys": ["ctrl+-"], "command": "decrease_font_size" }, + + { "keys": ["alt+shift+w"], "command": "insert_snippet", "args": { "name": "Packages/XML/long-tag.sublime-snippet" } }, + + { "keys": ["ctrl+shift+["], "command": "fold" }, + { "keys": ["ctrl+shift+]"], "command": "unfold" }, + { "keys": ["ctrl+k", "ctrl+1"], "command": "fold_by_level", "args": {"level": 1} }, + { "keys": ["ctrl+k", "ctrl+2"], "command": "fold_by_level", "args": {"level": 2} }, + { "keys": ["ctrl+k", "ctrl+3"], "command": "fold_by_level", "args": {"level": 3} }, + { "keys": ["ctrl+k", "ctrl+4"], "command": "fold_by_level", "args": {"level": 4} }, + { "keys": ["ctrl+k", "ctrl+5"], "command": "fold_by_level", "args": {"level": 5} }, + { "keys": ["ctrl+k", "ctrl+6"], "command": "fold_by_level", "args": {"level": 6} }, + { "keys": ["ctrl+k", "ctrl+7"], "command": "fold_by_level", "args": {"level": 7} }, + { "keys": ["ctrl+k", "ctrl+8"], "command": "fold_by_level", "args": {"level": 8} }, + { "keys": ["ctrl+k", "ctrl+9"], "command": "fold_by_level", "args": {"level": 9} }, + { "keys": ["ctrl+k", "ctrl+0"], "command": "unfold_all" }, + { "keys": ["ctrl+k", "ctrl+j"], "command": "unfold_all" }, + { "keys": ["ctrl+k", "ctrl+t"], "command": "fold_tag_attributes" }, + + { "keys": ["context_menu"], "command": "context_menu" }, + + { "keys": ["alt+c"], "command": "toggle_case_sensitive", "context": + [ + { "key": "setting.is_widget", "operator": "equal", "operand": true } + ] + }, + { "keys": ["alt+r"], "command": "toggle_regex", "context": + [ + { "key": "setting.is_widget", "operator": "equal", "operand": true } + ] + }, + { "keys": ["alt+w"], "command": "toggle_whole_word", "context": + [ + { "key": "setting.is_widget", "operator": "equal", "operand": true } + ] + }, + { "keys": ["alt+a"], "command": "toggle_preserve_case", "context": + [ + { "key": "setting.is_widget", "operator": "equal", "operand": true } + ] + }, + + // Find panel key bindings + { "keys": ["enter"], "command": "find_next", "context": + [{"key": "panel", "operand": "find"}, {"key": "panel_has_focus"}] + }, + { "keys": ["shift+enter"], "command": "find_prev", "context": + [{"key": "panel", "operand": "find"}, {"key": "panel_has_focus"}] + }, + { "keys": ["alt+enter"], "command": "find_all", "args": {"close_panel": true}, + "context": [{"key": "panel", "operand": "find"}, {"key": "panel_has_focus"}] + }, + + // Replace panel key bindings + { "keys": ["enter"], "command": "find_next", "context": + [{"key": "panel", "operand": "replace"}, {"key": "panel_has_focus"}] + }, + { "keys": ["shift+enter"], "command": "find_prev", "context": + [{"key": "panel", "operand": "replace"}, {"key": "panel_has_focus"}] + }, + { "keys": ["alt+enter"], "command": "find_all", "args": {"close_panel": true}, + "context": [{"key": "panel", "operand": "replace"}, {"key": "panel_has_focus"}] + }, + { "keys": ["ctrl+alt+enter"], "command": "replace_all", "args": {"close_panel": true}, + "context": [{"key": "panel", "operand": "replace"}, {"key": "panel_has_focus"}] + }, + + // Incremental find panel key bindings + { "keys": ["enter"], "command": "hide_panel", "context": + [{"key": "panel", "operand": "incremental_find"}, {"key": "panel_has_focus"}] + }, + { "keys": ["shift+enter"], "command": "find_prev", "context": + [{"key": "panel", "operand": "incremental_find"}, {"key": "panel_has_focus"}] + }, + { "keys": ["alt+enter"], "command": "find_all", "args": {"close_panel": true}, + "context": [{"key": "panel", "operand": "incremental_find"}, {"key": "panel_has_focus"}] + } +] diff --git a/sublime-text/Default/Default (Linux).sublime-mousemap b/sublime-text/Default/Default (Linux).sublime-mousemap new file mode 100644 index 0000000..44bed1f --- /dev/null +++ b/sublime-text/Default/Default (Linux).sublime-mousemap @@ -0,0 +1,100 @@ +[ + // Basic drag select + { + "button": "button1", "count": 1, + "press_command": "drag_select" + }, + { + "button": "button1", "count": 1, "modifiers": ["ctrl"], + "press_command": "drag_select", + "press_args": {"additive": true} + }, + { + "button": "button1", "count": 1, "modifiers": ["alt"], + "press_command": "drag_select", + "press_args": {"subtractive": true} + }, + + // Select between selection and click location + { + "button": "button1", "modifiers": ["shift"], + "press_command": "drag_select", + "press_args": {"extend": true} + }, + { + "button": "button1", "modifiers": ["shift", "ctrl"], + "press_command": "drag_select", + "press_args": {"additive": true, "extend": true} + }, + { + "button": "button1", "modifiers": ["shift", "alt"], + "press_command": "drag_select", + "press_args": {"subtractive": true, "extend": true} + }, + + // Drag select by words + { + "button": "button1", "count": 2, + "press_command": "drag_select", + "press_args": {"by": "words"} + }, + { + "button": "button1", "count": 2, "modifiers": ["ctrl"], + "press_command": "drag_select", + "press_args": {"by": "words", "additive": true} + }, + { + "button": "button1", "count": 2, "modifiers": ["alt"], + "press_command": "drag_select", + "press_args": {"by": "words", "subtractive": true} + }, + + // Drag select by lines + { + "button": "button1", "count": 3, + "press_command": "drag_select", + "press_args": {"by": "lines"} + }, + { + "button": "button1", "count": 3, "modifiers": ["ctrl"], + "press_command": "drag_select", + "press_args": {"by": "lines", "additive": true} + }, + { + "button": "button1", "count": 3, "modifiers": ["alt"], + "press_command": "drag_select", + "press_args": {"by": "lines", "subtractive": true} + }, + + // Column select + { + "button": "button2", "modifiers": ["shift"], + "press_command": "drag_select", + "press_args": {"by": "columns"} + }, + { + "button": "button2", "modifiers": ["shift", "ctrl"], + "press_command": "drag_select", + "press_args": {"by": "columns", "additive": true} + }, + { + "button": "button2", "modifiers": ["shift", "alt"], + "press_command": "drag_select", + "press_args": {"by": "columns", "subtractive": true} + }, + + // Middle click paste + { "button": "button3", "command": "paste_selection_clipboard" }, + + // Switch files with buttons 4 and 5, as well as 8 and 9 + { "button": "button4", "modifiers": [], "command": "prev_view" }, + { "button": "button5", "modifiers": [], "command": "next_view" }, + { "button": "button8", "modifiers": [], "command": "prev_view" }, + { "button": "button9", "modifiers": [], "command": "next_view" }, + + // Change font size with ctrl+scroll wheel + { "button": "scroll_down", "modifiers": ["ctrl"], "command": "decrease_font_size" }, + { "button": "scroll_up", "modifiers": ["ctrl"], "command": "increase_font_size" }, + + { "button": "button2", "modifiers": [], "press_command": "context_menu" } +] diff --git a/sublime-text/Default/Default (OSX).sublime-keymap b/sublime-text/Default/Default (OSX).sublime-keymap new file mode 100644 index 0000000..52cecb5 --- /dev/null +++ b/sublime-text/Default/Default (OSX).sublime-keymap @@ -0,0 +1,624 @@ +/* +On OS X, basic text manipulations (left, right, command+left, etc) make use of the system key bindings, +and don't need to be repeated here. Anything listed here will take precedence, however. +*/ +[ + { "keys": ["super+shift+n"], "command": "new_window" }, + { "keys": ["super+shift+w"], "command": "close_window" }, + { "keys": ["super+o"], "command": "prompt_open" }, + { "keys": ["super+shift+t"], "command": "reopen_last_file" }, + { "keys": ["super+alt+up"], "command": "switch_file", "args": {"extensions": ["cpp", "cxx", "cc", "c", "hpp", "hxx", "h", "ipp", "inl", "m", "mm"]} }, + { "keys": ["super+n"], "command": "new_file" }, + { "keys": ["super+s"], "command": "save" }, + { "keys": ["super+shift+s"], "command": "prompt_save_as" }, + { "keys": ["super+alt+s"], "command": "save_all" }, + { "keys": ["super+w"], "command": "close" }, + + { "keys": ["super+k", "super+b"], "command": "toggle_side_bar" }, + { "keys": ["super+ctrl+f"], "command": "toggle_full_screen" }, + { "keys": ["super+ctrl+shift+f"], "command": "toggle_distraction_free" }, + + { "keys": ["super+z"], "command": "undo" }, + { "keys": ["super+shift+z"], "command": "redo" }, + { "keys": ["super+y"], "command": "redo_or_repeat" }, + { "keys": ["super+u"], "command": "soft_undo" }, + { "keys": ["super+shift+u"], "command": "soft_redo" }, + + { "keys": ["super+x"], "command": "cut" }, + { "keys": ["super+c"], "command": "copy" }, + { "keys": ["super+v"], "command": "paste" }, + { "keys": ["super+shift+v"], "command": "paste_and_indent" }, + + { "keys": ["ctrl+alt+left"], "command": "move", "args": {"by": "subwords", "forward": false} }, + { "keys": ["ctrl+alt+right"], "command": "move", "args": {"by": "subword_ends", "forward": true} }, + { "keys": ["ctrl+alt+shift+left"], "command": "move", "args": {"by": "subwords", "forward": false, "extend": true} }, + { "keys": ["ctrl+alt+shift+right"], "command": "move", "args": {"by": "subword_ends", "forward": true, "extend": true} }, + + { "keys": ["ctrl+left"], "command": "move", "args": {"by": "subwords", "forward": false} }, + { "keys": ["ctrl+right"], "command": "move", "args": {"by": "subword_ends", "forward": true} }, + { "keys": ["ctrl+shift+left"], "command": "move", "args": {"by": "subwords", "forward": false, "extend": true} }, + { "keys": ["ctrl+shift+right"], "command": "move", "args": {"by": "subword_ends", "forward": true, "extend": true} }, + + { "keys": ["ctrl+alt+up"], "command": "scroll_lines", "args": {"amount": 1.0} }, + { "keys": ["ctrl+alt+down"], "command": "scroll_lines", "args": {"amount": -1.0} }, + + { "keys": ["ctrl+shift+up"], "command": "select_lines", "args": {"forward": false} }, + { "keys": ["ctrl+shift+down"], "command": "select_lines", "args": {"forward": true} }, + + { "keys": ["super+shift+["], "command": "prev_view" }, + { "keys": ["super+shift+]"], "command": "next_view" }, + { "keys": ["super+alt+left"], "command": "prev_view" }, + { "keys": ["super+alt+right"], "command": "next_view" }, + + { "keys": ["ctrl+tab"], "command": "next_view_in_stack" }, + { "keys": ["ctrl+shift+tab"], "command": "prev_view_in_stack" }, + + { "keys": ["super+a"], "command": "select_all" }, + { "keys": ["super+shift+l"], "command": "split_selection_into_lines" }, + { "keys": ["escape"], "command": "single_selection", "context": + [ + { "key": "num_selections", "operator": "not_equal", "operand": 1 } + ] + }, + { "keys": ["escape"], "command": "clear_fields", "context": + [ + { "key": "has_next_field", "operator": "equal", "operand": true } + ] + }, + { "keys": ["escape"], "command": "clear_fields", "context": + [ + { "key": "has_prev_field", "operator": "equal", "operand": true } + ] + }, + { "keys": ["escape"], "command": "hide_panel", "args": {"cancel": true}, + "context": + [ + { "key": "panel_visible", "operator": "equal", "operand": true } + ] + }, + { "keys": ["escape"], "command": "hide_overlay", "context": + [ + { "key": "overlay_visible", "operator": "equal", "operand": true } + ] + }, + { "keys": ["escape"], "command": "hide_auto_complete", "context": + [ + { "key": "auto_complete_visible", "operator": "equal", "operand": true } + ] + }, + + { "keys": ["super+]"], "command": "indent" }, + { "keys": ["super+["], "command": "unindent" }, + + { "keys": ["tab"], "command": "insert_best_completion", "args": {"default": "\t", "exact": true} }, + { "keys": ["tab"], "command": "insert_best_completion", "args": {"default": "\t", "exact": false}, + "context": + [ + { "key": "setting.tab_completion", "operator": "equal", "operand": true } + ] + }, + { "keys": ["tab"], "command": "replace_completion_with_next_completion", "context": + [ + { "key": "last_command", "operator": "equal", "operand": "insert_best_completion" }, + { "key": "setting.tab_completion", "operator": "equal", "operand": true } + ] + }, + { "keys": ["tab"], "command": "reindent", "context": + [ + { "key": "setting.auto_indent", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "preceding_text", "operator": "regex_match", "operand": "^$", "match_all": true }, + { "key": "following_text", "operator": "regex_match", "operand": "^$", "match_all": true } + ] + }, + { "keys": ["tab"], "command": "indent", "context": + [ + { "key": "text", "operator": "regex_contains", "operand": "\n" } + ] + }, + { "keys": ["tab"], "command": "next_field", "context": + [ + { "key": "has_next_field", "operator": "equal", "operand": true } + ] + }, + { "keys": ["tab"], "command": "commit_completion", "context": + [ + { "key": "auto_complete_visible" }, + { "key": "setting.auto_complete_commit_on_tab" } + ] + }, + + { "keys": ["shift+tab"], "command": "insert", "args": {"characters": "\t"} }, + { "keys": ["shift+tab"], "command": "unindent", "context": + [ + { "key": "setting.shift_tab_unindent", "operator": "equal", "operand": true } + ] + }, + { "keys": ["shift+tab"], "command": "unindent", "context": + [ + { "key": "preceding_text", "operator": "regex_match", "operand": "^[\t ]*" } + ] + }, + { "keys": ["shift+tab"], "command": "unindent", "context": + [ + { "key": "text", "operator": "regex_contains", "operand": "\n" } + ] + }, + { "keys": ["shift+tab"], "command": "prev_field", "context": + [ + { "key": "has_prev_field", "operator": "equal", "operand": true } + ] + }, + + { "keys": ["super+l"], "command": "expand_selection", "args": {"to": "line"} }, + { "keys": ["super+d"], "command": "find_under_expand" }, + { "keys": ["super+k", "super+d"], "command": "find_under_expand_skip" }, + { "keys": ["super+shift+space"], "command": "expand_selection", "args": {"to": "scope"} }, + { "keys": ["ctrl+shift+m"], "command": "expand_selection", "args": {"to": "brackets"} }, + { "keys": ["ctrl+m"], "command": "move_to", "args": {"to": "brackets"} }, + { "keys": ["super+shift+j"], "command": "expand_selection", "args": {"to": "indentation"} }, + { "keys": ["super+shift+a"], "command": "expand_selection", "args": {"to": "tag"} }, + + { "keys": ["super+alt+."], "command": "close_tag" }, + + { "keys": ["ctrl+q"], "command": "toggle_record_macro" }, + { "keys": ["ctrl+shift+q"], "command": "run_macro" }, + + { "keys": ["super+enter"], "command": "run_macro_file", "args": {"file": "Packages/Default/Add Line.sublime-macro"} }, + { "keys": ["super+shift+enter"], "command": "run_macro_file", "args": {"file": "Packages/Default/Add Line Before.sublime-macro"} }, + { "keys": ["enter"], "command": "commit_completion", "context": + [ + { "key": "auto_complete_visible" }, + { "key": "setting.auto_complete_commit_on_tab", "operand": false } + ] + }, + + { "keys": ["super+t"], "command": "show_overlay", "args": {"overlay": "goto", "show_files": true} }, + { "keys": ["super+p"], "command": "show_overlay", "args": {"overlay": "goto", "show_files": true} }, + { "keys": ["super+shift+p"], "command": "show_overlay", "args": {"overlay": "command_palette"} }, + { "keys": ["super+ctrl+p"], "command": "prompt_select_project" }, + { "keys": ["super+r"], "command": "show_overlay", "args": {"overlay": "goto", "text": "@"} }, + { "keys": ["ctrl+g"], "command": "show_overlay", "args": {"overlay": "goto", "text": ":"} }, + + { "keys": ["super+i"], "command": "show_panel", "args": {"panel": "incremental_find", "reverse":false} }, + { "keys": ["super+shift+i"], "command": "show_panel", "args": {"panel": "incremental_find", "reverse":true} }, + { "keys": ["super+f"], "command": "show_panel", "args": {"panel": "find"} }, + { "keys": ["super+alt+f"], "command": "show_panel", "args": {"panel": "replace"} }, + { "keys": ["super+alt+e"], "command": "replace_next" }, + { "keys": ["super+g"], "command": "find_next" }, + { "keys": ["super+shift+g"], "command": "find_prev" }, + { "keys": ["super+e"], "command": "slurp_find_string" }, + { "keys": ["super+shift+e"], "command": "slurp_replace_string" }, + + { "keys": ["alt+super+g"], "command": "find_under" }, + { "keys": ["shift+alt+super+g"], "command": "find_under_prev" }, + { "keys": ["ctrl+super+g"], "command": "find_all_under" }, + + { "keys": ["super+shift+f"], "command": "show_panel", "args": {"panel": "find_in_files"} }, + { "keys": ["f4"], "command": "next_result" }, + { "keys": ["shift+f4"], "command": "prev_result" }, + + { "keys": ["f6"], "command": "toggle_setting", "args": {"setting": "spell_check"} }, + { "keys": ["ctrl+f6"], "command": "next_misspelling" }, + { "keys": ["ctrl+shift+f6"], "command": "prev_misspelling" }, + + { "keys": ["ctrl+super+up"], "command": "swap_line_up" }, + { "keys": ["ctrl+super+down"], "command": "swap_line_down" }, + + { "keys": ["ctrl+backspace"], "command": "delete_word", "args": { "forward": false, "sub_words": true } }, + { "keys": ["ctrl+delete"], "command": "delete_word", "args": { "forward": true, "sub_words": true } }, + + { "keys": ["super+forward_slash"], "command": "toggle_comment", "args": { "block": false } }, + { "keys": ["super+alt+forward_slash"], "command": "toggle_comment", "args": { "block": true } }, + + { "keys": ["super+j"], "command": "join_lines" }, + { "keys": ["super+shift+d"], "command": "duplicate_line" }, + + { "keys": ["ctrl+backquote"], "command": "show_panel", "args": {"panel": "console", "toggle": true} }, + + { "keys": ["ctrl+space"], "command": "auto_complete" }, + { "keys": ["ctrl+space"], "command": "replace_completion_with_auto_complete", "context": + [ + { "key": "last_command", "operator": "equal", "operand": "insert_best_completion" }, + { "key": "auto_complete_visible", "operator": "equal", "operand": false }, + { "key": "setting.tab_completion", "operator": "equal", "operand": true } + ] + }, + + { "keys": ["super+alt+p"], "command": "show_scope_name" }, + { "keys": ["ctrl+shift+p"], "command": "show_scope_name" }, + + { "keys": ["f7"], "command": "build" }, + { "keys": ["super+b"], "command": "build" }, + { "keys": ["super+shift+b"], "command": "build", "args": {"variant": "Run"} }, + + { "keys": ["ctrl+t"], "command": "transpose" }, + + { "keys": ["f5"], "command": "sort_lines", "args": {"case_sensitive": false} }, + { "keys": ["ctrl+f5"], "command": "sort_lines", "args": {"case_sensitive": true} }, + + // Auto-pair quotes + { "keys": ["\""], "command": "insert_snippet", "args": {"contents": "\"$0\""}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\)|]|\\}|>|$)", "match_all": true }, + { "key": "preceding_text", "operator": "not_regex_contains", "operand": "[\"a-zA-Z0-9_]$", "match_all": true }, + { "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.double", "match_all": true } + ] + }, + { "keys": ["\""], "command": "insert_snippet", "args": {"contents": "\"${0:$SELECTION}\""}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true } + ] + }, + { "keys": ["\""], "command": "move", "args": {"by": "characters", "forward": true}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^\"", "match_all": true } + ] + }, + { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "Packages/Default/Delete Left Right.sublime-macro"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "preceding_text", "operator": "regex_contains", "operand": "\"$", "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^\"", "match_all": true } + ] + }, + + // Auto-pair single quotes + { "keys": ["'"], "command": "insert_snippet", "args": {"contents": "'$0'"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\)|]|\\}|>|$)", "match_all": true }, + { "key": "preceding_text", "operator": "not_regex_contains", "operand": "['a-zA-Z0-9_]$", "match_all": true }, + { "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.single", "match_all": true } + ] + }, + { "keys": ["'"], "command": "insert_snippet", "args": {"contents": "'${0:$SELECTION}'"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true } + ] + }, + { "keys": ["'"], "command": "move", "args": {"by": "characters", "forward": true}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^'", "match_all": true } + ] + }, + { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "Packages/Default/Delete Left Right.sublime-macro"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "preceding_text", "operator": "regex_contains", "operand": "'$", "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^'", "match_all": true } + ] + }, + + // Auto-pair brackets + { "keys": ["("], "command": "insert_snippet", "args": {"contents": "($0)"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\)|]|;|\\}|$)", "match_all": true } + ] + }, + { "keys": ["("], "command": "insert_snippet", "args": {"contents": "(${0:$SELECTION})"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true } + ] + }, + { "keys": [")"], "command": "move", "args": {"by": "characters", "forward": true}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^\\)", "match_all": true } + ] + }, + { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "Packages/Default/Delete Left Right.sublime-macro"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "preceding_text", "operator": "regex_contains", "operand": "\\($", "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^\\)", "match_all": true } + ] + }, + + // Auto-pair square brackets + { "keys": ["["], "command": "insert_snippet", "args": {"contents": "[$0]"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\)|]|;|\\}|$)", "match_all": true } + ] + }, + { "keys": ["["], "command": "insert_snippet", "args": {"contents": "[${0:$SELECTION}]"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true } + ] + }, + { "keys": ["]"], "command": "move", "args": {"by": "characters", "forward": true}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^\\]", "match_all": true } + ] + }, + { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "Packages/Default/Delete Left Right.sublime-macro"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "preceding_text", "operator": "regex_contains", "operand": "\\[$", "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^\\]", "match_all": true } + ] + }, + + // Auto-pair curly brackets + { "keys": ["{"], "command": "insert_snippet", "args": {"contents": "{$0}"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\)|]|\\}|$)", "match_all": true } + ] + }, + { "keys": ["{"], "command": "insert_snippet", "args": {"contents": "{${0:$SELECTION}}"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true } + ] + }, + { "keys": ["}"], "command": "move", "args": {"by": "characters", "forward": true}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^\\}", "match_all": true } + ] + }, + { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "Packages/Default/Delete Left Right.sublime-macro"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "preceding_text", "operator": "regex_contains", "operand": "\\{$", "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^\\}", "match_all": true } + ] + }, + + { "keys": ["enter"], "command": "run_macro_file", "args": {"file": "Packages/Default/Add Line in Braces.sublime-macro"}, "context": + [ + { "key": "setting.auto_indent", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "preceding_text", "operator": "regex_contains", "operand": "\\{$", "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^\\}", "match_all": true } + ] + }, + { "keys": ["shift+enter"], "command": "run_macro_file", "args": {"file": "Packages/Default/Add Line in Braces.sublime-macro"}, "context": + [ + { "key": "setting.auto_indent", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "preceding_text", "operator": "regex_contains", "operand": "\\{$", "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^\\}", "match_all": true } + ] + }, + + { + "keys": ["super+alt+1"], + "command": "set_layout", + "args": + { + "cols": [0.0, 1.0], + "rows": [0.0, 1.0], + "cells": [[0, 0, 1, 1]] + } + }, + { + "keys": ["super+alt+2"], + "command": "set_layout", + "args": + { + "cols": [0.0, 0.5, 1.0], + "rows": [0.0, 1.0], + "cells": [[0, 0, 1, 1], [1, 0, 2, 1]] + } + }, + { + "keys": ["super+alt+3"], + "command": "set_layout", + "args": + { + "cols": [0.0, 0.33, 0.66, 1.0], + "rows": [0.0, 1.0], + "cells": [[0, 0, 1, 1], [1, 0, 2, 1], [2, 0, 3, 1]] + } + }, + { + "keys": ["super+alt+4"], + "command": "set_layout", + "args": + { + "cols": [0.0, 0.25, 0.5, 0.75, 1.0], + "rows": [0.0, 1.0], + "cells": [[0, 0, 1, 1], [1, 0, 2, 1], [2, 0, 3, 1], [3, 0, 4, 1]] + } + }, + { + "keys": ["super+alt+shift+2"], + "command": "set_layout", + "args": + { + "cols": [0.0, 1.0], + "rows": [0.0, 0.5, 1.0], + "cells": [[0, 0, 1, 1], [0, 1, 1, 2]] + } + }, + { + "keys": ["super+alt+shift+3"], + "command": "set_layout", + "args": + { + "cols": [0.0, 1.0], + "rows": [0.0, 0.33, 0.66, 1.0], + "cells": [[0, 0, 1, 1], [0, 1, 1, 2], [0, 2, 1, 3]] + } + }, + { + "keys": ["super+alt+5"], + "command": "set_layout", + "args": + { + "cols": [0.0, 0.5, 1.0], + "rows": [0.0, 0.5, 1.0], + "cells": + [ + [0, 0, 1, 1], [1, 0, 2, 1], + [0, 1, 1, 2], [1, 1, 2, 2] + ] + } + }, + { "keys": ["ctrl+1"], "command": "focus_group", "args": { "group": 0 } }, + { "keys": ["ctrl+2"], "command": "focus_group", "args": { "group": 1 } }, + { "keys": ["ctrl+3"], "command": "focus_group", "args": { "group": 2 } }, + { "keys": ["ctrl+4"], "command": "focus_group", "args": { "group": 3 } }, + { "keys": ["ctrl+shift+1"], "command": "move_to_group", "args": { "group": 0 } }, + { "keys": ["ctrl+shift+2"], "command": "move_to_group", "args": { "group": 1 } }, + { "keys": ["ctrl+shift+3"], "command": "move_to_group", "args": { "group": 2 } }, + { "keys": ["ctrl+shift+4"], "command": "move_to_group", "args": { "group": 3 } }, + { "keys": ["ctrl+0"], "command": "focus_side_bar" }, + + { "keys": ["super+1"], "command": "select_by_index", "args": { "index": 0 } }, + { "keys": ["super+2"], "command": "select_by_index", "args": { "index": 1 } }, + { "keys": ["super+3"], "command": "select_by_index", "args": { "index": 2 } }, + { "keys": ["super+4"], "command": "select_by_index", "args": { "index": 3 } }, + { "keys": ["super+5"], "command": "select_by_index", "args": { "index": 4 } }, + { "keys": ["super+6"], "command": "select_by_index", "args": { "index": 5 } }, + { "keys": ["super+7"], "command": "select_by_index", "args": { "index": 6 } }, + { "keys": ["super+8"], "command": "select_by_index", "args": { "index": 7 } }, + { "keys": ["super+9"], "command": "select_by_index", "args": { "index": 8 } }, + { "keys": ["super+0"], "command": "select_by_index", "args": { "index": 9 } }, + + { "keys": ["f2"], "command": "next_bookmark" }, + { "keys": ["shift+f2"], "command": "prev_bookmark" }, + { "keys": ["super+f2"], "command": "toggle_bookmark" }, + { "keys": ["super+shift+f2"], "command": "clear_bookmarks" }, + { "keys": ["alt+f2"], "command": "select_all_bookmarks" }, + + { "keys": ["super+k", "super+u"], "command": "upper_case" }, + { "keys": ["super+k", "super+l"], "command": "lower_case" }, + { "keys": ["super+k", "super+space"], "command": "set_mark" }, + { "keys": ["super+k", "super+a"], "command": "select_to_mark" }, + { "keys": ["super+k", "super+w"], "command": "delete_to_mark" }, + { "keys": ["super+k", "super+x"], "command": "swap_with_mark" }, + { "keys": ["super+k", "super+g"], "command": "clear_bookmarks", "args": {"name": "mark"} }, + + { "keys": ["super+plus"], "command": "increase_font_size" }, + { "keys": ["super+equals"], "command": "increase_font_size" }, + { "keys": ["super+minus"], "command": "decrease_font_size" }, + + { "keys": ["ctrl+shift+w"], "command": "insert_snippet", "args": { "name": "Packages/XML/long-tag.sublime-snippet" } }, + + { "keys": ["ctrl+shift+k"], "command": "run_macro_file", "args": {"file": "Packages/Default/Delete Line.sublime-macro"} }, + + { "keys": ["super+alt+q"], "command": "wrap_lines" }, + + { "keys": ["super+alt+["], "command": "fold" }, + { "keys": ["super+alt+]"], "command": "unfold" }, + { "keys": ["super+k", "super+1"], "command": "fold_by_level", "args": {"level": 1} }, + { "keys": ["super+k", "super+2"], "command": "fold_by_level", "args": {"level": 2} }, + { "keys": ["super+k", "super+3"], "command": "fold_by_level", "args": {"level": 3} }, + { "keys": ["super+k", "super+4"], "command": "fold_by_level", "args": {"level": 4} }, + { "keys": ["super+k", "super+5"], "command": "fold_by_level", "args": {"level": 5} }, + { "keys": ["super+k", "super+6"], "command": "fold_by_level", "args": {"level": 6} }, + { "keys": ["super+k", "super+7"], "command": "fold_by_level", "args": {"level": 7} }, + { "keys": ["super+k", "super+8"], "command": "fold_by_level", "args": {"level": 8} }, + { "keys": ["super+k", "super+9"], "command": "fold_by_level", "args": {"level": 9} }, + { "keys": ["super+k", "super+0"], "command": "unfold_all" }, + { "keys": ["super+k", "super+j"], "command": "unfold_all" }, + { "keys": ["super+k", "super+t"], "command": "fold_tag_attributes" }, + + { "keys": ["super+alt+o"], "command": "toggle_overwrite" }, + + { "keys": ["alt+f2"], "command": "context_menu" }, + + { "keys": ["super+alt+c"], "command": "toggle_case_sensitive", "context": + [ + { "key": "setting.is_widget", "operator": "equal", "operand": true } + ] + }, + { "keys": ["super+alt+r"], "command": "toggle_regex", "context": + [ + { "key": "setting.is_widget", "operator": "equal", "operand": true } + ] + }, + { "keys": ["super+alt+w"], "command": "toggle_whole_word", "context": + [ + { "key": "setting.is_widget", "operator": "equal", "operand": true } + ] + }, + { "keys": ["super+alt+a"], "command": "toggle_preserve_case", "context": + [ + { "key": "setting.is_widget", "operator": "equal", "operand": true } + ] + }, + + // Find panel key bindings + { "keys": ["enter"], "command": "find_next", "context": + [{"key": "panel", "operand": "find"}, {"key": "panel_has_focus"}] + }, + { "keys": ["shift+enter"], "command": "find_prev", "context": + [{"key": "panel", "operand": "find"}, {"key": "panel_has_focus"}] + }, + { "keys": ["alt+enter"], "command": "find_all", "args": {"close_panel": true}, + "context": [{"key": "panel", "operand": "find"}, {"key": "panel_has_focus"}] + }, + + // Replace panel key bindings + { "keys": ["enter"], "command": "find_next", "context": + [{"key": "panel", "operand": "replace"}, {"key": "panel_has_focus"}] + }, + { "keys": ["shift+enter"], "command": "find_prev", "context": + [{"key": "panel", "operand": "replace"}, {"key": "panel_has_focus"}] + }, + { "keys": ["alt+enter"], "command": "find_all", "args": {"close_panel": true}, + "context": [{"key": "panel", "operand": "replace"}, {"key": "panel_has_focus"}] + }, + { "keys": ["ctrl+alt+enter"], "command": "replace_all", "args": {"close_panel": true}, + "context": [{"key": "panel", "operand": "replace"}, {"key": "panel_has_focus"}] + }, + + // Incremental find panel key bindings + { "keys": ["enter"], "command": "hide_panel", "context": + [{"key": "panel", "operand": "incremental_find"}, {"key": "panel_has_focus"}] + }, + { "keys": ["shift+enter"], "command": "find_prev", "context": + [{"key": "panel", "operand": "incremental_find"}, {"key": "panel_has_focus"}] + }, + { "keys": ["alt+enter"], "command": "find_all", "args": {"close_panel": true}, + "context": [{"key": "panel", "operand": "incremental_find"}, {"key": "panel_has_focus"}] + }, + + { "keys": ["super+,"], "command": "open_file", "args": {"file": "${packages}/User/Preferences.sublime-settings"} }, + + { "keys": ["super+k", "super+y"], "command": "yank" }, + { "keys": ["super+k", "super+k"], "command": "run_macro_file", "args": {"file": "Packages/Default/Delete to Hard EOL.sublime-macro"} }, + { "keys": ["super+k", "super+backspace"], "command": "run_macro_file", "args": {"file": "Packages/Default/Delete to Hard BOL.sublime-macro"} }, + { "keys": ["super+k", "super+c"], "command": "show_at_center" }, + + // These are OS X built in commands, and don't need to be listed here, but + // doing so lets them show up in the menu + { "keys": ["ctrl+y"], "command": "yank" }, + { "keys": ["super+backspace"], "command": "run_macro_file", "args": {"file": "Packages/Default/Delete to Hard BOL.sublime-macro"} }, + // super+delete isn't a built in command, but makes sense anyway + { "keys": ["super+delete"], "command": "run_macro_file", "args": {"file": "Packages/Default/Delete to Hard EOL.sublime-macro"} }, + { "keys": ["ctrl+k"], "command": "run_macro_file", "args": {"file": "Packages/Default/Delete to Hard EOL.sublime-macro"} }, + { "keys": ["ctrl+l"], "command": "show_at_center" }, + { "keys": ["ctrl+o"], "command": "insert_snippet", "args": { "contents": "$0\n" } }, + { "keys": ["ctrl+super+d"], "command": "noop" }, + { "keys": ["ctrl+super+shift+d"], "command": "noop" } +] diff --git a/sublime-text/Default/Default (OSX).sublime-mousemap b/sublime-text/Default/Default (OSX).sublime-mousemap new file mode 100644 index 0000000..d08b14d --- /dev/null +++ b/sublime-text/Default/Default (OSX).sublime-mousemap @@ -0,0 +1,98 @@ +[ + // Basic drag select + { + "button": "button1", "count": 1, + "press_command": "drag_select" + }, + { + // Select between selection and click location + "button": "button1", "modifiers": ["shift"], + "press_command": "drag_select", + "press_args": {"extend": true} + }, + { + "button": "button1", "count": 1, "modifiers": ["super"], + "press_command": "drag_select", + "press_args": {"additive": true} + }, + { + "button": "button1", "count": 1, "modifiers": ["shift", "super"], + "press_command": "drag_select", + "press_args": {"subtractive": true} + }, + + // Drag select by words + { + "button": "button1", "count": 2, + "press_command": "drag_select", + "press_args": {"by": "words"} + }, + { + "button": "button1", "count": 2, "modifiers": ["super"], + "press_command": "drag_select", + "press_args": {"by": "words", "additive": true} + }, + { + "button": "button1", "count": 2, "modifiers": ["shift", "super"], + "press_command": "drag_select", + "press_args": {"by": "words", "subtractive": true} + }, + + // Drag select by lines + { + "button": "button1", "count": 3, + "press_command": "drag_select", + "press_args": {"by": "lines"} + }, + { + "button": "button1", "count": 3, "modifiers": ["super"], + "press_command": "drag_select", + "press_args": {"by": "lines", "additive": true} + }, + { + "button": "button1", "count": 3, "modifiers": ["shift", "super"], + "press_command": "drag_select", + "press_args": {"by": "lines", "subtractive": true} + }, + + // Alt + Mouse 1 Column select + { + "button": "button1", "modifiers": ["alt"], + "press_command": "drag_select", + "press_args": {"by": "columns"} + }, + { + "button": "button1", "modifiers": ["alt", "super"], + "press_command": "drag_select", + "press_args": {"by": "columns", "additive": true} + }, + { + "button": "button1", "modifiers": ["alt", "shift", "super"], + "press_command": "drag_select", + "press_args": {"by": "columns", "subtractive": true} + }, + + // Mouse 3 column select + { + "button": "button3", + "press_command": "drag_select", + "press_args": {"by": "columns"} + }, + { + "button": "button3", "modifiers": ["super"], + "press_command": "drag_select", + "press_args": {"by": "columns", "additive": true} + }, + { + "button": "button3", "modifiers": ["shift", "super"], + "press_command": "drag_select", + "press_args": {"by": "columns", "subtractive": true} + }, + + // Switch files with buttons 4 and 5 + { "button": "button4", "modifiers": [], "command": "prev_view" }, + { "button": "button5", "modifiers": [], "command": "next_view" }, + + { "button": "button2", "modifiers": [], "press_command": "context_menu" }, + { "button": "button1", "count": 1, "modifiers": ["ctrl"], "press_command": "context_menu" } +] diff --git a/sublime-text/Default/Default (Windows).sublime-keymap b/sublime-text/Default/Default (Windows).sublime-keymap new file mode 100644 index 0000000..5bde08e --- /dev/null +++ b/sublime-text/Default/Default (Windows).sublime-keymap @@ -0,0 +1,641 @@ +[ + { "keys": ["ctrl+shift+n"], "command": "new_window" }, + { "keys": ["ctrl+shift+w"], "command": "close_window" }, + { "keys": ["ctrl+o"], "command": "prompt_open_file" }, + { "keys": ["ctrl+shift+t"], "command": "reopen_last_file" }, + { "keys": ["alt+o"], "command": "switch_file", "args": {"extensions": ["cpp", "cxx", "cc", "c", "hpp", "hxx", "h", "ipp", "inl", "m", "mm"]} }, + { "keys": ["ctrl+n"], "command": "new_file" }, + { "keys": ["ctrl+s"], "command": "save" }, + { "keys": ["ctrl+shift+s"], "command": "prompt_save_as" }, + { "keys": ["ctrl+f4"], "command": "close_file" }, + { "keys": ["ctrl+w"], "command": "close" }, + + { "keys": ["ctrl+k", "ctrl+b"], "command": "toggle_side_bar" }, + { "keys": ["f11"], "command": "toggle_full_screen" }, + { "keys": ["shift+f11"], "command": "toggle_distraction_free" }, + + { "keys": ["backspace"], "command": "left_delete" }, + { "keys": ["shift+backspace"], "command": "left_delete" }, + { "keys": ["ctrl+shift+backspace"], "command": "left_delete" }, + { "keys": ["delete"], "command": "right_delete" }, + { "keys": ["enter"], "command": "insert", "args": {"characters": "\n"} }, + { "keys": ["shift+enter"], "command": "insert", "args": {"characters": "\n"} }, + + { "keys": ["ctrl+z"], "command": "undo" }, + { "keys": ["ctrl+shift+z"], "command": "redo" }, + { "keys": ["ctrl+y"], "command": "redo_or_repeat" }, + { "keys": ["ctrl+u"], "command": "soft_undo" }, + { "keys": ["ctrl+shift+u"], "command": "soft_redo" }, + + { "keys": ["ctrl+shift+v"], "command": "paste_and_indent" }, + { "keys": ["shift+delete"], "command": "cut" }, + { "keys": ["ctrl+insert"], "command": "copy" }, + { "keys": ["shift+insert"], "command": "paste" }, + { "keys": ["ctrl+x"], "command": "cut" }, + { "keys": ["ctrl+c"], "command": "copy" }, + { "keys": ["ctrl+v"], "command": "paste" }, + + { "keys": ["left"], "command": "move", "args": {"by": "characters", "forward": false} }, + { "keys": ["right"], "command": "move", "args": {"by": "characters", "forward": true} }, + { "keys": ["up"], "command": "move", "args": {"by": "lines", "forward": false} }, + { "keys": ["down"], "command": "move", "args": {"by": "lines", "forward": true} }, + { "keys": ["shift+left"], "command": "move", "args": {"by": "characters", "forward": false, "extend": true} }, + { "keys": ["shift+right"], "command": "move", "args": {"by": "characters", "forward": true, "extend": true} }, + { "keys": ["shift+up"], "command": "move", "args": {"by": "lines", "forward": false, "extend": true} }, + { "keys": ["shift+down"], "command": "move", "args": {"by": "lines", "forward": true, "extend": true} }, + + { "keys": ["ctrl+left"], "command": "move", "args": {"by": "words", "forward": false} }, + { "keys": ["ctrl+right"], "command": "move", "args": {"by": "word_ends", "forward": true} }, + { "keys": ["ctrl+shift+left"], "command": "move", "args": {"by": "words", "forward": false, "extend": true} }, + { "keys": ["ctrl+shift+right"], "command": "move", "args": {"by": "word_ends", "forward": true, "extend": true} }, + + { "keys": ["alt+left"], "command": "move", "args": {"by": "subwords", "forward": false} }, + { "keys": ["alt+right"], "command": "move", "args": {"by": "subword_ends", "forward": true} }, + { "keys": ["alt+shift+left"], "command": "move", "args": {"by": "subwords", "forward": false, "extend": true} }, + { "keys": ["alt+shift+right"], "command": "move", "args": {"by": "subword_ends", "forward": true, "extend": true} }, + + { "keys": ["ctrl+alt+up"], "command": "select_lines", "args": {"forward": false} }, + { "keys": ["ctrl+alt+down"], "command": "select_lines", "args": {"forward": true} }, + + { "keys": ["pageup"], "command": "move", "args": {"by": "pages", "forward": false} }, + { "keys": ["pagedown"], "command": "move", "args": {"by": "pages", "forward": true} }, + { "keys": ["shift+pageup"], "command": "move", "args": {"by": "pages", "forward": false, "extend": true} }, + { "keys": ["shift+pagedown"], "command": "move", "args": {"by": "pages", "forward": true, "extend": true} }, + + { "keys": ["home"], "command": "move_to", "args": {"to": "bol", "extend": false} }, + { "keys": ["end"], "command": "move_to", "args": {"to": "eol", "extend": false} }, + { "keys": ["shift+home"], "command": "move_to", "args": {"to": "bol", "extend": true} }, + { "keys": ["shift+end"], "command": "move_to", "args": {"to": "eol", "extend": true} }, + { "keys": ["ctrl+home"], "command": "move_to", "args": {"to": "bof", "extend": false} }, + { "keys": ["ctrl+end"], "command": "move_to", "args": {"to": "eof", "extend": false} }, + { "keys": ["ctrl+shift+home"], "command": "move_to", "args": {"to": "bof", "extend": true} }, + { "keys": ["ctrl+shift+end"], "command": "move_to", "args": {"to": "eof", "extend": true} }, + + + { "keys": ["ctrl+up"], "command": "scroll_lines", "args": {"amount": 1.0 } }, + { "keys": ["ctrl+down"], "command": "scroll_lines", "args": {"amount": -1.0 } }, + + { "keys": ["ctrl+pagedown"], "command": "next_view" }, + { "keys": ["ctrl+pageup"], "command": "prev_view" }, + + { "keys": ["ctrl+tab"], "command": "next_view_in_stack" }, + { "keys": ["ctrl+shift+tab"], "command": "prev_view_in_stack" }, + + { "keys": ["ctrl+a"], "command": "select_all" }, + { "keys": ["ctrl+shift+l"], "command": "split_selection_into_lines" }, + { "keys": ["escape"], "command": "single_selection", "context": + [ + { "key": "num_selections", "operator": "not_equal", "operand": 1 } + ] + }, + { "keys": ["escape"], "command": "clear_fields", "context": + [ + { "key": "has_next_field", "operator": "equal", "operand": true } + ] + }, + { "keys": ["escape"], "command": "clear_fields", "context": + [ + { "key": "has_prev_field", "operator": "equal", "operand": true } + ] + }, + { "keys": ["escape"], "command": "hide_panel", "args": {"cancel": true}, + "context": + [ + { "key": "panel_visible", "operator": "equal", "operand": true } + ] + }, + { "keys": ["escape"], "command": "hide_overlay", "context": + [ + { "key": "overlay_visible", "operator": "equal", "operand": true } + ] + }, + { "keys": ["escape"], "command": "hide_auto_complete", "context": + [ + { "key": "auto_complete_visible", "operator": "equal", "operand": true } + ] + }, + + { "keys": ["tab"], "command": "insert_best_completion", "args": {"default": "\t", "exact": true} }, + { "keys": ["tab"], "command": "insert_best_completion", "args": {"default": "\t", "exact": false}, + "context": + [ + { "key": "setting.tab_completion", "operator": "equal", "operand": true } + ] + }, + { "keys": ["tab"], "command": "replace_completion_with_next_completion", "context": + [ + { "key": "last_command", "operator": "equal", "operand": "insert_best_completion" }, + { "key": "setting.tab_completion", "operator": "equal", "operand": true } + ] + }, + { "keys": ["tab"], "command": "reindent", "context": + [ + { "key": "setting.auto_indent", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "preceding_text", "operator": "regex_match", "operand": "^$", "match_all": true }, + { "key": "following_text", "operator": "regex_match", "operand": "^$", "match_all": true } + ] + }, + { "keys": ["tab"], "command": "indent", "context": + [ + { "key": "text", "operator": "regex_contains", "operand": "\n" } + ] + }, + { "keys": ["tab"], "command": "next_field", "context": + [ + { "key": "has_next_field", "operator": "equal", "operand": true } + ] + }, + { "keys": ["tab"], "command": "commit_completion", "context": + [ + { "key": "auto_complete_visible" }, + { "key": "setting.auto_complete_commit_on_tab" } + ] + }, + + { "keys": ["shift+tab"], "command": "insert", "args": {"characters": "\t"} }, + { "keys": ["shift+tab"], "command": "unindent", "context": + [ + { "key": "setting.shift_tab_unindent", "operator": "equal", "operand": true } + ] + }, + { "keys": ["shift+tab"], "command": "unindent", "context": + [ + { "key": "preceding_text", "operator": "regex_match", "operand": "^[\t ]*" } + ] + }, + { "keys": ["shift+tab"], "command": "unindent", "context": + [ + { "key": "text", "operator": "regex_contains", "operand": "\n" } + ] + }, + { "keys": ["shift+tab"], "command": "prev_field", "context": + [ + { "key": "has_prev_field", "operator": "equal", "operand": true } + ] + }, + + { "keys": ["ctrl+]"], "command": "indent" }, + { "keys": ["ctrl+["], "command": "unindent" }, + + { "keys": ["insert"], "command": "toggle_overwrite" }, + + { "keys": ["ctrl+l"], "command": "expand_selection", "args": {"to": "line"} }, + { "keys": ["ctrl+d"], "command": "find_under_expand" }, + { "keys": ["ctrl+k", "ctrl+d"], "command": "find_under_expand_skip" }, + { "keys": ["ctrl+shift+space"], "command": "expand_selection", "args": {"to": "scope"} }, + { "keys": ["ctrl+shift+m"], "command": "expand_selection", "args": {"to": "brackets"} }, + { "keys": ["ctrl+m"], "command": "move_to", "args": {"to": "brackets"} }, + { "keys": ["ctrl+shift+j"], "command": "expand_selection", "args": {"to": "indentation"} }, + { "keys": ["ctrl+shift+a"], "command": "expand_selection", "args": {"to": "tag"} }, + + { "keys": ["alt+."], "command": "close_tag" }, + + { "keys": ["ctrl+q"], "command": "toggle_record_macro" }, + { "keys": ["ctrl+shift+q"], "command": "run_macro" }, + + { "keys": ["ctrl+enter"], "command": "run_macro_file", "args": {"file": "Packages/Default/Add Line.sublime-macro"} }, + { "keys": ["ctrl+shift+enter"], "command": "run_macro_file", "args": {"file": "Packages/Default/Add Line Before.sublime-macro"} }, + { "keys": ["enter"], "command": "commit_completion", "context": + [ + { "key": "auto_complete_visible" }, + { "key": "setting.auto_complete_commit_on_tab", "operand": false } + ] + }, + + { "keys": ["ctrl+p"], "command": "show_overlay", "args": {"overlay": "goto", "show_files": true} }, + { "keys": ["ctrl+shift+p"], "command": "show_overlay", "args": {"overlay": "command_palette"} }, + { "keys": ["ctrl+alt+p"], "command": "prompt_select_project" }, + { "keys": ["ctrl+r"], "command": "show_overlay", "args": {"overlay": "goto", "text": "@"} }, + { "keys": ["ctrl+g"], "command": "show_overlay", "args": {"overlay": "goto", "text": ":"} }, + { "keys": ["ctrl+;"], "command": "show_overlay", "args": {"overlay": "goto", "text": "#"} }, + + { "keys": ["ctrl+i"], "command": "show_panel", "args": {"panel": "incremental_find", "reverse":false} }, + { "keys": ["ctrl+shift+i"], "command": "show_panel", "args": {"panel": "incremental_find", "reverse":true} }, + { "keys": ["ctrl+f"], "command": "show_panel", "args": {"panel": "find"} }, + { "keys": ["ctrl+h"], "command": "show_panel", "args": {"panel": "replace"} }, + { "keys": ["ctrl+shift+h"], "command": "replace_next" }, + { "keys": ["f3"], "command": "find_next" }, + { "keys": ["shift+f3"], "command": "find_prev" }, + { "keys": ["ctrl+f3"], "command": "find_under" }, + { "keys": ["ctrl+shift+f3"], "command": "find_under_prev" }, + { "keys": ["alt+f3"], "command": "find_all_under" }, + { "keys": ["ctrl+e"], "command": "slurp_find_string" }, + { "keys": ["ctrl+shift+e"], "command": "slurp_replace_string" }, + { "keys": ["ctrl+shift+f"], "command": "show_panel", "args": {"panel": "find_in_files"} }, + { "keys": ["f4"], "command": "next_result" }, + { "keys": ["shift+f4"], "command": "prev_result" }, + + { "keys": ["f6"], "command": "toggle_setting", "args": {"setting": "spell_check"} }, + { "keys": ["ctrl+f6"], "command": "next_misspelling" }, + { "keys": ["ctrl+shift+f6"], "command": "prev_misspelling" }, + + { "keys": ["ctrl+shift+up"], "command": "swap_line_up" }, + { "keys": ["ctrl+shift+down"], "command": "swap_line_down" }, + + { "keys": ["ctrl+backspace"], "command": "delete_word", "args": { "forward": false } }, + { "keys": ["ctrl+shift+backspace"], "command": "run_macro_file", "args": {"file": "Packages/Default/Delete to Hard BOL.sublime-macro"} }, + + { "keys": ["ctrl+delete"], "command": "delete_word", "args": { "forward": true } }, + { "keys": ["ctrl+shift+delete"], "command": "run_macro_file", "args": {"file": "Packages/Default/Delete to Hard EOL.sublime-macro"} }, + + { "keys": ["ctrl+/"], "command": "toggle_comment", "args": { "block": false } }, + { "keys": ["ctrl+shift+/"], "command": "toggle_comment", "args": { "block": true } }, + + { "keys": ["ctrl+j"], "command": "join_lines" }, + { "keys": ["ctrl+shift+d"], "command": "duplicate_line" }, + + { "keys": ["ctrl+`"], "command": "show_panel", "args": {"panel": "console", "toggle": true} }, + + { "keys": ["ctrl+space"], "command": "auto_complete" }, + { "keys": ["ctrl+space"], "command": "replace_completion_with_auto_complete", "context": + [ + { "key": "last_command", "operator": "equal", "operand": "insert_best_completion" }, + { "key": "auto_complete_visible", "operator": "equal", "operand": false }, + { "key": "setting.tab_completion", "operator": "equal", "operand": true } + ] + }, + + { "keys": ["ctrl+alt+shift+p"], "command": "show_scope_name" }, + + { "keys": ["f7"], "command": "build" }, + { "keys": ["ctrl+b"], "command": "build" }, + { "keys": ["ctrl+shift+b"], "command": "build", "args": {"variant": "Run"} }, + { "keys": ["ctrl+break"], "command": "exec", "args": {"kill": true} }, + + { "keys": ["ctrl+t"], "command": "transpose" }, + + { "keys": ["f9"], "command": "sort_lines", "args": {"case_sensitive": false} }, + { "keys": ["ctrl+f9"], "command": "sort_lines", "args": {"case_sensitive": true} }, + + // Auto-pair quotes + { "keys": ["\""], "command": "insert_snippet", "args": {"contents": "\"$0\""}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\)|]|\\}|>|$)", "match_all": true }, + { "key": "preceding_text", "operator": "not_regex_contains", "operand": "[\"a-zA-Z0-9_]$", "match_all": true }, + { "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.double", "match_all": true } + ] + }, + { "keys": ["\""], "command": "insert_snippet", "args": {"contents": "\"${0:$SELECTION}\""}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true } + ] + }, + { "keys": ["\""], "command": "move", "args": {"by": "characters", "forward": true}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^\"", "match_all": true } + ] + }, + { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "Packages/Default/Delete Left Right.sublime-macro"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "preceding_text", "operator": "regex_contains", "operand": "\"$", "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^\"", "match_all": true } + ] + }, + + // Auto-pair single quotes + { "keys": ["'"], "command": "insert_snippet", "args": {"contents": "'$0'"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\)|]|\\}|>|$)", "match_all": true }, + { "key": "preceding_text", "operator": "not_regex_contains", "operand": "['a-zA-Z0-9_]$", "match_all": true }, + { "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.single", "match_all": true } + ] + }, + { "keys": ["'"], "command": "insert_snippet", "args": {"contents": "'${0:$SELECTION}'"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true } + ] + }, + { "keys": ["'"], "command": "move", "args": {"by": "characters", "forward": true}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^'", "match_all": true } + ] + }, + { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "Packages/Default/Delete Left Right.sublime-macro"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "preceding_text", "operator": "regex_contains", "operand": "'$", "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^'", "match_all": true } + ] + }, + + // Auto-pair brackets + { "keys": ["("], "command": "insert_snippet", "args": {"contents": "($0)"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\)|]|;|\\}|$)", "match_all": true } + ] + }, + { "keys": ["("], "command": "insert_snippet", "args": {"contents": "(${0:$SELECTION})"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true } + ] + }, + { "keys": [")"], "command": "move", "args": {"by": "characters", "forward": true}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^\\)", "match_all": true } + ] + }, + { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "Packages/Default/Delete Left Right.sublime-macro"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "preceding_text", "operator": "regex_contains", "operand": "\\($", "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^\\)", "match_all": true } + ] + }, + + // Auto-pair square brackets + { "keys": ["["], "command": "insert_snippet", "args": {"contents": "[$0]"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\)|]|;|\\}|$)", "match_all": true } + ] + }, + { "keys": ["["], "command": "insert_snippet", "args": {"contents": "[${0:$SELECTION}]"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true } + ] + }, + { "keys": ["]"], "command": "move", "args": {"by": "characters", "forward": true}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^\\]", "match_all": true } + ] + }, + { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "Packages/Default/Delete Left Right.sublime-macro"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "preceding_text", "operator": "regex_contains", "operand": "\\[$", "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^\\]", "match_all": true } + ] + }, + + // Auto-pair curly brackets + { "keys": ["{"], "command": "insert_snippet", "args": {"contents": "{$0}"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\)|]|\\}|$)", "match_all": true } + ] + }, + { "keys": ["{"], "command": "insert_snippet", "args": {"contents": "{${0:$SELECTION}}"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true } + ] + }, + { "keys": ["}"], "command": "move", "args": {"by": "characters", "forward": true}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^\\}", "match_all": true } + ] + }, + { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "Packages/Default/Delete Left Right.sublime-macro"}, "context": + [ + { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "preceding_text", "operator": "regex_contains", "operand": "\\{$", "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^\\}", "match_all": true } + ] + }, + + { "keys": ["enter"], "command": "run_macro_file", "args": {"file": "Packages/Default/Add Line in Braces.sublime-macro"}, "context": + [ + { "key": "setting.auto_indent", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "preceding_text", "operator": "regex_contains", "operand": "\\{$", "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^\\}", "match_all": true } + ] + }, + { "keys": ["shift+enter"], "command": "run_macro_file", "args": {"file": "Packages/Default/Add Line in Braces.sublime-macro"}, "context": + [ + { "key": "setting.auto_indent", "operator": "equal", "operand": true }, + { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, + { "key": "preceding_text", "operator": "regex_contains", "operand": "\\{$", "match_all": true }, + { "key": "following_text", "operator": "regex_contains", "operand": "^\\}", "match_all": true } + ] + }, + + { + "keys": ["alt+shift+1"], + "command": "set_layout", + "args": + { + "cols": [0.0, 1.0], + "rows": [0.0, 1.0], + "cells": [[0, 0, 1, 1]] + } + }, + { + "keys": ["alt+shift+2"], + "command": "set_layout", + "args": + { + "cols": [0.0, 0.5, 1.0], + "rows": [0.0, 1.0], + "cells": [[0, 0, 1, 1], [1, 0, 2, 1]] + } + }, + { + "keys": ["alt+shift+3"], + "command": "set_layout", + "args": + { + "cols": [0.0, 0.33, 0.66, 1.0], + "rows": [0.0, 1.0], + "cells": [[0, 0, 1, 1], [1, 0, 2, 1], [2, 0, 3, 1]] + } + }, + { + "keys": ["alt+shift+4"], + "command": "set_layout", + "args": + { + "cols": [0.0, 0.25, 0.5, 0.75, 1.0], + "rows": [0.0, 1.0], + "cells": [[0, 0, 1, 1], [1, 0, 2, 1], [2, 0, 3, 1], [3, 0, 4, 1]] + } + }, + { + "keys": ["alt+shift+8"], + "command": "set_layout", + "args": + { + "cols": [0.0, 1.0], + "rows": [0.0, 0.5, 1.0], + "cells": [[0, 0, 1, 1], [0, 1, 1, 2]] + } + }, + { + "keys": ["alt+shift+9"], + "command": "set_layout", + "args": + { + "cols": [0.0, 1.0], + "rows": [0.0, 0.33, 0.66, 1.0], + "cells": [[0, 0, 1, 1], [0, 1, 1, 2], [0, 2, 1, 3]] + } + }, + { + "keys": ["alt+shift+5"], + "command": "set_layout", + "args": + { + "cols": [0.0, 0.5, 1.0], + "rows": [0.0, 0.5, 1.0], + "cells": + [ + [0, 0, 1, 1], [1, 0, 2, 1], + [0, 1, 1, 2], [1, 1, 2, 2] + ] + } + }, + { "keys": ["ctrl+1"], "command": "focus_group", "args": { "group": 0 } }, + { "keys": ["ctrl+2"], "command": "focus_group", "args": { "group": 1 } }, + { "keys": ["ctrl+3"], "command": "focus_group", "args": { "group": 2 } }, + { "keys": ["ctrl+4"], "command": "focus_group", "args": { "group": 3 } }, + { "keys": ["ctrl+shift+1"], "command": "move_to_group", "args": { "group": 0 } }, + { "keys": ["ctrl+shift+2"], "command": "move_to_group", "args": { "group": 1 } }, + { "keys": ["ctrl+shift+3"], "command": "move_to_group", "args": { "group": 2 } }, + { "keys": ["ctrl+shift+4"], "command": "move_to_group", "args": { "group": 3 } }, + { "keys": ["ctrl+0"], "command": "focus_side_bar" }, + + { "keys": ["alt+1"], "command": "select_by_index", "args": { "index": 0 } }, + { "keys": ["alt+2"], "command": "select_by_index", "args": { "index": 1 } }, + { "keys": ["alt+3"], "command": "select_by_index", "args": { "index": 2 } }, + { "keys": ["alt+4"], "command": "select_by_index", "args": { "index": 3 } }, + { "keys": ["alt+5"], "command": "select_by_index", "args": { "index": 4 } }, + { "keys": ["alt+6"], "command": "select_by_index", "args": { "index": 5 } }, + { "keys": ["alt+7"], "command": "select_by_index", "args": { "index": 6 } }, + { "keys": ["alt+8"], "command": "select_by_index", "args": { "index": 7 } }, + { "keys": ["alt+9"], "command": "select_by_index", "args": { "index": 8 } }, + { "keys": ["alt+0"], "command": "select_by_index", "args": { "index": 9 } }, + + { "keys": ["f2"], "command": "next_bookmark" }, + { "keys": ["shift+f2"], "command": "prev_bookmark" }, + { "keys": ["ctrl+f2"], "command": "toggle_bookmark" }, + { "keys": ["ctrl+shift+f2"], "command": "clear_bookmarks" }, + { "keys": ["alt+f2"], "command": "select_all_bookmarks" }, + + { "keys": ["ctrl+shift+k"], "command": "run_macro_file", "args": {"file": "Packages/Default/Delete Line.sublime-macro"} }, + + { "keys": ["alt+q"], "command": "wrap_lines" }, + + { "keys": ["ctrl+k", "ctrl+u"], "command": "upper_case" }, + { "keys": ["ctrl+k", "ctrl+l"], "command": "lower_case" }, + + { "keys": ["ctrl+k", "ctrl+space"], "command": "set_mark" }, + { "keys": ["ctrl+k", "ctrl+a"], "command": "select_to_mark" }, + { "keys": ["ctrl+k", "ctrl+w"], "command": "delete_to_mark" }, + { "keys": ["ctrl+k", "ctrl+x"], "command": "swap_with_mark" }, + { "keys": ["ctrl+k", "ctrl+y"], "command": "yank" }, + { "keys": ["ctrl+k", "ctrl+k"], "command": "run_macro_file", "args": {"file": "Packages/Default/Delete to Hard EOL.sublime-macro"} }, + { "keys": ["ctrl+k", "ctrl+backspace"], "command": "run_macro_file", "args": {"file": "Packages/Default/Delete to Hard BOL.sublime-macro"} }, + { "keys": ["ctrl+k", "ctrl+g"], "command": "clear_bookmarks", "args": {"name": "mark"} }, + { "keys": ["ctrl+k", "ctrl+c"], "command": "show_at_center" }, + + { "keys": ["ctrl++"], "command": "increase_font_size" }, + { "keys": ["ctrl+="], "command": "increase_font_size" }, + { "keys": ["ctrl+keypad_plus"], "command": "increase_font_size" }, + { "keys": ["ctrl+-"], "command": "decrease_font_size" }, + { "keys": ["ctrl+keypad_minus"], "command": "decrease_font_size" }, + + { "keys": ["alt+shift+w"], "command": "insert_snippet", "args": { "name": "Packages/XML/long-tag.sublime-snippet" } }, + + { "keys": ["ctrl+shift+["], "command": "fold" }, + { "keys": ["ctrl+shift+]"], "command": "unfold" }, + { "keys": ["ctrl+k", "ctrl+1"], "command": "fold_by_level", "args": {"level": 1} }, + { "keys": ["ctrl+k", "ctrl+2"], "command": "fold_by_level", "args": {"level": 2} }, + { "keys": ["ctrl+k", "ctrl+3"], "command": "fold_by_level", "args": {"level": 3} }, + { "keys": ["ctrl+k", "ctrl+4"], "command": "fold_by_level", "args": {"level": 4} }, + { "keys": ["ctrl+k", "ctrl+5"], "command": "fold_by_level", "args": {"level": 5} }, + { "keys": ["ctrl+k", "ctrl+6"], "command": "fold_by_level", "args": {"level": 6} }, + { "keys": ["ctrl+k", "ctrl+7"], "command": "fold_by_level", "args": {"level": 7} }, + { "keys": ["ctrl+k", "ctrl+8"], "command": "fold_by_level", "args": {"level": 8} }, + { "keys": ["ctrl+k", "ctrl+9"], "command": "fold_by_level", "args": {"level": 9} }, + { "keys": ["ctrl+k", "ctrl+0"], "command": "unfold_all" }, + { "keys": ["ctrl+k", "ctrl+j"], "command": "unfold_all" }, + { "keys": ["ctrl+k", "ctrl+t"], "command": "fold_tag_attributes" }, + + { "keys": ["context_menu"], "command": "context_menu" }, + + { "keys": ["alt+c"], "command": "toggle_case_sensitive", "context": + [ + { "key": "setting.is_widget", "operator": "equal", "operand": true } + ] + }, + { "keys": ["alt+r"], "command": "toggle_regex", "context": + [ + { "key": "setting.is_widget", "operator": "equal", "operand": true } + ] + }, + { "keys": ["alt+w"], "command": "toggle_whole_word", "context": + [ + { "key": "setting.is_widget", "operator": "equal", "operand": true } + ] + }, + { "keys": ["alt+a"], "command": "toggle_preserve_case", "context": + [ + { "key": "setting.is_widget", "operator": "equal", "operand": true } + ] + }, + + // Find panel key bindings + { "keys": ["enter"], "command": "find_next", "context": + [{"key": "panel", "operand": "find"}, {"key": "panel_has_focus"}] + }, + { "keys": ["shift+enter"], "command": "find_prev", "context": + [{"key": "panel", "operand": "find"}, {"key": "panel_has_focus"}] + }, + { "keys": ["alt+enter"], "command": "find_all", "args": {"close_panel": true}, + "context": [{"key": "panel", "operand": "find"}, {"key": "panel_has_focus"}] + }, + + // Replace panel key bindings + { "keys": ["enter"], "command": "find_next", "context": + [{"key": "panel", "operand": "replace"}, {"key": "panel_has_focus"}] + }, + { "keys": ["shift+enter"], "command": "find_prev", "context": + [{"key": "panel", "operand": "replace"}, {"key": "panel_has_focus"}] + }, + { "keys": ["alt+enter"], "command": "find_all", "args": {"close_panel": true}, + "context": [{"key": "panel", "operand": "replace"}, {"key": "panel_has_focus"}] + }, + { "keys": ["ctrl+alt+enter"], "command": "replace_all", "args": {"close_panel": true}, + "context": [{"key": "panel", "operand": "replace"}, {"key": "panel_has_focus"}] + }, + + // Incremental find panel key bindings + { "keys": ["enter"], "command": "hide_panel", "context": + [{"key": "panel", "operand": "incremental_find"}, {"key": "panel_has_focus"}] + }, + { "keys": ["shift+enter"], "command": "find_prev", "context": + [{"key": "panel", "operand": "incremental_find"}, {"key": "panel_has_focus"}] + }, + { "keys": ["alt+enter"], "command": "find_all", "args": {"close_panel": true}, + "context": [{"key": "panel", "operand": "incremental_find"}, {"key": "panel_has_focus"}] + } +] diff --git a/sublime-text/Default/Default (Windows).sublime-mousemap b/sublime-text/Default/Default (Windows).sublime-mousemap new file mode 100644 index 0000000..748418e --- /dev/null +++ b/sublime-text/Default/Default (Windows).sublime-mousemap @@ -0,0 +1,131 @@ +[ + // Basic drag select + { + "button": "button1", "count": 1, + "press_command": "drag_select" + }, + { + "button": "button1", "count": 1, "modifiers": ["ctrl"], + "press_command": "drag_select", + "press_args": {"additive": true} + }, + { + "button": "button1", "count": 1, "modifiers": ["alt"], + "press_command": "drag_select", + "press_args": {"subtractive": true} + }, + + // Select between selection and click location + { + "button": "button1", "modifiers": ["shift"], + "press_command": "drag_select", + "press_args": {"extend": true} + }, + { + "button": "button1", "modifiers": ["shift", "ctrl"], + "press_command": "drag_select", + "press_args": {"additive": true, "extend": true} + }, + { + "button": "button1", "modifiers": ["shift", "alt"], + "press_command": "drag_select", + "press_args": {"subtractive": true, "extend": true} + }, + + // Drag select by words + { + "button": "button1", "count": 2, + "press_command": "drag_select", + "press_args": {"by": "words"} + }, + { + "button": "button1", "count": 2, "modifiers": ["ctrl"], + "press_command": "drag_select", + "press_args": {"by": "words", "additive": true} + }, + { + "button": "button1", "count": 2, "modifiers": ["alt"], + "press_command": "drag_select", + "press_args": {"by": "words", "subtractive": true} + }, + + // Drag select by lines + { + "button": "button1", "count": 3, + "press_command": "drag_select", + "press_args": {"by": "lines"} + }, + { + "button": "button1", "count": 3, "modifiers": ["ctrl"], + "press_command": "drag_select", + "press_args": {"by": "lines", "additive": true} + }, + { + "button": "button1", "count": 3, "modifiers": ["alt"], + "press_command": "drag_select", + "press_args": {"by": "lines", "subtractive": true} + }, + + // Shift + Mouse 2 Column select + { + "button": "button2", "modifiers": ["shift"], + "press_command": "drag_select", + "press_args": {"by": "columns"} + }, + { + "button": "button2", "modifiers": ["shift", "ctrl"], + "press_command": "drag_select", + "press_args": {"by": "columns", "additive": true} + }, + { + "button": "button2", "modifiers": ["shift", "alt"], + "press_command": "drag_select", + "press_args": {"by": "columns", "subtractive": true} + }, + + // Mouse 3 column select + { + "button": "button3", + "press_command": "drag_select", + "press_args": {"by": "columns"} + }, + { + "button": "button3", "modifiers": ["ctrl"], + "press_command": "drag_select", + "press_args": {"by": "columns", "additive": true} + }, + { + "button": "button3", "modifiers": ["alt"], + "press_command": "drag_select", + "press_args": {"by": "columns", "subtractive": true} + }, + + // Simple chording: hold down mouse 2, and click mouse 1 + { + "button": "button1", "count": 1, "modifiers": ["button2"], + "command": "expand_selection", "args": {"to": "line"}, + "press_command": "drag_select" + }, + { + "button": "button1", "count": 2, "modifiers": ["button2"], + "command": "expand_selection_to_paragraph" + }, + { + "button": "button1", "count": 3, "modifiers": ["button2"], + "command": "select_all" + }, + + // Switch files with buttons 4 and 5 + { "button": "button4", "modifiers": [], "command": "prev_view" }, + { "button": "button5", "modifiers": [], "command": "next_view" }, + + // Switch files by holding down button 2, and using the scroll wheel + { "button": "scroll_down", "modifiers": ["button2"], "command": "next_view" }, + { "button": "scroll_up", "modifiers": ["button2"], "command": "prev_view" }, + + // Change font size with ctrl+scroll wheel + { "button": "scroll_down", "modifiers": ["ctrl"], "command": "decrease_font_size" }, + { "button": "scroll_up", "modifiers": ["ctrl"], "command": "increase_font_size" }, + + { "button": "button2", "modifiers": [], "command": "context_menu" } +] diff --git a/sublime-text/Default/Default.sublime-commands b/sublime-text/Default/Default.sublime-commands new file mode 100644 index 0000000..88e3318 --- /dev/null +++ b/sublime-text/Default/Default.sublime-commands @@ -0,0 +1,118 @@ +[ + { + "caption": "Word Wrap: Toggle", + "command": "toggle_setting", + "args": {"setting": "word_wrap"} + }, + { + "caption": "Convert Case: Upper Case", + "command": "upper_case" + }, + { + "caption": "Convert Case: Lower Case", + "command": "lower_case" + }, + { + "caption": "Convert Case: Title Case", + "command": "title_case" + }, + { + "caption": "Convert Case: Swap Case", + "command": "swap_case" + }, + + { "command": "toggle_comment", "args": {"block": false}, "caption": "Toggle Comment" }, + { "command": "toggle_comment", "args": {"block": true}, "caption": "Toggle Block Comment" }, + + { "command": "toggle_bookmark", "caption": "Bookmarks: Toggle" }, + { "command": "next_bookmark", "caption": "Bookmarks: Select Next" }, + { "command": "prev_bookmark", "caption": "Bookmarks: Select Previous" }, + { "command": "clear_bookmarks", "caption": "Bookmarks: Clear All" }, + { "command": "select_all_bookmarks", "caption": "Bookmarks: Select All" }, + + { "caption": "Indentation: Convert to Tabs", "command": "unexpand_tabs", "args": {"set_translate_tabs": true} }, + { "caption": "Indentation: Convert to Spaces", "command": "expand_tabs", "args": {"set_translate_tabs": true} }, + { "caption": "Indentation: Reindent Lines", "command": "reindent", "args": {"single_line": false} }, + + { "caption": "View: Toggle Side Bar", "command": "toggle_side_bar" }, + { "caption": "View: Toggle Open Files in Side Bar", "command": "toggle_show_open_files" }, + { "caption": "View: Toggle Minimap", "command": "toggle_minimap" }, + { "caption": "View: Toggle Tabs", "command": "toggle_tabs" }, + { "caption": "View: Toggle Status Bar", "command": "toggle_status_bar" }, + { "caption": "View: Toggle Menu", "command": "toggle_menu" }, + + { "caption": "Project: Save As", "command": "save_project_as" }, + { "caption": "Project: Close", "command": "close_project" }, + { "caption": "Project: Add Folder", "command": "prompt_add_folder" }, + + { "caption": "Preferences: Settings - Default", "command": "open_file", "args": {"file": "${packages}/Default/Preferences.sublime-settings"} }, + { "caption": "Preferences: Settings - User", "command": "open_file", "args": {"file": "${packages}/User/Preferences.sublime-settings"} }, + { "caption": "Preferences: Browse Packages", "command": "open_dir", "args": {"dir": "$packages"} }, + + { + "caption": "Preferences: Key Bindings - Default", + "command": "open_file", "args": + { + "file": "${packages}/Default/Default (Windows).sublime-keymap", + "platform": "Windows" + } + }, + { + "caption": "Preferences: Key Bindings - Default", + "command": "open_file", "args": + { + "file": "${packages}/Default/Default (OSX).sublime-keymap", + "platform": "OSX" + } + }, + { + "caption": "Preferences: Key Bindings - Default", + "command": "open_file", "args": + { + "file": "${packages}/Default/Default (Linux).sublime-keymap", + "platform": "Linux" + } + }, + { + "caption": "Preferences: Key Bindings - User", + "command": "open_file", "args": + { + "file": "${packages}/User/Default (Windows).sublime-keymap", + "platform": "Windows" + } + }, + { + "caption": "Preferences: Key Bindings - User", + "command": "open_file", "args": + { + "file": "${packages}/User/Default (OSX).sublime-keymap", + "platform": "OSX" + } + }, + { + "caption": "Preferences: Key Bindings - User", + "command": "open_file", "args": + { + "file": "${packages}/User/Default (Linux).sublime-keymap", + "platform": "Linux" + } + }, + + { "caption": "File: Save All", "command": "save_all" }, + { "caption": "File: Revert", "command": "revert" }, + { "caption": "File: New View into File", "command": "clone_file" }, + { "caption": "File: Close All", "command": "close_all" }, + + { "caption": "HTML: Wrap Selection With Tag", "command": "insert_snippet", "args": { "name": "Packages/XML/long-tag.sublime-snippet" } }, + { "caption": "HTML: Encode Special Characters", "command": "encode_html_entities" }, + + { "caption": "Rot13 Selection", "command": "rot13" }, + + { "caption": "Sort Lines", "command": "sort_lines", "args": {"case_sensitive": false} }, + { "caption": "Sort Lines (Case Sensitive)", "command": "sort_lines", "args": {"case_sensitive": true} }, + + { "caption": "Code Folding: Unfold All", "command": "unfold_all" }, + { "caption": "Code Folding: Fold Tag Attributes", "command": "fold_tag_attributes" }, + + { "caption": "About", "command": "show_about_window" } +] diff --git a/sublime-text/Default/Delete Left Right.sublime-macro b/sublime-text/Default/Delete Left Right.sublime-macro new file mode 100644 index 0000000..e6946e6 --- /dev/null +++ b/sublime-text/Default/Delete Left Right.sublime-macro @@ -0,0 +1,4 @@ +[ + {"command": "left_delete" }, + {"command": "right_delete" } +] diff --git a/sublime-text/Default/Delete Line.sublime-macro b/sublime-text/Default/Delete Line.sublime-macro new file mode 100644 index 0000000..5fecdcb --- /dev/null +++ b/sublime-text/Default/Delete Line.sublime-macro @@ -0,0 +1,5 @@ +[ + {"command": "expand_selection", "args": {"to": "line"}}, + {"command": "add_to_kill_ring", "args": {"forward": true}}, + {"command": "left_delete"} +] diff --git a/sublime-text/Default/Delete to BOL.sublime-macro b/sublime-text/Default/Delete to BOL.sublime-macro new file mode 100644 index 0000000..9697284 --- /dev/null +++ b/sublime-text/Default/Delete to BOL.sublime-macro @@ -0,0 +1,5 @@ +[ + {"command": "move_to", "args": {"to": "bol", "extend": true}}, + {"command": "add_to_kill_ring", "args": {"forward": false}}, + {"command": "left_delete"} +] diff --git a/sublime-text/Default/Delete to EOL.sublime-macro b/sublime-text/Default/Delete to EOL.sublime-macro new file mode 100644 index 0000000..3af8234 --- /dev/null +++ b/sublime-text/Default/Delete to EOL.sublime-macro @@ -0,0 +1,5 @@ +[ + {"command": "move_to", "args": {"to": "eol", "extend": true}}, + {"command": "add_to_kill_ring", "args": {"forward": true}}, + {"command": "right_delete"} +] diff --git a/sublime-text/Default/Delete to Hard BOL.sublime-macro b/sublime-text/Default/Delete to Hard BOL.sublime-macro new file mode 100644 index 0000000..947de20 --- /dev/null +++ b/sublime-text/Default/Delete to Hard BOL.sublime-macro @@ -0,0 +1,5 @@ +[ + {"command": "move_to", "args": {"to": "hardbol", "extend": true}}, + {"command": "add_to_kill_ring", "args": {"forward": false}}, + {"command": "left_delete"} +] diff --git a/sublime-text/Default/Delete to Hard EOL.sublime-macro b/sublime-text/Default/Delete to Hard EOL.sublime-macro new file mode 100644 index 0000000..153395f --- /dev/null +++ b/sublime-text/Default/Delete to Hard EOL.sublime-macro @@ -0,0 +1,5 @@ +[ + {"command": "move_to", "args": {"to": "hardeol", "extend": true}}, + {"command": "add_to_kill_ring", "args": {"forward": true}}, + {"command": "right_delete"} +] diff --git a/sublime-text/Default/Distraction Free.sublime-settings b/sublime-text/Default/Distraction Free.sublime-settings new file mode 100644 index 0000000..ddbae8d --- /dev/null +++ b/sublime-text/Default/Distraction Free.sublime-settings @@ -0,0 +1,8 @@ +{ + "line_numbers": false, + "gutter": false, + "draw_centered": true, + "wrap_width": 80, + "word_wrap": true, + "scroll_past_end": true +} diff --git a/sublime-text/Default/Find Results.hidden-tmLanguage b/sublime-text/Default/Find Results.hidden-tmLanguage new file mode 100644 index 0000000..4488707 --- /dev/null +++ b/sublime-text/Default/Find Results.hidden-tmLanguage @@ -0,0 +1,50 @@ + + + + + name + Find Results + + patterns + + + match + ^([^ ].*):$ + captures + + 1 + + name + entity.name.filename.find-in-files + + + + + match + ^ +([0-9]+) + captures + + 1 + + name + constant.numeric.line-number.find-in-files + + + + + match + ^ +([0-9]+): + captures + + 1 + + name + constant.numeric.line-number.match.find-in-files + + + + + scopeName + text.find-in-files + + diff --git a/sublime-text/Default/Find in Files.sublime-menu b/sublime-text/Default/Find in Files.sublime-menu new file mode 100644 index 0000000..2101553 --- /dev/null +++ b/sublime-text/Default/Find in Files.sublime-menu @@ -0,0 +1,8 @@ +[ + { "command": "clear_location", "caption": "Clear" }, + { "command": "add_directory", "caption": "Add Folder" }, + { "command": "add_where_snippet", "args": {"snippet": "*.${0:txt}"}, "caption": "Add Include Filter" }, + { "command": "add_where_snippet", "args": {"snippet": "-*.${0:txt}"}, "caption": "Add Exclude Filter" }, + { "command": "add_where_snippet", "args": {"snippet": ""}, "caption": "Add Open Folders" }, + { "command": "add_where_snippet", "args": {"snippet": ""}, "caption": "Add Open Files" } +] diff --git a/sublime-text/Default/Icon.png b/sublime-text/Default/Icon.png new file mode 100644 index 0000000000000000000000000000000000000000..82d904ce26ea0797689805d723c0f847f72eced1 GIT binary patch literal 1689 zcmV;K24?w*P)r7_ zSy`FBa^=b#@WSA^4x&5puV26Zb{xk_2(iCjuOp>IN{Q+YttCcFFcQZ|gpoM5GpCf; zQc`M(R)c%w&=?yV!*$*L?RHyTyLRnu$8r2&2X@TN%)FIlnecs|JkR^&!U0!+CqTHJ zRp&{I_SzC!OS~W=8vg=*)IgV@ODHWEvo#H#=b^RsW@l&L0)7T8dH}Ptv(vR&O+0z> z1lM&*)3k5BaKLvvsGbkE|Mo89`F+CB$MphQ?VNuuuVKfhnLY6x3O#_>oCeo*X}8<# z+qX{~K74q(*=#O)j^l{4XV31l)}pmW2tkr0eE?5@@j&>HK3U}SjONvsk6|YcP;Psr zvoaG?NXgv0|Dq@iQiC?#f*b*0tz~9rW?!?}6dvI2-Me?v7{mJdI*#M?0fYmd+XV=L z)&pMs>Lh5zgN3KuzVSW)VWo;J1!)qKD=0Lma&#JsqQF|q)YQ}@;Cg^NIXSr#Kq-Z_ zwx5C?fc3#O@Wwa34*Ej?e*E*_a^S_6**UqJpi(1|U=*kVq++BC)>@QO0PNnqdsiP| zVq#*OwU#{3F~)4D0l({jqv7_Wr_7u@4WC};``?`8PdES0`#1kWq8whDd4U1bgb=jbZOXDF%d$Rz5@38l!`+7q{Nm{ zBX7LMk&`XV>OIyTeaNrhd%&%04|(A$Comec>_V79F_vYCloBBXjYeal4-iGsxG{#6 zl@*GjpeTxg0|E*UWB@t`ojv6@?<}%y%x6bqoP!7UGdq2ZHv_{5AGP?^-FeE&PSOk# z*-6E48kU!rkx~*x(Rd%ATCI))tgo;0zp9XmrR5ctmRDGtbU87Ra%4}yKR#XOcCiyz z3_9j;CAQmbgb-9Jl`%Rk1~-bLT3MFFal9c&ul+g>xDKea#meGGq;adWA9Qv1P80G3 z@`P`_{`!9eUtL|r7(*0AwY~#k7*-v}*$Utc^?w0lD<5!ZGT{E=V{SdF;CenqQSjyw z0YwPg572B?(WX;;W<)be(-a{DVHj420V>woEdawHzUT3yAN~OD{f?xy%%kOmL@OF0 zytu=Isn>WI9^$=gH#*(W40gz2B}szTno6Y-4FiP6n11#5WVG${e?(x&? zJXqtUcmd;vh%!etzQkYeJmL>GZx9!dsX-&!OpvB2j^hvnLC^;Xf*{aZZv~*U3T-;o z{9q~OC-2-K^kI5;167s;zQ_Gf9#W`I;H=vTbvfFBUX0BEzUO%xcEKJ&51=Rk*_j6# zZhhS9zYnOgGkPufS({N0KuSpv1b!dD^E|(|5sh*HGf0J3Lf-v}_0nXz*ESd5sFyI` z_i$aP4jw#+>$>>9 z@Ae(=eP6h)ORLr5=+UG2zCYsj&#s~M_$1E)^k!2ZcYinC; z;xnjHsZguc`XG%)V*uc~uA`KqTCK9Mut1*Y#Bq$2^0@&7K|q?OOifKuuh(&1*I}p# z9f0%a&vWV0CFbYnNz)Xq^>YKzTC;1{E-qZS06;gU>i|cUQdg5CA&z5ewHlu1k!2aR zT8%u4-1e+=OGojZ55l+u1)DvH83n@tTI_kiT$#fw+ZojZ5DUat$K6iO+y*3UHsp6B6t z9=`7r$FZ54o4X1m4)8_b+rUX+58ytxsH0T^p8$Ub{^$Tcu%io72gI}QeJ(OU3@if6 jTmGDW-ui#9_P^@iz)9kRCH&>500000NkvXXu0mjf230r& literal 0 HcmV?d00001 diff --git a/sublime-text/Default/Ignored Packages.cache b/sublime-text/Default/Ignored Packages.cache new file mode 100644 index 0000000..27b92a5 --- /dev/null +++ b/sublime-text/Default/Ignored Packages.cache @@ -0,0 +1 @@ +["Vintage"] \ No newline at end of file diff --git a/sublime-text/Default/Indentation Rules - Comments.tmPreferences b/sublime-text/Default/Indentation Rules - Comments.tmPreferences new file mode 100644 index 0000000..8cb6749 --- /dev/null +++ b/sublime-text/Default/Indentation Rules - Comments.tmPreferences @@ -0,0 +1,13 @@ + + + + + scope + comment + settings + + preserveIndent + + + + diff --git a/sublime-text/Default/Indentation Rules - Comments.tmPreferences.cache b/sublime-text/Default/Indentation Rules - Comments.tmPreferences.cache new file mode 100644 index 0000000000000000000000000000000000000000..fa56901f17791ee2d5892bfe3fe84d2b15bd5dbc GIT binary patch literal 74 zcmV-Q0JZZ~y=R literal 0 HcmV?d00001 diff --git a/sublime-text/Default/Indentation Rules.tmPreferences b/sublime-text/Default/Indentation Rules.tmPreferences new file mode 100644 index 0000000..1688681 --- /dev/null +++ b/sublime-text/Default/Indentation Rules.tmPreferences @@ -0,0 +1,19 @@ + + + + + scope + source + settings + + decreaseIndentPattern + ^(.*\*/)?\s*\}[;\s]*$ + increaseIndentPattern + ^.*(\{[^}"']*)$ + disableIndentNextLinePattern + ^\s*\{[\]})]*\s*$ + indentParens + + + + diff --git a/sublime-text/Default/Indentation Rules.tmPreferences.cache b/sublime-text/Default/Indentation Rules.tmPreferences.cache new file mode 100644 index 0000000000000000000000000000000000000000..6b34a5172f44f83ef9f40c4385a4990755e96446 GIT binary patch literal 173 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 literal 0 HcmV?d00001 diff --git a/sublime-text/Default/Minimap.sublime-settings b/sublime-text/Default/Minimap.sublime-settings new file mode 100644 index 0000000..2e03071 --- /dev/null +++ b/sublime-text/Default/Minimap.sublime-settings @@ -0,0 +1,5 @@ +{ + "rulers": [], + "gutter": false, + "draw_indent_guides": false +} diff --git a/sublime-text/Default/Preferences (Linux).sublime-settings b/sublime-text/Default/Preferences (Linux).sublime-settings new file mode 100644 index 0000000..d6115ac --- /dev/null +++ b/sublime-text/Default/Preferences (Linux).sublime-settings @@ -0,0 +1,5 @@ +{ + "font_face": "Monospace", + "font_size": 12, + "mouse_wheel_switches_tabs": true +} diff --git a/sublime-text/Default/Preferences (OSX).sublime-settings b/sublime-text/Default/Preferences (OSX).sublime-settings new file mode 100644 index 0000000..5480b8a --- /dev/null +++ b/sublime-text/Default/Preferences (OSX).sublime-settings @@ -0,0 +1,9 @@ +{ + "font_face": "Menlo Regular", + "font_size": 12, + "scroll_past_end": false, + "find_selected_text": false, + "move_to_limit_on_up_down": true, + "close_windows_when_empty": true, + "show_full_path": false +} diff --git a/sublime-text/Default/Preferences (Windows).sublime-settings b/sublime-text/Default/Preferences (Windows).sublime-settings new file mode 100644 index 0000000..0eeb1f9 --- /dev/null +++ b/sublime-text/Default/Preferences (Windows).sublime-settings @@ -0,0 +1,4 @@ +{ + "font_face": "Consolas", + "font_size": 10 +} diff --git a/sublime-text/Default/Preferences.sublime-settings b/sublime-text/Default/Preferences.sublime-settings new file mode 100644 index 0000000..e815a95 --- /dev/null +++ b/sublime-text/Default/Preferences.sublime-settings @@ -0,0 +1,336 @@ +// While you can edit this file, it's best to put your changes in +// "User/Preferences.sublime-settings", which overrides the settings in here. +// +// Settings may also be placed in file type specific options files, for +// example, in Packages/Python/Python.sublime-settings for python files. +{ + // Sets the colors used within the text area + "color_scheme": "Packages/Color Scheme - Default/Monokai.tmTheme", + + // Note that the font_face and font_size are overriden in the platform + // specific settings file, for example, "Preferences (Linux).sublime-settings". + // Because of this, setting them here will have no effect: you must set them + // in your User File Preferences. + "font_face": "", + "font_size": 10, + + // Valid options are "no_bold", "no_italic", "no_antialias", "gray_antialias", + // "subpixel_antialias", "no_round" (OS X only) and "directwrite" (Windows only) + "font_options": [], + + // Characters that are considered to separate words + "word_separators": "./\\()\"'-:,.;<>~!@#$%^&*|+=[]{}`~?", + + // Set to false to prevent line numbers being drawn in the gutter + "line_numbers": true, + + // Set to false to hide the gutter altogether + "gutter": true, + + // Spacing between the gutter and the text + "margin": 4, + + // Fold buttons are the triangles shown in the gutter to fold regions of text + "fold_buttons": true, + + // Hides the fold buttons unless the mouse is over the gutter + "fade_fold_buttons": true, + + // Columns in which to display vertical rulers + "rulers": [], + + // Set to true to turn spell checking on by default + "spell_check": false, + + // The number of spaces a tab is considered equal to + "tab_size": 2, + + // Set to true to insert spaces when tab is pressed + "translate_tabs_to_spaces": true, + + // If translate_tabs_to_spaces is true, use_tab_stops will make tab and + // backspace insert/delete up to the next tabstop + "use_tab_stops": true, + + // Set to false to disable detection of tabs vs. spaces on load + "detect_indentation": true, + + // Calculates indentation automatically when pressing enter + "auto_indent": true, + + // Makes auto indent a little smarter, e.g., by indenting the next line + // after an if statement in C. Requires auto_indent to be enabled. + "smart_indent": true, + + // Adds whitespace up to the first open bracket when indenting. Requires + // auto_indent to be enabled. + "indent_to_bracket": false, + + // Trims white space added by auto_indent when moving the caret off the + // line. + "trim_automatic_white_space": true, + + // Disables horizontal scrolling if enabled. + // May be set to true, false, or "auto", where it will be disabled for + // source code, and otherwise enabled. + "word_wrap": "auto", + + // Set to a value other than 0 to force wrapping at that column rather than the + // window width + "wrap_width": 0, + + // Set to false to prevent word wrapped lines from being indented to the same + // level + "indent_subsequent_lines": true, + + // Draws text centered in the window rather than left aligned + "draw_centered": false, + + // Controls auto pairing of quotes, brackets etc + "auto_match_enabled": true, + + // Word list to use for spell checking + "dictionary": "Packages/Language - English/en_US.dic", + + // Set to true to draw a border around the visible rectangle on the minimap. + // The color of the border will be determined by the "minimapBorder" key in + // the color scheme + "draw_minimap_border": false, + + // If enabled, will highlight any line with a caret + "highlight_line": false, + + // Valid values are "smooth", "phase", "blink", "wide" and "solid". + "caret_style": "smooth", + + // Set to false to disable underlining the brackets surrounding the caret + "match_brackets": true, + + // Set to false if you'd rather only highlight the brackets when the caret is + // next to one + "match_brackets_content": true, + + // Set to false to not highlight square brackets. This only takes effect if + // match_brackets is true + "match_brackets_square": true, + + // Set to false to not highlight curly brackets. This only takes effect if + // match_brackets is true + "match_brackets_braces": true, + + // Set to false to not highlight angle brackets. This only takes effect if + // match_brackets is true + "match_brackets_angle": false, + + // Enable visualization of the matching tag in HTML and XML + "match_tags": true, + + // Highlights other occurrences of the currently selected text + "match_selection": true, + + // Additional spacing at the top of each line, in pixels + "line_padding_top": 0, + + // Additional spacing at the bottom of each line, in pixels + "line_padding_bottom": 0, + + // Set to false to disable scrolling past the end of the buffer. + // On OS X, this value is overridden in the platform specific settings, so + // you'll need to place this line in your user settings to override it. + "scroll_past_end": true, + + // This controls what happens when pressing up or down when on the first + // or last line. + // On OS X, this value is overridden in the platform specific settings, so + // you'll need to place this line in your user settings to override it. + "move_to_limit_on_up_down": false, + + // Set to "none" to turn off drawing white space, "selection" to draw only the + // white space within the selection, and "all" to draw all white space + "draw_white_space": "selection", + + // Set to false to turn off the indentation guides. + // The color and width of the indent guides may be customized by editing + // the corresponding .tmTheme file, and specifying the colors "guide", + // "activeGuide" and "stackGuide" + "draw_indent_guides": true, + + // Controls how the indent guides are drawn, valid options are + // "draw_normal" and "draw_active". draw_active will draw the indent + // guides containing the caret in a different color. + "indent_guide_options": ["draw_normal"], + + // Set to true to removing trailing white space on save + "trim_trailing_white_space_on_save": false, + + // Set to true to ensure the last line of the file ends in a newline + // character when saving + "ensure_newline_at_eof_on_save": false, + + // Set to true to automatically save files when switching to a different file + // or application + "save_on_focus_lost": false, + + // The encoding to use when the encoding can't be determined automatically. + // ASCII, UTF-8 and UTF-16 encodings will be automatically detected. + "fallback_encoding": "UTF-8", + + // Encoding used when saving new files, and files opened with an undefined + // encoding (e.g., plain ascii files). If a file is opened with a specific + // encoding (either detected or given explicitly), this setting will be + // ignored, and the file will be saved with the encoding it was opened + // with. + "default_encoding": "UTF-8", + + // Files containing null bytes are opened as hexadecimal by default + "enable_hexadecimal_encoding": true, + + // Determines what character(s) are used to terminate each line in new files. + // Valid values are 'system' (whatever the OS uses), 'windows' (CRLF) and + // 'unix' (LF only). + "default_line_ending": "unix", + + // When enabled, pressing tab will insert the best matching completion. + // When disabled, tab will only trigger snippets or insert a tab. + // Shift+tab can be used to insert an explicit tab when tab_completion is + // enabled. + "tab_completion": true, + + // Enable auto complete to be triggered automatically when typing. + "auto_complete": true, + + // The maximum file size where auto complete will be automatically triggered. + "auto_complete_size_limit": 4194304, + + // The delay, in ms, before the auto complete window is shown after typing + "auto_complete_delay": 50, + + // Controls what scopes auto complete will be triggered in + "auto_complete_selector": "source - comment", + + // Additional situations to trigger auto complete + "auto_complete_triggers": [ {"selector": "text.html", "characters": "<"} ], + + // By default, auto complete will commit the current completion on enter. + // This setting can be used to make it complete on tab instead. + // Completing on tab is generally a superior option, as it removes + // ambiguity between committing the completion and inserting a newline. + "auto_complete_commit_on_tab": false, + + // Controls if auto complete is shown when snippet fields are active. + // Only relevant if auto_complete_commit_on_tab is true. + "auto_complete_with_fields": false, + + // By default, shift+tab will only unindent if the selection spans + // multiple lines. When pressing shift+tab at other times, it'll insert a + // tab character - this allows tabs to be inserted when tab_completion is + // enabled. Set this to true to make shift+tab always unindent, instead of + // inserting tabs. + "shift_tab_unindent": false, + + // If true, the copy and cut commands will operate on the current line + // when the selection is empty, rather than doing nothing. + "copy_with_empty_selection": true, + + // If true, the selected text will be copied into the find panel when it's + // shown. + // On OS X, this value is overridden in the platform specific settings, so + // you'll need to place this line in your user settings to override it. + "find_selected_text": true, + + // When drag_text is enabled, clicking on selected text will begin a + // drag-drop operation + "drag_text": true, + + // + // User Interface Settings + // + + // The theme controls the look of Sublime Text's UI (buttons, tabs, scroll bars, etc) + "theme": "Default.sublime-theme", + + // Set to 0 to disable smooth scrolling. Set to a value between 0 and 1 to + // scroll slower, or set to larger than 1 to scroll faster + "scroll_speed": 1.0, + + // Controls side bar animation when expanding or collapsing folders + "tree_animation_enabled": true, + + // Makes tabs with modified files more visible + "highlight_modified_tabs": false, + + "show_tab_close_buttons": true, + + // Show folders in the side bar in bold + "bold_folder_labels": false, + + // OS X 10.7 only: Set to true to disable Lion style full screen support. + // Sublime Text must be restarted for this to take effect. + "use_simple_full_screen": false, + + // OS X only. Valid values are true, false, and "auto". Auto will enable + // the setting when running on a screen 2880 pixels or wider (i.e., a + // Retina display). When this setting is enabled, OpenGL is used to + // accelerate drawing. Sublime Text must be restarted for changes to take + // effect. + "gpu_window_buffer": "auto", + + // Valid values are "system", "enabled" and "disabled" + "overlay_scroll_bars": "system", + + // + // Application Behavior Settings + // + + // Exiting the application with hot_exit enabled will cause it to close + // immediately without prompting. Unsaved modifications and open files will + // be preserved and restored when next starting. + // + // Closing a window with an associated project will also close the window + // without prompting, preserving unsaved changes in the workspace file + // alongside the project. + "hot_exit": true, + + // remember_open_files makes the application start up with the last set of + // open files. Changing this to false will have no effect if hot_exit is + // true + "remember_open_files": true, + + // OS X only: When files are opened from finder, or by dragging onto the + // dock icon, this controls if a new window is created or not. + "open_files_in_new_window": true, + + // OS X only: This controls if an empty window is created at startup or not. + "create_window_at_startup": true, + + // Set to true to close windows as soon as the last file is closed, unless + // there's a folder open within the window. This is always enabled on OS X, + // changing it here won't modify the behavior. + "close_windows_when_empty": false, + + // Show the full path to files in the title bar. + // On OS X, this value is overridden in the platform specific settings, so + // you'll need to place this line in your user settings to override it. + "show_full_path": true, + + // Shows the Build Results panel when building. If set to false, the Build + // Results can be shown via the Tools/Build Results menu. + "show_panel_on_build": true, + + // Preview file contents when clicking on a file in the side bar. Double + // clicking or editing the preview will open the file and assign it a tab. + "preview_on_click": true, + + // folder_exclude_patterns and file_exclude_patterns control which files + // are listed in folders on the side bar. These can also be set on a per- + // project basis. + "folder_exclude_patterns": [".svn", ".git", ".hg", "CVS"], + "file_exclude_patterns": ["*.pyc", "*.pyo", "*.exe", "*.dll", "*.obj","*.o", "*.a", "*.lib", "*.so", "*.dylib", "*.ncb", "*.sdf", "*.suo", "*.pdb", "*.idb", ".DS_Store", "*.class", "*.psd", "*.db"], + // These files will still show up in the side bar, but won't be included in + // Goto Anything or Find in Files + "binary_file_patterns": ["*.jpg", "*.jpeg", "*.png", "*.gif", "*.ttf", "*.tga", "*.dds", "*.ico", "*.eot", "*.pdf", "*.swf", "*.jar", "*.zip"], + + // List any packages to ignore here. When removing entries from this list, + // a restart may be required if the package contains plugins. + "ignored_packages": ["Vintage"] +} diff --git a/sublime-text/Default/Regex Format Widget.sublime-settings b/sublime-text/Default/Regex Format Widget.sublime-settings new file mode 100644 index 0000000..e69de29 diff --git a/sublime-text/Default/Regex Widget.sublime-settings b/sublime-text/Default/Regex Widget.sublime-settings new file mode 100644 index 0000000..cf1b634 --- /dev/null +++ b/sublime-text/Default/Regex Widget.sublime-settings @@ -0,0 +1,3 @@ +{ + "syntax": "Packages/Regular Expressions/RegExp.tmLanguage" +} diff --git a/sublime-text/Default/Side Bar Mount Point.sublime-menu b/sublime-text/Default/Side Bar Mount Point.sublime-menu new file mode 100644 index 0000000..3411b67 --- /dev/null +++ b/sublime-text/Default/Side Bar Mount Point.sublime-menu @@ -0,0 +1,4 @@ +[ + { "caption": "-", "id": "folder_commands" }, + { "caption": "Remove Folder from Project", "command": "remove_folder", "args": { "dirs": []} } +] diff --git a/sublime-text/Default/Side Bar.sublime-menu b/sublime-text/Default/Side Bar.sublime-menu new file mode 100644 index 0000000..3d308b9 --- /dev/null +++ b/sublime-text/Default/Side Bar.sublime-menu @@ -0,0 +1,11 @@ +[ + { "caption": "New File", "command": "new_file_at", "args": {"dirs": []} }, + { "caption": "Rename…", "command": "rename_path", "args": {"paths": []} }, + { "caption": "Delete File", "command": "delete_file", "args": {"files": []} }, + { "caption": "Open Containing Folder…", "command": "open_containing_folder", "args": {"files": []} }, + { "caption": "-", "id": "folder_commands" }, + { "caption": "New Folder…", "command": "new_folder", "args": {"dirs": []} }, + { "caption": "Delete Folder", "command": "delete_folder", "args": {"dirs": []} }, + { "caption": "Find in Folder…", "command": "find_in_folder", "args": {"dirs": []} }, + { "caption": "-", "id": "end" } +] diff --git a/sublime-text/Default/Startup.cache b/sublime-text/Default/Startup.cache new file mode 100644 index 0000000000000000000000000000000000000000..8a82d702b6769ef3033586553477fedab53a831e GIT binary patch literal 119862 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

X@7FW@~)MO!JN9Y>)go+p79f2X$CJ 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%0DbCFD zc_p*zJowz}HDthRxGzLt8dU7F?$9}9iH5xH??y$QGB##gJ}KVdLogLM_|5~b2kE#0 zFMl?SbLnyOd`|^+pJQ@4l&SUtU&pRy!pQa`i8LH696_U6-FA~3iVKqVYExf)4V z*dYX5gqD8YwUbsiZ0%^1IZ^~Hti0nc$vdulq>|!;G$Hb)DH6FGvyWP|x}C&!fkGm6 zg`tzgBkoCxR+qTtB@@TI4AJV^A-^Dv8zqGiVo!LGNa-E%chXy3q8zaRgR~VzyjUFD z=AumXY#yV*4jE2~K*>pXl_Ta)=E(O$==0G9i7P|NLC5MdX=-GxdAS7{B6z8(Pr3yv z^a9lhCnKfx!Smq-abuImG*SCPeCfcB*e)6b&56L{aFA>*pKZ{L^M}jK72J&_jGA4 zzb_wzGfw?tT7U%-`GiE7%J%s<4XJrerMtv>v2Ee2^tvrhVLglHFAPKrAg6dhD1TdL z6xp4vO!fc^cZJ{vjqKRfWhz!&+%LV`1O(?RWq{Ek{0W%Ml`>Lwz;;x?K$Mx#v`ONQ z^OK{&u6T#tZgPtL)JExB^EmykmI)YXIIv^<6_gwu-+gi*QL#XDx})f1Ko4+*^& zMws%N6(omn5{d!Kz6WiPJbE#s-KlvPki80$)k-6Awur$X#10WOg|!e8O|{BV`ysgi z<07jv_yaPJa@id9kYp4Woi4@Q#Rhi=8m+m6^A=eg=$p#S_-Oj*cwD1qG@@_(SLwy& zq&htM?thhDk4IQ(+A335?Uhv)^2;~-tkHMuc@rV9@_)F3RA%jfdlIv8g}iCW)fkeeLab5d=; z%{jp!wa=VZ=)?yHnZRp~GLL-9sgxKHD-2_Nxx1orhElfOpa~TYr9|{BQhd?SnLmTY zCx;2_=twt?1z3=jdqED~K{A)S4byZcPS`x7JX-n0^j9WxbEo7IWiFO6nX-Clq%u!k zc}fuopuuNNQ>!1(A-0xU@knK2KBaJic-MuAcvT_mp)(Kd=2)yIb3@|OL}Fczz#MD@ zJ<7B$NNCPF4pAu9Vb>l23X&g6Ymg_$Fv;cq2r`tEN%IgF%`*f~stZQ*P^IFbLA@&M)S!6A*AVwe6RAX1v+rPFS0_wN z%I_!)9j7y(fFw@>m&y0B%26LZFkH(wStcn%5QaWkgD+Vo!0-2oF~B5}#Z?0;*RU+A zq!wFY%1+Xc?JZr=Zu%6wL}|=KS+_AF<~^FN_!#j=jfPPIn;4ClaB5l{V;4LuMH^`t z+6HBX&JTBDByFfTUCkI*1aa8nEZf?x!o^Z2aYeX!=OH@Y< zZ#`q9TLJlgvq>}Cdp#0!)WYHz7nOQQ#pW0jRg_bY8?p?JF;RQrpp$jENvOm#CNi^~ zVzZ2io7nMlt8{-vC^0%XzRh8erATx;s7#oi9m%pvpT82vq);%-UyWmuD;UPC2=W1I zn`8c&Cy#ko8Rn%X3FYxmAEz{xWU#hI<>Vv4}pB!VvECCfmvj#{ZQ$qe=N zZ8LYyP?m2w23^C}qOoOOkjq(2v#8f=B%{H=WhmqT9k`k*p&eQZCXf0-5vWXNxnuKq zmj+w+1=*)_BR5`asc#G=zVX{bD#k_1hhAauC<8Ib#>9!Jf~0Fljn>2bitJMNRnP)~ z+fAu3P>R_5Paw>W%LR?^x(VGn6Wt!2Zj!lVls1A<)`hvOMIA7;IPw`VbY5VVa^#7a zoKi)~FTqP&nJqCXPmd!7X`EbgTfrugD}TvD&(#Hq{!r(HErrEA&lVukXk-QCvht~W z#O230dSUepC;5g2!{!2&|06a7N<=3>I30+AN?v-{9S=gv z+s88249Bz_n_Ger55nn$+C?YgMAO!-x}4xD3P+{XSA>ji8l)N8Tb8$m;&H)6LNwV0 zA(f5hfb~hb7`%kM6gor7 zQ=E#Ht4Xt<&jne~0$l4tl0OtMu}xJIT_u=nVOv{?!w<@pp`4=*$~mT&#&RDZSC;ZI zn*nMr0Xr;iM9j&uqBF@`c z3^hQ6L2i)rv=KCe)QrhuY-QElUy@*Q3ywT1Qy~}4pGR|UVOR|MmX7$@=tZI<1>CV- zDM~mxbUM8TfNQ-jkE50*PBR)LpYL`YG^~)vK%)*AR>=Nn&Df6hR;K!6(TD!3bbmbJ zuwRMjg(OdHwWD;{3+BlEd77&_sN?WctB5+W9ps^#IBWF01&bdW`o_Wv)w-VJ(O6Fr+IF2S( z$X=Zb*nx+|0-_HREML(ZNI?};z5i@p-dFBQ9$c=A*+XtNM_GvjH*S)iYLiB^646`r z!bYC0c4!ztFmJxP46;ul^G8U^R9`IW=!i-4!5Olq>9DX(J?diUFpP%xsb$2RPccZ7 zTOGn??gz;nJ4BfD`)i08CUGllkCM=3jay6;)xNqazX{@_?ajorBt zy*5fS;x+m*b$-1O^D-JlJK4Q9RM*e=g=j%_tRD*|W+7T)Z~$RRx;+6^9{*M+C3#G5 zq=0jM1cvJaH)tIg?XVY8Ye7wsC}K=jwO)%yhXE}p$*-s( zW(x%Z=@J1BSHLBQQxP|&X%Y?ZM5K404I1tkl|wz_a={6V1EjN9N-Xsy ziq#iu3=vG@7n*!D*70El{l5Du#VunWkP#{ztoKbW1Pix_ERn}APa%rg z;Gq?Ld~9YUQWUCjyN4r)(n8wpnlgSC)hOm{Qe_^GVFZUizuF!4;5-v?d?lwSBfl4z zCu&AR$GC`+JFQqA1*P_cu3{yh2ry}^C4nsTm|4)u-{!^|*$)C3qzOw&7~NC=i89sw zk>p`tlU8eyNY-iMXq7>tzOMzLNs|B`9@opg`Y)E&B&#UN;}eZrlH^lsCT)zm1~+EV z>%sjuVpy_RJPTMz0J{Sa$di7)5KrndoD|vhD+mZP$Y)tmC(N;s#>Fp>j&uqiDRo6o z+W|R=0@kMFQuk##g#tcgMgfo}EEy=&#D4L&OdX>ZVNt<=0cpZq(z9z$lBiC%qhuW> z;VuRRNE7BQX?2HTLhPQIR0_Kvq&rmo%QsEXYvX#LCC6l}X_H!%i8_B3_hHFci=2hC zL`dx_y^8MFI6%A?*-`5&ML8EZ} zD$~(xk}xA( z><+BkZw6@$B)F2ww^l_R2M?}4@ujNCRG~)gS&ts35t?(jdZ0@Ei zH=HWuaS(^(-3^mS)ll5i>*PVmU1nDxv+iP;9lsQ2>xy=E%(9*3mb$ZMycjY5`S>Mf z8}hLZsx{>#%vLa5MoOW^q4=aw8w3=Ihofvfts~5p1^xtcC%v zBJD)&#Y%(xV~J|11Jy+9)P_N)lY|{=Y%56Ud2qd7)DD}YP6LhY0csP^k5tGKOdqLd5nIj3wyiAlg29XId_-*jiDG7g)&$&)U^6e+rdxx|HWxHO%PYrh--SdjK~*}r;|H-& z9eCt%$jG>?@BA(*tf)>ef0bAyxo|S#9-K)5*`=UZbyBy; zOeavj(1aXn=YH52}MoHlDROlC1~T2g$lh}%7^(7A6Mr1&_MJ@4g|8c|+< zWjh=Uc-Q;@Z&}JGf*YxP$auDIR{+6-GlygEHtq{9833?N+@mQ`(a69k6K*&dFB>pc zGJrX~JgC-V_CwoqT_&qDr|dk5+)NyeGPQ2rL}u|{Ci)5krKoct?d3oVgnDdptFcc0jS_ir^0qP422RS!(Mu8$j3q;sscPBtgU) zI_x)lb54h0JQ7x;Fh^}LMPP=GFtATALK9WAZsD`ESvUc(`*tP(>(E`R>mAtHq#aUzKL;!Q!D#zwo|+8E zJ_x5vv$!!7Lw`K52Voa)(daP)4tFU9lZw?bF(ElvCsjy3*J*Q13ST#>mY94;3Mo`O zPL#RE!j@t5y(*!^IcXv797Wv2sT|*=s^r$aKJy4}Wv4=myQ;Py>9c8K5#ptPB$Dk@ zJrvJapJrVyqFp1(M%I0YM znBl8tSe;!`JW!O^v^a$KEg%`Tx=u-%2~Eezm9?XkdUT88VN}(W7(xge zx=stS%ty&|ySCVn#a6=Z29%}w;h|tK!96hf4w2KfBP|U2`Fs|%Tl##3boHyhmaUMJ zf%wZqb>1=RO3h@n%T7~$R8pHm7K5z|esd5+cFQVJJu_xk>n!{F zKsaj~kF&!%`+Rm7N|!ABL*&_{VoQ?0^>G1VI)?mznDPlFRm>u!4B>axz}NzW~tKajgt(uflC_iH`9NQ|yWi_Kx`BO# zt)SpnwcFgvXgcVN*=^7YdyRf9EMMF4WOHBx&dm&9P!yLE>L^Q2$RT+Er2=BQ^e~tQ zg=TYAa;r`&=o6vgP=ys(hSzxN_2=gYTvU$A0J$F1;|C~*i$&rbVTEj;G>2OY&J(8v0%V292kO|JF#kf`_}%z9+xUu_^b!9u zwN&b=fLxcZa%nhXIbue;oIGxwCh?GMD2g~HBpE2dAUQi4xshj(oWhQf&=!N)NIfvA zz|a=Mc$hMjiwjdSjE9L)PnkASVi^yY4nJ*kjE72Gu&I!}@nq~^d4ifjEEvYa>=7ng znLHjIwQjD`$3x^t8Wib%bh(43kbiWO3K+(Y~Er#+O>q2#e zfwmZY+Y%oPx=J4hkzeXm9uu!cbK5}^n?GEf=rYyWo*d?rU$6z_l^#vrSkK90ExV)? zZ>s0yu~tQ{mN#CbNeCp)tyx0Jd8IQqhbaNyHi zWD{1-Sc9!5`KpOa(N`D4dlNpZf6$aA!5|H2 zmm$UE$Prwy2j?~NzE5$bZ~$b`?Vq)xu|iVGgg;H=PM)$GO3B{ezVXRg#S zbLmq_K&?|SYWAZ{KD}Mj9Bj^cwFfMMI@>_5lY>MW9tkr6Re9KK0nxcARbcGYp88Mi z_~otuNI4)s%^PG+qdNq|bQn)tz#`3Kl}H9EpDsd_yQM{C*!z8u=qa08(Uw)RpS;~; zAkkBn7WR>*W)0848bD@lwHqXFBNTh%Ma4%^ifB=>Qv3=<)f4+GmA<6G}Q$i#M2#)kPy4tDvc>6$zyq2va9cZQ8zZqZ6F=a2F&4+66<~I+|kT zPg)1iQhc(=uanDUON%?y;dCz!GU7_NPS+LAixa!U`O7lOGSnFf6X!NvFD88Ekf<`@ zST>M$d2W_F+I&B@#|n`q#b#B;*$H>h4~U06RkDN_BWA)h>G+%AwKK68oe7dQK6cxZ zmnLmkiv^X`Y>n7rOc&=E%UbmDarKTg+eTrFIqN1PON}OYEJI{)V|(3)$#!Ff6@9?E zLd3vKt;R5!0CT;&2vT;ZhD6SbP2J0#&hO%uG&^6cUzb2+lx^|T*HqC8iiGS7Qa4|% z=tq|3LVj3CqGr^NAY#UnU6K8DWwO)(Q6uupImV;ROXaBw$AOBp6%6cpm8s)aD|zZM zKk8T>%v`}!UrU~(WJG1vRReF6jIdFF{^~9+ zA+C2Q(*4mv0GjC|igbT;69LVC>iyVR1Umn*V|;5RC-r(sw}2*0-VR0AvQ1!>&W-u$ zE*BtOI`?DI3}?uRS|s~-ot-1%5~)h(EO0Lirr#MXD9iv~ z+V>lTGc|Ti(q~3YNtitMsdJi2{iZ38%}bCZBIW4xNh_B0+^Y2XOi*dc-(oJ4eaygg zE+yT=1Qq>LKV5 zcR9fqz?wY@N*zR-ybq|7>x9EN8Y(MKNXi4{jpiJA8qvk;97X0VDLwc#YEynH5mL+@iiVdaG7Tu><-KdHP|N4*x0%Q zwTR;%EThz7cJ^yNfkS_?#5J7be65Hc3 z;AIFmKm+>#R+V1cg9Q6@huYpXNC@Kc%SdK6KQbdVf{lKdbz}P;v&DeLEK{6KOpA&9 zJ3xUt2I2@_PtVAJNL9K=$+ttHHPKZ?SV08OIIxj`O5iNH8@XWf0+$a%g6)uI0dcyG zWOCHL=G7*s6EJ5QBd1&gFzFs}MGQg61c_K-QM+XD+;LsQ!doUJs3J)){?NSS%=$gN zDvK9i>F63fr=yahL8~`vL%<^Y;8d0FQI?9mEzJn>tIHf7kQmspr~(qzVsdbxSy=K~*R0R%=RKR+k>oXV1ZdKqem?Lh_^v*voY zxFfHX%i)ooDNMSfYT(VEC~-BPGKUi?jYml2nUwu7E|?cA9rg3qpvv!;Y)3}b zb-G7(=EyVQ1;qzq$mC$?mxB=_KJpPKE=6IgVNg4YZka~(pB`Z;^aqjg9$!ot3 zrjorOTD_!c?;#eH5|AszixlZwN264-e|}=?JcLTFEzovk8y1-Cs6at&>}13mJH4|l zx$O}zr{Gwpw+(B6Se&t7!dW7=yh-y0n`VHfHHfQLIxVt|ie&G?6};4-mQ%cex{1&fZz$?1DV^>yu}Mzq?0Z3xDB@2Kpj{y`jpP*XZ#q9{#ZBuGzJgK$8ajY_VJ932 zyPJa2G;c7<+Qek<2HYQ!ir4BFo6j2 zjdbTIpzEg0QJbS-JR~oOnKTa&>nw^&mZC;X>2TK7OoRYAb3i(UghwhwD{^5bakIfz zT|uq=NU&Aui47@^2?`FAA45q>LaFj)963iWK*Dl zwrJCx^w2G!Urr+Kq8Uci2rFyUH3n9Mq~W zSnAc+XoIHjQl;qg)6?pOK~j{Ny^OS z0tj0pNcvngX)28`NpQ=*c%lY<4*Er@Hz(8*Z z5oPmn3{rw@l(1hC54-TtEL_VZ4s2J*cy26$?LH1K34}x+;`xw|@m1++Z*EQ)$gLgq zCxCNtIH)>|?HQ^(PXDInessgSXnA$WubTuph*w>WAGeEua~ z_X+dBXB>{ zTm~KuJZslrByuoLbtbWB32`*g=S%Tv1717LkC~9^lW2?`qXEf2nLb??)brbQ{HDgj z5(;|bR&#;w>_jCts*%ZHolb4-5Vp5foKcT&=lP}nB#tx1Llr<^Tob~}lwL)ml**t) z#5G%z$;!?c3L0wH-%F8ZX1?DMVGH355xl(s*Dc7Smu~j4KDdgKgm9E|SJ;42pSslO zDK>E?*mhoFVkRo%Hf1|3hJ3L^@XkRxUfHM4vR7+SP4~|PKdxGA6PGnVlvcUMQla{R z9vj$>YV)Dn*^J+01~snhKoz_s6w6Ge{gSMv_ObQQuX5B1*k3G@ofkhSOm>{M`RWT9 zM`YJ+%-D(z z+5CZwu%SaC)@8vhtyb&?ld5%}c#>sRJ{3&V?0wV7WO;gzDOGNxO4N{SMgcS5FY+B_ zN*ZdrUzOWCKUhHU``EGb)^2-MS(V$$TakxS-Fca8WhM1?CC_hVYkZTs3~ns4o5XGF zT8S~cIYOw%O#JJmB*0XSzxs6SZ%(;yR+W&GymFCsgBh=nHyC}UiQQz_GL4Osp$CDljdk z;^u$Nm4n?K;^hKNt<&5g-W|YHEvXg;u0WM2z~GDrB&-3t4i%xk4yd?}m|8ANb#uaD zB<|+oniiD0;-zATVk+mY+f79e#niD1G6`oQ;^?zVugf;tZ40Xmo=f1n1}vMf3(ewr@AEgCRp2t}1#R9U0p3 zVZh!1R;zdlibpO)j)&GHk`p{U<&u{gy>deJqiV)7B{#5-ixm{#e0BSQH7e!=varz( z+7WWrNG{EPb53PH+)D{{t{^8A&<=#rkhq7aILY{qT6eO8(3W)Mn-n{^$$ri7@LgiPloNc)msxU} zG_PuwuZr-Us~}^;6+i0HoE@yp;%dprSuR`$WSLP-#qiU^VGQ0W|B}3ixb29r3 zaD=QpB~X!S%=3(`nbp=S9V8}<#xoZAxvTg(-FQo z7jsOh1-XLj48JTzlMusdlen7bs&X~LGxCzA`YuHJQ~9cyM@!}b?MdhO)Y?qG!c>$k z7m%fdf;nUYEc2Y^*ZFIq;+$}NlWBkemZJO8vopgxnWoWT99;#sr?xa4wDTFa9i^hX zN7P{eC$ra@-2z}u0gKDkMI z+D!>|^fTys*|ca01rAL@)D>fS)%r$fxgHfQlqv$6PgLw<|yNb&Y8yQZq#ch_8yr*(q7d; z>97l`->{}0T713(T~H@hKZhub92f0hN=hB*SUj97PTC znAV{}ndmAvh^~#TEI+%MMFR{f${Uz7jWzNSFt+KLWT*NpR_}>9RK=}Tb1Mg}u6@d{ zOr;eClICh31_a#(%M9~SGwQ<}vNG>)w5}=_HmsROTai3etP)nzHo~P~vrGWK8WCOK zie&=utzqVYUvOC}usW2Wk3u4RW0mgz9qm!SZ~NL*dUX)aN8o=TrtWNhH9wql_Db?gO$s2235{7vN5P&7Rf8CrCX4r|Tepe7Don{IIdK4+q z=cS~*k$9iEM4Sh_oN!mi_7RK<`MyxW7L>^`Uqzy!)O?QOxQ`UMKdNAwhq}$&yqnYJ z4Zdpb402n`W}#K##*`Y~g4sqlVk6BGn0$p zT|KAE(B90*sfhDvbP9p}s)9bL5(rBh_F(oUG!(?@91VAG@_8CViK{=Cp|R|kw?)3U z$T!>QZ$jFRRA&p?jvVyuBX^KEPB&K%V3emV4RH&$qYU=Y93NKU@LymKc^{!Bjprmh zJsO6NjGE+0r^GG7z9FC?xo(?z2CgW<#Fo$)29>d@c;GA`5k<0xA9VYmM=y|(FlkXe zqf5k-a>7l^kyY^~jnBQB2ii@;o^ZV;tx$V$lZv%drb?~ykCIBq z7N;TK5|)nrtdGTD>8J;$c7Ce#31E|uIQnNXxGNI)#JbEHQYz#kckFm+NDzlc%T%VG zdLcJz8RB$AOp75Opc_P#&|c_W%G9=4h3rt}U1ZeFzY2MtY8PC@e*jx0QU+6cErM6VSa#ht5fL=rgMhlW<79I8!2eezBu(W4Cq*i&_$Wh{=Z{)~-wBO2k;1w7KUm z6l{!fXBef5>dv-e;>{zI!wIE*i)@QA82FO#7#Z@gVp$fntbhO%Pu1nrZU&9Y9t0$L z4GtQ)9oB0{9_nM=8Zw`W%wj9%F`c457t`Ql7dsV0JlN?z(+(67kJ`E(RZ;BlG&h3; zBxh5a2_p4vG(tf)zS;SG0>knm%R~tvrY&`oN_)aaSt(_yHy*_EOmu zroq|S=*5E$c{_w*!)5|$8`xpGB$;;OB=gWv@QtBD*v?5v8QB%OHniE7C&~g;lna}q zZZ%sHa1}toQRLHMZYn9_x~@U;xqzbCcfr*=`+`e_?2D*k)-l;DsJ?h9|E($Yt=I+l zOUe;-tv>R5OgL%}U>`L|TaopYrb)xQH8HHo+(@HAM2^lSDmPgvrfm9nPF|2avNAne zvq4a0@LLuMDR4~+a}!*y)cZFCi-dN>Hj^TASs0|df&}Ib64PYxL8RTIn!uGm(3$m9 zL2?QY=j8X(;);mwa%VB4ub+o1$kmxwmWy%Vp16vr!$G(pCK)*VG<9+go=wpu#5){mCd6{sy`t3!?;$K6FnNNX31)@Bl7!a8tsas_t)b{*^SkfIRi)q$LosT`{lna;JdM1e4{4kbC+ ztBhqpR|i@_AFsJ~262Kr%#EN)otdaIaHCd~%2P?`Jho6uRAu<(&%VLVewaVUtliH; zbp}+PJA|LdO4o4Vc3Qq7fl!5b=J+^#lTK;izE)%dCe?P72*%b(l$kvc5^FAbQT=G8dZ^@oETlhLF#bJYc+`5oNK6(XY*5KRA=k@ zj>Dz4EcN&p%~doEFKn#-8fav?k7`hD4#?LtTzYe+(w+j}#iLYvJox@oVj#bV2bT{J z4IwB+mPLaOS!Pw9@tUBJ>_zytl4!;;d)88Gs_TMPp7C;n0fORWt})#UI_zAa^td}_ zdS7--9MZx;CmMtW=4?rhrG8z#0`tqhoBHC;PyyF0M zSyt{AQ89`bHh&dCZ`g(Bhz8{Tk;P#YjXnY?2rjczLWqS<(2D}QW0j~DcsKyX&Z-m( z9~v}iS#Ygcef3S>beoCV`FPO{p<6362w&qxD@c5x{B=BBnd1)&fg*D0qX|}irsLc~ zn^hT_Q<-V0e0XUjj)WJa`$sD?%D4v zSPb`Nu`0-#f;GABuc9S_C6|bn-e}Mc^r{MmyT2YQyafLs0u6 zo}7T2&uP|(`ud<{($aq{l@vYu!*6W?0Mo3tfyD1Q?FkaUXOtBLzu9HI*53~kJKA%Z zdcS88exI;n*s3i>nVk-C)7a+t-;-%EvIPBM&yMA3a~PQ}+8yRQ$Zw^On|0vPS%=>` z>%}K6KE|)DhXY}IzS{!`z-D3Nm^&~OEtgjMArL?Hpc{?dHyh@*UM#=36O`(LcGK=0WSSM z5y^yI&2fFVEX2A~$}AJ)dA4bV0=79O!5!A(4#&mKk`bB@4&=MhHbN}=(P?E(>a52zhh{;gfP?1e#!bdj|*54r6engpE=U)bI zBen(_J146n!2BktW|!@Z1(Q@itgP9L>7^@@a6+Gg`H&S`WaOgW3qJ2S@^VdOaj=#FWW(mlQNNysb0C*j^%i#?9>mM8rfEe5zV4RcP z{T7+`1V6{;nBkZlvJyD0D5$V-tU%-x>-Y{A&$^~%>1#FQ@stjyGeX0%26os+D5<2b z{(OnmecgxjZ*bK~b?)P4Z1?X!;F`Jj;TJQ||0?el$~NmCY^}~Cd1Pyc61Bbob-Kc{ zN*NVPE$y#3G&P^Ab?sh%R+d^BC7EF&jz}F1z)V&h^%zW_ulT5{=r+Azi4W{{$ zn-#)AwOiLb4edgo)$j$<%5RaJ3gT5OA4`cdouaU^<*jE0lNbIFgn3N5uoa**a{|MH zf1rALL|b0V#^Hsw5thQ09B25gqcJN;x>PL5kaMS|fwLXlacfW1yk6Mh++ZI#eN&9= zKwz-{0~0vSxMce#usc2EQKPzmkd&+AULwMH%tL9i$y9 z%scA2a0hTnUalFRN0tEQisYQlhx1yDSuT3q)dbD0C7c8~B+(>M^=&2ZFOjL=f+BRXNNPanUG)elq+|pVk0(Q4 zNv69Igi5-R_I26@@+gGEj+CKsarg}9oLg$uC>F`p!kjL)KXB*=HdoC_zcnA@@2WzY z2RoaMxD%R+yi41a+6sct3~N)X&PgzTCVeU9=QgGf&4wt$udxceuovl|9K5Fz@6}Z| zbf1dQI|gprQ*gPZ4is>2bK*=gUqI_>hv&8*ozoW> zE(;WpOZOhiw?rrio1T2%s0rZ;B(Dz8k5s2b;Js6>w+Tg#^a%Ry6ZRyW2SHk_Xm+I{ zG%zs+gvp^z?ss4lgYt&sVMlU6d(>zf`ed^YA0Z_jCnzV0r}PL}f7 z3FZra=(~F-*0hD6Lo6k82vp|YNt@9ThOAIt4)O&)W-(}?+=*BqS7NAQZo#XhXy$;M zg^g}N2o>ezI7v@OVrXkJ(z-1Ac(1qKz@rVxj?j_e1>8W78=e0KLt6s>uH>U}Q?(J^ zQ_c5xO|`Z`SbwwNJ2l89=i!f+-L_tSkt{h6FEZh@JmZo%!V8YSPqg<>3*ex#`*=QA zV)Uk-jFtYZsjl`;;O8Gxr;IqhS%GgKWi6;~MNNU9Yt`^iJ+<;d%VAE!_7SIGsK_@N z?RQOJJS&^Q)OuZ}31cE=&?*$`hDPPo8Ql%l#0V7Ox#fXD$qnn6ZjxC5>-V6I35jG{ ziQ`Td2<$74CUBvQ19U1w3BouGwnV6({m>d;)InBee!Iz)CREIo?43#osCvf*f z9_t`v_VV(NFjn$Z&+sshUIl1z5twJK=pHhbILb=CrjWM$sdN<|LxPV?AQ_>#Ct z?#Uh0Ksf@A@N!1|+CtwBSK@9#D&q5EjT6s5`UIpq`dHvS{A#iRL%FQO2)#qkG`CGh zdOaeg-l0h~^h|QJ#5**Qo|R&O$M^*=$%#a9Z5@;?DR$SpfZWjv9)Dwj^2l*ce?z#K zkM;W-!g4}6@4o>Wk0Ro`Ss0Rb{Oe&4a2jXG;4zh9_9W6;IgLvv?Xw#S?g6b3E;NMj ziJ9ka9tYC-B`FnWO=iIWIkw@nT`ujcY>Ln9Rh8M=ih2nt7NDaqvyy75H~9AN3k}pJq~4z=@h`Y>8gJ=f>S~Wq#q@7k|b{^lC38} z2(z7>;Wbhv)Sa>w>aM5GD}``z9y}ACmGoEJ#<`%=XLyw=35%bxXs0T(o-wUWd#BD5 zSitbCjb4bu+6XrU^;3~zjZtCrHWEdx0Y`o6M|NQf{A(u+>Km5TesbXRkET}>FEK_7 zGbLQSiJ*|*OLZE@w5;%RKCrTm=_$bu;j*2Wf^(M+i2ADzn>*UAB*%@80|MNrX6N8c z0(P)48W-yF34ShSP=f}|0e~qFcE?c3^&{aq(tOVsC%oCj#K1!NI8Ynq`fG{)wY?J7 zkwf^R1PhD^2cHWwpX_+>Gp}|a&P?gA`Ft9v%{}~_&nY$6Y3D9ovvEkCf?1wf{6!g& z0E`Ew?O3QV>yigz{;C`90xS*8&9uV?9;+zyd|$K)-9}x#(5N z#b1h)BeR`w#28ao1OfWkNV83FlU7Z9n4T`c3yU5OOfZ$mLI;>yfl6a+b)u#vi#I9Z z^se~MJ6zo9(@{7;(Kaxj>>-V95Ra}~f@a)^ZZ$wd`V1dDYDn4*u|NsyZ}oF+4#vJV zt)6S+g_W3{70g(vR5)Tf%!p;k|M@R}so(x~`7dHo#Dg@+Z(HBh!@1_>_y7EtzpBu; ze&`oJEOP&>1*w=JQXH*q=#qm>_B)aYC8;B>RQ@H2h(mBE9!k}oTr;Kl<;Ppg_87m7 zU6MHX#`H`uFCiZlZ~!Jn{qojL;Jg10JM6@Jp0mE<7vHZI99mg!W6w6hMKvb+%!CJF zTo$%J)1vfA2@kTi6T9xCW%+~p5uEE>w(}dgPVWHRM2Fr`qF`R!^|4$}q$@R9=^XM{ zrF*K+_it5mgF~|w99V6-DK)uhDLg8Po`K9lnT5)Z;u>0f^(?16l9H55+VCh+PFpPX zxHi&(VF3Ev64#|CTt|3NDG#g!O=I6R!~>+M#35EWQv;Dlb2K24;_qZiQvkDA)$^^l z%2r#NJ(V+OY3|)%A1jGF@}u+^%yn2IJRoeu6~-9(N|5 zYkWz@3H(ZN!NmuT>Z~T1zyA8|&tR{w-#;a!5uP1cb%6SuvkPG=22fgXFxDn1|2XC2bHpgr{aj4rS?mR_&i8F__)G7{&}ydem)4 zj#f|7K;4nUbg%m4uF4mh)4?{&%zOaGF|4N&yY5OWSD#50kxagJ>F%H~c}T892+B47 zQPmnL=N7i~hjcZOl8Lwc#j_?zz#rC$aqrkgVG8u-y)6&ALkLAaw#@W_XSzBf^zrJX zzR$xys)_(5+ET1Wgaw5t;BLyS{MLZu)Z+-BNQ58A+<4R~iUxH&fe`s)qeERSbbz25 zoE=qeyhiuZk{)Ghvqq4?KEx0Lu5;?q&&NJY&)iOw-`*JiD1B~^#dOdGpn{}c#r*gmaXHZUV47o<h)ye`Upo~PW-(zq#zbT93WP35Gcqw z{oeALuAPNwQHihLKf(F|tRs+Y9$vPXgK%KM}z`{iz^ex^@d6@o=JaD;usF7-}QSIlonDhRw(Uo+_{Be2kdMa2Bn(pu@iwjBbu1{ z-P)AR10Tp*voi{TC~60mL{ba4!dfRIwO(3-K|?$%_V$CsR@ z)0^soSallxSe@hju8axo_a;3iPl!BFwu*!H9qB=ZiGm}otRC2=r7Ms{vgNJMH8VA5 z$Iv8&*V*~wdP;uDWo|6-K;GW#R|vp(jfwGC!O}L|Afts4`Y89H#F`Mu7O->1lUuDPJmcpf7uF z=kD^h+wTN@BypJBRCJEnz~!{{wQICTM!5IC4b(~jCBrNlQ2v+S=Xx1JXp~C%jAsNAV~YF+C;O01(TL3D{1OG zI-#|<6PBysV4CM5Zwh6^DgC+5mSlXnjeUDG8d0EkM+Q!I$eKYSR8zvM55H#1)k=|N zs(#83XV6@v_d7xKv9z&IXb7UmHIbLO2@xv)gcUA=p`Z%xazzG)3mf@W)~k?&J(iI- zr<={MtWsQlXYO(^Vz^eRZ)U2F(d44)IL(hQ?y1tO_HD!aCX_!DS}NNer{ihOUdmAu z>{R-7-}~aT@AZ7DaNm%eszo@j-ipyX=81qv)bw4ekBf4{9U&wWq6I=9r6feMgIW}V zSf5Bmib&7xX=4(sAzaFazhoM-RX0yP*QJnRx!qS2Y`aewor>BjB8AGBwKoj7u*)qx zlTu>Yt1e3?v8~VGfoz1;sDo}a-`lmO?TuJM%mT_$(~cCy1}i4*8Z4EFPjE{|L@hG5)QfdNsTVn5N!4^W8=PuJJObt7DmdXNyfTlQg)s$`)+zNKQ~ zD|CfG4RE1=-M-QiuDZdQ1zv?)%p}+ywvRLIS$-e_LgBR-C8^)?p)QKhQiY?Ls{ie) zRNSEeUtB1+-?X4gERo^q^dyYj$@8#x?C2?$sV94D{r!QiM&S+F@(_sZ8GW-tB1i4sA#z^$$Q~DazqQ>#q6Fl>d>`Wmt41raV(DR_e}K9t^Su`Gw6q9R@-oy zrI3%)GBoBb3UEQW-tG%+8Hv(pJ+KC27*-!Dtsu8EN_N3R{M~a2xsf`=tg^U-+KL_G zhLS4E`d#o4|Dw9oabA^OYonJAIN1=z8o`~tEFri8QHC?|DBk<=k}xqpuP=Ac%VRKRREopjM95!Wju`>4lIM^c=5 z=n3oITw>D#GLaJ5`j&RfM~D>FWD~%S_4(??2f$-)HdBtN%@idk{-Db8F;WinfcoMA zla>DvrP8P-2g383+4dQe9ME@M%Qz9M9f?Ggapu;rOWb}j$*hLi`3H`NRrcaipfESU z$6`lHb!2B(G;2NGM&i<~1#)HBuD9{byb2e9m`VO? zCkB>Em%Iw*Zhyfa1tke$%u2})<#sr!D_gkMP4tm09OlPTg3z*9|1@Nin<2kGI+8 zH>8t|0K^XT#yb4h!b`h0+o@~Z+YTgUB844Q<~;}-lzc)t0I?avUpcCmi*+GF9VI2D z@N{7N+_LvQAlRnwfWqsOL{AY5XiD`VL#X1x9ePb9u;lS?j`oRo1y6spTUIxz!ab3d z|4FL(s)v08=PLKqFO833eb;~56csbhhwwX~D~DMLjkg zfY`@0-nC{`f&RhT7T}?<=ASItnc6GStOGPrq`&^nxZ$@xEj-;{3w6`8sQ^uM-_(d_ zbdFvOzJ@XQRvLplv54STOAmtFItS**gRw|WAU(+yx) z$a`!a%SXT^+dkgPbL{K z=EBc^2~uJ{nv?_y`}C*6l#%m8A57AwlJ=K&X@W*>(&du+E}CM!X#8VnR7vljlF9Y;h1mM$H`~W$H^X)nrQ`SZnEWs=_~mmjHWGq z$`LYeM8&wKlq@|b500edoZLl9Q+*-avIgKDJuDT`ZWOut`1-6x6#j*xakI0pph;d4^V)_kwGe%^RI({tA98@D8+psH5(a045Nq_f3D!We$S z14udyy@25mDMGB3vtwd#JXUv3ccTJSrvu7GKT#kKM=qGisVD^kJsVz#C#OTy&t0rK zD$gr<0ZtQ~n2YK@7$n)yi}%zqFu75%Lt?7uapFqCV8_aVo}4%&Yx5{U?LUDVNkhD_ zu49Nx*Affv5q^jfcd!IX6gb4Gs*^yd&{8%?O{IMb(0n_d)@cOC%SH8=c_q}PfdGB4 z0=9zh@OxFTEq{mKt73&4+ky^_zgr2lV-~{iRFSDtSfg?zVwHg!lOvF;M6TP@LYeZw z;>ePS`K_~CqTpX4jPb%|uMdTtPjmrUP>Pb4(UBK85T}MKool&4LUXLNlYW5_iIlGLGWNX}-j}zql(sjB$O~x(;mHD{;LrkvPUm_ZYmrn`h+P)w|8xoaxEi zo+6`U7(HMaxggqy7Wi5bXq`-1AK+eFGpkcHb1ape3F|;xXB`(Xth<0FRAWLdjJyzp zynNyiO!6cTZ6JK_2AtBX$^*{G33o$`oLQg6A6XqHy9%_#lI42L^Q?Sr^8^m`xRObF z+$NQc(!?q)VB<}}B3n=}29H>Sl0BC*=+MT|c_{O%Tyd+Uj2d4A4>1+f9Mc!NaC>(;4=NS1SnObKNODQkC!}r{^7`^78_^;B$SO86oM`LB2M^7?Y(Tmr3DCo<;~1J*;r79UxlDV}-XXE% z=>_r~k^_rAkW&#nIX&RFoC~D4+=M0;C>Uq_AmoH57C6R9&pcv*W1MKQGaXhSa*UUm z(IgVbSg9FJ2p97S8wRn!V{-+MgFTt8h9jpU;EyPl}AD^RL27ES3}L; zBK$o{gehGtP+Dhmj?^ikoXO+Dz){BxtrHP@ZGDMv9@jC$w##JcoO^1C&l3^}d6t5p z3-}}Mm`>QiA_==^5ukYrX08hJMwBkjY1#*$jyVigrWZGIP%e zFKuh=+%rH++1R;ffQlJ6u{O|@GyVl@vvAt_hEvnJ$R?RA@2%a3}WQmT9I55#n14_;s>>55_9+^ z9uq9v<#lCm@fcBNJ1#(F3i>%750it758I?7GMV@;O)9eIdEt^qC%#ORNXU_8-lp+E z9YOJN8Y7*3oraMstabeRG!b6NmwBOv5|Z!sp{p$~} zvND-7)GM4^T8JLigLKmM0xD0#P?QC4Hr2T<@Q`RaCI+A}zDsxp;xbkufIF`C`cw&R zj&&!^l4WA}Nc?0*OSrbL+|&_#i^4IU>F1ny+fFQ%!b)kLu8BG1 zV=j$?2O(cx$Tb5WVkDom3Q;sR+KXFT=&m>W0>U~@)+N-quH)TwyesU5&V#$mubq&) z-@p7g1^BN&P7cpS7nCR)a%hvwRFsUlUpTNXiEN;z9<0%$TOCIp%N16F=A@=`$#y}A zmQul3#4-U`Of;{f$}FA>@gsEY$QFymOX(nYt+Owd(-*=a4ZhfVYU=3K*3crALi=(8 zrdoBm>I(mega+4q&)w3Ux}HC=WJ9Up0cJZ_(nTgIRG8-wX1TR}pJm>q%Bj1d1(#_8 zt&zYrNBG&T!A0JNckj8g^m6au1d6)`6{3D)-h85DH1WOb`%XJDJLiTi6_z*FG+3O+ zeY>_jJ5F1?obDyP;vb@#O8t9gmz$mZh-Np-XYj(vwaqP=|M}Pf8W<%dD!|=ZwSL?q zN1C3R@}Sa~&BP^%06an@rqK!%5?;EVSiB6;QmUSC>=}T?MB8%f2G(A)cp=@DT2l{6Uk&X0 zT6>5kGppJq3QG+Fq&|d0^avF@7$JIqN*F&4tjWs8%3F7C<-u~7C>||ueV4is4#2%H zUEMQBxfyvk@a++>!Yrf?!28$%8hM(qOT61E)l^_>in>5xw@S^TntlH{yJpZ0i|txw=)P4t>VqFzq%!urJ36{*M({t{jThD&35>K(9wyE4t%c{ zw$3>L%{;U(@VE64*`M{VoQl*bl8;3hlqZwNzg@x`|Bzfi%x8;0|Hw_-@6Y10yn)Fg zZpx^ouE-N1Ral3_*=qEhTfN^U7)1pNvMKqPbmX)=o(A;?&#eByKBqrdZ+rc(EWK(O z=KELuceWxwi)#o5KGrs##W|3H4^oP@p@GT#c8l4iWh>c>h#rjkvmEv3kBjt(2?^vS9KJUR$KeHHsuCs4k2q=E?M2BLU^Z+x+Pe9Gi5h^k<0AxhF> zHrp1Ot2_gr6{S{2;6Scsh<@PHmrF79vCr(qiM4c~PdEco?^JZZGiQ2}|tB z7-IX9({%5K{dO??QVrI$)5XKS>0cK6u71_87W+m20xT2NTr~eLh~l=gOQL|4PI5Di z^H|dq8fJO3%;deF_1RM{b365L1WFvX0-Tc7k>85)!$@m|7C*|VvS}S>wro6+qs+o4vw;sX zvJC;S;)T2AHfGGhU7~o5So$Y@K!~L@cxeSP;=-XRPehZ#qYra#QPl-vP0U^5IIC3P zyT~zK@o0$?IFPO48o3iV7D=&P8XW67zLS+_EHF7Du>)C9K>P@)+>h)c2S_tD%GRd7 zR;J=$&0GD;I%6r#@O9ky>A4dqjrv*-XJO0T;z#HRH~2ALPB&-viae1*(zS(*UilqQ zCvbpJS}C`9DINWiKm-RX3pvJdl7|r|P&|sjo%Z_H^6Lst0DF^MqPIa@F*ERi?O7c{ z+}qzJ%6Iq8;dh-wZ2bv@3JV=JDauYcr;-O$w8OK+t6(gyzRnFMTKrY9z|)6NyTu5H zlBGJHyR&4e7`S`@6qg~NAKhJl5jQ4Y_I-(9xiLGh%B*Cv>zMpA!+TKKUVHJ4wSXI+ z;VNNgt+p4>WP6NT7-?U8!|gb`e4P8mJI@_(yTjdIyu;mJ-Qn(U{^9QL(c$i2qQl+4 zMu)rqTzt6uMYKO(cH^^Xw*8Vl&ifLc=M5{jh6;}OzK93)UiOoEWsw%gke7W3DPt2i zTweD5mZ)8OoyV7a=TWeQ{SxnC%lj5(8`>|@X7G#K4SwjH+DpNl;3b|Al$A-2^*CeB z0)7ch-~*h34fhh*!DXD{;PvwSzS`Kntgwci8i*Fi*%(@GQ{7zJ@$V4MfcC2}wuk&8 zuA=VYs}s?|g|Im;1V7pC9zrxN9Mez+39|}M$e7$culCyIt<}A~q~+E&Pp2_G59))N zT)|ci*9N3_$O1-vJylDKigz(%_Tc9t4X_MKx;$gVLJekfM_-LMX9C)RbblH=-F9iac(P0na!nYCQ-wb>E-r^m$Q1)NFwn$l3$j(D+ZVWSfVhUh5}i1YgEx zV{(v^B;(-WqH6RreVtPuW-)Hm^!5ytJ`N>OD~n!Do~iYj5H6|{Mw+P(7A>KoFCIC> ztVcKVm^taDL(KI{1sfhTpGDn9RF-QVM^(0}*7Af-(ZyDRC3i4Vt;C3{yNd-@7dMPy}#PV>s*@ZhHu2csg34| z8CWSn9LIb8xY(!4J#7EkeJjvhp!37D>C>*fCJo2g>1`u|<(N}}Ru%D#2O$!xvge|| zxW}N(Gncq7sEj|eSvl44ri6*tFZ!poYJb(g_6^TJ>)+m1=chmYsE6h@vU`AgJiGhU zx7kJ&hSw&mUbKpG$Opn6{U>o+f#-gOH1B&DyQ}-DZZPN}Z1jqO?XVQ&$bY z=9&k2#?b;L=DI$XM>1&S@d>03j&=h#R}Dq>GlTx3zNDdBR&K+|VDH(iFccM(+i(^p z#FQW^Mu6F)C{Rrwb4VndvhgHtaRh-f>)MQLkgft%=t-&|^L#-f^D+}3%aWU^5OPOT zl;08{C6B5xucG8L&KE4Gb=a#EW+!ZF(JsUpv7@OpuSc*OZG;?CISQ9KcEYlX67Ot; ziZgpj1W9#zV<-Q-_~Q)%xG2x%q!5$BV||vqb(2VmItxdD%)By@B6MbFmmn@y)4gtH zjyH6RJ=1DT&}nX;b=5Y8Xh}}%CU?yhZXktcM?p;qH@A%H3+#+#1NNxKN69Yp@Z9<` zW@Ua5pT?=Wwf$6)CyEk@5{n4}2#MI?BC>6{yKev}&8RM*h>f!Mm%wG_=^sO>r#+SjJJ5j$kdm^@O z)~)WVJ-~PSDPMiLBY+-OmQGmHFbh)*nI|FEu@)SUa~xa#=7*Nt27XP;f<^0>OH-%M z9_~n4H*(qfK7Zm&6SDoHL$Ni%FQc=*OV=MU>^#C=F?|L(kuVy}7h4~1?QExy>$ukJ zr4~)6SD{ry5x27wDJ+p~&<1Uef7up29m=YR1w$=mr$-D2tpl-=dI{~Dn^79blp+L(6)iGCu5diVj(__|Bu&q@9F&(^?=`94_FYh%&ti)79_oN z@5HBJyZcy((3CTAp4D8eQ#E;Sv81L{>^&d5y$tqPbQbWEf0@FWhN?qyS~%c|Giy#79@t>1$28qIG{ z{1d`f^dfx5LK98^EGS|5p^}zl2f#PaETV{rWG;EdPJ^(|%#3!Dj!T8N(kV zwk-9PFLQ%4h3=PmSpgfq^qO8QP_7X(tDf0+$Q<|D&O^=2Qa${^8jhd7?4Q2n@`UP> zUJD-bQNse+p_%V^R%y9*=TCO`0DgQnQD=wo{_`pAy5J*PAFJ>d>CjhwJzS}Ww>&62 z9Ua#ep6EEIMdT1ObAcC(ZQ|;#x4rcjNGc4O!lXu1HRJR~Ja8I-?p#1cz6v~6B~PCk zMm#XbDzvaxd6*V{h{W)Npx$?h^Qz9Xn&fivH{ik8>qGQ>+#SruJgWgNXfw}YCjuW- zvGl9VN;VzCLKqXpI{wna_j-QPPkqu{4rVh*Kdt5+IfZZ)ZwKtG+mKO<0w1b)sGm)J zrSzTMh>0vClvZG$cnLqKOIi!3m&N4}Xs+|k93E_j~&2XtFc+K z7Sei43FRzG6K0vlK}8|M97+{YKX)@Mr_hWB)I{6Nz12Ldw|kxX@z-DR3{T&>bJNmf zRQCxL4)qD04{BDi3mNNez2PQO`s{rGYOdS5PT*boHrgF!KDiirn|u9oa?->iIFond zNpBJ+)zE&=l%Wzkt9hqt$;@k)iGZupwrl1+WT>!uX@QBK!}4(iQPQ=Yj}_3Y^_5Sj zhaO8L7qh}x>BV3sj~rG=V?#4c=2ICNmn?^s(WrWSP4|WZu$1UIJuKm4Wi;?$XnK1i z0GTCNkoldjKMvFJFfR#|)SpffJ#){^#<)4uhysQlV=XASPkq;Pe36C%eDalbCifMg zz_Dhe4KnVf+8EE5wf5IU(CF`c64&nh#;4CiaSAm|8#k*Qo31*6<*a9ru$fHxZla~k zJWplieINQfEAF|TF@Txz-s{(D)i1?ki^@eQ7a1uUr{^k+Nhdr-0gO#OG(^jFNTfv| zf}?RH4*<4h46U?8uEoduJw3U#BS)CD5KW~a9KRP>&u|9jR4)ryumZ7pW=|-mP=YL} zX6(27aIm!6c}|_6Ie=?8fWNlQmQEQwsJNgnlzSBi9HXh~)Z0V=l39mu1m?M+4GQc4 zAC2y^jEONE!3QbF({D^A_3?wGbGii|faP>>a2Q_y9yX?=d;zkwv_w_~*OGSh9puy8 zHXSt~Bt+h!hTL+E;P=oI=kr7K9prGJm?sDHo#d3y>Qv$}CHhXc4MZvlB#LXle#K{~ zd)1$xwkt&(N}%C0j2G^eCJ55Q^lzNVp2=dk=LI&+Xz~Dl=*w3!v1*9zPh!d+<5t0^ zo&K{xJ+v?2W{^4CnM%Ziv{?&2k69h;knO<_4%?bRUv_5sHCk?AK$vs8G;=qtJnJrT zfO)%P%Sesw04=V{5Cra6addzclTGzZ+j<(H3xE09SHd1KhQ=~9uY=PH0ufqOP&K~j zXMtSxK$CpX52$2o%p}yu>3x+Ejs*22F(MCjgt%j#o+$CL@;ZpC{M=ei?a}JhF+Bg0$vDtWZC(u|kN*I+Z|1TYK)LEH$v!V*bt$ z-pBLSx2$OviO|va1Txy-tq*Q$;p1e>5U!8v@K&6)b3%#Io)G5ar#B{pc95T#vD0re z`{o0}tXhrQR8Rv6fmL6CcXFuU4$KfNOLwJe+YXix!1Xne1O#NFD?G{0vKUmRxYx1f5;-bv3gw|$3bs59m?L1i zh#f2;pl3S)F3~V+U}g!74T$SbY>(u_JPEhRlv!iqmzeAd6C0H4_p!g1gQ*!9HMlyA z9xk+v#rNwvv^1j(1%xQ7iKjSm3I#Gm+~j2kWdfLqFu?(m1B=<=<2;R>EpyZ90Ox7? zu|Cs7pFyOcSHh>31LS~I`RVU`Fg4K-i$B0+8m{miCI%O$sR1s~aG5aVa$&oJs}Cw9 zB79J8s);jAJ{T9(DHBz8US_6cd_aEg<)&Uj;1}{TsR!|a;jJ&aIT$1x6rQx=g99p1 z=s6%iNepm_W)&s?9x71S4u~1R1DvOMnY$H|y^c(_gaR2NrEwbPdVZrzD3M|5)^khr z-S8Dx9h(&n&9B1g)A4+2s(M>T#=HpOXgbFqOVi=hT!(rw&&M<&wxY`Uc93?RAuPSC z=#XQPMDHEcmQ#S{wy(9YF>AYLRRyl;QG8N}h%M#74iGCfuC zkg7iUqpJF;2UdFnDGu-*KJ5X1fuE~%I7defcA1$8M1+?&EV!+t@|4^|i11?ra6b-L zIBL(eSq~=*R6fiG3~)_L$`21O&ktc|G=z^)l6#{*SWd_88v5Y-Y#Y@ts0lFL4h{D1 zu~*rxcQq$r8={9lZrI8Z7@PLI&8=k0#zM#1fD4@=KS(Rod9u0}?C$Pi*$K=Jm)BKx z)xrmlC0@(cIfHBj|raz9jGUC*rhS>&A5C|UPXH3>!7`s&;&eu=8? zSFh@R`>_ul-+wI4Xu|yR19n?-wHj6-z*A7eMAX3_Gh5t-PBnNF*Sb+NpSlsPP0f&* z*hVrB#WZImX&r+415I*j;e-|*`e*LWQ8Kx8fFKCvZ7P*WZy$KKv%?pfX7*8Z1S{5+Civ3HSTy!UeQdR0Btij2eH1F#wmwYIMqjUS* zHKp9NTPa#Nq{)gNBwWr^oVPmIzak;xaXX;FnAb zzqpAR3c|IRb`V>VFQTJZ)_hzr!Z8vd5;B_;d1~e$*nmiat6Fl~31rH8O%p_}*P#$@ z$CV78)nTSjkiwe3cAGj|y&# zPTQ&P8p`<-FX@z)saQ68U6vL*Kt8nT+H45pfHt_+)IIaAZ~dU;vAqb7vc9Ps)l%&O zh0;`6&%$4o(fY<7y)>-nwwd21Hj@mT+(_N8?B`cSEY(dv__3|6RO+D=Ho@)W()9U< z63FM}xdUfZtPYJbX_ATCLCh`#e?)fa9Uik5#H#aT3I=xwq8B=a{I|HKgXa9P(o`_gM*M8p;QT_?yPc*RwzTrnYk9jfv>Im z_FQ?jO?xEvUh8ZJzfZ7Tgghw+71L9*eEOUje*z&Lq1SJJ`m;9%ksTAXfg{>;0~9G7 z$Ht9N?~D@VAcqjazDxhMUA5|{7q1s6Q1?r&gARnu-TEM*;oxjcqEu zdU(jQYcaG2!87ZnYvh@Z3oY2M7SD`KCS}>qDHMy%BJ;VmmQg_-8Nytb6pF=q4{OC4 zNG`E~)CZ&$`Ep4Oq~4p-xgO5ry_%MGJCD`rZ6%iZc~QK%EbcvaX) z)YxIf%n_7Plj}>RLBtIozH0TYUbi_m8}jy(JT7=6f~3u*E29kT9DGXM)qcSWrKMe8 zVj`2TFFVh)%@ecOOA0#U%+qI}5}op3=!p;}soKzXOBrwDj0^j zg-fpJ?x|E#WiYv4z6zOYtO|lAhJPy|P>P6kQ;IhN<}xxYo7bw0CN= zc4@yg!U^%`xx0@GvjgOVg;&#U5c;HZfR^t*yI}O8pb*xyw{dYEHBaLV&EDjSJ0|os zyTW66=~K`FT6SE-1R)RndYF9fsDPY0?;FC0;wzldO(Y&ZrW-I(r)pz?V@Y7o*2V%4 zpS%o+$P>1S#0Tjj&e_HS4<5A*Xvkx$iNw3pB%A9}Sp^1z8rLn557Oe78^ zfIVdy;fF}MgODNou0BaF&PUJl1;NQ9eTl@OjA0MVwxLL{%}EhDKoh8cC4#4J)tgc(?R-APLdDtT z2NZHG6~hJQ+a#D_E+p7&V8c;o)k&eiB4pW@WxdVGqcQfoslfMpJ@8d`z0q;P@3}qr zi8L^$-Lgclvux;L?N$4&(^uU*$ZWGHlwDjvY0CcEk$h4>QZ?7KEjuJLeL%r0+{o=l zHRnj?|A_#z&WCbKj>r=*rLfB7fvZcZ;yQV$s?0$7L6m-E<|YQ(l~9rk>#>R}k+WPiF$l1eb$ zr4>Al;}bkC!x33LL(|u4+`aYPz!L2eX@dLSKKRr3c5{21U+txX`OV&fQFLnAT?|7>4=3vThwEC`y19`v(+K{6 z!NT>!+9j1e(ERHUcztP{O}BJcCab%z_vugAWAO<%wQ9;)sYq><53^JvO-6LIC*Kl~ z@G?s30L`khm%>ga%NmnmXOmO5m%6wfyDVzg{%uMoF%g_bPJi}d_ws6@XUqAUE9dX7 zoPW{foQn`=e(fmLb6yXYNMFCT$!bpo6SWvVXSpZhnb;6bnfE7k09rt$zcX(dheQ?e zxM?a;q^`7Yx6~{6>63J8fdi^vm$jWt<#}^|gIU(0zpiYgz=>8*9GFTaKBNFFnOq3I z)Q1*C)6EUt6C;u;OUD3#z3-CiHTJt1Sfs$jVwnTVf>+uIU`Y@ThPa&7fZ?Wd$CD~B zpoF|DAY_|-C=pOk1(AhSJeC%~vaAG27?<@$rtyi7X)JhvzJ$4ybR3%Wfyf;RveBN? zI+;4%m>%S8dJk(!aL;iV+O-?DwxZsOP6Pt=!WC5=5MLGka(?d8vyh2E+G68p4Dy`< z^3k6469Hl*-Mt@_D-#zs5~0V9Ll?PU$|EN&l|&-+9O!6n=q*1%o5ml{1J5{i+41Ya z*j?vwqdWIl=$%U!hVQD~ZVC!fAXQeZVR}v+`i5xMzV`es6l;|x*OAD3>((|ux9RZ} z4+{xTz$KP35&TZe)wFD8LKF7jUh#eIw zM3!7H)Clw%m)CbnvqP+7k%+K{!>iG+70A2ITC(9>QT1id zVsy^p1l`9U=`Zwa#LR5mVr3N#q}j={1IxL%d9TF|?l?d&w$(bYJbIjkYq6|VX9c<0 zl8--Hvcjy?gNvdn%_V)jgp4!e4V0w-i<}A%--`m{Wa-q8>G>T(B+Y%d3a;#IkZ`T} ztC@6R%gz^))}*NAs91qR5eYUjisQmhTaHYFv@CSCa=M(vp@ca@p)66und{#y7MKd~ z!5gN7Zv5+y_I_%mUgpxR{5;)(+yXzUv`dF?2NJo8vu+<3v-&aB?C|eEdF;2Q{#R$} ze{-h(cW3IC%yG0r!9eiw><-VzM~mAJ^l{NJK3+a>VX>Y%>iBX5mkoUo0NssobcklV z2oP;&%FlL)mPbp;6DOxbw49CWG%O};+*%PS(=A>=Lp|OU;~5&=y;QiK%2D|;MRa

GFjbeYPL@y7%+n;KVe%Kax$X;@8)*qzGt%KR~&tSW;S$!*B?XZQ%|iro`i5yJDr! zdptGY5o^{v9DY2F$-8=q0Cl3{)iX;}S7tQZcw{uQWAu*7gLJ7LVe}0IvcvBIh1|Fr z2#5pg@zU(p>s(Ja!e?!aXNN+F9le%?2y<>hAROy+_2o?YUya}o*wNQ)Tw8J=-IjPm zyHIb}G}BBzN<@edrY{1=)63fUJIWaO-iAV;x+KZ>`l(%}ac#yvy}y_U1l0z8xVtc)3kF;5OsQ$Qm8@4gnytb6j`CN3NBP^2zwg%n)xzj+T|qw?gZ}UP zx_RoCPr2A})y{$8#4^8}ssmm-a;4T{f;FW@*qXVc=_avPDLsFVU-wObZ}y@b=G302 zzxa9jD_lC6#=$K+{Q1Xe!eaUKC-hk^ojBfOC}-_1BBms2UU+v09j9ZGx?z?4s5^bX zO)WV|abT`Y?(Kb?-!etx3mw|V*P)qRe2W$L^Jc;;o^G|I;=*(yL^p=gUf0oaYaD?< za%KV50A%j0mUg+CcJ0#lF#}Mj08=wA+GIt=6ip<;MxMRF6p+x4TL}?HPgoNUXeBPt z5h4$!PIbw`2^bGPwzj5U0Lto>>Rl*tXmxF|Ye|bViW(Q=TnqQ$RC!qSi!1$1IAyTk z#Y43FxbQ81XiUum*D<}P>_J(}8E*dGTefUG_>moydE~a~5ebhk-MGuN5CEPHrHJ5r zHkITvRt^ZwJX<1Sm4aQ%lbY_pvksgo8OsD}X6M@KI=8JomVe?MxI~QSdLdViA`xO1 z45pbi>~0u^5rz&BJ#RC6lE}w1H2jH^ z9VJdR>+hKa-^RK7T~|dR#eq;JuGAGuA7hq%B>zEv@Cr}NOB#$wK|JwTONPzJl+c-V z2y#s!5h@{Md~s7UC3N~alt`u}GE{o2y*jtx?p@9MlS|H=+&howY09=f3-#2%nfQwf zvw^@n>Z*PK2^k+h zOv;}P2_=pY!wPp(lZS72G$1tJ^0dE=9aqyV91s_@cnHUCd-`}lTwpee{k-YnKl+qE zFe?js?mNP>Um}oJa*fIS)7ZZW{fUL;esR8@q^{AzA2LC)WKshPWIk4_*uo;I572z$ zZ6Sn+>Cnv^c3%HvS2X@)>Yq7i{oNk4{>6?&zuJ-L&vqpG^d}gK^k1J!dUuSGbfhs7 zp(0;uc(dBt+9II+z7;%i9#;I@-I2`y$SF ze{ug8*jRVBYFl)coQc{iJ*XkXMQUFr6WE{Vy(Rb_c9iZq_m|vtZd{+_yZ0UDV(y0h zuSLT?-`LAeS(?`Y+2t=Ef5f0#=XzMUGrtZDGsDgqSYK2Sc3Ur>zJu3h^~bLic_2XC z0s~ldOl(NLd^RMXzB6h(2~y9O&qj~wGiIE=$ZCJhY5i4J`s)#$(`6Z(C+f+X9no6A zg|6fi?^@NDOWUmNne<5+-7UJXCE^6Y}>NhWvgG~{fC1E^%Mz}yjyXD>yJ}7#;Cj8s_SW)-t zq$}p3cS`06^GvKugy<1As31HWpaRwC0-Q@z+&4* zpPeUDZ;(SwY%+I{AB))e4uVvXwwXVk2DzidRg(kRYKhk@^RHNP(BS+p*^%X z&vh8O@>-~FfF0ngLB_BVVNVF(I2q=4~e*6N7hmJ~(1xaB>Fg5V}f@ zon7|43%=Mj3H4smjvUKp2*KEI9(s&(Y1`DzwL?-alL42D;73{qUkUG?!HNmFSKt_926 zgcRSfm)170=XO4g3-zW5DaBK+b4}XP`a5oD)ay+iJoWZbomo6ig^F$Tl}zR;C2Jcp z>x-d)j*4u6Yy+271`#4NooQ1Zfx>RWbK<6i&z+oS%x(D{;i7w+%$v5$+pyNjF_swD zk5tl(z4mO2yW6=!);R2P*n}7Og9K0lzdtTKl6dOI_(fHXmZ(R z>T+2=TtB~@?#Wp;`yG46;p)Be3ZMPv+AeDqcs)#uOI zwI@QRC{8L!^TMPJu~M4$%H@#(i;1W{%Lhw|qzD~|&vh1wW=nM~p&HVwkRht6q|R=a z9=D09-VQEJqZ$v=!>J)!N;OHjHC?^uy|P4e+IRV2ag3x0mDhtwy!dK5F#g+XyaA=OV;vDX#}o;!1l1^nb!Pm>u8SpSev?FKwkE;oVi_SZd13 z_b?o9WR@r5gy)X9JTnv2j$NSALGDkNjxbU@ESw&d48uC;FfwJLp@&EpX$V=oAtcw& zF47RPctc38JuJcyvg|`hL45c=af$jw%&e(^lWkqg-nw$lVi8)`vbU~mMy<18l~`0$ zX+uXOgJ&+8R;r<*gsH|xP6&Lkq&3phiXF;ECOutY4pl(EVoJMxl#@b)atoDf zUZ$R~KpgT&IX@G0&zeYFv7Wp1nw|b=g0f>T$W%m~*PpQ)d{t3c7Ge1dgxk5QPt=Z) z4`POxFY+tbMu^_z_rV7^%~Kuomfo(SWK4Cpz6?I&mC-UK=k(BCEbwpwsH>HP2#y{0 ze(PudUP|cU3xul|-_2LI)_rGRhuh%#G3>&bD=o16_0*1=^!e}isMVH4 zBFTLJm8+71Fb^AurR~e$hzEa_6^04R7qk;NUeG3}RM4IX7Bm#%5ptmvb_tAnI}|d{ z^-D#q=0!M_A$I37@Nt#9))Wvow{cGG#6*HuKDUi~_!a(kPn^MbdpTSK_Qu{^pDX(= zA^iPjnuPxT$=u!30OuGlh+o@x6W{B3B77RQ-X%f(X;aY8?y*|+XHjmFJMyuBP>}O@ zcQMgFY+TmS#YO#D6ql)!qoVK+F4a$dv3~N)^|L|#j6aIv4?dvk;Yw`BkW&8}N_QSr zuTHtFqNUy&Bg|LA17bl`srS?p0X~8UE=k((=6x7WsezC8>fF7<7(dPoi|Tk-iR0cS z_^d)aqYCana!LS0({b4D!fTsOe!Ok726L>wi++x)fn5n4l@#3<3A8%*-FO9+<|4%Df3 z3uuyVQ1g(xlsQV8?m-NI8^?FMR%)Lh2Zuwgb1&IV!fK2n(%ZHJb)+Rg%hEly^ZHh` zud0itGSY`J@_oH5wgDTQV_&NJd}d$Cj9`rJQsl3}1nui>Xl~>&>R2FQKm2IC9Fq|i zi-d?+{NZ>wr=$Ae`b@?Q)NXfUGma_)M-zJpZ_S8 z{3G@On5Zv)LEWPvecQx%i6%_(qff{?john$iNL#3PruymfYO5H`H8pN&1a8W2u=tyuEc~9;fe8b}1EWhWdn zU6?1A93YH1ET#B3PmCYTT>5Dq2Rss8;&C4QnmZe?@Q>g4SVh$dvI#uyj$;x)bjs#dA8nTBTV8+zt;Y6gt%*l1uB`Dx$oAR zR3K0iN3R#pt99|D4}yGVs6NwNW*J*r!RI|?2cXRFoMoTJbsg<9lB~b%Tc+OA9srvK)3uHeL_y0)XTJP5}OiNw*$v9dn8L-aT=y~{JQ?Az8Z41EhcKp&!I^Us5i5wotsee3}XaccWs?_#ZEHMR3H4mFX* zl$2I>?zDS^TFr-H56ljyQc`@b1&@r&3XRaa^l9%1j2ex-kG*f5PDDM*Jn)JxHd4`6A}rKmIToP!@Te zmC(PE2So{);~l47d91uEW1N~;PHLsyq64|5xMrMZ;lh^Du&EDxG7)`n9NH9JdMQkQ z)r@MAw+b6;ugn(wtG@;RDp+T)?k-WfR^VYCk=G~K75cV6!`U}p2RLT>%=ncL&_oZ; z!HpvEFybq>_52!aJ4%LESQm@FcRscIT;K`;d0`=V3%XtFQb$WeiF#qwY{i z!sSiXS87w$Pq?r_^J<(eGda40$Fp-$7T`VgN9Kd2X{Xm(U*k>R;xwbXXFk~ho^VUf z(_YCD=(S{n@)caBGLBh2tR&BrFvgu>GGGZ6Zj4ghk3s0phvfrzqHMnJV8V)@dEQyg z%DeVi=p7=7V-;HOt@PuG-ZPDGGE3wdDQ}EKI9=Ndb{3FFyW1nD=n;OfRbki}yf1N1 zASt0lOYXeNtFZs#VeiN#?LcC!?-M^P#v<<;8__u;Uv&eV?vGFrUx$C5$2;v~VMj7O zlonj)Hpz7dpqa&XC)$Al_)_f#boqF08)9n5h@r*BdOk=(>1vcGN3jxe@V!ma0gxep zi;CwqsYvFt4lF(mfk#EbAKgmcdWi8%QCjiyS+$q>Iqh;10ZnMWhF87p^K4iH!9}%M ze_dK-q1x;0&|d6)_3uCKwQ51CH|EZ%SoPa_6O(K4vgDH1xQ`KulnKchVgR!FCJd97 z0PXv^{kahn98!qYCT#LqqURNgo2v;H#wN~NK%O|^79&ItaMAs6B2dV9R<;fOC(H6H{ex4Mo8)b}k7m=@pWty*?k<{UM z9Lo^7)OVpjI2zds5y<@!kugJ)9;}uAuBq452$f`yc2(NJy*z6ABFE{$9;(o~Vfj6o z!wMKTc@cboc1R`_@GWaJ4e5zm{SnvE&2xOp0_?8bDWAE9JJ7Wn*ygIKn_H{z2`8%( zj94~;FWcPHa|j>Hn&u!%&lY?vM+46%wXfZUe7Yw@8P5hFMC{&~&q5$-QNn)L(atPD zfb8{mjs=lY9?EHr{VpT{U_ITqb+BiU8cT!>)rfc@3s*>xeo2vGEX?QcTT?wNhk;vzgAAowal@Q62 zk|Q7vp;8cXP27XfP(fqM^qS}r)*SoXR^C6Xp<%38A0)JhPqW2jxCSSUZC6#zz^J=z z>v?>UIwnrCtXndnmG%3S*AYmS@l#9x^SJ^H5pm8v#4-b(_*M;(~I<}^=tW~JEz z*i}t;b}FF+uX>*>?ecbLXE94R^_AcLfpFad8)K;-cONUV@|8TfC~v-(axiZkc~GuW zFND)${W0H?)!)h68v0{ynzs#49lT>#FR(o_PH6-Z2|OVNzr8*Wo)a|J^b0h>8gbK2 z#3@xqEYc~f7-4oZ=v7vZ-V?D0-n@Mu`8rO_p^U-yLfN#89H~%^8OL;z(=Ade(kCjg zW1En7zK9#4y_D4RRo{EDhu+w;sxe(u<@*#ijhD zQAA2n3CmbX$U{Fg9)Lw%CkE)L1?C+xbvT#9AWGZs5q=Wf8 zd|k|Xb3R3eTxc7f1lj@r;Q84*|5c+#^MX)`!c6;!r2e>si%lhv$;F{eo6v9qnX(iY zHKe&+w|T%*KGn9QcjGv@oIQcT7G;c{#@7lbrmQ6{38N8#P)6A{wW?PfPj#Ozi>D%) z6u{%3gw1O{TdP;R<*~H)s&0O6U3$60gUs<~WjLN;pXSoBCs#m-So1KSH4ius-~-QX z-`1%$?Lo&PLpP8eIl?w~%4kj(UmRek3apu8ZZ4Tsn)Y=fvptnzW;~&&zBrxMTv8}U zINpg%+98^upf_qlG8+m-Eu?~}Su>7LUCX?`%?cJONM~<5 zlF9!LwpVf0DD5#xq1=*~4RjyRn|Z*QD%X) zo7#t=uPyUx6(d#@bM_(vBUV^%Fci7;MTi_CUCLs-1Tik@6HPeM?=&S-7;9C(+o7G| z)EwWM0-;R7*#;wUX}q*K>8n}P0$n1IiP%!w8zq8fXZ6y;vCUj`;W`Jzh%uBnIV`TJ zbx(l7(wH#=VQbDl$&#+}>UJXFb)DvmM4emTCWTN%{8dl`^Hj#6WdyS=Xcd>rV;l>;eF;7a z5xm#euE7WW7Jc8gqXs=%&gqhGAL`~dHcxmlrFkOu&j=AAKR|ay`sxW$V?Qf_GdFYA zPOPB2A(#-zx1v@1d8Zfzp(LgSV7d_fE+;qpUvp!7VY_S z*~_i|l#r-znFVSPAy;%9P_mS>+~D?X``RXc(su-N_|A4Ew>zA(tkc&xcO*CcQ-bG~ zqd)|+<5n_VyWP!=!L(P{A&So~ajRJ!Tp5uge5)5ug@N9!LZ92DRT!vHg+1wup9GD} zr1=(3noCOo!*EI1(f4N5I5Fem4p|lah^S@h+si&yNJMR%?TBj+yT60Q6q5E~VJ_D2 z{_2nl%qLn2AYM%EIf;7S7v(qh%@w4ePMhpVVK$Jj=6FyNNAHr`c)6&~l%*fl$f&*R zrt}WthPj(E3aFk_f6i_yF5Pu#x4EC{j`WET<7P>;9acY)9QVEJ>zVXN?_;KOpZ7yB zdL-sqr@no?_h$d0I*-Y&C?$hqAipHNhv~=qOb6n<3VzHrsz z3so&tHLJYs8u*C|X6C96T*#c}aUGknH;Ke=^|DO2**<3f9o|EG4kdpv-$Kb>%M-!X zyf0kM`@c3ZV&(qASML976U4NiFI4;aKbi>m{pY=je)?0kjeZdd>i|>=fTM-xmshYdiST8{U+vzuAoJ$g4p z7iiJ9#E1nVLPqP<-d0L@roV?wyR;DUJo? zI;rHQww=jS2#LglHA*qSU$PD>LFQJ#80LuXacAxXhZ>bD4?7u@F9@4@bCs)yC)D8N~?VRS>&p{@L3z|6=w{ z?a=xRJ_&OA*kJ>p56e;@OCN^|z~kAOZySra%;1l>j=lRM@{CC6jn@?2qDZA7p=ng6%IVnVpxUZLaSGD7k!#SR@PibXc(_ft}VGh8E-P>|*+er;JzyJQGodDHD^(SOdM|U0S zb(`BywkNh9K9{H?hn!eID_TeWcPVLQD_NG^NxHfz+BeJXGy2Pgh02ra_nBiEjGQ@S zpwAPV9NQLL1u+wYU;*^&k7+wSwQuevif?*v%6`ekQB7}zm;oxqC&vyOWG{rL?NlP4 zYAcyns`De0=bli3>M)1DmgX?GSn6T>lD)t~o({DD5q($^ulb`$5YmlzZJjQ)!~$s8 zD{EtD``w&U06%VM3N>JvS3hYLJ02uLpv282c!vHuu3fzn_p4~JQU$80`>uhiLENfN zCD72^&k@%Bb@VC@JXBDots4llI2Adb4C-YfLS#=!5i4^_l@fYq7A?(0uRZ!8(FQ>I zif*y&Iu@KsuX1e`D9MF6A0+g7?5NIwRC&J zg}gseH=RQ`CYD|P?14F-aj8VCL3lbV2u!+^OC@6ZoC)d?&_+avC-k#<9`=i}Tk<+6 z|4I@3XbH%*=HW`Syxrw;H3Bg?x=XQ5wxo==K~{wLL*)xMFlb^xN?Yf;!N5uKAVhR0 zZWsTHxb;Ytoh`9k3c>MjRiBoz-&T0~<5>-q)Rd8t!^w(B-l&PuiFnH+M9pH&{K-|X z`Lnb6<}b$NdbxECTkCedZW!+!aX=-J_(-iyy*0OVb{OFws`1t>KR0R`mWl{^%apaR zlbQz%tC+8z(7P3;Q`Q~&$XvYE_w?Pg2>wWYeXU<-%n-IB@C z$w2QW--ZsBt#}ni;3JFhrR`1|VHCsyAEtBE7w`tQ*KoKQkIiPMNP2DuIrBULP5Wx+ zZg$d^qhEw^-@%VkOT(=v5Yj)pbKt8oVG5MU-9;!9s5)QR4ca|uc1(?>0u_sNyLu1K zbTWv=asFiTNBzkz%xN>INxe_!mTj=;&|yxysxO`AuNN#W7s;wRGaMoNZxl~x|9c;%u*lzh>KbcPXUkj=~ zu!@6dEEOcSFX-f$krT1w{f#(o`4SIw%C~yHk3-i~_qJxTBM>Q=IX-RkIxby$Y9T-i zh+ucDx~k!fACCf&1EZ)5ml-NjIouz-l(A<=3Q7`_A-7u>ju|F)+{AZq6^>o@j{=HD zMk1!w6uov75eS1(C=-;f+-h9FPVUxHIqYAo-8UW7;yV6PbuK`tw@@vyHIqo>&Im*S z#C|am)8zN9kh`oxb?>cEI0Y-1HA*3DD@Wz8AaO*yG)*K$iB^ie_hYJa6~h;OM^bs) zBoeY+nz1GeYhx}I>w&%)j?cE~OYf9Sd6U8Wqt!ZQ$si@&Jp3k`j?NqLee0BD#ntQiQrlxX{v71%W zjPu;~a{L1+d$ic*wfZxY(?Fn_z(DwXiUrKjlBMg0b33&I_z>b+UMlxk%)4QLvjgLK zBMw;5Vvi}xcZrGEM=kznVz@5Wo<-eO&iIxa&A9qsEe`1sP!%f<}cfrw3n z%{%xkDv%e*qUAA;XuMDMNDgzKD;3H1m=JZUzOp#i%du<5hjf|iN6eSn|6NZN*RuH?&SE4;@zwbVAJMH1Hg*00^v z3!c$1ESD7@mJ{>1e)>Xc0KlEV^x@<4Btm ze2==NIO{w~9JDd5k7fBZa)%TOy;~W3 z6Ooj%XUtabsQl;bLwGS4d5oBl@v9sHvI2be!*J64z6c(}7q8Rpfl$9hYb5e^y$wJ; zJRQM)6wNkL#&Wiy@9kPwa2-j|;ADy$gMJ)yu7?HACrX*I3zg@G>DnY(D^f<Z`qjVt(!N z-+r9lzBFzaFJ5z zVaa<9q*OXKy}%={;Jv9x8|gGFk-(M52c3TfY^;+ZQp%W~#SW7K62|!sA(N_+t`J8A zP-}BaK*nr|!d;~URgm=tLrSF;?>4?<^lX#15Gv9e4qu2s_0{!b#@-sAq-qaNsb0w8$RPP{aUGeuiGU`Mo=OD4jhVa}q^Kg1xx3C$eiYr} zU1!Q;w*IQ=;EggS=ysxtS%39YVLPXqzbLB1u)bRY6i?(SBfHuYYX8c;31o?=jY1DQ zUPm!7w`m)oY0ek`UIKEb+J(G&9!Td8_}QH8;H`fU0}mr^YoetrG*U`)3qBZZprwd< zA*nG(#Qgz9aO$bKp9RcBR`r1$c;b?l$(~`UE3FIodFRPd+}h@eTAA>$oy>Mt`X+g% zsKABxu%+Yw4r$((afUUVbH_GS9ROze?1_&=BDZq+%)SQh5Hp>-21#aDVV(!>c{PWW zRPS?lNzc8R?=Ji&*Y=+6%_8{x*(|WB&#blgj7QlCA6X8;NyrQx)_QY;QzqUQxW*3e zYOSwi>G(JfG_UMnXT+zef1_Utiv_THj^n;fmW%62P1**C%V&ms7f9;<%-`9;u;9(- z+E(zg7(8u4HUL75Oa+#%=aDMcyJ+GTo}Qo*Y}1SwfQlvNI>dT=G77nr!uj z@3#74RnA0VO7AG{kgLI!moWX?%hPq-(Xa3;pK`u|JMef_RQ+BBhZ{R$)|*H?QeN7r z8oOUd$ULkBm+mALDDjAbPUi!|jo|UT?-tsXS%4m=)kkso*jo5OVj;#3KTfT?Av_ZU zUUt)oA}#hvQRX_vut!YE-Jh3va_^ z;_O6n(|H$S>g%)x1!y^ys%V+`Igw)0rCqT|c~U2WJx5suSXRQq2+-mvuH*IEw?DVK z?^Yo%1F>TAm%3Y3|D4HJUn;4tX4Ukmo5W|{f$V%fZR@HBcFI$7Dq_|*RlBw$hIXye z+3UXNc9L8A`P_^>al^^Ou>UsnS3`UHtF_&1*-EAFQRF5(= zt&#oaeR(q-$NmLF{qkdd5zberc-+TxcX`8yjHr0}I3AJE!)*3^8wA~YcEGjR!viju zpTwKF4k;+;aZo|e9oH>+ux%v6(n+sQK_E3LKohyC~*kQk|?NY;qKal{0u$Rs^6c0{@-JEHv zjFWnX#!eDj5Sw4;p1H1n@9vwcHQms3XK4C%*Cf;Mr*XR1>RbBgo(~o@qiI}bc&Cr% zLCmb&Zv5jMAiOO%AxaJ{h!b9(;tR{iyUV33p^^6_5?}M zX#m@YVX}k4?-Csjlq4ZSzEv;ta3kO1520mi6xtZ8=hRQ3hmmQuEmGy^C)4|=KiMUH zOV@1kb4#2$k8o6JHxb^fLH=sD58g@@rA`iFfdW;Syw@+LYkm8YQ?7=N9&M|p@5sp_ zAy#UUML|jTD74sN4I^=!BEk!rx)Wc8u%s~Id>TLL^x$NS)puet%+f405Gai*I}_beFQPdzc0TIC zMRYLt*ENeGb71aND#(J(+cP7d0}l^ZV9k(wfgbj58}Z-&>!1FevP!RUG&WDl>{{nH=9nxmYU1F2%gXQpH~rW&qr;Q%l2^pKEMscSBoYT% zRgU)Qc#=pQWMz!sROBG9Ds+)l;pL2wE~y^w0zRi%mDZSiF59roZChbjPR}k;9C_`a zpkBa-fWDE=P{(4qp#?*!9?qVcwYT9JenJvEc6*6FtH->9oL3VH9@Jv*?HA~YMGtDS zcbW5wBFO`KRJVtflN%0pf#M1UL4*Ou!o_@(JWxzUBgN0HB_06wFdZHJmmC|h{iRLM zjWA}+*Lf*xKwk&d`NSx3IL`Rh5Qq7i9sZZrwcZMEd#7uftfW?E{+88j1K#gfHiVSx zv6xo?m}&6rn?G1{O6iB{yyxk>H|gYe2j3R-c+%b{@@!>J7p$4!8Z;g! zPs014X$)%0XD#jed{&K+TfKrp98%|1=CfI&bY4tnHSy*QbeM>sTZ5F$B3KW>4VQ6% zz)*GPH|@@1S!nYz5wPpS=I1mM4qLtE9S(`L>&c%^JIYMX`mA>!;sbncbF&ypGAGu7{!KA2Kfm}3kUMW)T zB3UxxAa4NX2==|_MT}A;m!mZoGDS*HCf7di6SehiKIa0%6?;9J5N|95AU19Eh$(SV zZk%=m+pci0e;v2d(~TQr|L5xLdsttE~9d7?5*q zZQn*2=a+40gcA;1bLr-^b1|QDk!iqRb~3v)pL2oFcQ~Y3pc!UwH;PB z+SwCuYTT2Q^{P{=bVyRq4x`C?0;{=<(R4a?bav z?gkY&Z7;N#r&gjLVUdDQhlkVY5V+^&OLFAL0STMj)Kz~tB)gLiC`v2Y^E#l2;?kwN zNA`P?AZZCq2ZAMLwm;d?vY3H*w@hu{lOAp`bN&usF(zu))$zutEk&pG$pbIv{Y+;h)e9_ZB)I)o7(ImshZ zQz70U!mJu1!kB7^&zKMoL`McfcM=kW!(Kw1DzmVHu{g{JM9P+Q;45Wgihl^2QB(rb z2cuUe9)$`FAsqOa#kdJZ*rWlGVT+7G8Q+i}3>hf}k2_KVZ?U2y2R>vFlShSNBj|UP zke)Iw5=+1ZK@}oCXIKm>?@M~hPG}ny77lUQGwCULml^TqH1gI*#&>y+-p}YozyjkZ zMWytlq47wSk^f+p#*Ye%#Ne^$5Qts+R3KInXc$y*5k?6p7~f_Ug%9z=fVWlC6{Y}K z)ePQe$bbL|z={AksN>M#96`DNn$$SrIiNjrv(s zf~C8-f(kSq4Phb}QUpNbq3BP)+nox;fw05{);09I5y!$gAcnWm190Lop0Pw^&34;y~Ci`debCKpYUFj{rs?3& zet#JiXgm}lPp8lTAzV5z)yBfX%vM=(Sr#g^1>iXcLnZk=FA z42Tlht{A{2<&{JHXsQpx#IRpE8^SUYld|JP%OHw;AVAw7fMKQ;f+QNOj@xtZO5-4OFyEhrzTyA{Kj<`O)7&Lyy6rGIlFq zX(D3~sT+%}Iv^H8=`lz%OrmBumx93xCo~o({DW5?GdC~_#)McH8?7;}b{H+htV_~h zaY&u1k|+q{GgQcg2rZPw^4kb9$*VA=MFLMqOM=k^F=-PKg`>|QGeBcnGZBMfwb0`) z)$mJ`KV&xIMlzrkISyhmS}1Ul)DMVLAR;eXC~2k(e4*Nx7K#DS!DxC>y_$*gh{=#o zri%^30#i~Z6^|l7)y*uX93c>m1MeSYkYa_#8cDEH)di?9DwOd`4VlnL!j?sabaL$I3ftL zz?>q8!Kh;s5s8~2D5_#`*C%64j&vJIe#alHisOMSQK_U{YVL@mykeXaYz~y z3z#v>1|VT^NE#yP1%bjLQQ%KjM1em!Cd#DuP~ouZk5TOPM_M!v4Gdys2m)nX{V|N` zU_}D6(ku?|2c7|?qe6bpVn3kHz&Ke2{n{>S! zG$j&jT%hAgY=qb`k{9Wm@O@UuOuVA)yD_wtz~23l(ie;qtT_C z(Lc3_FEL=VHZQ2_a3PUKWMP9cF}`I+m54A(k+L`gJmg3O7W$e{brHY$V8hV#hy9_k zCamUA3_buucYPfl0<-!wsfKj$Z_1T+>@mQqIVY$!i6vO8m>TWxE5)N(^*S=fL^LPq zji1c=IW@*ejl>;@qct+wkVsF2Ne8DxBj>?D6|zH~iCNH~jEqmzZNx?eEVVQdN@Cfq z>GA%yN@o3;28CHg)IA#fo6#l;8nUcg?5`S(bq9t(9B*YzJ1#BGcp5A;gmQ%vkrZ7u zW8lOpz%9c}=z%#;-zYpDpyB1Sh5&}Ye)Q|6j4{dG6CcU&o|v&^eQ_aCp<(2E-&j>d zgUoqd;LVn7)npwZVxO0ADUBWoNJ=0^u%!4*&foTWvEqkW0#q!5-2GAuD}&BOvN z8io!5-%^VufLGu6vt)vCk@0d7240d5uHmzz1W4rZ)(m|OCM^`At1-L2hEf<@1p|-H z06_sZjO2Miu31ROywrHbBpEJe#>TA7c=-U20Rn~mD7M26AI!>(gAaVTFN3pOG(aL{ z;0Zf~fG!XL44P18M2|E=n6fd5$vzS?0q8?xG(hqm1*T4a6q^OZv`Ez3U8v46Gl>yE z8jQ}Hi~+ODH~2zlG{gmwW5A@nmkh7HBV&^yB9chpMj2l`mN<4og&<7v*)tOIHKO2_ zA1t`@fb`xG(1Af5%4Vm`$b#!=00%I|786W1J26D0ua05>H9*S0zFNdRek>+6)I=Et zjdVCHvgx!%z$6GBM?e3ALZTLi9oi#X&}f?hRF4nDIcJUv(<_$6K~x6R*=f%)$n;f{ z&6_GI%`P)cJ9;F2M`w8yB^JEt#S0Tne_Ub|Lh5>?KUtko9W6zL%a}A360sIG>4VdI zB0>7s?$IGo_9TOsTrk@&Nh&zfb`TzFECQ8Y$aPViHtDWSa<|1}*{u=W7*4ka28{(# zH={}jcn0lD29OjFHU^VbCJ>pa)@k9ad`cuR(Ez(87-d5({LvwBLJ;b@F**cJ2r{_N z2?~cDvJ71FD2N>*koWS8LP++(Fx5uJqu(Mw3Sol+WCDN!V558h1^QX=7BI-lC_viUm^cASAx1Zl(jm}N zW^oniXlZ5_PC#SPR>UIOr%-^n*q+$09*W!**@HftXN+SE4gO8>e72G?>Uni#M*y7!1WS^Wu~0OdF{rgEw!`09o_Jc$tJ2O3NqH z4!+ha5aNDI%5&B%VF{Q}9Nv$9r5GQ>h#;5?9lNs&RU*}{XnqM;}d0krH8Q?Qg( zcV=(WB9_Pa0un(|CPHXQhvO(Owr4UC2Mb5~(!ZC2@|>a75g7+&hKz1Iq!3_Yd{ki8 zN+pi#bh)%q$QZQ}pD`mxygC(<91+4$Zf3W9l8Q6yCXvj#3F~z|A_<5qy(rJe3_f_E z58$y()vyMbc+l+@7=?_{D)AW;axrMA5Qp@f!NTsEaH!Mpq^Fb|%IH-Kq3Ce3nkX4I zM%;u$UARSh3Qd+F9l&oh*snnYB;_+eAJ1gR2B`$Z_!3SvyfB`E189)BCFy8$Pln#T)Cy^hInp~KP<04b!zGSm)$ z2b2L{2g!&G6_`Sd^o%u0TqrRajPZlo`*hpsCWq0hqUjFn16#@ zn1RBf>63y29)j^!Fc?fD5EqKkz=Zi=VlW!&q}i%QWRy<`HWZ@CmZArdJ>rYeK<=>M z8F_+NWEeI)oOGT7jL88=9E}jO;y{j-oGolE%v`J;?BnB=kc#mXNdez&0O$s&OMqM( zSOy5M2!O!q;8F!?cmSFc?Gr*eQvtLP9!fp^L7(aDC93VbM9S>*(u?|6oVFAAI;W+Sx$bLl7T!b1Kh9JGJL{XKBFfAt} z0EuTXAR_TYemo)``2Iqm82A)uM4%OcUmnXiZAcd|MF#LjZcDm0C4g{BldcE?nsl-t z0{9n4`UU<|^bJ8r65A;R?Sl!SoVZt1rAEPp5Jg;tTChMBLHXf9jS?A%_QQe8Hxx{5 z0EhU2LL|Ot>SxE1Us)L}LT&1RnrIJ^)o6RRq8z@KcATcH)ad zK@SR`=mH2x8fXZ54F-=?2X!2U2XPd~s@Fd%B*crvh@S}7zunpEr{A=uGmlN}T@c6@+Y4lvCR2n+#l1B7M- zMa2l{1&ME?Br^pVMK}iIN7R^>mMZ90D7_DiPQcz0io+2Cfp{}qal}TbX+sL}cP0fM z)WQOA49WG8;{!z~d!bS>(*^+S;UD1%&{!Z2h}R&PL(#VXgjUZ^oirkozG=*xhj0!B z{35~{s06W?SYIS!-aHK^TwwuJFD9(9?zy2@KR@tf8PmSYUT0v{$NyV93%!>F+_N@2 z{e+eJ$5;k(B>{dH@dUZ(5L{@DpvoBppq> z32P$9+AzJAG*PMuy$P^$G#-P7R2DfwMp6|RodC>wje3YkTAh&**bmS+s$PME`X|WQ zaV9=%lcA7c$L~Y*ngviz&6%nvM$!rEL(~dk-G#=ggf6$nnMxSCh<~ct*>k5X8=l?| zfSJ<&0!>V~S+MI{SsDht%20pVpZ*z@`JwT_<5d<|7Rto_8`>X;@Fz&LF~%@9jE5Ev z9mZhEfi(-H>s~=&*)=|3OeX)&!UVxMh-KoBjn<=RiJ5@lJFmdFSR0rf5I-Dc9LJy3 z3&({=g>%Lk{i+Y=>=Cuk273e?4v65e%sFIi93#cSokan}H$!n^C4VWTmMTJvBO%#X zdIN(_;{RY9utD1o8wqZj0QB>BnR7HAkBjlbGfr1?96&=Yld#8t7ucaDXsL@u6Y8rX zbb%0_&6OnflnuV7HoAe4b=zJ(5ezY{T#cF7`lP2-PPIUi5>6Cp7)Fd+yW&NKs-mvEHcvrq5;x}^Hu7x3wOl441054Fgj*E zjiW;3KyCu@L@*Tw=nBG#=eh#O)}%#KF=+z~C?tyh@#sDyOV*mlH9>|bKWMn}2P#ze!G%!v!_mwg$L`fy zKnyEMKUi+pV#|Lr<9@=zpiu|RC=#L*RZ|C)Ko^+GXzH^y51|M`jL?}z<_y(O)#Bhk zUx+i@Y2}o^Q|Bi^H$P)~V#tKQ3 zVeuhe?F;2U>V!p*b)O=A`L}DPjREMm>BSua4PMAlM(VqpRHL5I3SX4(;VN_ zk9bVj%O8sgVQ=M@jp0L^xG__k?8P|>*QvPiBH0e>nIIHX^qU@OnHs?cT|fB}R)7*M zyU=rf(*JCA(vjrVglD}tZ4x%}VcJB&v^kWGK5U}if2)Zcolzfxm^h(`;T%M6 zOp~oxlJisoGevQneWX}K4FhavQLqpXC_@;cAxgVP41tzx4j2>i9WUy|*EPe>YU+9wi2pstyN_N0j$k(`FPQ4KSA;(fk055YNjcw0 z4*4GAG>I>v31P7LpQ)vhvg@qvjZ@h|F@D&nP&Lr4O`L=zqFxO4DzKjOG25v;O8Otr z#>A@OpOBwp!AECmpujAqXkgD~>PMOTLhz!AU@y%DD6arK+7AmbgJL_FL4jK#I2nn@ zcy6ke1tADxaRhQ~fl!+R2>Rvju^9BnB1cFu_4?qUT|F?a z9b0cGI+lzEmEiJZ%cC2{5lnV!ib z`9bi7@8s|WtjH&Tft}GF^U-B*3}VGM$pvxBIN5R0an26oY^~n1%Q%Evg6e}pY@`HT%8!YHM|I8{Nnrb^?6^(JU-8=5x;E064t{j{r((5X*o5$N}b z(&b3UeeKG`3Cn0P`R^KaqBbo219Fb_xok8rE8+jE8<^fZvt!cQ{~Jsia%^I!y|vhs zo`GTf=i8h8hSvGt)X@J0E&T7bF*)j`m6r9kOqvAi=yqOm%;E=;UZvKc7Mt6h{*}@A zf3>iX#{3UUtf`|3jNR;=1p4P4*1s++ZA5GaZZl@{DlDRejJ731@51G9qRsy1@QFX` zL!62*sGHRZAEt90l2BgcsW_9}V<;AxbS>8Gvr&uI_!1S2+MUKaBLjh9V=Vd@;~f7s zeWrYjr&E$UTRfDNvVS%S+8~(2nKvcz#DFgr?;FA(*`zhTLOtWbD82!VMmuMUI2Yu z6!cC>AL477C`ZdQAwVPfcB(V;Y*kIXJ{OM(z{GNTcoHZWso{?e^CK1KxKE8gM?>V< zm-v#-@v;n-{ZZ5B7{|8u-!DVH2$Ilhd8ihXR@2$6qV06YeK<=0K+ zpdTkFK)QH>{APGiRu=Rk)guW+h@xP;;9tL7YYa_wUo^mniS%tEhi-5f?1I^^!;86L zu-JY3mt7BQM2c-}<2&MVdq#~yM1^DH{BYH+rOUR;uRVQJLRDVwVQR*Oegl)G%OVP@ zmpqKsK5?QvcE{4oW=|B9tP4~7d3~yjHym#J*>j!e=#l3;;K4Pvwo~73+IHh^-oBWh z>lYv0o@!pcf3?9KOY?>Mx_2AoN}QgXGf=qjyBn(L;;Zkb-}J=u;==T%dgJjDwF8+Y z&m@duk4vT5z8lWCRGFV5*`T@twPI@$s#!MgiFu!L?;~upj*Rm)&l691ek@Y`vnyNN z{q}*qb<0;CEIvHX&h*je+`6|mf*ZP#TYhJ5k4B4f-HJG?yg}=X;-wCq{)<}{Ray*g zyrgUIy2Y`6MqyW0WuDIrw)srxIIoV0FdD4Yf7L6jSres~<>J^b*a{42;u5R%Qo4;*2+NhOcR38Dd z>5lf6lLci3fv=OTt;|6i5eL8X^8!B|)}+V+zjy*n?Mz{?>a9Y*(360_1;VY|BVjO+ zM(_ilI%jDj@KAnvF4 ziRidhPTQse6~nA8?9D3|dvCCxI8~aUVyU$m#09BMMc^Y#)Mk6w7A^>F^7`0Vn!|>{ z{|f34Z)2cecqFJgtCsiMtL?c=#ZoWSgqLjf#=hJfcqCbuqYNtSToT2GFg&;~YuND1-gWG>+VV z`_fdkDgG+A*UO838>D^3a)O^#DqYDc`zDvw>}j@L*VJ{Wp^B%e?ba0+l`Hrf0`g3Q z9?T~s?#zh|Q>wXD8sv}ziMt*iu%5vq>2_~vOJi(SH=oO`>=vCBlsQRw;gK* z&0>?>_!E=L*24y-@2shq{N&Uxek;L4d(cOIE{;vs-fPD8(VQr|#ZbG|0h0Et|>DMp5-0CA7R8gc<`HI$|cfTyivfFc)&zGiik z-3~Nj$Bq+c$0Ku5iY0&kOTW+ne&9j((goNR3peT)y#M_AF)V=Ipn$|ZtrJ|An)pIM z7UkP4EK;EGIzpN-L&>2{ESsw!6#hUMo<0QwvlVx|6z!L6vMyH`Huu27m`eC@1%%Pn zRFnFBH6opuuO8?39pfGXCfq$x zs~H|naSw&|mmDQiFWfnrYiUvxE1r!ApBj48({Hzh{V5xrlte$?8Qwnrxsx2+HtcFt zeS19lLA}l8z&M;4*VXk82l6j?wJtgn-flf?-rltR^_ud$ridpqnoJB&{(4qxuxn|y z>UFUk=_@NYD3$G*ZT-1eq149luDtY_MCrYmOI_889k*MUMAQUv&*XM zOUGjEJ!!5x-)n41Gvv};@NKqh{iM=!bM2>8A5SVXfJ;rim-0zFHJnRR3})u~8@Ak1 zb-uIQBi|oWvn6a@(CMoc_L;V8pF-w0ROh>d1@YmW7kJ(~zI5}D@ao+y8f9xIht;C* zeu4{J$}XDYc=t%!>Rof~LT_5$TDUA#JZDA~?>)u#ffQJ4F{@{1^HL+ljH{kxVGXgrEHD@q+t^UpNWI3kku& z!4_bU@Nf%{4A0m&H zaN!l@?WqEoYO@Ffg?Y~c3;AJ-HKXGWy*&%3)|TPWA=Vh<=L#c{K2kYWSaI>>D z@Wq9yqy2C`81>lDaFBDDVXOi0H55ZYBVt2C!Xgb~7by}k41n+8V+})gA>2SiBPJ$BJw{6%hY!%u)YsS7 zK%z8IC^Y~>Epkm50UfIr7CDPVghIz06X}b`hJ)!F1o$`F2Ny+Hq^LMDl>+~f`3wyo zsVFRxEEOQ1Ml3p91DJnlj8F!N1K0+3#I9lv^co|eyJ)E)QEDiZi{=6YB+3A}z))ih z&Y03>V9&(iU2wP%BS&m3CL|R66M+IWp-n1FjX@DgV~kYem6m|@_lFi2gwV?iJ~eQ_ zgQvZT@3l12G}NGbHWuG~872}J5=De*=`7GeYG~Fvk>6_slJ3Vv1c`kP7ZA(tB{rg*rHj zueFwi8LjIwKI$?rMxrxq^Q4Ocl|kIFrZtIrp=TbSetYhMxN>vD2FGBeANI?a?ABH>FIewSZb z7O9ReB$i&F=3-hQ#E;U^t=VCGpV3T`(0_fxCyuQPdL)i)**2>WN}0Wsuxz|QKW zvz&l=K*AN-&LANioYM?VKeS!@Tw6x!U>&LDQ@~=cj2Z z9udgK$iOZ0I~xbw`U7wGEXc_fy<9U3d*@r_!6)C$_>;8l z;8zCL6{g#Mwr&rw*0s+4#REp>Uxt2{WWd&`p2y|hN}T!pQ>@DFbLO6(PwiTGzvRZM zbQd3S#n-22RoxA=?GkdW_0PRziFxNw95>|R{*xvVuBC!YeG|H9 z1`{wW+4i!1j#DCUpp3*m#~X>QaKy*`O=pz^VRvM?&vEaP=9SJg@a}*Yi%3T`lyWbb zj(n5o#0NZTnBK7A@Ykikm~`ftJAT~ zxfz)>Fuc&aZ>#e&o_9&k$U2?_iKmQb23t%185F4Fu06|juVI!WJgOsBRog`1#;+fi z$QjOXzGr&vuvZOc>uxJg4#NF0S!myklFYdB*6`a)16ir3zw$(9t!~ZnCWstOw0Lvb zqvjL;x;x7)!gh!m%JF!?9g;x;hW-W(i)9^AF7^o zIXI94D_9MrLr$4+>ax_0fZ!j>tOrJm&SKk56&=c=FWxzG=)iBqax zHvicpF7_+5{&g4ZTZ7zst!^H@wXFeDtDMW1WnVvB@oB{`n6U4%imRR4iVPi(CQ3~U z>4MZX(AG0R>dx2H1pG+#3~6hIjt8nhgIU2>cKh*2w{iX3Zo}we21?J_$qm_akicga zX)HBKKh7rG+Qw2ZD-}_GiL&}U48L7*3k3an>Q;v*Wc{ua52-_`xS_SwSa#S zc6XY^;vRhFfh8=I7n#}Whw`m<%XBSSzxdG>oA=pMat|LqjInU)NJ&Z2NE?1|oCjw7 z;L)Q;8#A_CJzkgUTy9|e$Z_6|C%wB2jE#q<3Oke?fIS=HPHLzD{spYRFwAFPv7@iC z{^UtQX+_2R=YXE33~DZM_;2Gjy>zha6`QeOvx`1{aMr+w8g39@Zs04 zI9z{>rpL)eWhOJfSme99FD~tvbnO0KRY}3E;k$GL1^Lz)b?x`5-o@L>cVc0|m#<$j zO($;)FS8zWv3(CKOPF!@Led*!?W&)TYs05`NKd+BdBUK85EJ8&7I8%8sB3p^oq84b zTAqck@HGdX$4lqhE!(9jZKJV5f4bw!l`Eg72mMA_?@23^egxme_cp-?kI&r^VQRna zg^zHvkL{w6b2^&xp1~m@A=h5wL;7{M^=Bs+I`;nT=~2XKdb-r5!&`%SU0gB2d3LLf z_O6tw<~4tJZKv3~qL$}t62F_)%Uy>}lG#?B^`L2KK)`FcPnTWQ=BMvkYB4?0;_chF zmSwAdSEwU(WajlHN~D{gopE1nu%=esXMWrpnCgc7^ykvSmJuN*3b=KeRk+>%T(7a= zO1^pXrmosbqgB__g#G5uhd*%NdsD|~;X=8_YCklWgv^!2hwu_-yKdi(c-Zp>7nP*y z*S-UGv};4nvF~w(3HN!p7Zz z+$)%!mFd^n>=7e-ZqvIZ&PO_q$gVO-P*XmMm^Sc%(bdqbzfjT0Jk&|d&W>GVsWhs$wwdU!8& z%;CsuD{Lm8xz@XbdsZiR=Brn)Tr{nmoO1ZAO5hQCX+lj!flEEPKgA-a2^HYMr61MO$l{Jn!bh*Mj5TC_~=Rwloht|tnc?#+GBpG#9q z=8@@I|HU^8F7PEv37MK5$l@A$SfHt(EvDJFS-Ciu+q}^Kb}M&Vpo4e83@e20+#EUX zEbTe%a(z8;Z!3NH+}X0R4FW+rH+>7Xr%nx?Yqtm{tPq8GX=)}KYx2IpUHC;?;hJq` zQ$%5AsrlEGMbAs5=SykAf=WNNUF5D>qVUxaCM@oFD&M+gIbNm1zU*?M?#XmpjRO8t z+k$4ykxe|mRNU1NmbsK0fiZ^7sM_?%E<)H3B`kmC;1%u$v25OD)!e;FZl!Wpw!j_l z-qKH;@l2_s&RbFJC-?4k*_&Okcpq<6O1)YTT&HwZ+IJXXyFxblW1>mvUgW}iC=_ZA zm!P0vv`Nsyz$+=}@T71!Jc)az(Yn|))hior$G$-BCI}R` z#Er+}XCw^&>HIQ0oUlCgqL7}nj7%%6^Ue3(+r`tpMXhXX0^rj<2Y(O6Oie9>o51Tl z7BB7*(b9@Ee(soG2V&3%A2@8!K4}@{_Ed8{wuF#pUb*XLMQ2qrJ=i3yXe z_qQ|!8<6}<(9T@;idGjNf6eu*T$Z+|F<&zo_a{|Xu}7he@O_%1)(~QuYo@uMY10ic z4}R^Sj$UtVttpMB=98RUI~VdB{l2tbBHP_vIh4BNxJ^jMfxexO(p%CdGPavH659pl z0mp!mhl*Y)6}quQ zZ7DoR4?9SR8UB=L6|^&dQaH`LUsP~QA@otGD1+_TMpJU#PY5B&P^d!0q$^75$Z zep-a-;R|h_A(NzT9^5(0RLs0?b&9&#j4Rb|cS>yEWMtAG9_!+oUfw*HXK>@~!0o(z ze0M&@{<2Y$n7ipxcUE)U&Ye5gw)dS}wA=Q8ho|S3E5{8tJ-BmjHf(UA=dthR^LFeJ zN?GjU+AgKkf9@{-ZUxP4SJN^z=jL6HxA-;toHA_isyFh%ri@$ZMQ77(SE0~QkPvC4+T!S)E#x^ac5rZ z>m&7D3)V0G@HN&@S1^TZkxyO7nkn1|KJ3m`N?%!9**(~C>XxtF#|ITzV()Tq`p2bx zuV1RWQ}9j6F3D9{b~jQtZR+~0Q5o&Nqs31x3MSS2;llxJaoE3R}zP&%?)1oN_({Va` zz3lAl_BTDcXDaX@E&V~-r+k5iN_5MG^vga9M?I$Vc;#(=ke1^nceeJH$@iSj5XBt5 zPIU3W{W;>ZswD<9CYyd={h(3}d;HM;boTw}4{jBU#5{|BRV&gvEYv6I4YOY{JMo-h z`~3;cATv0OPf^|DiBw%YRRGMboS2@p7|B1`+t2UCq#iqjtlUiQL@sd|?x|tC0?C0P z>j;?&;Xl7%`P|(fZbR6a)Crg;43& zT9JFvsoCxSMa+HGs*sGy2jl-VXNF)atYQYxRverccqEFnj{_ zR!OfnD^PF3Ts>+g>v)&)b)yo+7l|ch{7!OFlR9g(wl zff22^$G%B7qoWa*H{U#hFf;vZB9zc0%w6yzAtK_F*8^c#`fy8bU>o6nU$+n4T(Aa6i(y)WZL7_;lryaDGjflEjFJEn4>%uX?mTO(Ja1e z8jMRAHV@}p;rwLk#BO+kK5R)*_pFIj_hmYDH*onPQ7DNDfrob`YZC=FO*S>Do0QgS z(uY{hi)`G-J;0USFM2Sjx-^ux>|xr6Ny6Oc6Nb;{CnqOQ^Z34Xrm;~Z9&b=2*RbIg zflB+E*AulroTuUSr_mo~C9mW#M=W81u5K6bm&>nd_w+1mvYOM=)60*ouEFz53L#{h z_|l8t!qJ%~8@Xm7zVY~2AkK?6Jx&^wKfQ6|b=c1mbE%L+?F)3dc%)&;i7}zDhu5R1 zTj8%a@bteKgkwV4^h5sw28p~7IX@clbuT$~?D zZECI8t#6Z1L@0leT`PcSUuZRz$0^-9(UB{4qe`^-q$QH#bC>(MG{7x4Df(JS3MFsw zxi9cp%(3~Rlexvq&dgwe{)zyf8tFyE=yJRi?e<+U|VfvJ7gN=h~MYb5W_9D5*k$qN9q>n~sHiJN#;X?bTg* zDlZCU-EYa%X&=a}b$q%-aGBF4lWsFTc;Zb7yd$Eet8S+v~<_ zmBNs8l!c_shxE@}F#hdL`gM4b%|G-555Qs%1-!`MNw@YnBz}Jv_GRxC|DT^uIREg` zoWK2&U3XfnZR?kl!dsBj5|80_TELavLw5(}yswad|K9!HtH2)@9(K)G@BDkwm9;~z zpH$wp9x%;3;NBJT?x;q+6zrSQ%DvN1oZsOJI~mGr^0ND=Lq7ucc@pg8(|rRoQbRm* zn|g$23vGV)E+i73AFMvVS9d6X1Mb>|RQ>O}uYVX?zVOgA4CK=hDmPO>VAS76Yh2=NbAhz zlUct%STZom3l^WE?|9al?+R`a%xo67Qkd~tuK2gB#54u3oUaS4$T=3d6}9%y>z^}) zR%e8D+nOpmzxpP;)eo;+q$*R~wK3!(mqa!np+HbONgc_h>OEOLQ7fGLDFU`J(MpVa zC%3v47uJO5xT(2TEpY+rDvs#M9wr$ z>z4ZnQ%&(|+{SNmg`fNO5;uOiPv(oW-IU_%hC6ImLl)&^4+!EcG@c)e=)739~(-1?p7ain|;(cT0lp9Zox*v+1o?y+U0Y{1UznXOu#zWugQ&tzgi?r-i|WlD2*pGcl?+aHgDYy#U1`T;5)XK*}CHHO5WXH7Fy=efeca!LI*tz8oH}qp4ED|HReF; zelP9e7r!>WsXCXw_UzA~ub18|db3S-kL-C_8Ch4^JniNMGJC@IT;20>&ui_LlYuLR zPVuaKx$^ZXPvnl>A8xq#E1%e`UszH3{;=9@ql2C0iz<9ePq+mX+n=~K#UodJm9FWT z)n}Yz7CYEzxM_GDbLuZNa>}pBKX}3N!m5O84Q+@=-kVMLUMwxlD7=6^fG+O#omG}o zetTZ=%HoC1dcLP4GCmnSU!_u&zTZ06I_s*P^Mj73F5c%_PqqpNzY0{*E?-dFQdITC z-Tmm2djXhU?d?8$>r>`)zS(iJtM6DJ?%MBuYwoSdw~B>?r+u8(p(c&L9npPO9-pJ` zr=IB*8(!Gq`gq6lm2ZFEu)Cl2I=U&esq?|2hriDb%@?&1&9U6vvihbfYYzDd(flm&a=iqJMM!j{ey>aR1}$pZA9xc=ULV3iJvd zd#1Nbye-7D(}{u zb&Xvg8^fdKV_|OARBN^MO8XVd%~?`5QZY-eT3)ueYiVZ@XOU-Nljo-De&WTF%$1pl zLyM$l%1w<^ipC%L-ri}m>G``J!RH^;wN~#u@$M1+)XO8+TPw4@F1km|n;|!IdY9O6 z`jo~aFKsKoc-6$b*o2dvp#tYVt(cD*rh! zrl+1o9rya2^y0|&?Cr&KwT|3Aaud7pScIks~m-TiBKZTVyS)hbhIuX3`x(21bqPXjD5`PZCoh`;*sV$X}P>(j3eTpe1! zz<)tZRKWS@KdHYiF8B~EQjv16a`odH`xuXl=eob1f4eml5o-1Dh6MxK;&c1U4Zo7TlJs-AJKJ%z}dE;}@=QFh{-ko2LUKQaj zirwnB^(3nFc>U62L6&z9zd86ONp|a=SM_h=&b;6MsO9nf3tgcJci>svm-&olNXpkG zT>0)8Twxk|8U3XD=%v=TMQ_es2uScsFn@3LDW}yk#j>QOack7wg&p^GOLe#FG-l;C zS3i$v!To;r)hupGd7q3f0x;LZtz)r7s z>#=>O`a|pc!cY9(`MhGw`APAwe|ijQJpFbq{^ge8{c_x!d4GOTKOZ;j`D9UF{L|mJ z`HqNs8sAu}_dD>n@4M$kvjrXI9Vj!d_FYgNOd$*oQ3)q@^)=Xn~$B$zU zmnO9yX`R31C@8l`akb|3w`a^`{GUvw*S!KjHl)2jlU)RE*$dx(vs8n&SB7DM}C%Z%sPQz zpJP=*{axZZDxED3e&7jyUOE4l&i-GO&K|q}XoAw&ZW)9vfH_1H)7j#_ zl$oEzO+-C64kn}nG#&~Mzq~)m4W2d=_Q})REuOnw8k}?&?ioP3ppdqW{`{wru!otG zy{ESLCvxd@nrI&Fc_18{cnJpney|z*EuF;QZtJA_tZMpUq>jcjmrOe!X=xbD_>#gD zzUAm?)Kj&;K3Cx%6%sy! zRGlO~)1=C7$Fy_bt=`H#ITAQG5VN~cF~vL2FW^M&Egtn(p5Ay1-c(F^|LgpO+2(=@ zx2k4VZRNqm`x-Ajdim?k_pO&--qo1>d*FHe@cWm2CTsd*?%WwTc3d^s9)9KIvDR{5 zi)n3-PTTqFPZHa9%hMzvle=w;Gfa~Ye(=zdw|(+R-hKDf%DJ25c>)7H9_t+CO4FBx z#|jrdpAH{%;=fqLy;FB%RStY>;l~>?gE0++{daD(X775wsNn-h!&Jy8Vkxq?|ythZUhWkXKdxNU?LaE!^%VX;Wlot%BJSoDNN?M?-C6@E0)#SiGhzrZ4 zJwIDn_6BL^y!>stb;$15KjNJvV_;R6=EAz|c4BPOjSt7g8W&b0U$=VaC2$GDDlCdS zRM0h#CUidwRr?d)vKB^uQ!B*~>?Y6idk$^=~>cbai(Z~|1)ts?AWuy zx()o5YiF2><*Azo?UhdOR!tr6>{Pjr z&nEe(I8UDEeNp(Suh4)%s!*V*DAyu+tzENakV}m|db*!`C^3D~l{H+c^#_0Q^j@ti zUhrZ&X11nq(wt9|W7i8#eH?S+WL)Lo`xQrK+HhIH1Q2kgM4oJzgbCL#JJ`((Gl9wL zf6eTy(vQ(VnrS3{cse9|e}$AvjMmb-N9~{9(~k+<<3DAw+x92*ny=vf^-E0m`FJiX z%Uv4v@r#r<%-zE5mX_A1_z6v1kKP5%;?VT?(ptHUvahfn39+m!hc=jq$QCXHhNnbx zkY{r2@1LhID_8FMvUR5M7ZaW2K(U!hTkeV$1e#x}GpQ3O?L#=Ol}Y3MRM;c^MsreP zC2x7gLf-fks$vtM5H9Jmt zZ=5%4memcBv=UPtui9uk**UyDUR*(gW^F=9<792G`n6FD(we97O52}{e7$ACm4{#! zeb&A36nJjF`^Oac^FU8;7(Ws=aHcCpqNn~DwVwa_a5~)u9TW{O78+M35QgxzT4o1> zZ4!mSGJ(%;piq(t3>Loz2J71l#A+{rM!6Abm=Xhn3F?DcL&rcI0T&sF3rB$Y!*ELe z(5eN@AG+KJ^M^5O3vVL1mZd(eZGg4MZS%B1?~?JJ!!4qvU9C{WC2nE9N72f$De<v_#PD?5W&Oh^oFDppnEL6ot%7A!+Oaett(twR;$0HeOEQo<=J)9KJa7@w;)Y3D zhfE81OIOqp*G!)&@j|iZCG44%fLFwm6{^qtgqrg3);6u(ky9il5vK1{@9cQA$MpLP zzmjksu1heL`Ma+M-0^5%c4v2;JWQ(pmpiKGQM-l3Y3);|Pikvxp?;S+4o3~(mOgoG zu~ufVCP1uWc=P*XzuIMC-Z#>NP7G{Ts}xMUr3SmwIplLk50-ea6gU0;g>#~Ih8pQy zrsuM%BbG1UDV}!;B{A)b=x>Kj7YdJ^4^T4tu=R7BhyEv9bVj0jrQCcqWxFef0}g7r z%b)Ac-!wRr?@!bWUekTCBKeo5SZqu`lzH7o?9|?tSAu7;h6Z`x^Y;vjUix$Ja*b4a z`=Gd^Z)Rdg)I5{*@A>8kiX(0hUG^9*#+@HTBG#|zp0{mt@KkDC7 zp0n|m#AmH(-x^Mp0X4JM0;2`uN9vf??CD0JESQj6(qy-Bx{ZJx=Vg@+{%c}vBT*)!L0t~%aZDMHVthbupU%}iPNY~bU9K^;Ru6Et$R~s$i{?u9I)6dxxdAOhwu~%f|)vZQ{K=1gUdk9!X(~&lGDE;fiOs9n+K+ zo?M(&-5BemsA;|H)Gmn|Mz(UVwrx9^*tTuk&KKuQ)w%tvy4S_-yRNS4?)|RyteNwi5AFu@T0*_a zQsPsvIMN{LmGf^#jaip|5^YlZ z32xtz7^xVls1#_o;8Smz&vdI26*9eqT;p0i#wsp$HfGn>okSP5b|@dtsv28r%0F-K zL+}6iUmwYCn>)%n>Dt~QmyHm5m*A`L_xPGTXfbLrY}iYcvQeoh8E+cTOB5b-PPVNh zc@I@j(jJ8N&o;Fyf7jYAoyw+pml|HeuM%t~O=+X7(}uW=kl%IQN#0GH>p0xk>Y$pD zP(z{Cr<=JkS*Pnf=z530bBE2zam_UI_fXIcR=e$Jt|E)G=~1FM!2U4!dZ;Vcz3cb7 z9rw+glR|A+dX-j`(CBx}>D?%NRTd`6Y6SRK?Iu%OE4l5o)wU2jemqhu*X4F>v@_eb z2(mPiYVi=}d_c_x&?+L1+UZvG+WGWdu)hN2$LVZ8ZYpvQGLcz7o+ExD< z-d-M9?r&x&|CT+-g7uQCqtW&7J>C&FRm6swLi1Rut8I5PbH%Jw37=8q$%H4!= zOIxYt*he_GXteyk*n2n*yS3r(zIE1fHhDU++ggmXlk6ew%yavxbXvfxFc{^>aG9v7 z;fg=dJj!@xq1vgj()4}%9Tv={QSN3Qq(-2mr7SrjFrxp`^n{kNnQ{4-&kWNTHy%2* zCHY+3XYL*OENJH00)EJ?oyCo3<%a9+RXTcws3zw|6MmT}ZguH<4_5&{-StaaZ)gUf zH&2W0-2qy8i`M)^l6IwV!{v+qV}4%Z0hqY?ZNoBrN026Us=C$VcA2}S2o8WQtCWxA zkLQ0pJn3f33EN%RaogMN-2yOOdQN`Cx^))zilO@v!?eRX_)()#A~$Rgbyk>6X3-MT zQqit7^1@N$(zV!a+qK?~)&N?;mRy#0YkO3SG&qYE3KO|uP}MM8*{v^=I^|1wG@nWS zBvkHqH-CUl9r}*=zS8_ytefSrLLb=H>NcOO^@Y_z@wPeXJrU+KW*$wNNwVJ`B zVxh3L;0ox~T-11~J`;a_j~?RNJ@U&(A@$aAs5X#|4xS5IsGb)r{0nA1_Tq1+xpK+! zI)$1^es#5Va^FCua?{W5CMHGL?xdN{CvGqi^Y%PT`@=oB$m`0_Ir+Ig7d?xE3eglj zAHKY{O!?Sue!e>Hn1COHPuyO)ts_^*YF%IQq3h`tC0Mmx%idJk^tMJ&k<*~s_igCV zS@1dU4KK&FTU|7)*26c9`|y7#y+;NK-*h{zc6@hhqZ<(^$8wDxI(9A}2NoS`LU-q^ zc>`?z*%YgKSovk==F3@ImLS4AkJT{&`!e;)^5D$lJMig)c=O zX`Xg(Wi0<(JCr4LhmLdwD>r^=yBYr}6&r>eDjCw8iObX1F4aZr?)pyunt#NbRo~Ur zyHV4|@Afs-QQv$|-9=TDE}|2EjtY+A<9z6D;;*MISD}~nTg{AH>9Ot6HDhw{0!ZDA zuUV1oGV8h~@a$h@gqg7NFL*j`l+0-H2n<{OTuoo-`|R7y1;#_^+*edEw`;St;ArqW zodHI}KTo4frDydr=3c7qp1xgY;oO&?2V%@q&S>Y+=9A#P89m*}pBzr}4mP#f*YPw3Up6r=#jsp{B3$5ZvY!FFuZSYM65;f+r_*HYInIIdbYd&#+eKFJ3rxzB-pYLvbM zA-TV^-_@L~{+zsz>7zn&@y+ulh0^2S{JrmT?Z1M+Lju$W=$~eK-YS?tllH-Pbvu30ceMG* z^hlP`wi_Og^@!i)m(MdFIuswSlf%IX z^0&gL@){N=uja-dV;sL#wPjjS>B7icp)!8f$g+SNS+V|V)=@m02(4Za(qWW{oS|8Z zohft%{l-lX-f4(?;RbKx07%lle?LtcW;G36v$dHhzadVd*~ukODQ1)r5VWw!7ToQt zltmq&q47AXLoKwmT1!r4Uldbi6TbT2h6v549vw7ATM2JF4EF;rdU`wFPM3U&R>i?z z^30E|_Rx1MN{*Wd6ko>-WG_qIunEAm?m$d2foc9`nlkxkiV2KTPzm7zp&|AaV&Msa`#*tU zJSi)<0|hPurz?qPf`kDo71+=1NK^F4=VZpIG4r7(&mf8_#zkbfsiK_VlO_=c7=(i> zCYf>LX#GJ=-rO;O#$rZ0YOe27MkySZ&nVPoK>zX`zDS>8I}#T)UjmGd;ac?;BBOSP zSV13|y&3pf)?T>sEa4Xp5QSouo{o^9M{e%1>TbB?DW-gBBC=)4RduQJ^5klJ@<^?%oVf>9H1RYbVJh zxlLfTTqzvYQ5JQJP8bX4GNmSpLy*q*5`BIjF?NaA2O()1f-G-90`VMW=JPR!;YukJ zTy{Ly-~|PW)mw9un;!`5LldMnx?%qqP+w?Q0jkfi4kQM;lL$3c`$-!_2xcJ_)-L+W@&O!~~&+!1sY^i+d&q1N-UwEr+T_l*oHB;`{d{%{EQ91-3=S zg=^NPGwd^;`UCL&q~pYjB*?RjW$DStNwi4>mRQ!%B_nD4Z9q-p!k^w=H7NEJrCP<* zn!iqYdp#bMKa2HDk7X|x10lW}>WFh2+fdv8W+|2J&F@w<-Ng_i?z21?W7P>0!n&Xw zUgcKeJMV4ty%L>7o`{qhYMGY2)OXZRF)(pQab1$9Qz*tc2Afk`Q`zG>mMnAka|Y(_ z8*|1~+O4(9)!nOemgt3pRl3C`1&?heh9l-H zx%IbINy+e2Ct613MvYfiuo%M5ys7H|X7ZA0hpDWbpx8lT;v>+obfu7VCP+{8_sx}K z9X?JzoqNwOO72HZ)76{Bw+r5X9{28gH~CP`+__`(M(#K_KoosdPacApd*YN~x5|DQ zO)bu!Z||hQ^>j|XM#s|9hOzFeDSLeJGnKLP@yxkQAOO*3Vaqpzo4AqRVZ39jPpt1) zVjKT(%y`V|^soG1GQU~CMSq2ZoeAl9zdR6nVG>WV+j(jMT-8~qS~XFmS=j2C?tIKh zGemzz+ob+BPB+cJDoP(Ap!U|VA2NhuhbC9?aF#1jm|A@ zP_0oNaiz;)A^iiN%l#zAH77XvPa0DJ^Ib_eMKJX}32u1d0{?JqA=iL?S!4j~EwVd&-^YnT)rB=V^bl-LSp-wx^qm-^uRbB_|nV)RbeCg4%Tp3`+}>9`H8{h zq%_l%UYrQbLwUmKCguu`A3HnlaAw2Lu`y~Vq$hDs0fnk=T%x#nUd>=wn|$w#6TUa} zw+sCfuycsO;vtylrp57t?(`B>FPkO3=%v4SPEbJ3Y`_XP1lHZHu(#XJ^cA1Vis6c$ zr>#3)rYu1)>U|rO6COG0q+jYw&Zt))!$*JG`EBBb^rTm&?8uZ}md~1o@zlJi9HsQO zglLPfC%1ZB(^I}LV6oze$LRv%`ZFpY?EWM$4Meu4loYgx_;cVQNK0benI^ zY7Q0Vx8tD9;}Xlfm7q)W8au$XIN?KLqplIKjhWCE&r;avsZNPQ!n4Ys-A|i?NPIut zF6yCP-6xaShM0lOs2yQ~V!1$ODFE~c+1F= z#ll?q_GHtl+w!{>nLOn~&$xT6+;XMScIVO3>&C|QC4eBz%XzhqiRrA1)oNGU_@rL#L2PxwkoX3u{PzKSLS9a zM!rDypcJQstiSP&qHE)JwWm4@aD7Hl(NQxfe9udJFuOG0Lp5yR6OFW>b0tCbX0rcwV^zi`-v^N0)WQ`33<%y78lJl~JpF(9=UC%CuD}rJCU10M zyPHQh6+vID639uTE5;rD+goC6BcF$Yc}L0tN!b zLKEk_NoQ;Zhvy*%ITX@salF;f5T0-OOW`lMBO14c$Ii7k-K$SJS6_7Q-l&}2;h9^* z)Bi93+^@BN_L_DMMqg^z%O?zb{ zvwfZO9e){d5Ic1{_W57(!;t~~WyLi~HZIbX$jq$}FBXjG@+dbn8>x(1P zclvWgk6Vqe*yaC{pSZ@3cQ>`XYEiIy0int{o!w%!G;op_GXgS*d4cg#a@ZA>JL^&_ z1I_AoA=5U2H^OqFY9|orjqYNZ9+h;r@B)TaMxVFBUBb8Mj8pDnqp(5+UlN7bH~Oh( zXBW0*c1Kob=C47b!$P-ngxdweof6?L=`i;+xO+O>16{76PUrCdU-<6LhC_V51gkDK zclxT5hNk=`#wQwWEeTPRsLS*gkQ77OwopUN210HFpEVC0uMw0c3i_|NqCgI;zxSl)zjKonCV{@-JM!kI)N{m ziUZ;gar&&=WapqyQO4;0`t7Wiga)b-gS7Kb1!PX_VFB4Uz3SI)LmJ_iD#>(IrDFW< zI;ycxsG%rICULXtIEih}N+0a887fMB5==M-Rs;J4JEgqiZw>laSO#j%=p<-X05AT; zvA*!ZQJ_soaRJ0yPf6F9pCsx&arQ6Et!FmJ!zwz>);?mMF2M)wl$zGd?1XolG ztd;^JEY2B7q-bt#+`V5t457?L5Jc(*1e%WOsT}8}+gd#B37$!e9&Sts!WHKEeRBTz zVp(Jv9My{NZ&;s*b#<6GrOGn&M_3Pz*uCp$c0h9ZuVxq0n$&O zKzpt-?6+#9RI4D`hs*ro7>U|1jx6+k2LcK5c)sg(LGPf(8kw$T@|VzobKiB0R5L<` zx#OJ%eb08Jp#h)P(NZc{^Tk#-zPvm=T`nIzK~;lm-L_o{obHz<=i!%ug3rEuq*^!W zV8qW@157jgH3$5Fe`%RAF$u(KaC18FRX$H9SCEDR$g_AHxCLOATLDu-30bBjPTos_ zqXj6NF4{#!a7g6G@TGfA@J$RYwIdXfABf=MN*P5Z!j^Dc%}mx28WMGXq6+>kh3)!- z!S59ejxeiWtA{pCk*4pQyDg^oRvZa^fOlaX7) zffO0rmqeusz}m|ZC%?)s)?%cc3a`#@6%vrS(M>$Jl2ErQZb<=J7h|4Gangl&VjX1g znaz2vXT^s|SOdfY-67+DvcDLat(Y+=2r`Q$L{)*IGXfEY9yE?X0l+V*G(j@4@TD3O zf`^Rofg(HDH$fAvrCIAwn(7nYYQY**eLrtM89)*Rv4*~n0n%=!(1PK^kRjEDE#uLf z8>*J>O`P{vSj(@tt6}L8)l{k7v7hm96L5WpdNT{oy-W-EF86zOmj|uQZM{~4yTkuL zbz`66CfNetDws5_*u(55U1$;IA7<15uXu8_{RM;zKWiLEz$)yT+0W8ZRl=v64;?l1 zWQ6k0bwYISg}k&Um#m)HHbP_FLy<{jfpy}G*@o|$+cS7!ysM$&mb7azJYBMx0$P zN9(QG`ewHWK<+k1=hn#j*ksx@{$<*tXlo9p+C{=SEyKVg#<155=#t1v!zqN2SbZR- zYaO;f%qACgI|-Y8a0JUli{_{lZtJVbwws-Y5o`s^k}E()4$-K&iDNUDibutBP1T+m z9=32R3^t?sW4`^pWGR^-L_jItxFghn3P#fz2Bs$I@ew_ijSZi^w6rw6fGzpA{c3pj zV(6UDX&pD|cz+_~64{i)(# z7-e^)85tSd|DqhyiDg`}ujR`dt!1+6P3L;|J%Hf~;-83`Rx8Wc(25F5Vlc1~q~o{7 zdlo4|qxc&d)9G+>cM0T=MERp&Y&G2TC#s|OcP_LX2&)e;+2s-Yg;MNvt?9jfGlqut zF5tYSSVUZ0Te93eEckzTDZs)k`zdx<(EMcxch%!H4wSvgJ?sXukfCz%aF7<$cSaKCzV`a&mIruh@^sM8mq^Z<5RYUg4N)r8%8{%#_*5 zHoGb-E3pPj$=|-_Kqq@-RlJkofRU2kj>~FtWVJu%k7;FP^RU5AUx`P=`tnV~K<3+- z%A?`mj$t4BV9v5vgN$zI=s?E7x7^D=wDkn%o-LN1qtV!!5mmJTyhbaTUwZi;wjaZ? zDIDvBhs*>|s)@`m;7Ug-us%|?iMuv~F{z%06HdO>w1M#j0{;B{Zbe+5C8Q-HDmMWf zPp+LOS=BENpq~+`aC_%0_mL50r)gJ%!lR2-S&>oVW6HnnThMS)nrFG{AF;FDtBLUW zTZDxKIeRwlg83dv*=H#QB3t%w8p3@zw8iA*^-)n#kMkQEu1F<4{QM~4YZiz`{&sYA zdEX9(oiKUD-pN|!9OTm9`heowqZmu)3PO#mUVx}an3Lhzxqtlo_Tth0;jslAh)-HR zSkYY82)eL!UtilwXK=4~Zfs|2kPCC0g=r_50m6=hV+nmN&Gv2CC+u9+T7jM)^Y(~- zHI#IuMx_>l|412f#7+!+S$nJ!btL3+gxS8@%$R^P1)=8`FS=n zbzHC$)v5kH-i)FuF?^jPBgvW0k*+ZovL`7i`8!)?>UD{vxaZdQBaNUvBq|CNpSiKK zlRJrHo}L*Rn;9GX&<0Y>Or9HE7+#FqEOHm_;lqJMCMPC`2Diu5mi+6z zwIHFpDvE&f4Zzgf?aQ4IanC<ny5n$8P@YfGPX9GB*! zohiRHzBD(yBe}h^BX*X@Ddzu{C;hp3`E|Xh?E~4rd-K+L6SAkO^|)l06$D_%XY*v2 ze5x`6US9?3@05EUUbFK|dIVm?sn93}tcd(MCDxg+c407whEWc!g~NhP^%wptp~1sb zvSk14ge?<45P<`4n3jWGh(xl9BeG9ZsQjsr1N1CvY6Tg%P4K=K1RMrj)xQxU#{6UJ z_R>i`6Ff?92$|tHx_%*05evb;W4h6M!sgWcLH=)wcfS)D`fdgDsP2#SaBe5SS<+3C zR}sN|v2(-R$H;G{S!v#=D7&p-`!9Hxje$B}D)e!(L#^AS#$qZ%aneG(4@#*Km-xNM z*`g_WmN1v@?iq-3HBnYeIU8oRo9+Nfoefo^Tf;nt53gto-q*yO=SgqV66-;ace+(J z5Icm;D+FtTj@2D3L-bVPN}vkQdX|w^nK%F)RoFf5K-vRn0l^>=J(D1mN_f%KW^9#` z6o5gixm*Y%)`Q+8sf_!}l>lv&AQh)&x1Qs4%SVOu&U#*wJUaH>F3BhT0zN@;eQ?%h zj}u)9-bxQ2kUh7vqxU|hZW)q_`FFJ`c+3C+7&k{;T-@~iT{_5ar)$5XLxy`VS3J2y z+BdMhLsjl|7}piQMoLk#;`rd;fOPb7i#hv`e-oL5mS{L=ReD28N=ivU|KFyx-XR*< zDneAIPO5dfY#GWk38pBUk*zHqz;F~gygXY7zmA33>v}DF=GuA;ova)lbPHr1`919< zS_`6da4J@vyo-=2CN?%PulH*__vb^;>cabCB7tZgftRqtp!GfRSTW6eEF=!==lb=v zO+jN+)d(W9D>?iK;XAF!S-!eV1-DnLezfY*$*XKzdC`I78F}vwvY{FONYv_5kE_JJ zKWTZuMAJO$N}94#lE)Ta+%idD|2|TT=Ht7jwMX8eBf{YoS5{1hZ$3SwlZ0P6()|bV zK$m;_@%CukK7H>LLWfY|+U6!Q&#(^F2FrD#S*4ivFy=gPDxQt#%w0o6O(LF+ulomy zxz%ZY)hkixx`EM8Jzw0X;1J8g zkp1hzAax2SCnp(m{kd%gaE%D=Hg7Ja%LYX7C6nARtGTz0f3G8%*4khA;IrOWBf0&o zlZcZ@g|!|3%;6_K-c^djHlr&mvBWE*B`35SfZICSE}yFIohV1b785JUiqv8h-5~)X zAxGrZUf0rdN?{?DZWv2_xu<5l_(r6l1J2R39>n_N4Q&mL^3_2;SePo%Q>xwSUQ z*(q=2J=5|1YklZmB0>BcBJo44807iP9rqpD`q0xwiy83}MRP%d1*8%qDknXNRK5JS zR~f-t0(W*1uRz6}fv1h=}mQ9rU@r*OHcQ=F7O*=BipD=H#R zCibgs9*Jn)R*oX4gj7^KH)UtL3b#0eXJl28bo)pD?qsgMzzp2NSlHj*Ps=h@AHt|x zR&~=28y#tD#;6|#b^QeM3DCrq2+kSrf>`G(U0GR4G0Ivwn#Nr%a<19GCg?O-t27zn zeU+Dfzp=ITMZVp6Bk2ubd2`HcdUB@hb#Ho3J?4RdRX5*J-^!1M5GDYTVMUBMo3*p{ zWoc#V9ohOOoP3;~4T}1CIQpS)zx4Rwa*GEa2bu`~1pb>#_k$wi^RL>_w@z`%hI3;!#b5y#G9I{;k&qJXFd>{&(z{4c?u zAdx6~LN)zF(?EfI>~MsHN$d%P{OHEW369^EEX+jGXrz>sRKdvV98W;Q4mIR+IO;=4 z%Hhz#)IKo4NWh@L9v0`7j+Vf&{E@0}=n<;BW9NBk8NWVxFdp(G*?-Iybit~rK7~65 zzE_h4I>LG-*{Li!9xo22cDLs2LDs5-aN&F?Ix1a$yVIBiLRb(BY1s8HeTOgM|7@OW zs}))(Bmfs@A`+-&`Z8NsSd?tBx950fDuZ3>6lXQZ+)m)4XcQ^6pmznQ{|H; zHnGuryE8H?5e>UxymqyRDETF2+|zTjh_4qo8#PVl56+v=Jg;MByf<3r{t}QKuo1~+ z>$YPs*qD-qbv*k)-m^QCrjZxziOMT zYl-zV21J$P1ul;^xt1_R@6TgLcO#?23R#w`6b&OB+_R~mD(TZE(~*%s6xxM%d{@Gh zqQIs^@*c)M$W(#r>T+{);{wWhm!jq9O6HImXa|gTcC;Py=6rTfnzU_sO z8^RL$GQ$G5P(m8WeF@RPBQF#s_Q%YJ`uY^e)l$y`K3`IB!#eD^BANfluxs>KwYIgT zvtuzF7pV9)a$DQG1jq5JVwvI8fRV=gVM3wb$T`t(*~q5xw0&7IDgyv^=a#A~u! zjm#xxB~j3~>k11&6wN$C%w$0XXMyvu{d8(tQpXC2_1`8f6#{C-XZ$4@4>8Y#E<6OI zN0kslw@EmT8J8b_&3&9X;u-8W?BA?>Offk9`|A+;6NLjC=#ePU{^|3XaT6LE+UmU^ zohm*_Ic$J{5{@~hX*f;5jm&=kR{o-M5a3U^TK*!5&eItlbHhN;K@`1ogXEYvgk-in z>_0v~M_Xkms&e^+_0KeL&0&1v13J|OQ<|>h znFJ}I=UCB&WX`Lr(`r+Xp6wwwWfd9kU%*6MMmSJt6i|>DcPul%^RMIOAOBBFh1;)5 z*Qd4`LeQ{JiS4kzxxQiaeMGh5ei2%+bl@ASyV`1x+rILOlx+GNLj*Dvn~+k1+S z{eNhr&x%-mb5a}tUrZSPUR(O%>0x81$xV8kmsc4RUKz>S2SP+5fQd{DwT@6rmSO5I z*+i6e6fEb|7l9aF_%bRF|KR(4wbqwZ<9iw?Zr%+Du3JFtk8l1U03ZNP%@h9o4?uH6 zA^2z8E=Sf~#%ly*I3ZD72@ZH;lR>TWWZa9JZa(Of_pYO{gRu1on zP#FD+vV_#BQd(k#cfTSy`F$YGaqSYt;~Qe|&+Q+RbPxje@U>IYZjbR&*>S7el7nD$ zqu?@rozq5WcV z00$SY+CE}am1{kk0Dw6V#=1tZ^#@8)3qnpD^#|q1sd>uRp2+!+2#X?;JiR*dhu$Vy zVVZRf!I%d9s0r`3y-~l%F2H(?y3bV&{n1T4bQZ@kRN{2RAnAB?*}(dJyffv% zUma7McL2^%fqbUZo3T;VJ=UGK!@eb+fw40HB#hJ;c+oH6M9Ib4nSB$@3Pa-NXS%oMN`;cvQ8N3zO*VZ`1q6kU*pP-LC zSqxn?HD_vyG9N!V%Qh+9(mc?0R@_nY4CoQyEU^!yyFlaOermuuS}t1_xdY3y%NB;{ z2^8iVT`@Lyjrd42ZVWP*V8yyU`{HS78OeF~X}=b%bcq{&?liUB@){F#K{d@9DvDu8 zu+dJ)C#$Neb`mS`)=v}yw-R8Ca%Kv1Kv+Y!xDIP89H?ZaVAff3zz*s4yD*d<>(j@& zSe^g?vxu~cf;;wN>DYm4cE!U3)Xp9khhb_Ku`xzX>8B6S@h0lU0HpV|yBjnxFkJf0 zjg6xZV`BQXCkw{bw4EMZ1M}g~)e4zVEREbOhh_QMsUvv3=03e3=N@%t8?|s_DifXGwqyv|j z3Kjz!2c#=3qA|qT5ZQF@O;O7aPcV4n$3wv*Bvb1O=h=A8lZK>rH3_+2^%H8DYN5nIjh z9;dqF$mu3>)8lJT2$b3U)i>623nT1h%Ypv=&{rk9GH~q6y&sB9FZpDu1R?*@(=RJ} zr~`JCuqx>!A`OVm$;*pBdw06{wVxHuH^B0%3e`BbeZ!`b8sylEs{p;9VUC$21K;WYhVOg75X4lugL>YNVLJ)kCqUYzA{ETcYBuVtzG@Vf&vg0#($3o|*0*`+dEBi3Ru zclNl|9MN<)I$ar!wZ1!(94suwUN*j*jZmk`G{sg@RXox*L5EwD zB~8<`iX@{VV4xpAMp@0IgEuBte_6hv5q>b6{TsqF+OrT|$$%@~poT{8prU|cY*bLv zZB6rjR96bU(X)1NJRb3mdHU||3fiWkxQs@4tM8CyCnH@tKzvSsijNLX`TP4fXoJ=_ zwKwdGk3KMcc-=Q?n_c%`hI=ZEP_TsBxpVl+OWH?<^)*uj{}8yQG0-^GKdmbFeqOX5 zAWyB#5Ao-RA%Q3zjY-p!IWOjqj4MDfGBN25FAuqz1n~oQQ{P`CvP0Kxx{BOk`?C6@ zApt#BLxDy&nzGXYg^-sMLD6?wIDwjMwOSBWsFssp4NQQ0aB@l>_U34w-47(e zkeCThWO8(MuLrgIp!l|E;1O?%@Q6|M3>usvm)g-(#&sX7o~`*h(%jg>6Yr0gmpRtq z{B*Y%vnis*j%J<^h??m_|m@j3OJp)@_UT(Oo!)pUBqEz?;cfg#{UR#Wn z+4?=q=K1@2ICp`RT5;f%2|s5*Z$|_ZPew%rhy200&`|--7P$?pcdB94*W7%HQpZ zhLF%{&V@Uc7YRn-nYZ4HEnV4LMVmY33ED-o+qU&&h!>ZQcQ*evgiR_R@%whzWT77) zg>mg1VPN?MPLK%;KF%lZ_zI)dro)aVD^LU;5RlN+_&8m6kPrv(OAq%7#8)L*WMjKG zhP-o?NP9b_B_v)Q=I)KvUp#=53sHc3O7VN?WEKOD#BfJVZ+1i#ALs_cQ9|U1R{FsE z2ARoiu3LpmN}MfEP`Iz<1!if7Anpn-s@z3tbM&J_!jGS~3x7eGaGRx{etU&@IkndQ z0p7XsH*%8p_3f#OlV341^NJpgk%B%z;X>9_j=R~-n;P!C($!_1fJr^6eO^oGt8R)v z5FdxZW4h$R^kj8RMh@UEJcIYoR8WN*R^n zb+(QgIFiKaf41Bs5!653IR^8+eOh+F+_1jBpOgTWD#%IOhg-MeqLlFh!F4`T89(LX zP-;zW(CdmK@+YYzWOg=C`1rf+4GHs>ke~MmTj^me{acqk$W&)qjG7T)hiKjwn1YTr{{@ov+0)A!m&9G#D;5dhUs|F(MUhO-xFP zGBBSUG67OVkCJ-L*7<7iC0QZ+zl&hOaiX4N+B|FcN<&Leq7(oA?VK7VfOn=!r1cOf zdTPR}xM6-SGPbXXXOC;NGWwa@`vct>Ki6#7U~jB(#KmpZRty3Ltkf;hXJ$HshteDU)N}5}E|hhZ0K#~IPE)pv_p6_G{!f^`s;cVK^5iIHTiCcoD_?-< z4!E8>|5K*Lqq{g>j5dgcJkOA;aayIgZ1z`+RSd9*OruY`pOx;mqJJQN2iPT;n9aY+ z6t!2J%Neh}X*Z)`Ljr{IjV4tU`b5-al2GMzOqw| zc&1S{?O@<~(0EWKF{f-AlGwbWGVerasJNHPXWc>4KYKJK1;vPr_VeGu^=axj1=6rq^o22KV~*X?DOB~)7Pu&owmpxC!5CL5?W zsOcFyi6x<}^RJ^B+-4cs5D$)$KUu^EvFxwH|@r6|Z4N9gDgNd@eyYh=~Xx$^018rn#cz?_iG6G;&_fo_8$A7gQA$ z_mL1VVlgh>RmhZEU;l<3%oFa<7lFfXRZ2;j=O!BSJa;^_Y7W(s)b@0XvMJA+%)r_1 z_%*OUr@J;vwj?K_vuf$`e~g`XwdHUnenL zj&6~s%x@`23h?VaM4lAM8l2sf_7Z4h^$N%0pBeU~>S}P`n=FKZy`Pi}ABBuoU6=F! z=E9zl@P$M!hA=^igU0iNbEE_r*oWqS6ddRgnD0k7b%~|>5DA&BQQK>uh4_qyKqk`b zbkU)t4FXwFtNef@r^7S|WQ|P(`D1B!tu#=Ee@j7db}XDyw%)RU@G^@q&=8wr@dEw!m3j4jhYgK{Ms z*HC!kIA-VWK44KtE)v3eV3NrX^9_gnVzM#59pWW3ho=(VBVmAx`t6Wy1T1TU0(!rX zw`I+0AC&Q$@gXb&+y_sua&+8G&e_0DyD;^2G6lBsR7AWV0R>+p{8th@*7>yN-G=}H zm>QX6dU_1bg+KDqP9CDZxvB9}vUBz;1sP<>7oTy5Y?U~0<21J%0|NVX0#zFsA9GRc zFF4rp$@d3B-rD<%f62twSr{v8y_OcVuL?a*1#;mg_m08-zALZ0q~m9BVn0tMQ!5wx z@6{D`>+${bnWM(Ti@;_PulC2coPx{4X6gpy-LxHxe*VbuE=5sb!5df39g5sU@g7?yzKzj&0TAs9s1^bw9m68w?ID65*L5+~MZXcEe+ z9+qXrmgYQH7!450pfqXod@G`IIVeX4ro(#Oe`kdx=+0ing3vw|rHRa(ATdaZxU}m-a3&0J z>LSt#^sv##IakjpMjlF6(;G!k#>E=kkVclWuZJ-a@xhPS$wzjW$Joc9L+KYn`7IP5 z&l>|4Cn|Tgm*6_7?MzheD<3}BGT<~;6R-j@^Gu?Qr8We#Axr|#?_TWz*!R4xobAjk zA$dSx0^(32AjM#U^QQxGsDQxmpn(fJa+Cb4FnBpLMKlAmqute)H$PPBYL=E&tDxmQ zcxjtp5K35@@>Cn+0@}7qMw)5zBvC^nIP<*sYZEA+mXdE`#`o-_Xk_WTcI4_R#~Rk= zpZ`DSDdsxo>N}l*=;GA%)+&_~MI(GO@A(-)#7|XMW*3}|gp@pMr^gcr3JU5gyvhC| zhzJL)&qgQa%+Py_BNC1Z4i01i4yctC!9u^b{d08V`?>;!e`#f4XMACDXJ&ZrWE3mx za{_DeQ^82-Gc&WJBX}$N)m_|W28P=5!m!E2`4fgj1yleF=Z{W}yw>ArW#!L6Wk&{A zy9U-zLt#Mg-@;^m^=p3!p4!kqnj;>VcP)(;E5J+2-Peh)4XIka<*9UNwJlP)+NHeMn*s zSptAvhy;lUc+^9@Ssl_nfnirOYJq0QhcEXWcuzdUj5y=EfgugqT|qMdj5e*WqVNS? zV&%fx>qEDItT$Qnn=s!SE*aA~d~wZT66MbilSB%lg*WTB5&3lTC%rJK{M zzkeGIr5RPHqLvt}xtJuj6#h(Ug%J~4=L@ntgJPJcRI3{RLN6SvT#e&UP|dL8WtyF! zh;lE2>>n%udOjGmz#?gi6NN9hLKO5l!krcDDJkQrt+TzGiv#zX01>$ZgkAzyiEw^TK{C ziTB=eI!2F#L>RnA7jhRi1S9!^ZCbMFl3EHgk?QK2Tr`Qc6Q}(m5B(AG6mJF4W|Ys^ zI=b#`#S6g4ElYxa-*b3HxLuF?#+Zya>gbvIyHh0uS4!U@?3m*X&cQ^0wKebD|!0(X-f43lUg6VcmFmr4!PvVQLBsJ0}(?S{0Y$fhbDa%kU*2$*Qzg zSc0=ATetMH6AXG_Ne2!)-|I152GsS0aA6o>6v{1f1!Xn_k+3joZ8!XY>T&=8YK6jNk1~4b3Y>i|hq$!Y}6?etyCILIai@7+`JCq>AG#UngzO2X7#RBLmxPaiN zLBaS~_M*O&yjy#hTVo1Ndl@ez{A#^l?I!H3^rzmdT58|fkI~5}{uk{K67RxylcI)1 z;}&SI!%{5-t9fxMCzgLQfBTxCDFXV255uCrtd{3MqG$imtX_^TKA~*ffKVF#f_)3t z$}J7=1acu+Eq(>g_#=5RZedce+IeCOD_3t?;&beRCG4Pj}g-qs@|u?;yva+03jDP8U&Z=QoDI3X{RZ)|_CnN7>G@)(e~M5G=8u@FH(S zWqofsZwf5fu@LP~^GiAJN16ZZc7y)8#Nq#8bD913ME=oelJ}9{+ zAaoifFisB>{OmTW;k^B3&S{rB4M*?N3 z`pl1_e)OwE{o4qhf78#k{k%v2&sw?uA4j30SpnEl`5|h_P@OTxkFmnXK!<*$*9hz# zMB$9G^_Qrq`^JGzE&~p2z;G~Lhj=K^rytsftQ)M{53NVt4My0iU55OGqg^ZF$VW;5 zxNViOrzBT9M(o@_it29@LSv|RpoT>|IHrl&5yCf5V4*`&=&ooI9_deD<@Dtp zKzQZPqA23Fhzx^z^ueFmQ1^rAOene1fwzL2H^9!ob5Q{QD7e4<1mJhU{k!Hh`YW54 z!ylU$lmrVK8ykpDnv@ID$PU7*9pccFbP=Wgk{LmL94eeKq8`&E015R5wCby%BKnX` z&mKT-0DTZ=2q38g>i4rOW7Gjt2UwON1hBydC>$z?GT|XX%eaLcL@cZ-uz*|me5j6# z)P}_1|6l2O{=BJ8|H`K3{!dNqyU@Hzxd28&q}Px=IN;Buks4rqh~Ae{@wGDehbNm#c9%kE;#@kV9}((4kO2!WgM^jYAm`lU_sg zqy~79D3DRq4j|roVmCvC8G)Bf20zM9?(fRZ!O+gsM&Id=={oX$F0QYFg8t@|*jIUw z0RFQaC@?OvijpwzKrj&G{ANbVXSW}beHAF|jPc2*Po^SJ3{Qmpr7(<)IsiRzwLTZ8 zNQ$t4{Lj#JX7&6SKUV#3r!4tL)qffyN&5do20&(jevb+9+jX-bhEfTKDG}AVN5!+29L_!$ zNqtm2(~mS)IFLaqC<=pf0F@78D~p9SYsVyF$^sOdYe%`XB-n_mb;mBjU&=(ZXRfxV zu{uBd^4a6_oDd8UV4Ja_sRGYXp8R%S=t&@0?X?^oLlJ=O5D}u78ybLk`&Jr=H24`V z4xZE*J#H|3DCB|2HO7JbR;a>L`1DE0`UbUeCNehZ0OTZ%9%UdKO+b4iK1U_kJO;vd zhIf4CYpDW}1WJJ+HYGanutQxxC&KX8I3Vg`uw_PQaYcYT2}bxAMqKjc*&eimiwM#& z=SL}2A0XpApMj>(-hBi-(9l3hg0P)udYq3c@MfttY^bG5xXIa$$nu77N!b6^5(d~u z8TQr6{9$Cy-}b+L)a_4OHOa3G{B`~@U&z{A$6yCuT0DSN!O1+dS*|AWo z&cKb`Kwep6az(fZ?})6(Mc#LVPA?ZuAXu9gfH_jWDZF&pd>a!>{s@3Gv<&A1>uRvIBN9REYoif6xe#EBR`1 z0&AZvQ_{@QnlI3uy=?lUhy*hhPvsQ~s^c)Pz9{@^^CYha!dWZ;1n|bXhiupi6Y)#! z%2$hGajS^mCMtb}pdU35|8u(n`K>GZYFFB)WDEbQ2H3xMMOm!I&>+N`gX3cg9{=l0 zQHSg6tH|Zc>nnoJFK7ECSf5ZW0gn;uh{3mYCRV+df$2|i`d_TGyQRq=mZC@i{iQlX z?0rpI`!!Xq%0Jec0EVcKS!0M|UUS)%j+4XcSR>bY#F5Ktms?0qab2MqStHJqG)Tso zu*<%&0@bwdVB@Ri82bjDlyntdEccx`luaDk;fx;_`!rM20kkFmT;o*tdgQSJ%$ zXp{Sha59eiD>mI9p_&v4lHp1EDi)C7g-kqUZt>9Q*_R!sA=IwrJp&wF!fOtY4X(_ z-!dT`rd3@%IFbu=h~pVFF$6p7$SBV!*nMsZgYu=G!Khw!f1tYJ8H-`QIJK}ZIR{bA zf=q;nkC=fZqk<|4X_!`{A`&Wq&&pBfBur5bO_1o#=1OVx!o^6UR@9s8onWJC;ex<5 zExBWo_;c8VOVMlk>H+2Vo?nLaYGxmtB~@l-v>Yw-zj~kEj88l>*}vwj_{b-D$}Le- zI;FzXt2N^zzVJuQRMw3^&e$I3nu|k5{p8_Px+u(7YZ}Mf^1-e;tlUdaZ2b8JSDD6` zp1*OfjELlZkeOp^N}9oRXSE`x5t}g5vi}34ijeO%Mn%$ zZ2MrdlSAoV+s2<$P8%3xw0>fKD6H$zCgqR#Ni_*?__cb(nSU3(2}gD_vi*7NeBUL` z`q|^nC$tdEHp~6#Ew=X^_fhjqi|m}MAaGtz_#QOaSr_>6TtaFIlw((_aXuk!1roZ2 zc@b~XrA?-!jPR<3F+53Z`7mgtHmou)uBJ9aHDfA|{VZL>=!4sA`XrGZVIHs8Sx4w&lhyd!4bJ9eyVxO4;ot!8Jx>AlY`V7TXC)AHU=I*BE~&Oy8pxf?(ec2&0{p1$N&(rR z^%%HadruwFy2S3sn_m9!-t^8chAytoUxN>S0h}8(5gf( z4HuFJIs~5(P^OZi^AJ(x`A)7E3==dMxdy1_9gr5SK;Z|hWoMy|8D9X2^aY6>LZ{R# z(F5KiA?4C6PVmEhQv13WyVnPN(0HM9+8|XvBd=`4J6wxG(fCD~R7yxhUmDW)5+D>F z(UD?L#H80XMvO(4#DLH^zWVh%DnPOfwiB#)5rA*7Cf?8i=x{pXxBf6Sek-@V_Rd%yYao$r2g%TG}Yp3w!ir-~x(@puj` zzfkCQ$2x{hUYc>Ytu->d7W8gxY&@i;sP^Lx4SDvcc)fo0Z-2D4eic_SX)D}M<*KX8 zd#kK$cSX(?kJp!#3EjIQq_oPguB-VzaozMo^UX7wY~5bZ(0^&RJ30o1Yd@bNr-R-k zp=BU|(RoLIWZb&?Jt8`^I1U69>cHv4QNp%UNt5U!NkcMs?3w;t=AL3MXt|yHwjg!q z`&?<$*`|s63ah8IEWFp2el5*eS(B8!l8FEzC4G-M?V*PktL*{j?MiRKncX~Wr!JQ41zr0WyQ+x-cb zW0hR*s1JW_dss4)U{4-Z8n!Vrdx)|5oGj1TACt$vJ9V}qY0*u$VgTIyO?%qUx}k9X z(FJvz`g>0nIM+I>mThv@ zpVY1KB9rgz8CB8fp5xA`lArpeq9}KD%OZb8eWT9bsH-j-VLrDj=+wmx%LWc8xpJ~8 zMb_J|#p%47j+c+^YG_ZKDeZB2b~Fa z{PMCQc-oH}KkgOSR?Dsl8Pxo2KbKtJXPYcamB7f?RmFWUB3i$}vtd`&<`w+&bX@6A zmgw|jUmyvu%sNqeFD$vFe0hr+mVX$$bFd&+_TGQ{fPQ6cTT{%@roEw8e$PwES0bu~ z8dtZEtWP|nz$Pgq#b(Ox;$dCAYTG}LzXE*weXlwacyPtv6IVT&BHp8wpI`84du*bi zq^zvX5s2DH=EzFUdlT%Q^?osQjk<7JX}4vZANz0RdaG!O>`(<58)Gu(E*clndGP`< zKXYz&rzU*yIQJ3Ae9`O!u;p6JU|v4(#l^supDhAw zwrDV=nWQ04$L$f&VrU7(^{};_LPy4!45Ha8c1n|y@!;5=TfW2B#v+-YpW3$phJPtK z7Q{red~6~Q?$e-HlNHPm4MwY&F;BFlLx~ckB%n`&paU4oWw~$ zlQ67h2ohi{!mt#I0fJ&l9OF<(qZJUC#WX;mXhfqC2%w=PRu~5ZL?g){z&OMb6p!%~ z3kXa=1e_y)z>x^fkPM(C5{)7VL{b7wvj_oDjKEm|6M%*#7@S54fKe<(Q5X)P2&v^@ zNoESg8Crv)fJ87F + + + + name + Symbol List + scope + entity.name.function, entity.name.type, meta.toc-list + settings + + showInSymbolList + 1 + + uuid + 0A0DA1FC-59DE-4FD9-9A2C-63C6811A3C39 + + diff --git a/sublime-text/Default/Symbol List.tmPreferences.cache b/sublime-text/Default/Symbol List.tmPreferences.cache new file mode 100644 index 0000000000000000000000000000000000000000..720f4212b58ef07810e3013a5400a05e2bc56b68 GIT binary patch literal 172 zcmV;d08{_JL;R=C0001ZoMU2OU|@mbyu{p8W+2TC#KD!hN%=VnKAFWO96)YyYDr0E zUV1STkj)6h0wA%B{BqAch(eG$W~iJYD@ZaqzW{8QDG;aTm1LGw>VeGHODoMwF3HT# z(@{VcEvYO>)ltYzElJcX$xqhJ0U8H#QE6#r3dj%@AU1F`aB(zrbJjJrbaB-+adWZM awRALc)-^MBHnT7^bToE0wgdo8iZFQa#7Z~- literal 0 HcmV?d00001 diff --git a/sublime-text/Default/Syntax Summary.cache b/sublime-text/Default/Syntax Summary.cache new file mode 100644 index 0000000000000000000000000000000000000000..a86b80fadc3edefbd37cd61576c88cd26f68ce42 GIT binary patch literal 2619 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 literal 0 HcmV?d00001 diff --git a/sublime-text/Default/Syntax.sublime-menu b/sublime-text/Default/Syntax.sublime-menu new file mode 100644 index 0000000..b555b7b --- /dev/null +++ b/sublime-text/Default/Syntax.sublime-menu @@ -0,0 +1,6 @@ +[ + { + "caption": "Syntax", + "children": [ { "command": "$file_types" } ] + } +] diff --git a/sublime-text/Default/Tab Context.sublime-menu b/sublime-text/Default/Tab Context.sublime-menu new file mode 100644 index 0000000..b5781f0 --- /dev/null +++ b/sublime-text/Default/Tab Context.sublime-menu @@ -0,0 +1,8 @@ +[ + { "command": "close_by_index", "args": { "group": -1, "index": -1 }, "caption": "Close" }, + { "command": "close_others_by_index", "args": { "group": -1, "index": -1 }, "caption": "Close others" }, + { "command": "close_to_right_by_index", "args": { "group": -1, "index": -1 }, "caption": "Close tabs to the right" }, + { "caption": "-" }, + { "command": "new_file" }, + { "command": "prompt_open_file", "caption": "Open file" } +] diff --git a/sublime-text/Default/Widget Context.sublime-menu b/sublime-text/Default/Widget Context.sublime-menu new file mode 100644 index 0000000..971328a --- /dev/null +++ b/sublime-text/Default/Widget Context.sublime-menu @@ -0,0 +1,7 @@ +[ + { "command": "copy" }, + { "command": "cut" }, + { "command": "paste" }, + { "caption": "-" }, + { "command": "select_all" } +] diff --git a/sublime-text/Default/Widget.sublime-settings b/sublime-text/Default/Widget.sublime-settings new file mode 100644 index 0000000..fe8c1fa --- /dev/null +++ b/sublime-text/Default/Widget.sublime-settings @@ -0,0 +1,15 @@ +{ + "rulers": [], + "translate_tabs_to_spaces": false, + "gutter": false, + "margin": 1, + "syntax": "Packages/Text/Plain text.tmLanguage", + "is_widget": true, + "word_wrap": false, + "auto_match_enabled": false, + "scroll_past_end": false, + "draw_indent_guides": false, + "draw_centered": false, + "auto_complete": false, + "match_selection": false +} diff --git a/sublime-text/Default/comment.py b/sublime-text/Default/comment.py new file mode 100644 index 0000000..b967afc --- /dev/null +++ b/sublime-text/Default/comment.py @@ -0,0 +1,233 @@ +import sublime, sublime_plugin + +def advance_to_first_non_white_space_on_line(view, pt): + while True: + c = view.substr(sublime.Region(pt, pt + 1)) + if c == " " or c == "\t": + pt += 1 + else: + break + + return pt + +def has_non_white_space_on_line(view, pt): + while True: + c = view.substr(sublime.Region(pt, pt + 1)) + if c == " " or c == "\t": + pt += 1 + else: + return c != "\n" + +def build_comment_data(view, pt): + shell_vars = view.meta_info("shellVariables", pt) + if not shell_vars: + return ([], []) + + # transform the list of dicts into a single dict + all_vars = {} + for v in shell_vars: + if 'name' in v and 'value' in v: + all_vars[v['name']] = v['value'] + + line_comments = [] + block_comments = [] + + # transform the dict into a single array of valid comments + suffixes = [""] + ["_" + str(i) for i in xrange(1, 10)] + for suffix in suffixes: + start = all_vars.setdefault("TM_COMMENT_START" + suffix) + end = all_vars.setdefault("TM_COMMENT_END" + suffix) + mode = all_vars.setdefault("TM_COMMENT_MODE" + suffix) + disable_indent = all_vars.setdefault("TM_COMMENT_DISABLE_INDENT" + suffix) + + if start and end: + block_comments.append((start, end, disable_indent == 'yes')) + block_comments.append((start.strip(), end.strip(), disable_indent == 'yes')) + elif start: + line_comments.append((start, disable_indent == 'yes')) + line_comments.append((start.strip(), disable_indent == 'yes')) + + return (line_comments, block_comments) + +class ToggleCommentCommand(sublime_plugin.TextCommand): + + def remove_block_comment(self, view, edit, comment_data, region): + (line_comments, block_comments) = comment_data + + # Call extract_scope from the midpoint of the region, as calling it + # from the start can give false results if the block comment begin/end + # markers are assigned their own scope, as is done in HTML. + whole_region = view.extract_scope(region.begin() + region.size() / 2) + + for c in block_comments: + (start, end, disable_indent) = c + start_region = sublime.Region(whole_region.begin(), + whole_region.begin() + len(start)) + end_region = sublime.Region(whole_region.end() - len(end), + whole_region.end()) + + if view.substr(start_region) == start and view.substr(end_region) == end: + # It's faster to erase the start region first + view.erase(edit, start_region) + + end_region = sublime.Region( + end_region.begin() - start_region.size(), + end_region.end() - start_region.size()) + + view.erase(edit, end_region) + return True + + return False + + def remove_line_comment(self, view, edit, comment_data, region): + (line_comments, block_comments) = comment_data + + found_line_comment = False + + start_positions = [advance_to_first_non_white_space_on_line(view, r.begin()) + for r in view.lines(region)] + + start_positions.reverse() + + for pos in start_positions: + for c in line_comments: + (start, disable_indent) = c + comment_region = sublime.Region(pos, + pos + len(start)) + if view.substr(comment_region) == start: + view.erase(edit, comment_region) + found_line_comment = True + break + + return found_line_comment + + def is_entirely_line_commented(self, view, comment_data, region): + (line_comments, block_comments) = comment_data + + start_positions = [advance_to_first_non_white_space_on_line(view, r.begin()) + for r in view.lines(region)] + + start_positions = filter(lambda p: has_non_white_space_on_line(view, p), + start_positions) + + if len(start_positions) == 0: + return False + + for pos in start_positions: + found_line_comment = False + for c in line_comments: + (start, disable_indent) = c + comment_region = sublime.Region(pos, + pos + len(start)) + if view.substr(comment_region) == start: + found_line_comment = True + if not found_line_comment: + return False + + return True + + def block_comment_region(self, view, edit, block_comment_data, region): + (start, end, disable_indent) = block_comment_data + + if region.empty(): + # Silly buggers to ensure the cursor doesn't end up after the end + # comment token + view.replace(edit, sublime.Region(region.end()), 'x') + view.insert(edit, region.end() + 1, end) + view.replace(edit, sublime.Region(region.end(), region.end() + 1), '') + view.insert(edit, region.begin(), start) + else: + view.insert(edit, region.end(), end) + view.insert(edit, region.begin(), start) + + def line_comment_region(self, view, edit, line_comment_data, region): + (start, disable_indent) = line_comment_data + + start_positions = [r.begin() for r in view.lines(region)] + start_positions.reverse() + + # Remove any blank lines from consideration, they make getting the + # comment start markers to line up challenging + non_empty_start_positions = filter(lambda p: has_non_white_space_on_line(view, p), + start_positions) + + # If all the lines are blank however, just comment away + if len(non_empty_start_positions) != 0: + start_positions = non_empty_start_positions + + if not disable_indent: + min_indent = None + + # This won't work well with mixed spaces and tabs, but really, + # don't do that! + for pos in start_positions: + indent = advance_to_first_non_white_space_on_line(view, pos) - pos + if min_indent == None or indent < min_indent: + min_indent = indent + + if min_indent != None and min_indent > 0: + start_positions = [r + min_indent for r in start_positions] + + for pos in start_positions: + view.insert(edit, pos, start) + + def add_comment(self, view, edit, comment_data, prefer_block, region): + (line_comments, block_comments) = comment_data + + if len(line_comments) == 0 and len(block_comments) == 0: + return + + if len(block_comments) == 0: + prefer_block = False + + if len(line_comments) == 0: + prefer_block = True + + if region.empty(): + if prefer_block: + # add the block comment + self.block_comment_region(view, edit, block_comments[0], region) + else: + # comment out the line + self.line_comment_region(view, edit, line_comments[0], region) + else: + if prefer_block: + # add the block comment + self.block_comment_region(view, edit, block_comments[0], region) + else: + # add a line comment to each line + self.line_comment_region(view, edit, line_comments[0], region) + + def run(self, edit, block=False): + for region in self.view.sel(): + comment_data = build_comment_data(self.view, region.begin()) + if (region.end() != self.view.size() and + build_comment_data(self.view, region.end()) != comment_data): + # region spans languages, nothing we can do + continue + + if self.remove_block_comment(self.view, edit, comment_data, region): + continue + + if self.is_entirely_line_commented(self.view, comment_data, region): + self.remove_line_comment(self.view, edit, comment_data, region) + continue + + has_line_comment = len(comment_data[0]) > 0 + + if not has_line_comment and not block and region.empty(): + # Use block comments to comment out the line + line = self.view.line(region.a) + line = sublime.Region( + advance_to_first_non_white_space_on_line(self.view, line.a), + line.b) + + # Try and remove any existing block comment now + if self.remove_block_comment(self.view, edit, comment_data, line): + continue + + self.add_comment(self.view, edit, comment_data, block, line) + continue + + # Add a comment instead + self.add_comment(self.view, edit, comment_data, block, region) diff --git a/sublime-text/Default/comment.pyc b/sublime-text/Default/comment.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f422962978668079255cafe6cab1f738e9a86c8e GIT binary patch literal 6283 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 E->@wl#sB~S literal 0 HcmV?d00001 diff --git a/sublime-text/Default/copy_path.py b/sublime-text/Default/copy_path.py new file mode 100644 index 0000000..fd324c7 --- /dev/null +++ b/sublime-text/Default/copy_path.py @@ -0,0 +1,10 @@ +import sublime, sublime_plugin + +class CopyPathCommand(sublime_plugin.TextCommand): + def run(self, edit): + if len(self.view.file_name()) > 0: + sublime.set_clipboard(self.view.file_name()) + sublime.status_message("Copied file path") + + def is_enabled(self): + return self.view.file_name() and len(self.view.file_name()) > 0 diff --git a/sublime-text/Default/copy_path.pyc b/sublime-text/Default/copy_path.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4f5a64850057979dc956ad886002151970b6b68e GIT binary patch literal 814 zcmah{Jx{|h5IrX?pDHjRKn!ezrA%xHAv&-jB6<}yf*sA%>!_aD&kzbS-jbLm>J*>W9?LunQBK9- zD%aM=W9`TCWL9S*4|Hl=ghKMc@|o^#0{0ZF=vH@L!=x@)f@M)8HpQw)*hyY&kT+)s zfSvK?z?pI#h6LYIQ?nX_oAJF9l4&H5E15LnAbGsMwJo5+Sfz`2nCX xmax: + return xmax + return x; + +class DeleteWordCommand(sublime_plugin.TextCommand): + + def find_by_class(self, pt, classes, forward): + if forward: + delta = 1 + end_position = self.view.size() + if pt > end_position: + pt = end_position + else: + delta = -1 + end_position = 0 + if pt < end_position: + pt = end_position + + while pt != end_position: + if self.view.classify(pt) & classes != 0: + return pt + pt += delta + + return pt + + def expand_word(self, view, pos, classes, forward): + if forward: + delta = 1 + else: + delta = -1 + ws = ["\t", " "] + + if forward: + if view.substr(pos) in ws and view.substr(pos + 1) in ws: + classes = sublime.CLASS_WORD_START | sublime.CLASS_PUNCTUATION_START | sublime.CLASS_LINE_END + else: + if view.substr(pos - 1) in ws and view.substr(pos - 2) in ws: + classes = sublime.CLASS_WORD_END | sublime.CLASS_PUNCTUATION_END | sublime.CLASS_LINE_START + + return sublime.Region(pos, self.find_by_class(pos + delta, classes, forward)) + + def run(self, edit, forward = True, sub_words = False): + + if forward: + classes = sublime.CLASS_WORD_END | sublime.CLASS_PUNCTUATION_END | sublime.CLASS_LINE_START + if sub_words: + classes |= sublime.CLASS_SUB_WORD_END + else: + classes = sublime.CLASS_WORD_START | sublime.CLASS_PUNCTUATION_START | sublime.CLASS_LINE_END + if sub_words: + classes |= sublime.CLASS_SUB_WORD_START + + new_sels = [] + for s in reversed(self.view.sel()): + if s.empty(): + new_sels.append(self.expand_word(self.view, s.b, classes, forward)) + + sz = self.view.size() + for s in new_sels: + self.view.sel().add(sublime.Region(clamp(0, s.a, sz), + clamp(0, s.b, sz))) + + self.view.run_command("add_to_kill_ring", {"forward": forward}) + + if forward: + self.view.run_command('right_delete') + else: + self.view.run_command('left_delete') diff --git a/sublime-text/Default/delete_word.pyc b/sublime-text/Default/delete_word.pyc new file mode 100644 index 0000000000000000000000000000000000000000..36c80bb3b09ae37e51068865e76a815ed4463af4 GIT binary patch literal 2390 zcma)8TTdHT5T3L4+StKd0t8f)rVo|sR4R$o+e?JPC6OXUCR!VzBB7P>9>@}VZM=tI zB6y-ze@6dKU;Esj(6_$!q5ZyD-x5V_Eq3;tIdf*tneUrfe*3dh{`s$7y(Pn+kM~nN z=_W*kKO=8M4##67heje#euUDKC@0oPoRbqM^Hko7{BW4(wtAJm;=l2$wQ?Bp@$l^6 zNvjaoMy^H9M7q8hjOvCOPtNk0#>+JIs)2EhJETe{E)Oy2#EIj=U^s0KG7G3AU4Ynl z6xp_QHoWZiqmAB`<9S-`W~WCdX&FLH#rXQTMa*{9{s87X-A<>OL@nCz#~s^v(uWWh zcgKBYlmw##q#`fY*W`F|SdgHur)}}H1w7-s|ANVNPP&i9AWt`WW+BF(VfJo(&5N&D zC?hYv+!#4O6q9@odyn==`@{_C8=ECY%wTimAPX^c?ooTI`F)E0XINy`fshZx*4n?uW1^eTvd6~Y{|Ay9Piw7t~j!=sg6&& z{mW)QQbYifYr0uj*dz*j-86P_H~B9tE3iL_vEleC)Yx>8ehML`XbNT?sLpu>j4Gz= z<)mWn1L=9MMH28hJm(Ic^bd$@Fb+v18ongOEYE;4M^>LA=LI#{(}W=xASqK>kh6kx zzn#*;!|G&ZT?{B1dqSC$ZNBodeUp>(UxDYV_cyLhHooW5m#LMZOJ7|UGM7blN$eS5 zhNmOwB^~&(3a;UTw>h~*MJYg2$fm@&gpDGf;iN#Bh2fZ<^x`;meFY4|cHFU!b+z+y zt6mQe_JZB8-q;EnZgs4DwO`w5>~A$*?A3;AbK|v_FKW-iXSH27QK=8AR>oG-9=I|I zsQa^kJX~N;L6d;as>CxO3j?C-Sghbtz>5TTC`b^ey9+1%W|!u!Kn)>wI;D7ChoJ5mK@=qbPLU z@J-xqhy6G?RRU;x>Bpz9U6_3n9AR$TlhM3-5A%TEfPh>KbV^>kyAT=U>-*ao>%q%_ z>R^dtnN}1ZSY=ctJNovm?WZ=Huro!^BUNpu=dQHYn!O&{U$9PRti|I%8)*(h+$dPX zJK#hYn|l2IMH05M?^IREPob^XMzPE8U4ja=t5nVkLc4WhFGHLmRd1UPGR`i~4^N|iVKqO`o9)yF8&FLSr=yS7Zos{CoHBO>ue4NJ(0@V{SnWH*J{I=c k7pHNOWt3EC*nt~<^VQ4$38xo&l3ihwn5B%r=9P;70A1Rxi2wiq literal 0 HcmV?d00001 diff --git a/sublime-text/Default/detect_indentation.py b/sublime-text/Default/detect_indentation.py new file mode 100644 index 0000000..9f6ae1d --- /dev/null +++ b/sublime-text/Default/detect_indentation.py @@ -0,0 +1,62 @@ +import sublime, sublime_plugin +from functools import partial + +class DetectIndentationCommand(sublime_plugin.TextCommand): + """Examines the contents of the buffer to determine the indentation + settings.""" + + def run(self, edit, show_message = True, threshold = 10): + sample = self.view.substr(sublime.Region(0, min(self.view.size(), 2**14))) + + starts_with_tab = 0 + spaces_list = [] + indented_lines = 0 + + for line in sample.split("\n"): + if not line: continue + if line[0] == "\t": + starts_with_tab += 1 + indented_lines += 1 + elif line.startswith(' '): + spaces = 0 + for ch in line: + if ch == ' ': spaces += 1 + else: break + if spaces > 1 and spaces != len(line): + indented_lines += 1 + spaces_list.append(spaces) + + evidence = [1.0, 1.0, 0.8, 0.9, 0.8, 0.9, 0.9, 0.95, 1.0] + + if indented_lines >= threshold: + if len(spaces_list) > starts_with_tab: + for indent in xrange(8, 1, -1): + same_indent = filter(lambda x: x % indent == 0, spaces_list) + if len(same_indent) >= evidence[indent] * len(spaces_list): + if show_message: + sublime.status_message("Detect Indentation: Setting indentation to " + + str(indent) + " spaces") + self.view.settings().set('translate_tabs_to_spaces', True) + self.view.settings().set('tab_size', indent) + return + + for indent in xrange(8, 1, -2): + same_indent = filter(lambda x: x % indent == 0 or x % indent == 1, spaces_list) + if len(same_indent) >= evidence[indent] * len(spaces_list): + if show_message: + sublime.status_message("Detect Indentation: Setting indentation to " + + str(indent) + " spaces") + self.view.settings().set('translate_tabs_to_spaces', True) + self.view.settings().set('tab_size', indent) + return + + elif starts_with_tab >= 0.8 * indented_lines: + if show_message: + sublime.status_message("Detect Indentation: Setting indentation to tabs") + self.view.settings().set('translate_tabs_to_spaces', False) + +class DetectIndentationEventListener(sublime_plugin.EventListener): + def on_load(self, view): + if view.settings().get('detect_indentation'): + is_at_front = view.window() != None + view.run_command('detect_indentation', {'show_message': is_at_front}) diff --git a/sublime-text/Default/detect_indentation.pyc b/sublime-text/Default/detect_indentation.pyc new file mode 100644 index 0000000000000000000000000000000000000000..12bbe929046d5bd8516a47fe9ec692952cc16899 GIT binary patch literal 2900 zcmd5;-ESL35T8AN#ZK(TO-U0d)a?uAD@8~Ysi3Cn2M7s8=u#;nQaCPmYvKYXaedByPo|~PWnVqlQAAYUZ?*882 zjOh3&IAa3kz4_=zWj! z6%gR{GQ9>-W4M{I3W1jy6A&saDIXwaP*DXk6oYmeT-#)vd15!Iz}o z1=w<={UYUSGH=Bg$lEVa{uD@4h2t_MRRTXI)j?CSwLG?Bn2Q&(q02!a^GxhkX)@17 zj|;S4qWl}BSV5U(U{kDiU#ZboWU*p_jf?AaRDkhc(5J|rdAduIXASxo-p4wRCJV$e z7DUE8eL}Q4m3fMl?7(X5_be%n5~Q9WTW3BfJsmI7Y2JYN*+sL#flE$M+$6im8q{%^ zrxPb-H6~Czo9ZA@Tch7*OkVn1lTZDhOg`gn9n=bvNQhyD#8Iz0M>VI8dO~9R53Xs7 zYgh_1uqWE5Q5zd52)NH<&;T%8_BDZ36bgdKpoJRX=a=>F=b!QO<9heIZ~6IYz1xxJ z=k;U`9MU`@Uc-aME@2oJjj$k!%TSGc-jx0#%G;PD*KT;t$f4ZzT#d`TVPn@Wa1V%V zFjM?%{ST2pL~o>FZ#NDvp9gL*$h-jH`c-SDVO?r%x=zuW5yI`oaIb5bei&&Zz0MB8 z%%q{!fem*}VDsR3lGT9}nB*g!{DEfq@P5yN(#l7To_ zh9>A~V?xZb7B+&Ne!s^%BErbl-W&{_>NmsG=r%WfXOd1kg6J3)E%5Ta{BSC_%6xkR z4PxrdF=4NtYI}k?#rA-W=isA}fhL&|q=~U&r%N9lgMzb5G%@BJ=dy?+9PNqe`gVdd zGty2}*we>3JQH@_%p=pBT`?GD;)xG{lX}@JEBw4gDys@rR8!SdLoI?<0i{k2RZ=a` zR=smxT`j34P*>DBRRPDU{Hor=w7S;>M^m*qpkjRxWNdOEfenIQ9uHIgxrSlh0vO|FBo`u79u8d`DEUh$Pf&6A%e@N6=fo2}xdrUuyz}_- za*@xMX#-`!8Riod7c^{A8tQ4^~fII9eoZIj(A)IXTvON W9>Xkm3b@p~%pzsSD{9eOz4#|IdQAra literal 0 HcmV?d00001 diff --git a/sublime-text/Default/duplicate_line.py b/sublime-text/Default/duplicate_line.py new file mode 100644 index 0000000..3a8d37f --- /dev/null +++ b/sublime-text/Default/duplicate_line.py @@ -0,0 +1,11 @@ +import sublime, sublime_plugin + +class DuplicateLineCommand(sublime_plugin.TextCommand): + def run(self, edit): + for region in self.view.sel(): + if region.empty(): + line = self.view.line(region) + line_contents = self.view.substr(line) + '\n' + self.view.insert(edit, line.begin(), line_contents) + else: + self.view.insert(edit, region.begin(), self.view.substr(region)) diff --git a/sublime-text/Default/duplicate_line.pyc b/sublime-text/Default/duplicate_line.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4830be78c19226fc7f8f5497cd66be959f96ba41 GIT binary patch literal 760 zcma)4Jx}965S_I{?i2_D4gn>lE2!uYLWF_>Q6xwwA|Wfp3tC~XO?J$O6vIobTJGCJ&0PUG;es$cpdI>S)^t>Vts0??&VoFvdNrI0dR!nR$(-V(2%6z zFrfY*lJq!$5m{}l9+vwD^Z1u4(BM@EuN+UjYpl}~_P{HBV{9ZP9*z2I@94y^$4&sqZC_Zp3nTsF zac)^#b`b*Pjr#>}XE*t{k63U!#gkVxDXrAIWr3>|YOAhVQyXeKh(t91go$H2%5)ra z$8WMcDN}6wOW1zWe96@Zl>8KANNweR7M3C5?5W8#i-5+Di?qbic@d#={m9MF<9mFQ R&+Fc=l^)2AIN{w2-T?~ik!%0} literal 0 HcmV?d00001 diff --git a/sublime-text/Default/echo.py b/sublime-text/Default/echo.py new file mode 100644 index 0000000..dc7d730 --- /dev/null +++ b/sublime-text/Default/echo.py @@ -0,0 +1,5 @@ +import sublime, sublime_plugin + +class EchoCommand(sublime_plugin.ApplicationCommand): + def run(self, **kwargs): + print kwargs diff --git a/sublime-text/Default/echo.pyc b/sublime-text/Default/echo.pyc new file mode 100644 index 0000000000000000000000000000000000000000..024cbc38f89082b2045dc8bc0e5099d38422a295 GIT binary patch literal 464 zcmaJ-Jx{|h5IrYQpa>+G_z9lM#D)+bLLeb^NG7sGY2p^Eb`sT&5E2_m{678)D+9c9 zs&uR6JKsIOdw06;pQG{DZ=061KD&6YVeSI1!WFb6%7$1_Ca8)?3DObG5y$jN^g;BT z#mr9S4l4B@&eR_wyf0sxyT;n0u7)lG_$|zxz$xfMhgc_zC`l!Mm+T@KzfUlC0QWBF z;StoHGnIfyGRt#Ur_9`s5G-Gd)x!0^Nc-B!xxy%u_RYtDR$U!RxR``w$nV4Dd0kkQ z=YAX#+f=(6y- Xsn>f7Qd^saQ7`-9u6RSC=~?s-h;30a literal 0 HcmV?d00001 diff --git a/sublime-text/Default/exec.py b/sublime-text/Default/exec.py new file mode 100644 index 0000000..f51f775 --- /dev/null +++ b/sublime-text/Default/exec.py @@ -0,0 +1,229 @@ +import sublime, sublime_plugin +import os, sys +import thread +import subprocess +import functools +import time + +class ProcessListener(object): + def on_data(self, proc, data): + pass + + def on_finished(self, proc): + pass + +# Encapsulates subprocess.Popen, forwarding stdout to a supplied +# ProcessListener (on a separate thread) +class AsyncProcess(object): + def __init__(self, arg_list, env, listener, + # "path" is an option in build systems + path="", + # "shell" is an options in build systems + shell=False): + + self.listener = listener + self.killed = False + + self.start_time = time.time() + + # Hide the console window on Windows + startupinfo = None + if os.name == "nt": + startupinfo = subprocess.STARTUPINFO() + startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW + + # Set temporary PATH to locate executable in arg_list + if path: + old_path = os.environ["PATH"] + # The user decides in the build system whether he wants to append $PATH + # or tuck it at the front: "$PATH;C:\\new\\path", "C:\\new\\path;$PATH" + os.environ["PATH"] = os.path.expandvars(path).encode(sys.getfilesystemencoding()) + + proc_env = os.environ.copy() + proc_env.update(env) + for k, v in proc_env.iteritems(): + proc_env[k] = os.path.expandvars(v).encode(sys.getfilesystemencoding()) + + self.proc = subprocess.Popen(arg_list, stdout=subprocess.PIPE, + stderr=subprocess.PIPE, startupinfo=startupinfo, env=proc_env, shell=shell) + + if path: + os.environ["PATH"] = old_path + + if self.proc.stdout: + thread.start_new_thread(self.read_stdout, ()) + + if self.proc.stderr: + thread.start_new_thread(self.read_stderr, ()) + + def kill(self): + if not self.killed: + self.killed = True + self.proc.terminate() + self.listener = None + + def poll(self): + return self.proc.poll() == None + + def exit_code(self): + return self.proc.poll() + + def read_stdout(self): + while True: + data = os.read(self.proc.stdout.fileno(), 2**15) + + if data != "": + if self.listener: + self.listener.on_data(self, data) + else: + self.proc.stdout.close() + if self.listener: + self.listener.on_finished(self) + break + + def read_stderr(self): + while True: + data = os.read(self.proc.stderr.fileno(), 2**15) + + if data != "": + if self.listener: + self.listener.on_data(self, data) + else: + self.proc.stderr.close() + break + +class ExecCommand(sublime_plugin.WindowCommand, ProcessListener): + def run(self, cmd = [], file_regex = "", line_regex = "", working_dir = "", + encoding = "utf-8", env = {}, quiet = False, kill = False, + # Catches "path" and "shell" + **kwargs): + + if kill: + if self.proc: + self.proc.kill() + self.proc = None + self.append_data(None, "[Cancelled]") + return + + if not hasattr(self, 'output_view'): + # Try not to call get_output_panel until the regexes are assigned + self.output_view = self.window.get_output_panel("exec") + + # Default the to the current files directory if no working directory was given + if (working_dir == "" and self.window.active_view() + and self.window.active_view().file_name()): + working_dir = os.path.dirname(self.window.active_view().file_name()) + + self.output_view.settings().set("result_file_regex", file_regex) + self.output_view.settings().set("result_line_regex", line_regex) + self.output_view.settings().set("result_base_dir", working_dir) + + # Call get_output_panel a second time after assigning the above + # settings, so that it'll be picked up as a result buffer + self.window.get_output_panel("exec") + + self.encoding = encoding + self.quiet = quiet + + self.proc = None + if not self.quiet: + print "Running " + " ".join(cmd) + sublime.status_message("Building") + + show_panel_on_build = sublime.load_settings("Preferences.sublime-settings").get("show_panel_on_build", True) + if show_panel_on_build: + self.window.run_command("show_panel", {"panel": "output.exec"}) + + merged_env = env.copy() + if self.window.active_view(): + user_env = self.window.active_view().settings().get('build_env') + if user_env: + merged_env.update(user_env) + + # Change to the working dir, rather than spawning the process with it, + # so that emitted working dir relative path names make sense + if working_dir != "": + os.chdir(working_dir) + + err_type = OSError + if os.name == "nt": + err_type = WindowsError + + try: + # Forward kwargs to AsyncProcess + self.proc = AsyncProcess(cmd, merged_env, self, **kwargs) + except err_type as e: + self.append_data(None, str(e) + "\n") + self.append_data(None, "[cmd: " + str(cmd) + "]\n") + self.append_data(None, "[dir: " + str(os.getcwdu()) + "]\n") + if "PATH" in merged_env: + self.append_data(None, "[path: " + str(merged_env["PATH"]) + "]\n") + else: + self.append_data(None, "[path: " + str(os.environ["PATH"]) + "]\n") + if not self.quiet: + self.append_data(None, "[Finished]") + + def is_enabled(self, kill = False): + if kill: + return hasattr(self, 'proc') and self.proc and self.proc.poll() + else: + return True + + def append_data(self, proc, data): + if proc != self.proc: + # a second call to exec has been made before the first one + # finished, ignore it instead of intermingling the output. + if proc: + proc.kill() + return + + try: + str = data.decode(self.encoding) + except: + str = "[Decode error - output not " + self.encoding + "]\n" + proc = None + + # Normalize newlines, Sublime Text always uses a single \n separator + # in memory. + str = str.replace('\r\n', '\n').replace('\r', '\n') + + selection_was_at_end = (len(self.output_view.sel()) == 1 + and self.output_view.sel()[0] + == sublime.Region(self.output_view.size())) + self.output_view.set_read_only(False) + edit = self.output_view.begin_edit() + self.output_view.insert(edit, self.output_view.size(), str) + if selection_was_at_end: + self.output_view.show(self.output_view.size()) + self.output_view.end_edit(edit) + self.output_view.set_read_only(True) + + def finish(self, proc): + if not self.quiet: + elapsed = time.time() - proc.start_time + exit_code = proc.exit_code() + if exit_code == 0 or exit_code == None: + self.append_data(proc, ("[Finished in %.1fs]") % (elapsed)) + else: + self.append_data(proc, ("[Finished in %.1fs with exit code %d]") % (elapsed, exit_code)) + + if proc != self.proc: + return + + errs = self.output_view.find_all_results() + if len(errs) == 0: + sublime.status_message("Build finished") + else: + sublime.status_message(("Build finished with %d errors") % len(errs)) + + # Set the selection to the start, so that next_result will work as expected + edit = self.output_view.begin_edit() + self.output_view.sel().clear() + self.output_view.sel().add(sublime.Region(0)) + self.output_view.end_edit(edit) + + def on_data(self, proc, data): + sublime.set_timeout(functools.partial(self.append_data, proc, data), 0) + + def on_finished(self, proc): + sublime.set_timeout(functools.partial(self.finish, proc), 0) diff --git a/sublime-text/Default/exec.pyc b/sublime-text/Default/exec.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f2584d7dbee54eaf572b85e758e3bff8ff9627f4 GIT binary patch literal 7114 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 literal 0 HcmV?d00001 diff --git a/sublime-text/Default/fold.py b/sublime-text/Default/fold.py new file mode 100644 index 0000000..6747e5d --- /dev/null +++ b/sublime-text/Default/fold.py @@ -0,0 +1,125 @@ +import sublime, sublime_plugin + +def fold_region_from_indent(view, r): + if r.b == view.size(): + return sublime.Region(r.a - 1, r.b) + else: + return sublime.Region(r.a - 1, r.b - 1) + +class FoldUnfoldCommand(sublime_plugin.TextCommand): + def run(self, edit): + new_sel = [] + for s in self.view.sel(): + r = s + empty_region = r.empty() + if empty_region: + r = sublime.Region(r.a - 1, r.a + 1) + + unfolded = self.view.unfold(r) + if len(unfolded) == 0: + self.view.fold(s) + elif empty_region: + for r in unfolded: + new_sel.append(r) + + if len(new_sel) > 0: + self.view.sel().clear() + for r in new_sel: + self.view.sel().add(r) + +class FoldCommand(sublime_plugin.TextCommand): + def run(self, edit): + new_sel = [] + for s in self.view.sel(): + if s.empty(): + r = self.view.indented_region(s.a) + if not r.empty(): + r = fold_region_from_indent(self.view, r) + self.view.fold(r) + new_sel.append(r) + else: + new_sel.append(s) + else: + if self.view.fold(s): + new_sel.append(s) + else: + r = self.view.indented_region(s.a) + if not r.empty(): + r = fold_region_from_indent(self.view, r) + self.view.fold(r) + new_sel.append(r) + else: + new_sel.append(s) + + self.view.sel().clear() + for r in new_sel: + self.view.sel().add(r) + +class FoldAllCommand(sublime_plugin.TextCommand): + def run(self, edit): + folds = [] + tp = 0 + size = self.view.size() + while tp < size: + s = self.view.indented_region(tp) + if not s.empty(): + r = fold_region_from_indent(self.view, s) + folds.append(r) + tp = s.b + else: + tp = self.view.full_line(tp).b + + self.view.fold(folds) + self.view.show(self.view.sel()) + + sublime.status_message("Folded " + str(len(folds)) + " regions") + +class FoldByLevelCommand(sublime_plugin.TextCommand): + def run(self, edit, level): + level = int(level) + folds = [] + tp = 0 + size = self.view.size() + while tp < size: + if self.view.indentation_level(tp) == level: + s = self.view.indented_region(tp) + if not s.empty(): + r = fold_region_from_indent(self.view, s) + folds.append(r) + tp = s.b + continue; + + tp = self.view.full_line(tp).b + + self.view.fold(folds) + self.view.show(self.view.sel()) + + sublime.status_message("Folded " + str(len(folds)) + " regions") + +class UnfoldCommand(sublime_plugin.TextCommand): + def run(self, edit): + new_sel = [] + for s in self.view.sel(): + unfold = s + if s.empty(): + unfold = sublime.Region(s.a - 1, s.a + 1) + + unfolded = self.view.unfold(unfold) + if len(unfolded) == 0 and s.empty(): + unfolded = self.view.unfold(self.view.full_line(s.b)) + + if len(unfolded) == 0: + new_sel.append(s) + else: + for r in unfolded: + new_sel.append(r) + + if len(new_sel) > 0: + self.view.sel().clear() + for r in new_sel: + self.view.sel().add(r) + +class UnfoldAllCommand(sublime_plugin.TextCommand): + def run(self, edit): + self.view.unfold(sublime.Region(0, self.view.size())) + self.view.show(self.view.sel()) diff --git a/sublime-text/Default/fold.pyc b/sublime-text/Default/fold.pyc new file mode 100644 index 0000000000000000000000000000000000000000..56b63f6801ffdc07543819e25fbf0581049fd776 GIT binary patch literal 4342 zcmb`K%WfP+6oyarc*fW9CB9{1Co#Fe2t|oRc7P&C3@h-W46=x1wI=Si=`i>1NhZNw zITCxG03q=TYZ-5*bNbi6%M;)I)85>X z^sk8Dk8s7mpa}499z4Lx!o`FeX8H$S|E7#<}Lr>I~K&J;&e1j)y9*5nT6h#hWPh zv2K*;WVq;up0rlPBp#oJHavro^RCySCz~gj*okIr)n=8GY`~vLmHU{m_8{T3ar87y zMp@}Ss7H-3DWPt|y{OgHUNs%7T^~i^V{PkJ(MPn1$5Fd^YqwPoZnmE!%eZ6R@2UrX zx7%v?Q8NgeNdcyq&c!U56)%}X?NfC9vdIDWT8&1n8SK!`KQ8btu9)3I94U@bxRW?r zyIG}KcaJOQ6Y1_Ppm|T^z?1&Zx`Ejqu5bS&2iU!W9E`~Rh(sQD_Mj;HMQL5b<`%fE zG=KwcZdO~y4q`~th~a_Yzr=2bMh;4XZQC!g4(fPH3wft8P6dPMETIi^ToKd1%--wU z^STC{=6LGKbbgR6cEq(spIDspIU=n)xle^5n&84szsg?g+pFr!EzH>`bEkjF7MHEZ zU%(Ez563QtvYOZ6Z! z2ItBM$yJ_@v1|ZS1n_jU=`5P8VF==!er;>bVPZGvg+6a^C4761&9arQ-QhmwUWaQZ zy$*wS?6%p`SAooJRC(U|0$3iRBC%&eL7=0NJ4cl18z)}F^8TVe5fN-v<>C0rS$ zTt6xOxL!Xis7D0%5BPI}3)Q5+4oMLx?02by!0Mq$E67pxQgw9ti>P)e(!K#s!L8%8 zsGLG-arl5&MV2}W^~EfmOSvmRtNaZN86S{f)zR$z0SRt#s-V22;;c67rNM)bS+g^ukDlgSIMuvdVZL4eeZy0{S zsa8=C!;+aX1tEm)Dti~aS;(f!<*Bfv$M@+v6-T}u+_<|>J_{d(XF`vX%{|XGasrQ; zAWhOkM#LwE1qN@bA5I#HQWoU<-;+V$Lkyoeb~HD1f(I9j-ZnR&Zx-T#9snetw*U-) zRL=wwI;!wdH%B$rv+o$E@4PFWAH`%z1E$JkD7PEM6qboBQ%Kj0`0W-y#aR{8vP9F0 z>5L?^Y4N~KbiqGmF{RTD9nqSX>)eSV#1bRxv|BD^>?q_PaSwbV4b#zHaWX&uAV zd47wAD=bby>IVA993%+s16C_Jt>b3$%)DNO+s`>c$}6@04W^}^;5nU2_W#UOC=KVo zr{SE?A_rAshZ0gWr3qwq%{vpRimKo@< zlQh!jpfXeKudt8ivQDI7bt2vQO>^1T=CPB+dpM8H7v%!`RPOMiIXREjpiD^^gz;nf zt7T%QKss=7_d*y~m3~P3nu4B6Q{TY^JDenC zlnIDq^nV0%`eJ~)N5^+jP<&K>+~+3bG;M((LXM6^)GVt+?4>OWnDprari)a1Ji3## zxGxKR@pJjmFU)~dyfSh6mMi6w#awrZ{Hb=4zMs+s*Mctrjnb^UsOvs~{dT>#7d18S z)5QLZu%D#)k|zF^d6ivdag_zn#?tj*=~_FQ_~{qNhwdBW4tF4Cq(ASCmnw^u)yjNj Hsj~bp= 36: + current += 4 + elif current >= 24: + current += 2 + else: + current += 1 + + if current > 128: + current = 128 + s.set("font_size", current) + + sublime.save_settings("Preferences.sublime-settings") + +class DecreaseFontSizeCommand(sublime_plugin.ApplicationCommand): + def run(self): + s = sublime.load_settings("Preferences.sublime-settings") + current = s.get("font_size", 10) + # current -= 1 + + if current >= 40: + current -= 4 + elif current >= 26: + current -= 2 + else: + current -= 1 + + if current < 8: + current = 8 + s.set("font_size", current) + + sublime.save_settings("Preferences.sublime-settings") + +class ResetFontSizeCommand(sublime_plugin.ApplicationCommand): + def run(self): + s = sublime.load_settings("Preferences.sublime-settings") + s.erase("font_size") + + sublime.save_settings("Preferences.sublime-settings") diff --git a/sublime-text/Default/font.pyc b/sublime-text/Default/font.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bbb718e1bb869fc2211f558665e7ccfcdef14001 GIT binary patch literal 1685 zcmd5+O=}cE5Urm5NV0LG#;-&?ij0TEqaH-mh~Oni@5#Lk>rU@7ad&3f?iG{-gb4ly zf0lp6s|S6rW}K{$7(@h@?Kj_#1g6(y!-6 z`bN@7oRKV&5#|l~C~_?Fs^5^bxg==Sf~KVHCBaH9XwiNzUWKphJAV7&2Bt6a;oJ?p zdtT(Bm%Vp;#dJEz(>g{2ou?T7GQc4^L?N`uu_1WW9!YoGu} zNRHZvBf~h56OF?l^j_RSbo>4m@a5c%+}!0u=Xd?$^(33R9q&TO^05zVP#7UAiAP#8 z9?EVLnuIMvMBwGK4}h5E3@d=jROn(pDF$g$+hmr;aKJA&so@82U9AyQ66nIa$tcjc zSDVAd9D#-y8=~MD-|js|xI25N7UzpxPhO{zxo9?{uGugcQ3tb*xfGS=Nr5EE2UC|M zffq}XX^}1_SXwSmoSfpxLP4wTdHuFg7Cm$S5sMz2%_0@mEaIwSk^CbTS*3@Phq)}t zbCa_Z@~|9A9?LyT23Xe7l2En{(6U)l%Tn30^jaE)Uzwm4Bm;a+gT|>euGl#>%>|$+~4z{ZTeIaFiaZY{s;u#SfHJ&qp$wEXG+LHnH_&Hk)L_LCA`{ idZ4upEz4qmT04^xVHIi*%NBp6PYNAwMcbR(SAGB%PY>1r literal 0 HcmV?d00001 diff --git a/sublime-text/Default/goto_line.py b/sublime-text/Default/goto_line.py new file mode 100644 index 0000000..2ec2ea2 --- /dev/null +++ b/sublime-text/Default/goto_line.py @@ -0,0 +1,33 @@ +import sublime, sublime_plugin + +class PromptGotoLineCommand(sublime_plugin.WindowCommand): + + def run(self): + self.window.show_input_panel("Goto Line:", "", self.on_done, None, None) + pass + + def on_done(self, text): + try: + line = int(text) + if self.window.active_view(): + self.window.active_view().run_command("goto_line", {"line": line} ) + except ValueError: + pass + +class GotoLineCommand(sublime_plugin.TextCommand): + + def run(self, edit, line): + # Convert from 1 based to a 0 based line number + line = int(line) - 1 + + # Negative line numbers count from the end of the buffer + if line < 0: + lines, _ = self.view.rowcol(self.view.size()) + line = lines + line + 1 + + pt = self.view.text_point(line, 0) + + self.view.sel().clear() + self.view.sel().add(sublime.Region(pt)) + + self.view.show(pt) diff --git a/sublime-text/Default/goto_line.pyc b/sublime-text/Default/goto_line.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7294cf30b024b65b8aa7f954478e8840c725dd11 GIT binary patch literal 1481 zcmah}OK;Oa5T0EpeT23Ys;Vs)KydJ>9FRC5gb)F7K@oBgg$S_<_O^9#Y%9BIC`wL2 z;>Yl7_$ypFz&GPODpaWD8PC4v^?mCfKi3=IewFQ*rcWK;ClJ?yO7JTBMAVtviaLrC zO;%B==@526Ux_9}?>Ye`HCd?1LVdnaXE*I|2`hO$1P6ep~r~A8kA>$!!%Edq2Gk*j*Fp5^K#%#+0AX{moZu7CMk03`9KRs z$cf0v+3YaHfJC_sSo`;m5XWSQvtOQh4&NW-+;qq1N!?U2SHue|kS4@^fI53d$ZMo% zqG+t8HbG#51n!dJ;%4I%I4C++G(x$W9!xZ;T#-7+x2T51P8w7!lfsi@c&dy(f>c&1jwdORnLm8tE6IUR5Zs?nCHn7k8{h}{jj<}cN)7#HJ z;!ywXO~n1+U2YAERG`+>rV7=Ds-WTS7?XE<))V;qa87%0-pfR_4SKkTx2rm(l1s(U~ElUfG9#3+yKw)i8I^n%S<;(_fN_&_AHJQSkhI#d$2uU@o8nI%mzp3!#bu8 normed_indentation_pt => 12 + \n \t\t\t => normed_indentation_pt => 12 + + Different amount of characters, same visual indentation. + """ + + tab_size = get_tab_size(view) + pos = 0 + ln = view.line(sel) + + for pt in xrange(ln.begin(), ln.end() if non_space else sel.begin()): + ch = view.substr(pt) + + if ch == '\t': + pos += tab_size - (pos % tab_size) + + elif ch.isspace(): + pos += 1 + + elif non_space: + break + else: + pos+=1 + + return pos + +def compress_column(column): + # "SS\T" + if all(c.isspace() for c in column): + column = '\t' + + # "CCSS" + elif column[-1] == ' ': + while column and column[-1] == ' ': + column.pop() + column.append('\t') + + # "CC\T" + return column + +def line_and_normed_pt(view, pt): + return ( view.rowcol(pt)[0], + normed_indentation_pt(view, sublime.Region(pt)) ) + +def pt_from_line_and_normed_pt(view, (ln, pt)): + i = start_pt = view.text_point(ln, 0) + tab_size = get_tab_size(view) + + pos = 0 + + for i in xrange(start_pt, start_pt + pt): + ch = view.substr(i) + + if ch == '\t': + pos += tab_size - (pos % tab_size) + else: + pos += 1 + + i += 1 + if pos == pt: break + + return i + +def save_selections(view, selections=None): + return [ [line_and_normed_pt(view, p) for p in (sel.a, sel.b)] + for sel in selections or view.sel() ] + +def region_from_stored_selection(view, stored): + return sublime.Region(*[pt_from_line_and_normed_pt(view, p) for p in stored]) + +def restore_selections(view, lines_and_pts): + view.sel().clear() + + for stored in lines_and_pts: + view.sel().add(region_from_stored_selection(view, stored)) + +def unexpand(the_string, tab_size, first_line_offset = 0, only_leading=True): + lines = the_string.split('\n') + compressed = [] + + for li, line in enumerate(lines): + pos = 0 + + if not li: pos += first_line_offset + + rebuilt_line = [] + column = [] + + for i, char in enumerate(line): + if only_leading and not char.isspace(): + column.extend(list(line[i:])) + break + + column.append(char) + pos += 1 + + if char == '\t': + pos += tab_size - (pos % tab_size) + + if pos % tab_size == 0: + rebuilt_line.extend(compress_column(column)) + column = [] + + rebuilt_line.extend(column) + compressed.append(''.join(rebuilt_line)) + + return '\n'.join(compressed) + +class TabCommand(sublime_plugin.TextCommand): + translate = False + + def run(self, edit, set_translate_tabs=False, whole_buffer=True, **kw): + view = self.view + + if set_translate_tabs or not self.translate: + view.settings().set('translate_tabs_to_spaces', self.translate) + + if whole_buffer or not view.has_non_empty_selection_region(): + self.operation_regions = [sublime.Region(0, view.size())] + else: + self.operation_regions = view.sel() + + sels = save_selections(view) + visible, = save_selections(view, [view.visible_region()]) + self.do(edit, **kw) + restore_selections(view, sels) + visible = region_from_stored_selection(view, visible) + view.show(visible, False) + view.run_command("scroll_lines", {"amount": 1.0 }) + +class ExpandTabs(TabCommand): + translate = True + + def do(self, edit, **kw): + view = self.view + tab_size = get_tab_size(view) + + for sel in self.operation_regions: + sel = view.line(sel) # TODO: expand tabs with non regular offsets + view.replace(edit, sel, view.substr(sel).expandtabs(tab_size)) + +class UnexpandTabs(TabCommand): + def do(self, edit, only_leading = True, **kw): + view = self.view + tab_size = get_tab_size(view) + + for sel in self.operation_regions: + the_string = view.substr(sel) + first_line_off_set = normed_indentation_pt( view, sel ) % tab_size + + compressed = unexpand( the_string, tab_size, first_line_off_set, + only_leading = only_leading ) + + view.replace(edit, sel, compressed) diff --git a/sublime-text/Default/indentation.pyc b/sublime-text/Default/indentation.pyc new file mode 100644 index 0000000000000000000000000000000000000000..34fb69303a88b869cace51a1aa781bc9609d4e64 GIT binary patch literal 5650 zcma)AOLH7o6+X9TG@~BP=;4R_z{Z1FWNcExP89@5Vh5~HE*>JZotVg0I-}{9)k#lx zt8b4b2iY6DiVZBNVnxA{EgSv;|A4>1FQC{$6@1^h^N@`bF;d^Y@5edc`Odlhw|{n8 zzxr2kXCUL>Jl^l(v42Mr;orz-BAe5^kxetH_hi$XV zb=c>b$VZzeBwCdCgw`%iYfnnFJgHro)}G>ucX}sq%;Z1#Z43;ueCl{^;jtHxR3eAy zVYono(_%eOp5dQ^Yv{01QDjwrJG9B?al(SuS8PnON}Fw5RY~^HYURVY>T#Wl3q4BW z{T|+;iCso+?VCv!#aY#_k~~{09#?HtVo*3)q=~Zikcb&@6|Oml=N2COS0rxJ*y0oD z1ZjPIhC>_!#W^|ny;PnY&Ph_^!45siJ7QR_vz)b1FylrXc6}?6Ck>rsP7WJ7NmCA? zPftF@*j04L8Z~k0>e)B3fGrx}Q8s?5Ll9(k*hEP+;ABr)%SMZ99ILWW6ihGRBzX zQQW;eovF&Zw(6G^yQWDNx27#E-}kxPJ2%GjheuQq78M(=zcK6H?dpJIx=;JBCp$ZF z3DtJ{!+eAnHZa)jm;FH%m-h9p?GNLwJ5cw?!fQG~0*QzvaD2cKfFTS5>Ro}vgH#Qa z4$6K8w6H;CpqPuZNE_{F+g4@8p^3Fce-QVGo`B-kju2htqmboUsOV-C2@noo zKUd>i2d43#1GK>76YTw`02?~g;5Fhmzw~kwfjKd7v-d4A_gI9btBsq? zX#1TW<>@$rGT>$`pG!y%&T{Il6?tNWW}|HMq1kK5y-0v%YHLH&U;)`4Cs5g~U8~qO zI7Wh&3VHisoW%!4dE*->sP+33G?2b@qV9}&`e~~AEb>AX-!BSa!0`@IGRV`>Fgs@9 zYDs$zi!!!0bVIIidD4`4XH2WMVrp{MESZ(sfXCu9r6P8vFp;W;ps{n`glUe%9iXtFNbi5GbRPIf@?J;lQtz=00u#}q)1dx$&!6)if<*-+hX=^%Zxsq zFpn~Z%9U1E#RpYbRk%~;!|;EV@D^H?4Qk?>Rnztw-l-`cw7iz-i0`R#hz#yi+28>(58FsD}b|LT0dUU~YYDm5PHvVJa8}H9v)}&r^KbRUWzWD zBUUl=HQf%rii#e$<3y%}7N_xmj>sx4hxe~sH<8YQ3rsFD`8pCcLU$}4 z&{laFN5N}szQSfaUly})vQjP7>D!H;orchv#4tn}cQ7@$@1ro)A`bKnhIw$6`d#0; zOe35%;$%*Dlc>z>oq2(FXNu$WgER(oxmZ7ng4gj@%5>-Kph#R=Wrw1&0lD_Llaf-v zkCe~sc=iL-+Ib|P6t4*!C(IAH8!j`|+D*XAod%piHmFm54AIUTAO+Y&<@#3JkbN3t z75X?(Mnej^F62DW!o1K?aip)~TXOIhWu&GX|0iXy1$ojY2J)*I*`^ghvhDl=N-YvH z5KB&3kV{w;|K@#le`tf1w6%s*MIOSsh|`^SW%!3OcB?5#%k5`e9&_78bn|r?&|8bM zaS86ZC41W-uWgW*c5tm4kIwO`kYH2(WWe5K=oelVb+A{4;l$^L@?1-$tl^R4Js1Qu zNIhskWQ#PZG`@+m(J(F%O{z;)7YR;em_!w&iLHXO$OPmpt@;#f*`w+zCD2_cyDAaW zD+gAjzn!GCl_R!%XNMs_`6AEK$01M`p|9>i5vG$2a_3p&NTY!?36x66r#iHZw?|3p zrVP%ZHuxHwxIspZ#{rY49x-Nsue*=Dy@o{Ks~cWN5O4vOi(X?~I&ID%-0GN?hF>e@ zBm%IGIq&I4@AkKE<-;N78E^{zXhJ{0V@Vh>E_y~{T+M1saW#uXZ)$TAI09ARb3-)3 zA9LKlkvQO!f;}ndRv11RR&$oPd$8iz*z=AqaNm@*KIq4j6{P57diuX;_Wg;%@-hs>5Nt1z|VUq86|m ztWpt~EYXIlWo_n!D>Rs0+#4a4Ir%n6K{{j9Rs>mvh~4sL!yBFrtK3E2R>7=Du!AyB zQ^l5r!SMHwn=Y=?i-cZd9f|p9n@$*zT9xhyM|!K>zD3-Vh4HYc9?$qHbX-020g5u- zXcgLdL0f@S8~3y7(t@j;op8mSCD~5najT*^$^+s}Io3_KoA0Xu{IH*5H;jbKQHH2e zf#qzJ(1yd?(E)J;TP3@qcQ`$g%1DK>znf#p?Gf)(y5wj3P6XpwtcHx^tsQ49#51<@ zl*`fP#rWO{bJ06(E_+K}+k6F)VF$LeY?N*^3<|>x7q&1|8wtZ<9*wY}F!%|E2kS`m z7YxZft$Qmwc^^EQjzi0Y<{ixgMTKpB;ZBP&{gi>es%1V3X!nsxIa<07${JYOx! zAED##@L19?^ofwN#emZ2T`u?#mBBqGzhFXr1spP)_Dj_C5jy@B&rD5R_vC43UAO|?V-QUny3YUy)i##%yvs`NuGAu{-Qs--*nSq5Lipry%Y8GsJj zaQp=Qtil(=?C95#!h2&T5NpjKQb0fI4mC)@j7QbSZEpnMMe05@)R8-)LvB^?Wx-A6 zHrY?>W-8;@SLrR_bxRHVMUM$Kssi2uW*Ycn#r_ffEXm=hVo!QYFk2V7zNFs&TeA-^ zxHsQ8S4ulLFQS7XkowX7s{B*f#bVrSfnF-d2*ssCg3hLj?n9Z2G>dq z8+jHhg(^onwp1umqRNkVvB=o*Dlr6vUBDgAMD)cV)qTG0Sm_4o!gi6g&G^srYwb(^ UqF?t 1 and len(regions) == len(lines): + # insert one line from the top of the kill ring at each + # corresponding selection + for i in xrange(len(regions)): + s = regions[i] + line = lines[i] + num = self.view.insert(edit, s.begin(), line) + self.view.erase(edit, sublime.Region(s.begin() + num, + s.end() + num)) + else: + # insert the top of the kill ring at each selection + for s in regions: + num = self.view.insert(edit, s.begin(), text) + self.view.erase(edit, sublime.Region(s.begin() + num, + s.end() + num)) + + def is_enabled(self): + return len(kill_ring) > 0 + +class AddToKillRingCommand(sublime_plugin.TextCommand): + def run(self, edit, forward): + delta = 1 + if not forward: + delta = -1 + + text = [] + regions = [] + for s in self.view.sel(): + if s.empty(): + s = sublime.Region(s.a, s.a + delta) + text.append(self.view.substr(s)) + regions.append(s) + + kill_ring.add(self.view.id(), "\n".join(text), regions, forward) diff --git a/sublime-text/Default/kill_ring.pyc b/sublime-text/Default/kill_ring.pyc new file mode 100644 index 0000000000000000000000000000000000000000..33cbef2ebba6e3cd283ad0b2e6c09f86bf5274d7 GIT binary patch literal 3608 zcmbVP+in|082)G1huCe>w1Kt;+LWkBrnH3u0;EQ$he%vhio~Q+)S$3(yqk0rd+m7F zZ7SKl34$l!nit_Ecmr;D0WP@V0>1B`T{~1sT9IUC=lGxI`~I2y_UCNJhnD`2}=@*#3k9ry7FX2S;ESZ ziRxscLKSPx8q~%A;Ab_PLGw}E>DV~gnb>78_y8sS1{D<03ZW3_h5$C8+tWrVH*Et- zOF9B2YRX2HW^nP0*tKRAvf7mFqm)n{qNLxWg2<6bAhLsrv5`#sG2At>vNaAG z?In?pZ4I}#qk)b+jap$wF`X#M&fvR;hz0##oMdT6zqB8Rs!DgHQD<8l!FP8y;SY2- zQHfUR99p+O)=dM%{dWI_oCtQM&(5e=TV*~qmuOMm@UhAMv|(oLu-UT1gb2%p7b7J6w8+I!B|CSs?r#FF4V=q^8W8w;R0QZ zHS{ow-g1(=0O`n9w5m*Lps8~d=cSQ%kYzL!EtaTO{b=+dx3MswP|Zof5% z@`=+Aokq68uz^o{9hI1Qf6l9zim6HkXMf47nz~o<=KZQ!@|OHr?>LZiI}gCsfOQUa zPcBYaPEAvmD_D;}l+cQkFgkd>xk!9pVfCw|r~eN*&UiaxiUgy?P)=xzhj+RfiU7%j_%{V(KYNkDiKx}vE7XhsKg zLI&FfQGXFL8DaxD023hck75q~5CnHJjfs`bJxv*q2vU>#NRMpQ3M$mhBL!I6@5EUrPNGyZIkSZ(7hKwi7FZuWiw0?AiEvB7nvdcn z#dE-3V4v)Y2CX#G_33a6PYL&Gu$pNsbAFSUa7l^TDhlJwWhCxa^_FnAB)ff^6*uT( z!5PLiYFIMtPH}z=#C6eNnB2$yJnPiWS?{cO1G(m=zktkB$M03MXx{UghuCTp<1F-0 zVM}@etgv7Lu;OOKOnw1sP?p%`-Zywx(8o9pqNKIei9$SXC-m1GzDOz8Sbf6k4yviI zCvy6IEW3xI4+U_#k-df9{V;sodz8OsPo(sDtbB#iU^2aF`>2Qj77fX-Xn<;9E128I z?TM!)I>n7#B8hP?AM7f$3(Bu-J}GFc#P3}LO?^V2Oa{MQ?JHTpZ;Auw^ZOQ33YOy> zcyDq-S#S0~lXZ}q48k(}DNjSl1~+lrgS-$ArKS8~!x+1VjXwBOx>;{(UcHW{{Q#AN zbGM(pupe^l2FJLtWf?0)KQNwV1IvTg44e@)ai|2^#Y0%1_lgGl5!djgsB%M)s-?Jh z7{7&y=>Z=DX2k*jEl4k;65gD=G4Y)Ta%aso(=g{feQMkPf@doBMBID|iJO#7^DD;f z;A!hcpA$LgcZPUyxL{yT)NQ>h9^=)Q1IrSFmI7a|S1-9`cddQR$m)CWvbS)z<~6ST E3kk9;s{jB1 literal 0 HcmV?d00001 diff --git a/sublime-text/Default/mark.py b/sublime-text/Default/mark.py new file mode 100644 index 0000000..284b52c --- /dev/null +++ b/sublime-text/Default/mark.py @@ -0,0 +1,43 @@ +import sublime, sublime_plugin + +class SetMarkCommand(sublime_plugin.TextCommand): + def run(self, edit): + mark = [s for s in self.view.sel()] + self.view.add_regions("mark", mark, "mark", "dot", + sublime.HIDDEN | sublime.PERSISTENT) + +class SwapWithMarkCommand(sublime_plugin.TextCommand): + def run(self, edit): + old_mark = self.view.get_regions("mark") + + mark = [s for s in self.view.sel()] + self.view.add_regions("mark", mark, "mark", "dot", + sublime.HIDDEN | sublime.PERSISTENT) + + if len(old_mark): + self.view.sel().clear() + for r in old_mark: + self.view.sel().add(r) + +class SelectToMarkCommand(sublime_plugin.TextCommand): + def run(self, edit): + mark = self.view.get_regions("mark") + + num = min(len(mark), len(self.view.sel())) + + regions = [] + for i in xrange(num): + regions.append(self.view.sel()[i].cover(mark[i])) + + for i in xrange(num, len(self.view.sel())): + regions.append(self.view.sel()[i]) + + self.view.sel().clear() + for r in regions: + self.view.sel().add(r) + +class DeleteToMark(sublime_plugin.TextCommand): + def run(self, edit): + self.view.run_command("select_to_mark") + self.view.run_command("add_to_kill_ring", {"forward": False}) + self.view.run_command("left_delete") diff --git a/sublime-text/Default/mark.pyc b/sublime-text/Default/mark.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0ba2b3d0dad39556ce213dde786e1aa461bfc60d GIT binary patch literal 2250 zcmbuAU2hvj6o${NKavy-OwF!RuH)DtFR;F3NO|!^UXT$+WRDS=h|Di#J_>weiVhd8^&2$_zgT4lZQz> za-Ls&bJS`bwmsM3yF=SK>U0m=-6kiZu@K@^8!n2yHo_l1?|II+u(VBFr71Y``=2qV z`{N%qfqarO&4L4o`P95)Gmccmbf=gaE z{swNH^Zxia_K#jiJub~sz2EV$lnrWJ8iA0iC&VlD43>IAKlE0i=g0E2BD31!6%Y$O zL1C$9l}ch6<9ewlwwX5RZ}mQqS$z>wM~%1SqRtP^<6q@C#eIc_ z>SDP#inrxjDF;L67aUmXVkxtwIF@s_ltpz*TgC#ahSfVvyphW#*jRlFFKBQNkG=PlsnU5VEK&-!DM`?y|q zPH-u?zm%&zH0IKvNR*1No&$Mg1dv4)`2sX8iUi(-PK#~NSmgnRdJXDBpXs*r+!(C> zcs`4hB+TP&o8(z1}aQy)e;pK|MQ{ndl|9S+K~P{sSYpA@di?Cr7+{I48z z&a3}*bL$m$_H6|Cgh4ncN`uxQBBjUm{2&X*$z&L(nsV1o{rvdWgTitNEETkjwaQjo aR|}Jtw6DsOXpdSJn=tPOyY=11?)E>b_+S43 literal 0 HcmV?d00001 diff --git a/sublime-text/Default/new_templates.py b/sublime-text/Default/new_templates.py new file mode 100644 index 0000000..f288b7b --- /dev/null +++ b/sublime-text/Default/new_templates.py @@ -0,0 +1,53 @@ +import sublime, sublime_plugin +import os + +class NewBuildSystemCommand(sublime_plugin.WindowCommand): + def run(self): + v = self.window.new_file() + v.settings().set('default_dir', + os.path.join(sublime.packages_path(), 'User')) + v.set_syntax_file('Packages/JavaScript/JSON.tmLanguage') + v.set_name('untitled.sublime-build') + + template = """{ + "cmd": ["${0:make}"] +} +""" + v.run_command("insert_snippet", {"contents": template}) + + +class NewPluginCommand(sublime_plugin.WindowCommand): + def run(self): + v = self.window.new_file() + v.settings().set('default_dir', + os.path.join(sublime.packages_path(), 'User')) + v.set_syntax_file('Packages/Python/Python.tmLanguage') + + template = """import sublime, sublime_plugin + +class ExampleCommand(sublime_plugin.TextCommand): + def run(self, edit): + $0self.view.insert(edit, 0, "Hello, World!") +""" + v.run_command("insert_snippet", {"contents": template}) + + +class NewSnippetCommand(sublime_plugin.WindowCommand): + def run(self): + v = self.window.new_file() + v.settings().set('default_dir', + os.path.join(sublime.packages_path(), 'User')) + v.settings().set('default_extension', 'sublime-snippet') + v.set_syntax_file('Packages/XML/XML.tmLanguage') + + template = """ + + + + + + +""" + v.run_command("insert_snippet", {"contents": template}) diff --git a/sublime-text/Default/new_templates.pyc b/sublime-text/Default/new_templates.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0a666f4133d0f057f4a91300c9c13ef0dc4fb551 GIT binary patch literal 2481 zcmc&#TW=dh6rOcrJKof!6eun5uyOO?O1=ahc(5!(8<0>{(rBEjkPxjl-ibZU-n280 z6Q$-QNc;qT7k`CU9^gB(YiEN*CDceHp4pi>XU=WD`R4aO>h`aHCc_cS|0?)?jiwYj zA3uwoGIp>WTkODEte4n9iTNcaEGAdj3D#HGFN|F=_T#}S^H&Rk@={P{ex)F&E(I0x zHEgcIulx&tyZR#xcg5`KR0jU=LTM51#9`<~{xVt%8c)&G`{)GXG_fHD1jdI=5|5}` zK`W!}ps6XkH*kWVMZwN3_68Z0XpB4%gDwAupjx4Xt&mz?tWqM^XGqEXC zn)qclFBwzol;Z?uQJyOM5<4xFGRtjOufxADPP}QLU08l%u}^qj-S z*5!6D^iIXRab(YJ{T{?Jf-mi=NG6HUn(94@BP}AWns+eK1c8~1{CH-Bk(jwBG7x5> zutP>;rB|RtlM=qMGC3rko|wVwSVpKEmDli0_Vy;o!$hN!cBGTUZ4f}57g~Ajm zoks2`JMkv@Gscw&PBfkAnF$D>NCHobCRUi~)IE$kT?%_4RGs9)L=1}r14VUU)&~AR zv+7p8T(L3-R1DVy;JVs2lQ8zDfpA^^A*R<}-sXx!lhLUvs!qkyckuy`_k!tIMz@0D z2`t_chJoH3wm@=u0ozIewse%coNCS~A+?EaiPOCcJ&B`k_9>$DH)zQ)iBs+5IA|>f zZel87+oQl!%K7%(!y$^iFwI;$SL*DGbDfJG_v{*Oj)P-t5)N99@TI2J+SWELbk3xh zbuxrEN!D_cw~wJu-WPbIn1Huo zcExW6a6iN3y8&*=ub@~ECO9#t(sIV0l>!W_3mC2yU`QuYfT5-=7d#4#h)BseQifS_ zPRuz@eG1JbV1M}jc^9n+)vti1pTyi`FT%Iq?$WY zIi7?07rlJrykj374f@^1X4u(mx1AS>Mp$0ZbB01=i}sH9Q#l@s)X}kn_+=!VNj#&O zUI-?_$*nr=Hbq31`qx_r6GC*qTUaS5{?nxz#fc#McqpWHW)qQOTJSNGL9ldQaA-CT zR6I>bf+!Rhz2D6ijXO*-hzqU8)DL_=v1#B;GXCU>-ugt@lUpey-aJrqGtX-3X8U5QsMfB6po}B@auA+qp)}7MBjfZ#t22rsIb^rhX literal 0 HcmV?d00001 diff --git a/sublime-text/Default/open_file_settings.py b/sublime-text/Default/open_file_settings.py new file mode 100644 index 0000000..c701d94 --- /dev/null +++ b/sublime-text/Default/open_file_settings.py @@ -0,0 +1,12 @@ +import sublime, sublime_plugin +import os.path + +class OpenFileSettingsCommand(sublime_plugin.WindowCommand): + def run(self): + view = self.window.active_view() + settings_name, _ = os.path.splitext(os.path.basename(view.settings().get('syntax'))) + dir_name = os.path.join(sublime.packages_path(), 'User') + self.window.open_file(os.path.join(dir_name, settings_name + ".sublime-settings")) + + def is_enabled(self): + return self.window.active_view() != None diff --git a/sublime-text/Default/open_file_settings.pyc b/sublime-text/Default/open_file_settings.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0895b24d65f08a025e44af1c0ab253d08f15a333 GIT binary patch literal 1047 zcmb7DO>YxH4E5|LX_K~82t*P5fxQq8ToD2y^%$g$5MqTi+GHnT+Wk^y(zH@~N+o_D ze}yXtcy@MEZa_5S_1GT!*>Cdw$I0N^&w4VW=GVjbEw+0HkzpyiBue(WqC~a!fRd21 zfQ%yBp*id!-4ShxJ||tiIf**RVt?T`_GeH()TTVQxtSR6ZMkrxswmPj+gDeJd5`U$ zK^WAPTF99MoR5`|;z<<1J>%eRvq$(kxM_oWSc*~HD)Ir@kkK_tmo@;~W3N5nl-qWF z3FsCpY$FfJ_sI@85-o1w>a@v^?qfDE0$NCCh(IotQPcI<^C;a->CGrCan(J}eao(sM8r@nq$uGx=N;fx_2X z+*(R94O$9kb}6O^782o@^x?~WR^475);9ugxhlDk`pkk0Aae z7DK)WF=q}MN8DyCf*Td6Ky+z%c?+@`|NHE&XZjIaceU z%2v72I)02}`~>2@)L;9L5l)QQvFNFOFX9&y%VT)J_8n8Y&R2_uyvhxks#wTjDn7}B ZY5qo%@jnnqORslLyy002lBeo8_ziRe((V8N literal 0 HcmV?d00001 diff --git a/sublime-text/Default/open_in_browser.py b/sublime-text/Default/open_in_browser.py new file mode 100644 index 0000000..042f141 --- /dev/null +++ b/sublime-text/Default/open_in_browser.py @@ -0,0 +1,13 @@ +import sublime, sublime_plugin +import webbrowser + +class OpenInBrowserCommand(sublime_plugin.TextCommand): + def run(self, edit): + if self.view.file_name(): + webbrowser.open_new_tab("file://" + self.view.file_name()) + + def is_visible(self): + return self.view.file_name() and (self.view.file_name()[-5:] == ".html" or + self.view.file_name()[-5:] == ".HTML" or + self.view.file_name()[-4:] == ".htm" or + self.view.file_name()[-4:] == ".HTM") diff --git a/sublime-text/Default/open_in_browser.pyc b/sublime-text/Default/open_in_browser.pyc new file mode 100644 index 0000000000000000000000000000000000000000..40d0f86fc26361966c053a96aabb80c301989f2b GIT binary patch literal 927 zcma)4!EVz)5S_KtKubX!kcxVMtJOmyI3k3gy?|(g0Z`eq#3sA{F!p7HFyotZZ?`{(@e#_x+}Jf-E+$NxRVe}F3RDf&T_UD=8<^?yI2 zETSSJqsYcI!+uP^h|Y+PvL1VmlOCeje|SdW8O$$@ai84oyk2-S->a)?;)<)(3I}!} zejCalsU$)`&Z0PS7E?M-BEVBtEHPvc;$K6ZA{jo#6zUhGLd3-2y9#WbDN+tn5D0RN zk$(U^v!!`6917*YypOF}g!Lt&-J~*M1FMC}^R9rfiDiwFv@;7GCb>itUvJ8p7^bix z!7&o$xe0@z_*kcxaR$vv;5z25Tf@(Da#By#lsm%0Ly;m|7^}6^hScgBrM|>KzDLx2 zz6FT|d36Kn!Dmg7ty_>jBjbcSG_n_%q-TzUZ=otX>*L|UzWvJp^JbtkurK{cxq_7Y zoQTEl_vr}t+IoF#z0FI*bMOzLNbRU?yxp95N6T!qmg#6+)kRwxty89)@`3AYV%<4} z6laNxkOKN@y_YcAz=3?5mlikR$+fMUvi)jZ%A*U9pbpK?u)Nd~>b`jclYHCpe#bqM J{Lj^9bP4v~uY~{r literal 0 HcmV?d00001 diff --git a/sublime-text/Default/paragraph.py b/sublime-text/Default/paragraph.py new file mode 100644 index 0000000..bb5fb22 --- /dev/null +++ b/sublime-text/Default/paragraph.py @@ -0,0 +1,211 @@ +import sublime, sublime_plugin +import string +import textwrap +import re +import comment + +def previous_line(view, sr): + """sr should be a Region covering the entire hard line""" + if sr.begin() == 0: + return None + else: + return view.full_line(sr.begin() - 1) + +def next_line(view, sr): + """sr should be a Region covering the entire hard line, including + the newline""" + if sr.end() == view.size(): + return None + else: + return view.full_line(sr.end()) + + +separating_line_pattern = re.compile("^[\\t ]*\\n?$") + +def is_paragraph_separating_line(view, sr): + return separating_line_pattern.match(view.substr(sr)) != None + +def has_prefix(view, line, prefix): + if not prefix: + return True + + line_start = view.substr(sublime.Region(line.begin(), + line.begin() + len(prefix))) + + return line_start == prefix + +def expand_to_paragraph(view, tp): + sr = view.full_line(tp) + if is_paragraph_separating_line(view, sr): + return sublime.Region(tp, tp) + + required_prefix = None + + # If the current line starts with a comment, only select lines that are also + # commented + (line_comments, block_comments) = comment.build_comment_data(view, tp) + dataStart = comment.advance_to_first_non_white_space_on_line(view, sr.begin()) + for c in line_comments: + (start, disable_indent) = c + comment_region = sublime.Region(dataStart, + dataStart + len(start)) + if view.substr(comment_region) == start: + required_prefix = view.substr(sublime.Region(sr.begin(), comment_region.end())) + break + + first = sr.begin() + prev = sr + while True: + prev = previous_line(view, prev) + if (prev == None or is_paragraph_separating_line(view, prev) or + not has_prefix(view, prev, required_prefix)): + break + else: + first = prev.begin() + + last = sr.end() + next = sr + while True: + next = next_line(view, next) + if (next == None or is_paragraph_separating_line(view, next) or + not has_prefix(view, next, required_prefix)): + break + else: + last = next.end() + + return sublime.Region(first, last) + +def all_paragraphs_intersecting_selection(view, sr): + paragraphs = [] + + para = expand_to_paragraph(view, sr.begin()) + if not para.empty(): + paragraphs.append(para) + + while True: + line = next_line(view, para) + if line == None or line.begin() >= sr.end(): + break; + + if not is_paragraph_separating_line(view, line): + para = expand_to_paragraph(view, line.begin()) + paragraphs.append(para) + else: + para = line + + return paragraphs + + +class ExpandSelectionToParagraphCommand(sublime_plugin.TextCommand): + def run(self, edit): + regions = [] + + for s in self.view.sel(): + regions.append(sublime.Region( + expand_to_paragraph(self.view, s.begin()).begin(), + expand_to_paragraph(self.view, s.end()).end())) + + for r in regions: + self.view.sel().add(r) + + +class WrapLinesCommand(sublime_plugin.TextCommand): + line_prefix_pattern = re.compile("^\W+") + + def extract_prefix(self, sr): + lines = self.view.split_by_newlines(sr) + if len(lines) == 0: + return None + + initial_prefix_match = self.line_prefix_pattern.match(self.view.substr( + lines[0])) + if not initial_prefix_match: + return None + + prefix = self.view.substr(sublime.Region(lines[0].begin(), + lines[0].begin() + initial_prefix_match.end())) + + for line in lines[1:]: + if self.view.substr(sublime.Region(line.begin(), + line.begin() + len(prefix))) != prefix: + return None + + return prefix + + def width_in_spaces(self, str, tab_width): + sum = 0; + for c in str: + if c == '\t': + sum += tab_width - 1 + return sum + + def run(self, edit, width=0): + if width == 0 and self.view.settings().get("wrap_width"): + try: + width = int(self.view.settings().get("wrap_width")) + except TypeError: + pass + + if width == 0 and self.view.settings().get("rulers"): + # try and guess the wrap width from the ruler, if any + try: + width = int(self.view.settings().get("rulers")[0]) + except ValueError: + pass + except TypeError: + pass + + if width == 0: + width = 78 + + # Make sure tabs are handled as per the current buffer + tab_width = 8 + if self.view.settings().get("tab_size"): + try: + tab_width = int(self.view.settings().get("tab_size")) + except TypeError: + pass + + if tab_width == 0: + tab_width == 8 + + paragraphs = [] + for s in self.view.sel(): + paragraphs.extend(all_paragraphs_intersecting_selection(self.view, s)) + + if len(paragraphs) > 0: + self.view.sel().clear() + for p in paragraphs: + self.view.sel().add(p) + + # This isn't an ideal way to do it, as we loose the position of the + # cursor within the paragraph: hence why the paragraph is selected + # at the end. + for s in self.view.sel(): + wrapper = textwrap.TextWrapper() + wrapper.expand_tabs = False + wrapper.width = width + prefix = self.extract_prefix(s) + if prefix: + wrapper.initial_indent = prefix + wrapper.subsequent_indent = prefix + wrapper.width -= self.width_in_spaces(prefix, tab_width) + + if wrapper.width < 0: + continue + + txt = self.view.substr(s) + if prefix: + txt = txt.replace(prefix, u"") + + txt = string.expandtabs(txt, tab_width) + + txt = wrapper.fill(txt) + u"\n" + self.view.replace(edit, s, txt) + + # It's unhelpful to have the entire paragraph selected, just leave the + # selection at the end + ends = [s.end() - 1 for s in self.view.sel()] + self.view.sel().clear() + for pt in ends: + self.view.sel().add(sublime.Region(pt)) diff --git a/sublime-text/Default/paragraph.pyc b/sublime-text/Default/paragraph.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b57254569767fa10c9fbf6da54ae29d33a32b0da GIT binary patch literal 5829 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 L<~N(?*V_L9iHQhl literal 0 HcmV?d00001 diff --git a/sublime-text/Default/save_on_focus_lost.py b/sublime-text/Default/save_on_focus_lost.py new file mode 100644 index 0000000..939259c --- /dev/null +++ b/sublime-text/Default/save_on_focus_lost.py @@ -0,0 +1,10 @@ +import sublime, sublime_plugin +import os.path + +class SaveOnFocusLost(sublime_plugin.EventListener): + def on_deactivated(self, view): + # The check for os.path.exists ensures that deleted files won't be resurrected + if (view.file_name() and view.is_dirty() and + view.settings().get('save_on_focus_lost') == True and + os.path.exists(view.file_name())): + view.run_command('save'); diff --git a/sublime-text/Default/save_on_focus_lost.pyc b/sublime-text/Default/save_on_focus_lost.pyc new file mode 100644 index 0000000000000000000000000000000000000000..689d4a85de08432c1d59abef9a5ffc5baf4e9e9e GIT binary patch literal 774 zcmb7C$xhrr5UutsEP)`nuqYp3-oGsCN>Y|xcm@J%d&VYY4> zSRkh;WcT@^F)YpiC-uDGA1vR&{IY=qe?YouoG$%rR=6saS6fk=mb$p$$|Q$_Eq#7zS__Skq$xdF6YP zbS&WUoJ4wGrDBd(5JGcVTO5=CKIM8|H&g54*oT1}##q$xCc?L+aXiGS7-tp{_8l^! Rr7x|CBl)F*XxdX7$v>z8pS1u0 literal 0 HcmV?d00001 diff --git a/sublime-text/Default/scroll.py b/sublime-text/Default/scroll.py new file mode 100644 index 0000000..1d9dcaa --- /dev/null +++ b/sublime-text/Default/scroll.py @@ -0,0 +1,13 @@ +import sublime, sublime_plugin + +class ScrollToBof(sublime_plugin.TextCommand): + def run(self, edit): + self.view.show(0) + +class ScrollToEof(sublime_plugin.TextCommand): + def run(self, edit): + self.view.show(self.view.size()) + +class ShowAtCenter(sublime_plugin.TextCommand): + def run(self, edit): + self.view.show_at_center(self.view.sel()[0]) diff --git a/sublime-text/Default/scroll.pyc b/sublime-text/Default/scroll.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2a884ee841568bea0237b9986a87822b2dbaa0f1 GIT binary patch literal 1112 zcmbtSJ#Q016nuL=J18MYNEEoBpt~yh0})DM(Yn}6gPW7NTPLU7hvi)pKy*Rk_vNpo zrGS}d=WG&+L|NUwoBf)7Z+32O_jiB&o~OC2TOa>pbbpRe;4^Y5GU>39iIE}_XQYf| z2HcaMBG)3HCOs+Qt%ZKK5KA%GTG;6p`s7cO7r3kZgEkI(fN8#HtLm&hZD(Cx2J@%r z{xyO_Mz~qXGl|5e377K-;jWLk_YJ}iP~*dPBiBX@PNfNVjWI2vFvLJ#N_VBeU$j@7 zY456;PP?KEi5_9_O!VN;YpMtHZ=r|rV%d<%lU_{1sleK@teMs>%fhY>>b6)`7+Q+G zp;UCA*J6v1NJ$6gAAvqTSD<$w?gUzch>zJRMPbKUi6yiwZKYEA-Kk2J*;&@TDdj;G ztdvS@OJfH-xWn)mA$Xjd?}T^>oZ_iY!pJqjEpm*tJ;f@_eT44cBm7qh*k;(NvE>`B znpcHaJdZ@OX~=R-Ma=-?JWU@K^bCFIEt+zzPeOHr3by=Qm9<;txx(4JTAr7Un(54a n4WqWMr%j<|vlQBrZS$Ur?mwzp`)Fn64^+bQ%D2%l9>#wGXA7jw literal 0 HcmV?d00001 diff --git a/sublime-text/Default/send2trash/__init__.py b/sublime-text/Default/send2trash/__init__.py new file mode 100644 index 0000000..d6fa7f0 --- /dev/null +++ b/sublime-text/Default/send2trash/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2010 Hardcoded Software (http://www.hardcoded.net) + +# This software is licensed under the "BSD" License as described in the "LICENSE" file, +# which should be included with this package. The terms are also available at +# http://www.hardcoded.net/licenses/bsd_license + +import sys + +if sys.platform == 'darwin': + from .plat_osx import send2trash +elif sys.platform == 'win32': + from .plat_win import send2trash +else: + from .plat_other import send2trash diff --git a/sublime-text/Default/send2trash/__init__.pyc b/sublime-text/Default/send2trash/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..44f2792065aca8d52d36ed10fb0bf1c089196304 GIT binary patch literal 339 zcmZ8bL2kk@5F9%RMW~gi#Gy~f2_z7=s_F}RC^s%vRHsTH#8JFe%L{lPU+J|6I*uSn zSl(H$cV=ggzYn9sU$gqa`NYhx3||l|ufi5s136GCSdEQ_n?TtJHpW(?im;BL>Lt{f zliYCPp7Yr2lFJ_rR_TCd<%#D_!qaB$cUjX8NCU`-;PcwfrOkXH2}=?d^G+yH=ayiKXZ75o#+>Fnw_Glu(!G1F$>O@7`v`&H#H PcO?3--Mt>GiDKw~*HS}k literal 0 HcmV?d00001 diff --git a/sublime-text/Default/send2trash/plat_osx.py b/sublime-text/Default/send2trash/plat_osx.py new file mode 100644 index 0000000..ba58b6f --- /dev/null +++ b/sublime-text/Default/send2trash/plat_osx.py @@ -0,0 +1,44 @@ +# Copyright 2010 Hardcoded Software (http://www.hardcoded.net) + +# This software is licensed under the "BSD" License as described in the "LICENSE" file, +# which should be included with this package. The terms are also available at +# http://www.hardcoded.net/licenses/bsd_license + +from ctypes import cdll, byref, Structure, c_char, c_char_p +from ctypes.util import find_library + +Foundation = cdll.LoadLibrary(find_library('Foundation')) +CoreServices = cdll.LoadLibrary(find_library('CoreServices')) + +GetMacOSStatusCommentString = Foundation.GetMacOSStatusCommentString +GetMacOSStatusCommentString.restype = c_char_p +FSPathMakeRefWithOptions = CoreServices.FSPathMakeRefWithOptions +FSMoveObjectToTrashSync = CoreServices.FSMoveObjectToTrashSync + +kFSPathMakeRefDefaultOptions = 0 +kFSPathMakeRefDoNotFollowLeafSymlink = 0x01 + +kFSFileOperationDefaultOptions = 0 +kFSFileOperationOverwrite = 0x01 +kFSFileOperationSkipSourcePermissionErrors = 0x02 +kFSFileOperationDoNotMoveAcrossVolumes = 0x04 +kFSFileOperationSkipPreflight = 0x08 + +class FSRef(Structure): + _fields_ = [('hidden', c_char * 80)] + +def check_op_result(op_result): + if op_result: + msg = GetMacOSStatusCommentString(op_result).decode('utf-8') + raise OSError(msg) + +def send2trash(path): + if not isinstance(path, bytes): + path = path.encode('utf-8') + fp = FSRef() + opts = kFSPathMakeRefDoNotFollowLeafSymlink + op_result = FSPathMakeRefWithOptions(path, opts, byref(fp), None) + check_op_result(op_result) + opts = kFSFileOperationDefaultOptions + op_result = FSMoveObjectToTrashSync(byref(fp), None, opts) + check_op_result(op_result) diff --git a/sublime-text/Default/send2trash/plat_other.py b/sublime-text/Default/send2trash/plat_other.py new file mode 100644 index 0000000..ee1479b --- /dev/null +++ b/sublime-text/Default/send2trash/plat_other.py @@ -0,0 +1,154 @@ +# Copyright 2010 Hardcoded Software (http://www.hardcoded.net) + +# This software is licensed under the "BSD" License as described in the "LICENSE" file, +# which should be included with this package. The terms are also available at +# http://www.hardcoded.net/licenses/bsd_license + +# This is a reimplementation of plat_other.py with reference to the +# freedesktop.org trash specification: +# [1] http://www.freedesktop.org/wiki/Specifications/trash-spec +# [2] http://www.ramendik.ru/docs/trashspec.html +# See also: +# [3] http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html +# +# For external volumes this implementation will raise an exception if it can't +# find or create the user's trash directory. + +import sys +import os +import os.path as op +from datetime import datetime +import stat +from urllib import quote + +FILES_DIR = 'files' +INFO_DIR = 'info' +INFO_SUFFIX = '.trashinfo' + +# Default of ~/.local/share [3] +XDG_DATA_HOME = op.expanduser(os.environ.get('XDG_DATA_HOME', '~/.local/share')) +HOMETRASH = op.join(XDG_DATA_HOME, 'Trash') + +uid = os.getuid() +TOPDIR_TRASH = '.Trash' +TOPDIR_FALLBACK = '.Trash-' + str(uid) + +def is_parent(parent, path): + path = op.realpath(path) # In case it's a symlink + parent = op.realpath(parent) + return path.startswith(parent) + +def format_date(date): + return date.strftime("%Y-%m-%dT%H:%M:%S") + +def info_for(src, topdir): + # ...it MUST not include a ".."" directory, and for files not "under" that + # directory, absolute pathnames must be used. [2] + if topdir is None or not is_parent(topdir, src): + src = op.abspath(src) + else: + src = op.relpath(src, topdir) + + info = "[Trash Info]\n" + info += "Path=" + quote(src) + "\n" + info += "DeletionDate=" + format_date(datetime.now()) + "\n" + return info + +def check_create(dir): + # use 0700 for paths [3] + if not op.exists(dir): + os.makedirs(dir, 0o700) + +def trash_move(src, dst, topdir=None): + filename = op.basename(src) + filespath = op.join(dst, FILES_DIR) + infopath = op.join(dst, INFO_DIR) + base_name, ext = op.splitext(filename) + + counter = 0 + destname = filename + while op.exists(op.join(filespath, destname)) or op.exists(op.join(infopath, destname + INFO_SUFFIX)): + counter += 1 + destname = '%s %s%s' % (base_name, counter, ext) + + check_create(filespath) + check_create(infopath) + + os.rename(src, op.join(filespath, destname)) + f = open(op.join(infopath, destname + INFO_SUFFIX), 'w') + f.write(info_for(src, topdir)) + f.close() + +def find_mount_point(path): + # Even if something's wrong, "/" is a mount point, so the loop will exit. + # Use realpath in case it's a symlink + path = op.realpath(path) # Required to avoid infinite loop + while not op.ismount(path): + path = op.split(path)[0] + return path + +def find_ext_volume_global_trash(volume_root): + # from [2] Trash directories (1) check for a .Trash dir with the right + # permissions set. + trash_dir = op.join(volume_root, TOPDIR_TRASH) + if not op.exists(trash_dir): + return None + + mode = os.lstat(trash_dir).st_mode + # vol/.Trash must be a directory, cannot be a symlink, and must have the + # sticky bit set. + if not op.isdir(trash_dir) or op.islink(trash_dir) or not (mode & stat.S_ISVTX): + return None + + trash_dir = op.join(trash_dir, str(uid)) + try: + check_create(trash_dir) + except OSError: + return None + return trash_dir + +def find_ext_volume_fallback_trash(volume_root): + # from [2] Trash directories (1) create a .Trash-$uid dir. + trash_dir = op.join(volume_root, TOPDIR_FALLBACK) + # Try to make the directory, if we can't the OSError exception will escape + # be thrown out of send2trash. + check_create(trash_dir) + return trash_dir + +def find_ext_volume_trash(volume_root): + trash_dir = find_ext_volume_global_trash(volume_root) + if trash_dir is None: + trash_dir = find_ext_volume_fallback_trash(volume_root) + return trash_dir + +# Pull this out so it's easy to stub (to avoid stubbing lstat itself) +def get_dev(path): + return os.lstat(path).st_dev + +def send2trash(path): + # if not isinstance(path, str): + # path = str(path, sys.getfilesystemencoding()) + if not op.exists(path): + raise OSError("File not found: %s" % path) + # ...should check whether the user has the necessary permissions to delete + # it, before starting the trashing operation itself. [2] + if not os.access(path, os.W_OK): + raise OSError("Permission denied: %s" % path) + # if the file to be trashed is on the same device as HOMETRASH we + # want to move it there. + path_dev = get_dev(path) + + # If XDG_DATA_HOME or HOMETRASH do not yet exist we need to stat the + # home directory, and these paths will be created further on if needed. + trash_dev = get_dev(op.expanduser('~')) + + if path_dev == trash_dev: + topdir = XDG_DATA_HOME + dest_trash = HOMETRASH + else: + topdir = find_mount_point(path) + trash_dev = get_dev(topdir) + if trash_dev != path_dev: + raise OSError("Couldn't find mount point for %s" % path) + dest_trash = find_ext_volume_trash(topdir) + trash_move(path, dest_trash, topdir) diff --git a/sublime-text/Default/send2trash/plat_other.pyc b/sublime-text/Default/send2trash/plat_other.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2d2f7ab452db9829e063a8df0bdb289fea3911d2 GIT binary patch literal 4326 zcmbVP>uwvz6+W{|Q6xoOta}2-rke_7(OL@90%=`4up(Qv8b>mgYVEQYg5s{Cl~%j- z&PtX6DJbdyeVo2RU!f1t7wF&qXut0aNfAbY2$8g-nX_lkoXdC4nf>R#r)z)vPrucZ z!A}kUALFt2j7W$-BPSy5(cDPe4C$W4zO+la^yFkhk_l-~h#71vOS`P^d^wqvq$2GK z-j$?Xl@N?I3BfTXQAy&uL`LFiiDx97l&~W2Jb8zsX7%lyM6(iBNo?Oz&UtwUr4}Tt zNqbR32w9S7fm>GE%M#Y*TfAP8a9Ss;63*!40|{q!@*(XC=j2>xwCqJNsR&xceivNqB-6s4cMFm6HEutbmjT~hHl-Fk&NSqzU zNo0!>W^sC$S$ccD$h-E4%VHYKS5JQ3d9t~`*?G42)l)kI$~PP9N!IHo8}_K1J2Cs* zV$0m^rjw)T{ho*U@Y%xL{scpT6OCLN`sm6Gm!eA{J@({Mmo3$Mx9M{iuz8h)zAZuFCG(aDOVC|~ct zEvk4O+m74+LoC!XF|+vX(XD)Vj9Nn{LDN{V32R!a!LGdp`r7aBubtjs3-{NaJy`qd z!J4y0)we}{cpVi+fN{FHl2h1mnB}KXoEv|PrKL_{)Zz3Ng{q40Fo8=$k>iT=Z;2_? z_4KbN^=ttI%^m0PE0J_SD$z0q$rDh4uq#Bxlh6~O$8oQOzN~yUpqJ?RVp3vcj0SJ~ zZL3Md?OHnQ4+@jU4p8=|nkD@OLiEVevo+;-5+y)wmOg=TkD3gLMshbxqky&t3^9%p z=^j|c0q1$7m8BSqE^<2)eg=B}@RoB7d!|9?thJV^XI zX2F~H%4XHvxrPZPZ;^-M2cTEa^cTmx4$s2HCN)~D1_+A(0V|peqO+9-M;EaztV;u{ zI6Cc~L@>d+?B;P;-Q1QsHuR37-bts2gesz6Vr_Y*cyp#ladb8V7<5pbxx&$ha z!@lAK7=U{mrKFSzr2sHsF!D!WsVrA0tAJC5#H*@Y{8@Pb9=8|3)A|bjeglpIb@UE` zs*L;!T!#1AJu#ORV)8SH0~#;Og7xL39Qv{h*{@%Uc?n-#LK`@kvk5n=N?aq1-#-+g zD5i$g@#8{g5H{7=Bv2rkA5cRzF{I8A`D{4@xT7vWdE(I$pli0VX4fndP~=T>7NZL; zF?G;IN$Q?P3iRVFPPGzk?>v9n>O9#AG~7G8+k2yh?I&>&T@=AGc0*$keck%)_V&)J zfK@JFLr|on77j&cebhyU^i7WK!4g@x>?N6vnwne-q$!we5iD{+1=%fB3e!$PNePP6mqbF6Fw18egW-? zOj4eHoumO{tk%Z%l=iA)HBOqK0S&mhxpUw?jMEU-LRP0wOt7M9qZWS_rp}?>^yo#p zdX%Ss$6{n2$^{F!>#{IMn{MA-j9La7BDWkdo@9mRMkI-{)%$my8>+*7vq(4a0P0in zxSox~IA`Jz%?o6jJM-;~6f=Xp=4HAlrD9f&Ym(veg&!u0d4;ovZJs7;N(3L#2G*zj zy%&IgXFu3%JyWO$nl}n%-UkD$ z8RVwkR)7@TUa~pBad!ptqbV*N!oa*y&PSgxnIg#?NH>0I%hle=c2O-;&W6y=G zBD^Y8<*FpAvZv~_Ox$D6L5hrQeA zR*f_(8iy#J;REzt%aFc^^3&K_TrC@6l*W<1(SH1mCec=QmW1h#unmQ`p@p}hg%@&i z2x;>E>e7d8H+aZl)MmTAUS!=D)yvM_m%&rK)i0FjqTfx!GaKarqoO5*pH!}@eM%vW zRIq_TFUr~~v{|yR5+LJcCpvd+nf-*#)aBL9b5uW?Mjt?bffUQM6@Shw`pbCgr6q3~ zm8Ry^73GT?auLp;^>{x|!1pNEzP(^YB|4>*_?+uTEDd N>WkG%mCt0={~z|(5G4Qr literal 0 HcmV?d00001 diff --git a/sublime-text/Default/send2trash/plat_win.py b/sublime-text/Default/send2trash/plat_win.py new file mode 100644 index 0000000..b437174 --- /dev/null +++ b/sublime-text/Default/send2trash/plat_win.py @@ -0,0 +1,55 @@ +# Copyright 2010 Hardcoded Software (http://www.hardcoded.net) + +# This software is licensed under the "BSD" License as described in the "LICENSE" file, +# which should be included with this package. The terms are also available at +# http://www.hardcoded.net/licenses/bsd_license + +from ctypes import windll, Structure, byref, c_uint +from ctypes.wintypes import HWND, UINT, LPCWSTR, BOOL +import os.path as op + +shell32 = windll.shell32 +SHFileOperationW = shell32.SHFileOperationW + +class SHFILEOPSTRUCTW(Structure): + _fields_ = [ + ("hwnd", HWND), + ("wFunc", UINT), + ("pFrom", LPCWSTR), + ("pTo", LPCWSTR), + ("fFlags", c_uint), + ("fAnyOperationsAborted", BOOL), + ("hNameMappings", c_uint), + ("lpszProgressTitle", LPCWSTR), + ] + +FO_MOVE = 1 +FO_COPY = 2 +FO_DELETE = 3 +FO_RENAME = 4 + +FOF_MULTIDESTFILES = 1 +FOF_SILENT = 4 +FOF_NOCONFIRMATION = 16 +FOF_ALLOWUNDO = 64 +FOF_NOERRORUI = 1024 + +def send2trash(path): + # if not isinstance(path, str): + # path = str(path, 'mbcs') + if not op.isabs(path): + path = op.abspath(path) + fileop = SHFILEOPSTRUCTW() + fileop.hwnd = 0 + fileop.wFunc = FO_DELETE + fileop.pFrom = LPCWSTR(path + '\0') + fileop.pTo = None + fileop.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_SILENT + fileop.fAnyOperationsAborted = 0 + fileop.hNameMappings = 0 + fileop.lpszProgressTitle = None + result = SHFileOperationW(byref(fileop)) + if result: + msg = "Couldn't perform operation. Error code: %d" % result + raise OSError(msg) + diff --git a/sublime-text/Default/set_unsaved_view_name.py b/sublime-text/Default/set_unsaved_view_name.py new file mode 100644 index 0000000..57d4228 --- /dev/null +++ b/sublime-text/Default/set_unsaved_view_name.py @@ -0,0 +1,70 @@ +import sublime, sublime_plugin +import os.path +import string +import functools + +class SetUnsavedViewName(sublime_plugin.EventListener): + setting_name = False + + dropped_chars = string.whitespace + + pending = 0 + + def on_modified(self, view): + if view.file_name() or view.is_loading(): + return + + if self.setting_name: + return + + self.pending += 1 + sublime.set_timeout(functools.partial(self.update_title, view), 20) + + def update_title(self, view): + self.pending -= 1 + if self.pending != 0: + return + + if view.settings().get('set_unsaved_view_name') == False: + return + + cur_name = view.settings().get('auto_name') + view_name = view.name() + + # Only set the name for plain text files + syntax = view.settings().get('syntax') + if syntax != 'Packages/Text/Plain text.tmLanguage': + if cur_name: + # Undo any previous name that was set + view.settings().erase('auto_name') + if cur_name == view_name: + view.set_name("") + return + + # Name has been explicitly set, don't override it + if not cur_name and view_name: + return + + # Name has been explicitly changed, don't override it + if cur_name and cur_name != view.name(): + view.settings().erase('auto_name') + return + + # Don't set the names on widgets, it'll just trigger spurious + # on_modified callbacks + if view.settings().get('is_widget'): + return + + line = view.line(0) + if line.size() > 50: + line = sublime.Region(0, 50) + + first_line = view.substr(line) + + first_line = first_line.strip(self.dropped_chars) + + self.setting_name = True + view.set_name(first_line) + self.setting_name = False + + view.settings().set('auto_name', first_line) diff --git a/sublime-text/Default/set_unsaved_view_name.pyc b/sublime-text/Default/set_unsaved_view_name.pyc new file mode 100644 index 0000000000000000000000000000000000000000..955776f878000899eef878fb7b27fc577e956f00 GIT binary patch literal 1864 zcmb7E-)|d55T4z;vt!q;+olOo1QHTLIteL}kPtjn2#VmTimG!#s$Y)7w{|wY+#TM% zq($yiD)pb@k$-@Hg;yTnn^`9@QYFC2&du(AJM-=Q*x&yc58wXTPUp1w?cn*&Z!`kLV52718rqpDj+)7}o7y_?`F% zP^ZR!U%TSMls{N=c~YF48$t@(k1^aagaH*rMjV@%EIjqtYcLBRvmJKK%7C(I8sUt^ zpt*+N!H&Pda6dwF)zQ;yjZ^Coqu5T;1o!}e?=G&rx+1O2*1#| zOnIj1EZPe5bsi9V6wZ|*AJN%%9<~87172%MC3K?Kk?4|1wvY%QrZvj5Cyu^Gu3_%8 zt(2pXO0mQ{>)`Hw*hhW!*@XJ}H&Qjep)@p&nh_A {OkvCX9y-mKi>cWsg^b%FBd~;m1BltN>pKkRb3Iz4JV#QV4Y9k&A;I~ZV&+QS6f-pPdl2ue5vj$Z^G&GW9^+oszIf?Ag8HXAQxQq;>1dmgaRC+LhzTVln2ily{EM8=it`JLMIi352e zV0?n_cSVJD#z=edl35j4+MEcSc)zlB06P1N$ry-chJCZNO)V;V&H0s>#n-l;OTAn* zZEMPWep;-YIC{3~OvW692wbIH_!-A5<2Du7^KKPfbNk=4Q#N7H0fQL6urQf3vH#qS z8QXgg!##o^HBtA_fbV1MsZq42#;UJ(A@@`gO)w7Cu1ey4Y0_P_uP6F}9$;uMdcr$(ygx&33MEjTLCBrci z`)s+VdU~KShAAg7r0FiS%{!R4RkyUYJa~;eY72kr`F(3#_A%o*6Oy)XFHG&9Sm#Y` ZR^sFT(UQPC3ZeLtUv$TO4%CSM^xqjtW1#>5 literal 0 HcmV?d00001 diff --git a/sublime-text/Default/side_bar.py b/sublime-text/Default/side_bar.py new file mode 100644 index 0000000..6c17cfb --- /dev/null +++ b/sublime-text/Default/side_bar.py @@ -0,0 +1,84 @@ +import sublime, sublime_plugin +import os +import functools +import send2trash + +class NewFileAtCommand(sublime_plugin.WindowCommand): + def run(self, dirs): + v = self.window.new_file() + + if len(dirs) == 1: + v.settings().set('default_dir', dirs[0]) + + def is_visible(self, dirs): + return len(dirs) == 1 + +class DeleteFileCommand(sublime_plugin.WindowCommand): + def run(self, files): + for f in files: + send2trash.send2trash(f) + + def is_visible(self, files): + return len(files) > 0 + +class NewFolderCommand(sublime_plugin.WindowCommand): + def run(self, dirs): + self.window.show_input_panel("Folder Name:", "", functools.partial(self.on_done, dirs[0]), None, None) + + def on_done(self, dir, name): + os.makedirs(os.path.join(dir, name)) + + def is_visible(self, dirs): + return len(dirs) == 1 + +class DeleteFolderCommand(sublime_plugin.WindowCommand): + def run(self, dirs): + if sublime.ok_cancel_dialog("Delete Folder?", "Delete"): + try: + for d in dirs: + send2trash.send2trash(d) + except: + sublime.status_message("Unable to delete folder") + + def is_visible(self, dirs): + return len(dirs) > 0 + +class RenamePathCommand(sublime_plugin.WindowCommand): + def run(self, paths): + branch, leaf = os.path.split(paths[0]) + v = self.window.show_input_panel("New Name:", leaf, functools.partial(self.on_done, paths[0], branch), None, None) + name, ext = os.path.splitext(leaf) + + v.sel().clear() + v.sel().add(sublime.Region(0, len(name))) + + def on_done(self, old, branch, leaf): + new = os.path.join(branch, leaf) + + try: + os.rename(old, new) + + v = self.window.find_open_file(old) + if v: + v.retarget(new) + except: + sublime.status_message("Unable to rename") + + def is_visible(self, paths): + return len(paths) == 1 + +class OpenContainingFolderCommand(sublime_plugin.WindowCommand): + def run(self, files): + branch,leaf = os.path.split(files[0]) + self.window.run_command("open_dir", {"dir": branch, "file": leaf}) + + def is_visible(self, files): + return len(files) > 0 + +class FindInFolderCommand(sublime_plugin.WindowCommand): + def run(self, dirs): + self.window.run_command("show_panel", {"panel": "find_in_files", + "where": ",".join(dirs)}) + + def is_visible(self, dirs): + return len(dirs) > 0 diff --git a/sublime-text/Default/side_bar.pyc b/sublime-text/Default/side_bar.pyc new file mode 100644 index 0000000000000000000000000000000000000000..291d4c41bbe06f660bbba5f45c6790595eef69ab GIT binary patch literal 4769 zcmcIoTW=dh6rNc-v2$;mwj{KL&uO}ySq^ymqyYcev4t>#FW51ViKrGduVcnG0b`+0J+7ff>Fg-#jtlV z?c*Z+Y8vGrP%cpWSc8pL4+B-arSyKF(hA9`*b-z|art?mbgq?-6~raSCU_|2W-!G` zJL+XFjMFZ7E7h1FWfId~n#aYSqi^$MFKk08N0G85mra{Em*(46Hu2CP(UHAPvbHS1 z)H+`Eq=8AvWaqHDanq)85^hD^8=Ysupxeu9AXwh4^g^(x#Rjwk$0~-Uc^%9!qO>=c z*Qddo33M}k9LzVbUYh|yG7i~@M!pG zXvEr zY9l5TXs@QsqM1$d_(Ru??2fon?B@svy59S-J=FA7KZ-r5R^N#=D0&PhRv`&3-t_o8 z%!zdT*qiBu3%q&6b!HYDh7LW6qvmm**9{z1ErYtq;-q_|pRVDZqkBxQ@!*BR~J~0~1mWr;4cq>f+^$Wy^_!~we<_wJ@ zYS^7(FHG}J&xM^RPck3;p`1L)~ zqTU=;3{iOn3kZr##MvvW6(QIV3l3GaUL~chUd|0IU2yl5B z4hf0jI~G50;P7RPfwa7AFhtt_BlSq?czbxOq~4cNOUaIzW6t5|64}w|$T5|vid)38 zpJm45_asG${KYCiV&Q%0F$>ofUn%|U>Py)N-bJnIXP+x-W8?9CrM2d(sQ)Nf%u4sw zgZ~yO%UJZnuXuQWErrQ%Sz6|&JVMf5am7k3sdS|+TKd#2^`y6zrMroszjze3qP&%4 zD0Wd+Y?}p&&r7U}T+fEPiM7#oG6a!S4=G^rSop9ITq7ScQ+iQXG?U*2{4Haha5@}H z$4G#6ygXI{CcyVGUOxd6kXOlx!37l6rBa!MF?1iXc6u3*{wXuy?|AS~B2=WOSq3bA z30S@kd?Kt2+M0?&T}me6hcvez*vYi&W?{R3lVU1=Qv~p&v3y}Mi2qtYq zLCss_Kz6ujERYE0n;4c0r7!D`^-^#~w*(E?DPup!!_Z;y8Egy#SJkuIvJaObomaW3 zeHBAnk1bdfUVv$fvmkgk;uJCfqkkhmFPWjHQnc`Ln)?r8Rs)7mQ@X%m+;;_-4N
{f&>~y`6hFE$J`yN2FCcaa`mjAMoD&xO0*d7cqGS(%GtM4!* zzcRpD^vz(1vad87$EXl|XY9Qc{s-RMhXU1o845fzWFo6W+Wb#&YK@%80u`bvUB((B z>-+qad`}rm-xG1nAkr)%C&0hxkLh1H*H;Uqk9cCl(acg!|53x1*EhTT6p;8&ee_$& zw4TPVj_dNgx07`HEdZr3pK)S7IcfKM5AXDyeDRc=T&EZqemcZ8bl^J1>pS^#aA}g$ zz{w5yl9Ea^&wbxmg`KRoo#wvuNrjW9if1?E{}1|UKt6yCUo>n}4Z94(bYh4m!`p_6 i9RWOv*)RRq_iZ}NvaT-aS^f)_r 1 + +class SortLinesCommand(sublime_plugin.TextCommand): + def run(self, edit, case_sensitive=False, + reverse=False, + remove_duplicates=False): + view = self.view + + if case_sensitive: + permute_lines(case_sensitive_sort, view, edit) + else: + permute_lines(case_insensitive_sort, view, edit) + + if reverse: + permute_lines(reverse_list, view, edit) + + if remove_duplicates: + permute_lines(uniquealise_list, view, edit) + +class SortSelectionCommand(sublime_plugin.TextCommand): + def run(self, edit, case_sensitive=False, + reverse=False, + remove_duplicates=False): + + view = self.view + + permute_selection( + case_sensitive_sort if case_sensitive else case_insensitive_sort, + view, edit) + + if reverse: + permute_selection(reverse_list, view, edit) + + if remove_duplicates: + unique_selection(view, edit) + + def is_enabled(self, **kw): + return has_multiple_non_empty_selection_region(self.view) + +class PermuteLinesCommand(sublime_plugin.TextCommand): + def run(self, edit, operation='shuffle'): + permute_lines(permute_funcs[operation], self.view, edit) + +class PermuteSelectionCommand(sublime_plugin.TextCommand): + def run(self, edit, operation='shuffle'): + view = self.view + + if operation == "reverse": + permute_selection(reverse_list, view, edit) + + elif operation == "shuffle": + permute_selection(shuffle_list, view, edit) + + elif operation == "unique": + unique_selection(view, edit) + + def is_enabled(self, **kw): + return has_multiple_non_empty_selection_region(self.view) diff --git a/sublime-text/Default/sort.pyc b/sublime-text/Default/sort.pyc new file mode 100644 index 0000000000000000000000000000000000000000..479c74cdba55ca0fc6c8892c2633dc24c5460db0 GIT binary patch literal 6182 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 literal 0 HcmV?d00001 diff --git a/sublime-text/Default/switch_file.py b/sublime-text/Default/switch_file.py new file mode 100644 index 0000000..60fa7e3 --- /dev/null +++ b/sublime-text/Default/switch_file.py @@ -0,0 +1,42 @@ +import sublime, sublime_plugin +import os.path +import platform + +def compare_file_names(x, y): + if platform.system() == 'Windows' or platform.system() == 'Darwin': + return x.lower() == y.lower() + else: + return x == y + +class SwitchFileCommand(sublime_plugin.WindowCommand): + def run(self, extensions=[]): + if not self.window.active_view(): + return + + fname = self.window.active_view().file_name() + if not fname: + return + + path = os.path.dirname(fname) + base, ext = os.path.splitext(fname) + + start = 0 + count = len(extensions) + + if ext != "": + ext = ext[1:] + + for i in xrange(0, len(extensions)): + if compare_file_names(extensions[i], ext): + start = i + 1 + count -= 1 + break + + for i in xrange(0, count): + idx = (start + i) % len(extensions) + + new_path = base + '.' + extensions[idx] + + if os.path.exists(new_path): + self.window.open_file(new_path) + break diff --git a/sublime-text/Default/switch_file.pyc b/sublime-text/Default/switch_file.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9648a6caa3b717a92736fc3858fd63701220a2d5 GIT binary patch literal 1404 zcma)6O>YxH4E0QsZJIVv`jz$sCzMk_;=%zTM5|tqqAEdD1kh^9PTGNFce^ubQYksL z5xwQs+&Zl9LV3VvT^-6_are2w1P1gvnP+TIT$Obe(aG8x)MDKemoUYrfAhrFCr`^|3i*>+d-#~b{ z6`w%#7fsm~sXLQqQ`#UkLzL#I87heaN0-eou!`=x%@XppJ>TlYCUH7(K7f801Y%sai9JCaLw0PZX3b?R7IyUglkMd zQ>WYHh6KMgD15;KEO!JmBU3<_RY)-q0#{*Nz%|!21G+_kFOe;it+4S*(Y!=UOR%(j z)HE;C9Mgq2Ab<*>IT8wt7)*)M4;YNh{~-dWZ34Uqzm2`pbol8R&8y^B`S`3#`-q1* z-N#7;m#Bf{Gf<^O&yo80{5vVElSGl4nq@-xCDmI_HA8%r8n;Du=g182CKq}88i2B}M znDD}y3GPP3Y>>%&o@MHM89!O%&xDP!&6yR#K9>!xH&YM1K{=C1=4l=!r>4V$mA#o- z=bdCuGm{9hnp{`%Ix`&j8g@uy5@*xI34sS(q;tOr`y4qVRk)fE(ntA1>!;(y3%{*I z*mx?Ux89y{Wel zd-pPif?62LeZp{*#$zBEb{-+=T^E0U|2kC!GBS>V4^)%)0=gT29$J8YkDUuW%!cDr vn}|DgExu`o-5ox=K)()c@#nF8Nu|L5bRq!0SX|&Gzpsv4*;DJlVm0^!`Q-!; literal 0 HcmV?d00001 diff --git a/sublime-text/Default/transform.py b/sublime-text/Default/transform.py new file mode 100644 index 0000000..a194513 --- /dev/null +++ b/sublime-text/Default/transform.py @@ -0,0 +1,38 @@ +import string +import sublime +import sublime_plugin + +class Transformer(sublime_plugin.TextCommand): + def run(self, edit): + self.transform(self.transformer[0], self.view, edit) + + def transform(self, f, view, edit): + for s in view.sel(): + if s.empty(): + s = view.word(s) + + txt = f(view.substr(s)) + view.replace(edit, s, txt) + +class SwapCaseCommand(Transformer): + transformer = string.swapcase, + +class UpperCaseCommand(Transformer): + transformer = string.upper, + +class LowerCaseCommand(Transformer): + transformer = string.lower, + +class TitleCaseCommand(Transformer): + transformer = lambda s: string.capwords(s, " "), + +def rot13(ch): + o = ord(ch) + if o >= ord('a') and o <= ord('z'): + return unichr((o - ord('a') + 13) % 26 + ord('a')) + if o >= ord('A') and o <= ord('Z'): + return unichr((o - ord('A') + 13) % 26 + ord('A')) + return ch + +class Rot13Command(Transformer): + transformer = lambda s: "".join([rot13(ch) for ch in s]), diff --git a/sublime-text/Default/transform.pyc b/sublime-text/Default/transform.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cf94c1fef9be04a69f67643cd5169c96cd5fa5ae GIT binary patch literal 2383 zcmcIl-EJF26h5>5Nu1h+HYI66NPwXARZztpsw!xDiF`3GLKq@zv%5*R*t^@EF-eij zO)Bv&JOQu4t8mK&eBasix>RXp30UWx%$%8X=KRe!zyC4V`Q^`I97+9k@&5~u`wc9{ zpOGI#Ce7H$#H{3jOah4mNdie*asqivUWi4N+?J%R(oQ4oNZegXw;E|z;_a2R z*GRV{-dRbnG}3K}`Iy@e}1?SVh@QwTx3?G$Y=1%f*o|H|X2J#0W z_bylhgBlhsBPOFqw8V~w0hS{&QX6y#avy>%aYn_VYUCE@fh>(&w8X>$H>fhg9+6=S z%=gGvzNlx-EGa#W|ClCcs-`oS%uaNW#Hk-*S(Le}7#)1t=pGc$Jnff@jOBAYR!l^D zoOeL#bcDhA_p(H}v`P<;M)JHZ%eJI&S|r~U!$kzqmJ7qR%s^yRrBzG0&`}9gRk-YE z$WI6IjfTzCj)pu|-9i+elVo1_XBy5~UdCQsT^u`K`Yo)MNihqfWJs~4>z-y#ECaJ@ zi*u(I{rQ`-VY!vbc6~501L>N9*$v(?L$$mO;dGjX^JF^pJ35)?@nVLl)$^&p&iCt* zZm~onD-*Ya$<@mW|LhAuhG=kqX&nRWeW^a04-086yvnwx|Bf?ne`&6}ki`!-mW zCSRu6si)fx#v>TFEb;~}Uc)w$HbvKX+WfjGlJY=gS*!;_29r+p^cF?n8Y{?4bkz z^Qy7#rN(sQKa8oQHYP|iv1X)M4we6uGM_0!)cKdnClv^@UMs9xWNGxctmI5U^jLT1 zZ!QIqtIYk~&)&zNhNHf@ZSE*};*;g_24L~J#-fu%Ev?1@2G|IIKShmL4v~jPyYgIL zCU^{hM=q~Fy(T|viR!k4nyeq5CwZFLk13*Y?KlPQ>34UJ>_?P?Dt1Z#S@zs*(7)-s zPoPh#`)Uf 1 and view.has_non_empty_selection_region(): + rotate_selections(edit, view) + else: + transpose_selections(edit, view) + + def enabled(self): + sels = self.view.sel() + return not (len(sels) == 1 and not sels[0].empty()) \ No newline at end of file diff --git a/sublime-text/Default/transpose.pyc b/sublime-text/Default/transpose.pyc new file mode 100644 index 0000000000000000000000000000000000000000..20b224a7c7342ddca1bab5767587e83315501ef1 GIT binary patch literal 3634 zcma)9U2hx56}_{hNRgtfSaxhHDAH|Hplo2Panb^T5u{D6JQM|lU=={A8ey^Gj--{z z-PO*}q6#v3kb(S*KKG&jqt8YEKz>7C`_P_qcO^P)p_I_h&ez_#ALpJs`rAL&```St z+#5;r>*M`vJnqkEQv4ZtA#xycd0&Ttyf88j56t%CGBXZCuvtZeMwifvnFXzY)7(z92-gdoV*hG z{lPjF+#9Yz+3a8V?G6pPzRmF;v$7twFv8%*#sK5zc-&ny9y=k@$dwW5zc=LauDj2+ z@TXaR68a+aRg$~1a8{Rnm!D6M#@WRBJM8wr%F(Vqmhjyr@@1rw^rfPQaBQf4c7U)!qp5U5xV93L(K=uq~8dG2% zw4o@!g2qlte;M&0-$4`EldQ;f?|O2N>2i1S1~UYaX@X zPZ-Rhw%P!t=1>?upS=W1h?i z#D92t2&_N_ZL^389ubhY2lh?uC~b9IRFn7`xS5A}Z&4P%m*8G7Fu#yZbI){TMAxn3 zp}89FuW{;ZwsiT<;h9+gvWO*Oud!Po=q=)y2u4Q{d>kkM7}FJo6?1yX!k$G6R7zL5ry5E0-Ok+W4Px`_6=uM1m@Qms$)glU0D&!F@29fp3qqCQ0EmHYJ(>3#bQUXOK0E&wCw?pY(5N|4m+Ry5 zPmsxAIk*MJs2_L$m0lCSM!uV`QQBf4e!cM;I|EMEGC(DSI!?#Y5Ybi(_hIkekomr= z3Hjv(@=mD^4ViMdfuW*7adJ^qX+&02tl2!(+2gF~>=wCIaL&MkCl(1yeo){|5GYUAljH4 zovN5)dqnQkjis+&PyItojZPD0ovq>{3yMt}mbxAJB>v?=$Rj%caPDCS(lF4 zFh4e%tuDa-2;;8V3fMlx$`7Q6(U#c=9tD~fObI$d)8g;w%sx>pC=u=)ejrQ>#2=I< zQiQM5RGlx%jR-jYh+aPXFdptFq*P43iiEo6Pond6{#5j0*XH>N`ICu-dWvL1tKeB_Y#9o}%SF}N|t`h6{UqGG9QUl{et8vXU#9#CVn=LdNuW{yl zq+lS4D5jFKB;Z;Ymqn?p7%|++qyLE+k{W{IA~ICOf>Re`U!jJ&|AX0x!Ky&LwuD_1 zTynmad_fpH2je{<+ANPzfx~RuZa)rfGCEx@g+6(K%3I`W#_M0xtQ!g8kwtZ~Vdj5!t(^k| zV9SjP%gxWiw7|SxwCdfOndB%2=64KEg$7Jo=To_=cdRQwn^!4tb5pFeM&W`2Fry$L zX?R6JT`+Rimf~$BFA5oMD#+x!5P>w)@`6+{`5jDX7GV!30GIFF(MS}EW}7ERW1B{8 zOuWXIRCNqjzK!>3;&5}!WA*hC$qmIt@A1ob(F|#$W*$6utl6X#`QoA$yv=3iX^wSw zJ2mqBYMOt6mt$6w30H%j8JI!vmbn{@m=Y`ve4gWR@1v=GTC>~2kf-4iIF2qu+1^mT zL#k}mWqvTIlVulQXf$BMcl{83fQ5)U>t#IpC5N=*R_!C|0*{NMGy#EYdDJ2l$9Xcb zag17wD^olv(&?B(7Q{GCi%}d$AEK`^mZxa%f86e)r`W5QqVqdzouD@ulI|i#PU$2= zRq{mv9>WYvy~uATCGM1;R#j0&G`+r~^RwnZjkp|7aYL_BaZ_0}${KH#@;U0^^I|ed q@>JFMer?qQAJsO0Oobf__8@4P`{s^$vxVrkd#zr(*XwQdHvSFoe#HF% literal 0 HcmV?d00001 diff --git a/sublime-text/Default/trim_trailing_white_space.py b/sublime-text/Default/trim_trailing_white_space.py new file mode 100644 index 0000000..96aa0ec --- /dev/null +++ b/sublime-text/Default/trim_trailing_white_space.py @@ -0,0 +1,19 @@ +import sublime, sublime_plugin + +class TrimTrailingWhiteSpace(sublime_plugin.EventListener): + def on_pre_save(self, view): + if view.settings().get("trim_trailing_white_space_on_save") == True: + trailing_white_space = view.find_all("[\t ]+$") + trailing_white_space.reverse() + edit = view.begin_edit() + for r in trailing_white_space: + view.erase(edit, r) + view.end_edit(edit) + +class EnsureNewlineAtEof(sublime_plugin.EventListener): + def on_pre_save(self, view): + if view.settings().get("ensure_newline_at_eof_on_save") == True: + if view.size() > 0 and view.substr(view.size() - 1) != '\n': + edit = view.begin_edit() + view.insert(edit, view.size(), "\n") + view.end_edit(edit) diff --git a/sublime-text/Default/trim_trailing_white_space.pyc b/sublime-text/Default/trim_trailing_white_space.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd8b6083b898075d24b3a1df5c4b332691343eeb GIT binary patch literal 1399 zcmbW0&ubGw6vyA}CaI0qs+7`#76lIhp&kTJBK|6PkQ^q(Vx$b)Jzt-yCeh*t6I{T{le}?9oFkSoO4@9G_6JrDeWJ8O}`0uzp#V-BC)B>`UfAZ z=hiUk@VpX*DKF66O&CTE*o!1(J0jg`NVpThNW~SjmuPMRGev2kB8wG@P8Ioxjw8ws zNJ$K3Mlw2!Xd02NNbw<16>k>PryU8rI^3jLC1k77G^QygMx;(&(}84JkuhXZ85#;} zHDc`D^!H#rlo@{}%}hj_aU#y-nQ_UOogBsc)w_oe?l-Q;0x^!g$5A*hiTdb>s{LZb zA=zY{BpUAu-*n8OmwCp7Z=!A`$^0)A}m$^~FO`ZTXe(v}3UI(M$Tb43O zIj8IgI+s#5IH&9sj|SjXD1TcHl`w%C1Y+6(Ja{k1G3AdJ`2&@}3&@pDIUVf9z+OjMLyq}anKMjX2=erec G*Z%?wI~Pa* literal 0 HcmV?d00001 diff --git a/sublime-text/User/Default (Linux).sublime-keymap b/sublime-text/User/Default (Linux).sublime-keymap new file mode 100644 index 0000000..0d4f101 --- /dev/null +++ b/sublime-text/User/Default (Linux).sublime-keymap @@ -0,0 +1,2 @@ +[ +] diff --git a/sublime-text/User/Default (OSX).sublime-keymap b/sublime-text/User/Default (OSX).sublime-keymap new file mode 100644 index 0000000..0d4f101 --- /dev/null +++ b/sublime-text/User/Default (OSX).sublime-keymap @@ -0,0 +1,2 @@ +[ +] diff --git a/sublime-text/User/Default (Windows).sublime-keymap b/sublime-text/User/Default (Windows).sublime-keymap new file mode 100644 index 0000000..0d4f101 --- /dev/null +++ b/sublime-text/User/Default (Windows).sublime-keymap @@ -0,0 +1,2 @@ +[ +] diff --git a/sublime-text/User/Preferences.sublime-settings b/sublime-text/User/Preferences.sublime-settings new file mode 100644 index 0000000..4925c0f --- /dev/null +++ b/sublime-text/User/Preferences.sublime-settings @@ -0,0 +1,3 @@ +{ + "color_scheme": "Packages/Color Scheme - Default/Twilight.tmTheme" +}