From 847d7d3c592b2a9a0648c97333dcaa3284195616 Mon Sep 17 00:00:00 2001 From: Clemens Schwaighofer Date: Tue, 8 Oct 2024 17:58:44 +0900 Subject: [PATCH] Initial checkin --- .gitmodules | 27 + etc/apache2/conf-include/akamai.proxy.list | 23 + .../conf-include/akamai.site-shield.list | 46 + .../conf-include/ip-netskope.access.conf | 8 + etc/apache2/conf-include/ip.access.conf | 18 + etc/apache2/conf-include/login.access.conf | 8 + etc/gitconfig | 166 + etc/gitignore | 6 + etc/postfix/aliases | 96 + home-rc/ReadMe.md | 54 + .../dot-files/.bash-git-prompt/.gitattributes | 3 + home-rc/dot-files/.bash-git-prompt/.gitignore | 3 + .../dot-files/.bash-git-prompt/LICENSE.txt | 23 + home-rc/dot-files/.bash-git-prompt/README.md | 396 + .../.bash-git-prompt/bash-git-prompt.rb | 31 + .../.bash-git-prompt/bash-git-prompt.spec | 70 + .../.bash-git-prompt/git-prompt-help.sh | 76 + .../dot-files/.bash-git-prompt/gitprompt.fish | 115 + .../dot-files/.bash-git-prompt/gitprompt.png | Bin 0 -> 22550 bytes .../dot-files/.bash-git-prompt/gitprompt.sh | 702 ++ .../dot-files/.bash-git-prompt/gitstatus.py | 154 + .../dot-files/.bash-git-prompt/gitstatus.sh | 199 + .../.bash-git-prompt/gitstatus_pre-1.7.10.sh | 140 + .../.bash-git-prompt/prompt-colors.sh | 78 + .../.bash-git-prompt/themes/Chmike.bgptheme | 32 + .../.bash-git-prompt/themes/Crunch.bgptheme | 34 + .../themes/Custom.bgptemplate | 65 + .../.bash-git-prompt/themes/Default.bgptheme | 113 + .../themes/Default_NoExitState.bgptheme | 11 + .../Default_NoExitState_Ubuntu.bgptheme | 15 + .../themes/Default_Ubuntu.bgptheme | 11 + .../.bash-git-prompt/themes/Evermeet.bgptheme | 31 + .../themes/Evermeet_Lowres.bgptheme | 33 + .../themes/Evermeet_Ubuntu.bgptheme | 33 + .../.bash-git-prompt/themes/Minimal.bgptheme | 62 + .../themes/Minimal_Chevron.bgptheme | 72 + .../themes/Minimal_UserHost.bgptheme | 70 + .../themes/Plague_Doctor.bgptheme | 41 + .../themes/Single_line.bgptheme | 11 + .../themes/Single_line_Dark.bgptheme | 20 + .../themes/Single_line_Minimalist.bgptheme | 33 + .../themes/Single_line_NoExitState.bgptheme | 12 + .../Single_line_NoExitState_Gentoo.bgptheme | 20 + .../Single_line_NoExitState_openSUSE.bgptheme | 20 + .../themes/Single_line_Solarized.bgptheme | 34 + .../Single_line_Solarized_Lamda.bgptheme | 48 + .../themes/Single_line_Ubuntu.bgptheme | 25 + .../themes/Single_line_openSUSE.bgptheme | 20 + .../themes/Single_line_username_repo.bgptheme | 13 + .../themes/Solarized.bgptheme | 13 + .../themes/Solarized_Extravagant.bgptheme | 41 + .../themes/Solarized_NoExitState.bgptheme | 16 + .../Solarized_NoExitState_Ubuntu.bgptheme | 18 + .../themes/Solarized_Ubuntu.bgptheme | 14 + .../themes/Solarized_UserHost.bgptheme | 23 + .../themes/TruncatedPwd_WindowTitle.bgptheme | 40 + ...ncatedPwd_WindowTitle_NoExitState.bgptheme | 40 + ...wd_WindowTitle_NoExitState_Ubuntu.bgptheme | 46 + .../TruncatedPwd_WindowTitle_Ubuntu.bgptheme | 45 + home-rc/dot-files/.bash_profile | 18 + .../dot-files/.bashrc-amazon-linux-v2-root | 38 + .../dot-files/.bashrc-amazon-linux-v2-user | 41 + home-rc/dot-files/.bashrc-debian | 146 + home-rc/dot-files/.bashrc-general | 105 + home-rc/dot-files/.bashrc-ubuntu | 149 + home-rc/dot-files/.psqlrc | 97 + home-rc/dot-files/.screenrc | 42 + home-rc/dot-files/.vim/.netrwhist | 4 + home-rc/dot-files/.vim/autoload/pathogen.vim | 264 + .../.github/ISSUE_TEMPLATE/bug.md | 41 + .../.github/ISSUE_TEMPLATE/feature_request.md | 8 + .../.github/ISSUE_TEMPLATE/question.md | 23 + .../.github/PULL_REQUEST_TEMPLATE.md | 3 + .../nerdtree-git-plugin/.github/stale.yml | 17 + .../.github/workflows/ci.yml | 57 + .../.pre-commit-config.yaml | 14 + .../bundle/nerdtree-git-plugin/.vintrc.yaml | 40 + .../.vim/bundle/nerdtree-git-plugin/LICENSE | 14 + .../.vim/bundle/nerdtree-git-plugin/README.md | 104 + .../after/syntax/nerdtree.vim | 58 + .../autoload/gitstatus.vim | 69 + .../autoload/gitstatus/doctor.vim | 167 + .../autoload/gitstatus/job.vim | 131 + .../autoload/gitstatus/listener.vim | 112 + .../autoload/gitstatus/log.vim | 56 + .../autoload/gitstatus/util.vim | 225 + .../nerdtree_plugin/git_status.vim | 343 + .../nerdtree-git-plugin/tests/.themisrc | 4 + .../nerdtree-git-plugin/tests/test_all.vim | 109 + .../nerdtree/.github/ISSUE_TEMPLATE/bug.md | 46 + .../.github/ISSUE_TEMPLATE/feature_request.md | 8 + .../.github/ISSUE_TEMPLATE/question.md | 13 + .../nerdtree/.github/PULL_REQUEST_TEMPLATE.md | 22 + .../nerdtree/.github/workflows/vint.yml | 15 + .../dot-files/.vim/bundle/nerdtree/.gitignore | 3 + .../.vim/bundle/nerdtree/.vintrc.yaml | 5 + .../.vim/bundle/nerdtree/CHANGELOG.md | 307 + .../dot-files/.vim/bundle/nerdtree/LICENCE | 13 + .../.vim/bundle/nerdtree/README.markdown | 227 + .../.vim/bundle/nerdtree/_config.yml | 1 + .../bundle/nerdtree/autoload/nerdtree.vim | 249 + .../nerdtree/autoload/nerdtree/ui_glue.vim | 732 ++ .../.vim/bundle/nerdtree/doc/NERDTree.txt | 1534 ++++ .../bundle/nerdtree/lib/nerdtree/bookmark.vim | 365 + .../bundle/nerdtree/lib/nerdtree/creator.vim | 402 + .../bundle/nerdtree/lib/nerdtree/event.vim | 13 + .../bundle/nerdtree/lib/nerdtree/flag_set.vim | 58 + .../bundle/nerdtree/lib/nerdtree/key_map.vim | 164 + .../nerdtree/lib/nerdtree/menu_controller.vim | 211 + .../nerdtree/lib/nerdtree/menu_item.vim | 118 + .../bundle/nerdtree/lib/nerdtree/nerdtree.vim | 209 + .../bundle/nerdtree/lib/nerdtree/notifier.vim | 35 + .../bundle/nerdtree/lib/nerdtree/opener.vim | 326 + .../bundle/nerdtree/lib/nerdtree/path.vim | 852 ++ .../nerdtree/lib/nerdtree/tree_dir_node.vim | 706 ++ .../nerdtree/lib/nerdtree/tree_file_node.vim | 349 + .../.vim/bundle/nerdtree/lib/nerdtree/ui.vim | 532 ++ .../nerdtree_plugin/exec_menuitem.vim | 40 + .../nerdtree/nerdtree_plugin/fs_menu.vim | 484 + .../bundle/nerdtree/nerdtree_plugin/vcs.vim | 47 + .../.vim/bundle/nerdtree/plugin/NERD_tree.vim | 234 + .../.vim/bundle/nerdtree/screenshot.png | Bin 0 -> 87896 bytes .../.vim/bundle/nerdtree/syntax/nerdtree.vim | 97 + .../dot-files/.vim/bundle/undotree/.gitignore | 1 + .../dot-files/.vim/bundle/undotree/README.md | 110 + .../bundle/undotree/autoload/undotree.vim | 1428 +++ .../bundle/undotree/doc/_static/undotree.png | Bin 0 -> 149759 bytes .../.vim/bundle/undotree/doc/undotree.txt | 480 + .../.vim/bundle/undotree/plugin/undotree.vim | 186 + .../.vim/bundle/undotree/syntax/undotree.vim | 37 + .../.vim/bundle/vim-bufferline/.gitignore | 1 + .../.vim/bundle/vim-bufferline/LICENSE | 21 + .../.vim/bundle/vim-bufferline/README.md | 38 + .../vim-bufferline/autoload/bufferline.vim | 130 + .../bufferline/algos/fixed_position.vim | 9 + .../bundle/vim-bufferline/doc/bufferline.txt | 119 + .../vim-bufferline/img/bufferline-command.png | Bin 0 -> 1560 bytes .../vim-bufferline/img/bufferline-status.png | Bin 0 -> 1467 bytes .../vim-bufferline/plugin/bufferline.vim | 61 + .../bundle/vim-easymotion/.github/FUNDING.yml | 12 + .../.github/workflows/reviewdog.yml | 36 + .../.vim/bundle/vim-easymotion/.gitignore | 4 + .../.vim/bundle/vim-easymotion/.travis.yml | 31 + .../.vim/bundle/vim-easymotion/Gemfile | 4 + .../.vim/bundle/vim-easymotion/README.md | 406 + .../.vim/bundle/vim-easymotion/Rakefile | 11 + .../vim-easymotion/autoload/EasyMotion.vim | 1610 ++++ .../autoload/EasyMotion/cmigemo.vim | 117 + .../autoload/EasyMotion/command_line.vim | 283 + .../autoload/EasyMotion/helper.vim | 185 + .../autoload/EasyMotion/highlight.vim | 251 + .../autoload/EasyMotion/migemo/cp932.vim | 97 + .../autoload/EasyMotion/migemo/eucjp.vim | 97 + .../autoload/EasyMotion/migemo/utf8.vim | 97 + .../autoload/EasyMotion/overwin.vim | 27 + .../autoload/EasyMotion/sticky_table.vim | 24 + .../autoload/EasyMotion/undo.vim | 50 + .../bundle/vim-easymotion/autoload/vital.vim | 12 + .../autoload/vital/_easymotion.vim | 5 + .../autoload/vital/_easymotion/Data/Dict.vim | 116 + .../autoload/vital/_easymotion/Data/List.vim | 457 + .../autoload/vital/_easymotion/Data/Set.vim | 284 + .../vital/_easymotion/HitAHint/Hint.vim | 126 + .../vital/_easymotion/HitAHint/Motion.vim | 806 ++ .../_easymotion/Over/Commandline/Base.vim | 606 ++ .../_easymotion/Over/Commandline/Modules.vim | 42 + .../Commandline/Modules/BufferComplete.vim | 179 + .../Over/Commandline/Modules/Cancel.vim | 40 + .../Over/Commandline/Modules/CursorMove.vim | 58 + .../Over/Commandline/Modules/Delete.vim | 56 + .../Over/Commandline/Modules/Doautocmd.vim | 121 + .../Commandline/Modules/DrawCommandline.vim | 155 + .../Commandline/Modules/ExceptionExit.vim | 37 + .../Commandline/Modules/ExceptionMessage.vim | 66 + .../Over/Commandline/Modules/Exit.vim | 40 + .../Over/Commandline/Modules/History.vim | 75 + .../Commandline/Modules/InsertRegister.vim | 164 + .../Over/Commandline/Modules/KeyMapping.vim | 139 + .../Over/Commandline/Modules/NoInsert.vim | 55 + .../Over/Commandline/Modules/Paste.vim | 40 + .../Over/Commandline/Modules/Redraw.vim | 72 + .../vital/_easymotion/Over/Exception.vim | 46 + .../autoload/vital/_easymotion/Over/Input.vim | 40 + .../vital/_easymotion/Over/Keymapping.vim | 95 + .../vital/_easymotion/Over/Signals.vim | 119 + .../vital/_easymotion/Over/String.vim | 164 + .../vital/_easymotion/Palette/Capture.vim | 74 + .../vital/_easymotion/Palette/Highlight.vim | 133 + .../vital/_easymotion/Palette/Keymapping.vim | 121 + .../autoload/vital/_easymotion/Prelude.vim | 430 + .../autoload/vital/_easymotion/Vim/Buffer.vim | 187 + .../autoload/vital/_easymotion/Vim/Guard.vim | 240 + .../vital/_easymotion/Vim/Message.vim | 80 + .../autoload/vital/easymotion.vim | 339 + .../autoload/vital/easymotion.vital | 20 + .../bundle/vim-easymotion/doc/easymotion.txt | 1255 +++ .../vim-easymotion/plugin/EasyMotion.vim | 290 + .../t/compare_movements_spec.vim | 274 + .../vim-easymotion/t/easymotion_spec.vim | 1471 +++ .../t/operator_pending_spec.vim | 110 + .../vim-easymotion/t/smartsign_spec.vim | 575 ++ .../.vim/bundle/vim-fugitive/.gitattributes | 2 + .../bundle/vim-fugitive/.github/FUNDING.yml | 2 + .../.vim/bundle/vim-fugitive/.gitignore | 1 + .../bundle/vim-fugitive/CONTRIBUTING.markdown | 24 + .../.vim/bundle/vim-fugitive/README.markdown | 137 + .../bundle/vim-fugitive/autoload/fugitive.vim | 8127 +++++++++++++++++ .../.vim/bundle/vim-fugitive/doc/fugitive.txt | 730 ++ .../bundle/vim-fugitive/ftdetect/fugitive.vim | 1 + .../vim-fugitive/ftplugin/fugitiveblame.vim | 6 + .../bundle/vim-fugitive/plugin/fugitive.vim | 751 ++ .../bundle/vim-fugitive/syntax/fugitive.vim | 57 + .../vim-fugitive/syntax/fugitiveblame.vim | 7 + .../vim-gitgutter/.github/issue_template.md | 4 + .../.vim/bundle/vim-gitgutter/.gitignore | 5 + .../.vim/bundle/vim-gitgutter/LICENCE | 22 + .../.vim/bundle/vim-gitgutter/README.mkd | 744 ++ .../vim-gitgutter/autoload/gitgutter.vim | 265 + .../autoload/gitgutter/async.vim | 107 + .../autoload/gitgutter/debug.vim | 109 + .../vim-gitgutter/autoload/gitgutter/diff.vim | 421 + .../autoload/gitgutter/diff_highlight.vim | 201 + .../vim-gitgutter/autoload/gitgutter/fold.vim | 115 + .../autoload/gitgutter/highlight.vim | 245 + .../vim-gitgutter/autoload/gitgutter/hunk.vim | 613 ++ .../vim-gitgutter/autoload/gitgutter/sign.vim | 250 + .../autoload/gitgutter/utility.vim | 255 + .../bundle/vim-gitgutter/doc/gitgutter.txt | 784 ++ .../bundle/vim-gitgutter/plugin/gitgutter.vim | 322 + .../.vim/bundle/vim-gitgutter/screenshot.png | Bin 0 -> 601382 bytes .../.vim/bundle/vim-gitgutter/test/cp932.txt | 8 + .../bundle/vim-gitgutter/test/fixture.txt | 11 + .../bundle/vim-gitgutter/test/fixture_dos.txt | 11 + .../.vim/bundle/vim-gitgutter/test/runner.vim | 162 + .../.vim/bundle/vim-gitgutter/test/test | 21 + .../vim-gitgutter/test/test_gitgutter.vim | 1166 +++ .../.vim/bundle/vim-signature/.gitignore | 1 + .../.vim/bundle/vim-signature/LICENSE | 22 + .../.vim/bundle/vim-signature/README.md | 97 + .../vim-signature/after/plugin/signature.vim | 38 + .../vim-signature/autoload/signature/mark.vim | 427 + .../autoload/signature/marker.vim | 174 + .../vim-signature/autoload/signature/sign.vim | 375 + .../autoload/signature/utils.vim | 195 + .../bundle/vim-signature/doc/signature.txt | 408 + .../bundle/vim-signature/plugin/signature.vim | 69 + home-rc/dot-files/.vim/colors/Tomorrow.vim | 485 + home-rc/dot-files/.vim/colors/afterglow.vim | 547 ++ home-rc/dot-files/.vim/colors/darkburn.vim | 300 + home-rc/dot-files/.vim/colors/grb256.vim | 30 + home-rc/dot-files/.vim/colors/grb4.vim | 17 + home-rc/dot-files/.vim/colors/grblight.vim | 15 + home-rc/dot-files/.vim/colors/ir_black.vim | 212 + home-rc/dot-files/.vim/colors/peaksea.vim | 612 ++ home-rc/dot-files/.vim/colors/zenburn.vim | 351 + home-rc/dot-files/.vim/filetype.vim | 3 + home-rc/dot-files/.vim/syntax/xt.vim | 78 + home-rc/dot-files/.vimrc | 283 + home-rc/dot-files/get-bash-git-prompt.txt | 2 + root/user_create.txt | 7 + 260 files changed, 50744 insertions(+) create mode 100644 .gitmodules create mode 100644 etc/apache2/conf-include/akamai.proxy.list create mode 100644 etc/apache2/conf-include/akamai.site-shield.list create mode 100644 etc/apache2/conf-include/ip-netskope.access.conf create mode 100644 etc/apache2/conf-include/ip.access.conf create mode 100644 etc/apache2/conf-include/login.access.conf create mode 100644 etc/gitconfig create mode 100644 etc/gitignore create mode 100644 etc/postfix/aliases create mode 100644 home-rc/ReadMe.md create mode 100644 home-rc/dot-files/.bash-git-prompt/.gitattributes create mode 100644 home-rc/dot-files/.bash-git-prompt/.gitignore create mode 100644 home-rc/dot-files/.bash-git-prompt/LICENSE.txt create mode 100644 home-rc/dot-files/.bash-git-prompt/README.md create mode 100644 home-rc/dot-files/.bash-git-prompt/bash-git-prompt.rb create mode 100644 home-rc/dot-files/.bash-git-prompt/bash-git-prompt.spec create mode 100755 home-rc/dot-files/.bash-git-prompt/git-prompt-help.sh create mode 100644 home-rc/dot-files/.bash-git-prompt/gitprompt.fish create mode 100644 home-rc/dot-files/.bash-git-prompt/gitprompt.png create mode 100755 home-rc/dot-files/.bash-git-prompt/gitprompt.sh create mode 100755 home-rc/dot-files/.bash-git-prompt/gitstatus.py create mode 100755 home-rc/dot-files/.bash-git-prompt/gitstatus.sh create mode 100755 home-rc/dot-files/.bash-git-prompt/gitstatus_pre-1.7.10.sh create mode 100644 home-rc/dot-files/.bash-git-prompt/prompt-colors.sh create mode 100644 home-rc/dot-files/.bash-git-prompt/themes/Chmike.bgptheme create mode 100644 home-rc/dot-files/.bash-git-prompt/themes/Crunch.bgptheme create mode 100644 home-rc/dot-files/.bash-git-prompt/themes/Custom.bgptemplate create mode 100644 home-rc/dot-files/.bash-git-prompt/themes/Default.bgptheme create mode 100644 home-rc/dot-files/.bash-git-prompt/themes/Default_NoExitState.bgptheme create mode 100644 home-rc/dot-files/.bash-git-prompt/themes/Default_NoExitState_Ubuntu.bgptheme create mode 100644 home-rc/dot-files/.bash-git-prompt/themes/Default_Ubuntu.bgptheme create mode 100644 home-rc/dot-files/.bash-git-prompt/themes/Evermeet.bgptheme create mode 100644 home-rc/dot-files/.bash-git-prompt/themes/Evermeet_Lowres.bgptheme create mode 100644 home-rc/dot-files/.bash-git-prompt/themes/Evermeet_Ubuntu.bgptheme create mode 100644 home-rc/dot-files/.bash-git-prompt/themes/Minimal.bgptheme create mode 100644 home-rc/dot-files/.bash-git-prompt/themes/Minimal_Chevron.bgptheme create mode 100644 home-rc/dot-files/.bash-git-prompt/themes/Minimal_UserHost.bgptheme create mode 100644 home-rc/dot-files/.bash-git-prompt/themes/Plague_Doctor.bgptheme create mode 100644 home-rc/dot-files/.bash-git-prompt/themes/Single_line.bgptheme create mode 100644 home-rc/dot-files/.bash-git-prompt/themes/Single_line_Dark.bgptheme create mode 100644 home-rc/dot-files/.bash-git-prompt/themes/Single_line_Minimalist.bgptheme create mode 100644 home-rc/dot-files/.bash-git-prompt/themes/Single_line_NoExitState.bgptheme create mode 100644 home-rc/dot-files/.bash-git-prompt/themes/Single_line_NoExitState_Gentoo.bgptheme create mode 100644 home-rc/dot-files/.bash-git-prompt/themes/Single_line_NoExitState_openSUSE.bgptheme create mode 100644 home-rc/dot-files/.bash-git-prompt/themes/Single_line_Solarized.bgptheme create mode 100644 home-rc/dot-files/.bash-git-prompt/themes/Single_line_Solarized_Lamda.bgptheme create mode 100644 home-rc/dot-files/.bash-git-prompt/themes/Single_line_Ubuntu.bgptheme create mode 100644 home-rc/dot-files/.bash-git-prompt/themes/Single_line_openSUSE.bgptheme create mode 100644 home-rc/dot-files/.bash-git-prompt/themes/Single_line_username_repo.bgptheme create mode 100644 home-rc/dot-files/.bash-git-prompt/themes/Solarized.bgptheme create mode 100644 home-rc/dot-files/.bash-git-prompt/themes/Solarized_Extravagant.bgptheme create mode 100644 home-rc/dot-files/.bash-git-prompt/themes/Solarized_NoExitState.bgptheme create mode 100644 home-rc/dot-files/.bash-git-prompt/themes/Solarized_NoExitState_Ubuntu.bgptheme create mode 100644 home-rc/dot-files/.bash-git-prompt/themes/Solarized_Ubuntu.bgptheme create mode 100644 home-rc/dot-files/.bash-git-prompt/themes/Solarized_UserHost.bgptheme create mode 100644 home-rc/dot-files/.bash-git-prompt/themes/TruncatedPwd_WindowTitle.bgptheme create mode 100644 home-rc/dot-files/.bash-git-prompt/themes/TruncatedPwd_WindowTitle_NoExitState.bgptheme create mode 100644 home-rc/dot-files/.bash-git-prompt/themes/TruncatedPwd_WindowTitle_NoExitState_Ubuntu.bgptheme create mode 100644 home-rc/dot-files/.bash-git-prompt/themes/TruncatedPwd_WindowTitle_Ubuntu.bgptheme create mode 100644 home-rc/dot-files/.bash_profile create mode 100644 home-rc/dot-files/.bashrc-amazon-linux-v2-root create mode 100644 home-rc/dot-files/.bashrc-amazon-linux-v2-user create mode 100644 home-rc/dot-files/.bashrc-debian create mode 100644 home-rc/dot-files/.bashrc-general create mode 100644 home-rc/dot-files/.bashrc-ubuntu create mode 100644 home-rc/dot-files/.psqlrc create mode 100644 home-rc/dot-files/.screenrc create mode 100644 home-rc/dot-files/.vim/.netrwhist create mode 100644 home-rc/dot-files/.vim/autoload/pathogen.vim create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/.github/ISSUE_TEMPLATE/bug.md create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/.github/ISSUE_TEMPLATE/feature_request.md create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/.github/ISSUE_TEMPLATE/question.md create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/.github/PULL_REQUEST_TEMPLATE.md create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/.github/stale.yml create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/.github/workflows/ci.yml create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/.pre-commit-config.yaml create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/.vintrc.yaml create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/LICENSE create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/README.md create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/after/syntax/nerdtree.vim create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/autoload/gitstatus.vim create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/autoload/gitstatus/doctor.vim create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/autoload/gitstatus/job.vim create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/autoload/gitstatus/listener.vim create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/autoload/gitstatus/log.vim create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/autoload/gitstatus/util.vim create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/nerdtree_plugin/git_status.vim create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/tests/.themisrc create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/tests/test_all.vim create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree/.github/ISSUE_TEMPLATE/bug.md create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree/.github/ISSUE_TEMPLATE/feature_request.md create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree/.github/ISSUE_TEMPLATE/question.md create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree/.github/PULL_REQUEST_TEMPLATE.md create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree/.github/workflows/vint.yml create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree/.gitignore create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree/.vintrc.yaml create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree/CHANGELOG.md create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree/LICENCE create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree/README.markdown create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree/_config.yml create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree/autoload/nerdtree.vim create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree/autoload/nerdtree/ui_glue.vim create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree/doc/NERDTree.txt create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/bookmark.vim create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/creator.vim create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/event.vim create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/flag_set.vim create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/key_map.vim create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/menu_controller.vim create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/menu_item.vim create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/nerdtree.vim create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/notifier.vim create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/opener.vim create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/path.vim create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/tree_dir_node.vim create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/tree_file_node.vim create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/ui.vim create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree/nerdtree_plugin/exec_menuitem.vim create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree/nerdtree_plugin/fs_menu.vim create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree/nerdtree_plugin/vcs.vim create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree/plugin/NERD_tree.vim create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree/screenshot.png create mode 100644 home-rc/dot-files/.vim/bundle/nerdtree/syntax/nerdtree.vim create mode 100644 home-rc/dot-files/.vim/bundle/undotree/.gitignore create mode 100644 home-rc/dot-files/.vim/bundle/undotree/README.md create mode 100644 home-rc/dot-files/.vim/bundle/undotree/autoload/undotree.vim create mode 100644 home-rc/dot-files/.vim/bundle/undotree/doc/_static/undotree.png create mode 100644 home-rc/dot-files/.vim/bundle/undotree/doc/undotree.txt create mode 100644 home-rc/dot-files/.vim/bundle/undotree/plugin/undotree.vim create mode 100644 home-rc/dot-files/.vim/bundle/undotree/syntax/undotree.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-bufferline/.gitignore create mode 100644 home-rc/dot-files/.vim/bundle/vim-bufferline/LICENSE create mode 100644 home-rc/dot-files/.vim/bundle/vim-bufferline/README.md create mode 100644 home-rc/dot-files/.vim/bundle/vim-bufferline/autoload/bufferline.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-bufferline/autoload/bufferline/algos/fixed_position.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-bufferline/doc/bufferline.txt create mode 100644 home-rc/dot-files/.vim/bundle/vim-bufferline/img/bufferline-command.png create mode 100644 home-rc/dot-files/.vim/bundle/vim-bufferline/img/bufferline-status.png create mode 100644 home-rc/dot-files/.vim/bundle/vim-bufferline/plugin/bufferline.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/.github/FUNDING.yml create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/.github/workflows/reviewdog.yml create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/.gitignore create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/.travis.yml create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/Gemfile create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/README.md create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/Rakefile create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/EasyMotion.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/EasyMotion/cmigemo.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/EasyMotion/command_line.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/EasyMotion/helper.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/EasyMotion/highlight.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/EasyMotion/migemo/cp932.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/EasyMotion/migemo/eucjp.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/EasyMotion/migemo/utf8.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/EasyMotion/overwin.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/EasyMotion/sticky_table.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/EasyMotion/undo.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Data/Dict.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Data/List.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Data/Set.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/HitAHint/Hint.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/HitAHint/Motion.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Base.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/BufferComplete.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/Cancel.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/CursorMove.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/Delete.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/Doautocmd.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/DrawCommandline.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/ExceptionExit.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/ExceptionMessage.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/Exit.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/History.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/InsertRegister.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/KeyMapping.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/NoInsert.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/Paste.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/Redraw.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Exception.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Input.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Keymapping.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Signals.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/String.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Palette/Capture.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Palette/Highlight.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Palette/Keymapping.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Prelude.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Vim/Buffer.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Vim/Guard.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Vim/Message.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/easymotion.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/easymotion.vital create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/doc/easymotion.txt create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/plugin/EasyMotion.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/t/compare_movements_spec.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/t/easymotion_spec.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/t/operator_pending_spec.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-easymotion/t/smartsign_spec.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-fugitive/.gitattributes create mode 100644 home-rc/dot-files/.vim/bundle/vim-fugitive/.github/FUNDING.yml create mode 100644 home-rc/dot-files/.vim/bundle/vim-fugitive/.gitignore create mode 100644 home-rc/dot-files/.vim/bundle/vim-fugitive/CONTRIBUTING.markdown create mode 100644 home-rc/dot-files/.vim/bundle/vim-fugitive/README.markdown create mode 100644 home-rc/dot-files/.vim/bundle/vim-fugitive/autoload/fugitive.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-fugitive/doc/fugitive.txt create mode 100644 home-rc/dot-files/.vim/bundle/vim-fugitive/ftdetect/fugitive.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-fugitive/ftplugin/fugitiveblame.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-fugitive/plugin/fugitive.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-fugitive/syntax/fugitive.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-fugitive/syntax/fugitiveblame.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-gitgutter/.github/issue_template.md create mode 100644 home-rc/dot-files/.vim/bundle/vim-gitgutter/.gitignore create mode 100644 home-rc/dot-files/.vim/bundle/vim-gitgutter/LICENCE create mode 100644 home-rc/dot-files/.vim/bundle/vim-gitgutter/README.mkd create mode 100644 home-rc/dot-files/.vim/bundle/vim-gitgutter/autoload/gitgutter.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-gitgutter/autoload/gitgutter/async.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-gitgutter/autoload/gitgutter/debug.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-gitgutter/autoload/gitgutter/diff.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-gitgutter/autoload/gitgutter/diff_highlight.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-gitgutter/autoload/gitgutter/fold.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-gitgutter/autoload/gitgutter/highlight.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-gitgutter/autoload/gitgutter/hunk.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-gitgutter/autoload/gitgutter/sign.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-gitgutter/autoload/gitgutter/utility.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-gitgutter/doc/gitgutter.txt create mode 100644 home-rc/dot-files/.vim/bundle/vim-gitgutter/plugin/gitgutter.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-gitgutter/screenshot.png create mode 100644 home-rc/dot-files/.vim/bundle/vim-gitgutter/test/cp932.txt create mode 100644 home-rc/dot-files/.vim/bundle/vim-gitgutter/test/fixture.txt create mode 100644 home-rc/dot-files/.vim/bundle/vim-gitgutter/test/fixture_dos.txt create mode 100644 home-rc/dot-files/.vim/bundle/vim-gitgutter/test/runner.vim create mode 100755 home-rc/dot-files/.vim/bundle/vim-gitgutter/test/test create mode 100644 home-rc/dot-files/.vim/bundle/vim-gitgutter/test/test_gitgutter.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-signature/.gitignore create mode 100644 home-rc/dot-files/.vim/bundle/vim-signature/LICENSE create mode 100644 home-rc/dot-files/.vim/bundle/vim-signature/README.md create mode 100644 home-rc/dot-files/.vim/bundle/vim-signature/after/plugin/signature.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-signature/autoload/signature/mark.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-signature/autoload/signature/marker.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-signature/autoload/signature/sign.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-signature/autoload/signature/utils.vim create mode 100644 home-rc/dot-files/.vim/bundle/vim-signature/doc/signature.txt create mode 100644 home-rc/dot-files/.vim/bundle/vim-signature/plugin/signature.vim create mode 100644 home-rc/dot-files/.vim/colors/Tomorrow.vim create mode 100644 home-rc/dot-files/.vim/colors/afterglow.vim create mode 100755 home-rc/dot-files/.vim/colors/darkburn.vim create mode 100644 home-rc/dot-files/.vim/colors/grb256.vim create mode 100644 home-rc/dot-files/.vim/colors/grb4.vim create mode 100644 home-rc/dot-files/.vim/colors/grblight.vim create mode 100644 home-rc/dot-files/.vim/colors/ir_black.vim create mode 100644 home-rc/dot-files/.vim/colors/peaksea.vim create mode 100755 home-rc/dot-files/.vim/colors/zenburn.vim create mode 100644 home-rc/dot-files/.vim/filetype.vim create mode 100644 home-rc/dot-files/.vim/syntax/xt.vim create mode 100644 home-rc/dot-files/.vimrc create mode 100644 home-rc/dot-files/get-bash-git-prompt.txt create mode 100644 root/user_create.txt diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..1c78b0b --- /dev/null +++ b/.gitmodules @@ -0,0 +1,27 @@ +[submodule "home-rc/dot-files/.bash-git-prompt"] + path = home-rc/dot-files/.bash-git-prompt + url = https://github.com/magicmonty/bash-git-prompt.git +[submodule "home-rc/dot-files/.vim/bundle/nerdtree"] + path = home-rc/dot-files/.vim/bundle/nerdtree + url = https://github.com/scrooloose/nerdtree.git +[submodule "home-rc/dot-files/.vim/bundle/nerdtree-git-plugin"] + path = home-rc/dot-files/.vim/bundle/nerdtree-git-plugin + url = https://github.com/Xuyuanp/nerdtree-git-plugin.git +[submodule "home-rc/dot-files/.vim/bundle/vim-bufferline"] + path = home-rc/dot-files/.vim/bundle/vim-bufferline + url = https://github.com/bling/vim-bufferline +[submodule "home-rc/dot-files/.vim/bundle/vim-gitgutter"] + path = home-rc/dot-files/.vim/bundle/vim-gitgutter + url = git://github.com/airblade/vim-gitgutter.git +[submodule "home-rc/dot-files/.vim/bundle/vim-fugitive"] + path = home-rc/dot-files/.vim/bundle/vim-fugitive + url = https://github.com/tpope/vim-fugitive.git +[submodule "home-rc/dot-files/.vim/bundle/vim-signature"] + path = home-rc/dot-files/.vim/bundle/vim-signature + url = https://github.com/kshenoy/vim-signature.git +[submodule "home-rc/dot-files/.vim/bundle/vim-easymotion"] + path = home-rc/dot-files/.vim/bundle/vim-easymotion + url = https://github.com/easymotion/vim-easymotion +[submodule "home-rc/dot-files/.vim/bundle/undotree"] + path = home-rc/dot-files/.vim/bundle/undotree + url = https://github.com/mbbill/undotree.git diff --git a/etc/apache2/conf-include/akamai.proxy.list b/etc/apache2/conf-include/akamai.proxy.list new file mode 100644 index 0000000..a105290 --- /dev/null +++ b/etc/apache2/conf-include/akamai.proxy.list @@ -0,0 +1,23 @@ +# https://techdocs.akamai.com/property-mgr/docs/origin-ip-access-control +# per: 2022/9/8 +# Use the site-shield list for WAF setups +23.32.0.0/11 +23.192.0.0/11 +2.16.0.0/13 +104.64.0.0/10 +184.24.0.0/13 +23.0.0.0/12 +95.100.0.0/15 +92.122.0.0/15 +172.232.0.0/13 +184.50.0.0/15 +88.221.0.0/16 +23.64.0.0/14 +72.246.0.0/15 +96.16.0.0/15 +96.6.0.0/15 +69.192.0.0/16 +23.72.0.0/13 +173.222.0.0/15 +118.214.0.0/16 +184.84.0.0/14 \ No newline at end of file diff --git a/etc/apache2/conf-include/akamai.site-shield.list b/etc/apache2/conf-include/akamai.site-shield.list new file mode 100644 index 0000000..a0caf45 --- /dev/null +++ b/etc/apache2/conf-include/akamai.site-shield.list @@ -0,0 +1,46 @@ +IP Addresses - Omnicom Site Shield Sites_20221118.csv +104.75.169.0/24 +104.88.195.0/24 +104.93.21.0/24 +168.143.242.0/24 +168.143.243.0/24 +172.232.11.0/24 +184.30.31.0/24 +201.159.159.0/24 +23.1.96.0/24 +23.192.164.0/24 +23.192.44.0/24 +23.192.45.0/24 +23.192.46.0/24 +23.193.170.0/24 +23.195.73.0/24 +23.200.54.0/24 +23.201.57.0/24 +23.205.108.0/24 +23.210.215.0/24 +23.211.14.0/24 +23.212.54.0/24 +23.213.54.0/24 +23.220.165.0/24 +23.220.247.0/24 +23.220.96.0/24 +23.35.71.0/24 +23.44.170.0/24 +23.48.209.0/24 +23.48.94.0/24 +23.54.124.0/24 +23.56.168.0/24 +23.58.158.0/24 +23.61.250.0/24 +23.63.251.0/24 +23.67.73.0/24 +23.77.203.0/24 +23.77.218.0/24 +67.220.142.0/24 +69.174.30.128/25 +69.31.74.0/24 +69.31.75.0/24 +96.17.111.0/24 +96.17.149.0/24 +96.7.218.0/24 +96.7.74.0/24 \ No newline at end of file diff --git a/etc/apache2/conf-include/ip-netskope.access.conf b/etc/apache2/conf-include/ip-netskope.access.conf new file mode 100644 index 0000000..2870698 --- /dev/null +++ b/etc/apache2/conf-include/ip-netskope.access.conf @@ -0,0 +1,8 @@ +# Tokyo B +Require ip 103.219.79.0/24 +# Tokyo A +Require ip 163.116.207.0/24 +# Tokyo C +Require ip 163.116.208.0/24 +# Osaka +Require ip 163.116.197.0/24 \ No newline at end of file diff --git a/etc/apache2/conf-include/ip.access.conf b/etc/apache2/conf-include/ip.access.conf new file mode 100644 index 0000000..593f8de --- /dev/null +++ b/etc/apache2/conf-include/ip.access.conf @@ -0,0 +1,18 @@ +Require local +# Somen Proxy Jump +Require ip 35.76.193.119/32 +# Udon Monitoring +Require ip 18.177.200.38/32 +# [TO BE DEPRECATED] Toranomon Network +Require ip 153.143.238.72/29 +Require ip 153.143.238.208/29 +# [TO BE DEPRECATED] Yokohama Network +Require ip 153.246.36.48/29 +Require ip 153.246.36.56/29 +# Netskope/Singapore TAO +Require ip 202.2.133.4/32 +# Netskope/TBWA Japan AWS Publisher +Require ip 18.178.205.136/32 +Require ip 18.182.222.190/32 +# E-gra AWS DMZ VPC Subnet IPv6 +Require ip 2406:da14:7:5d00::/64 diff --git a/etc/apache2/conf-include/login.access.conf b/etc/apache2/conf-include/login.access.conf new file mode 100644 index 0000000..7924f16 --- /dev/null +++ b/etc/apache2/conf-include/login.access.conf @@ -0,0 +1,8 @@ +AuthUserFile /etc/apache2/auth/default.passwd +AuthType Basic +AuthName "HOST NAME OR INFO" +# AuthUserFile /etc/apache2/auth/passfile +Require valid-user +# Require user ... +# AuthGroupFile /etc/apache2/auth/groups +# Require group diff --git a/etc/gitconfig b/etc/gitconfig new file mode 100644 index 0000000..5a3edb9 --- /dev/null +++ b/etc/gitconfig @@ -0,0 +1,166 @@ +[core] + # if a user sets his own ignore file, the data in this file will be not used + excludesfile = /etc/gitignore + editor = /usr/bin/vim + pager = less -r +[init] + defaultBranch = master +[advice] + # hints in status page (like how to add/etc) + statusHints = false +[push] + default = simple +[pull] + rebase = false +[diff] + mnemonicprefix = true + algorithm = histogram + colorMoved = default + colorMovedWS = allow-indentation-change + submodule = log +[grep] + extendRegexp = true + lineNumber = true +[status] +# showUntrackedFiles = all + submoduleSummary = true +[merge] + conflictStyle = zdiff3 +[rerere] + enabled = true +[color] + ui = true +# https://www.kernel.org/pub/software/scm/git/docs/git-config.html +# colors: normal, black, red, green, yellow, blue, magenta, cyan, white +# valid: bold, dim, ul, blink, reverse, italic, strike +[color "diff"] + meta = bold yellow + frag = bold blue + new = green + old = red + newMoved = green dim + oldMoved = red dim + commit = magenta + whitespace = reverse red dim +[color "branch"] + # plain + meta = reverse blue white + local = yellow + remote = green + upstream = magenta +# current = red +[color "status"] + # unmerged + header = white + added = yellow + changed = red + untracked = cyan + branch = cyan + nobranch = bold yellow +[color "grep"] + # context, function, linenumber, match, matchContext, matchSelected, selected, separator + filename = magenta +[alias] + co = checkout + # add + commit in one step + ci = commit -a + # same as above with verbose + civ = commit -a -v + # commit shortcut + cm = commit + # commit verbose + cmv = commit -v + # commit with ammend + cma = commit --amend + # commit +add with ammend + cmaa = commit -a --amend + # commit with ammend and verbose + cmav = commit --amend -v + # branch + br = branch -vv + # branches sort by last commit date + brc= branch -vv --sort=committerdate + # remote branches + brr= branch -vv -r + # all branches + bra = branch -vv -a + # shortcut for status + st = status --short --branch + # add with verbose + ad = add -v + # merge + mg = merge + # update (pull + rebase) + up = pull --rebase + # last log message + last = log --date=iso --decorate --stat -1 HEAD + # detailed log (include log size) + ll = log --date=iso --decorate --graph --log-size + lla = log --date=iso --decorate --graph --log-size --all + # same, but with stats + lls = log --date=iso --decorate --graph --log-size --stat + llsa = log --date=iso --decorate --graph --log-size --stat --all + # short log (one line per log entry) + ls = log --pretty=format:'%Cred%h%Creset %Cgreen%ad%Creset | %<(80,trunc)%s %Cgreen(%cr)%Creset %C(bold blue)[%an]%Creset%C(yellow)%d%Creset' --graph --date=iso --decorate + lsa = log --pretty=format:'%Cred%h%Creset %Cgreen%ad%Creset | %<(80,trunc)%s %Cgreen(%cr)%Creset %C(bold blue)[%an]%Creset%C(yellow)%d%Creset' --graph --date=iso --decorate --all + # terse, but with commit file info + lsl = log --pretty=format:'%Cred%h%Creset %Cgreen%ad%Creset |%<(60,trunc)%s' --graph --date=iso --decorate --stat + lsla = log --pretty=format:'%Cred%h%Creset %Cgreen%ad%Creset |%<(60,trunc)%s' --graph --date=iso --decorate --stat --all + # log with changes (patch format) + lp = log -p --pretty=fuller --abbrev-commit + # revert change before add [take file from commited and overwrite local file] + # revert command itself is already used + rvt = checkout -- + # revert add [undo an add file] + # reset is the shortcut for reset HEAD + rst = reset -- + unstage = reset HEAD -- + # diff shortcut + df = diff + # diff to index (cached) + dc = diff --cached + # diff with word difference + dw = diff --word-diff + # diff with stat, shows quick difference (edited to index, before add) + ds = diff --stat + # diff stat cached: same, but to index (after add) + dsc = diff --stat --cached + # info -> remote verbose + info = remote -v + # new log entries since last pull/fetch + new = !sh -c 'git log $1@{1}..$1@{0} "$@"' + # stash pretty print + stashed = stash list --pretty=format:'%gd: %Cred%h%Creset %Cgreen[%ar]%Creset %s' + # unpushed commits (long) + unpushed = log --branches @{u}.. + # unpushed short + upushed = log --branches --not --remotes --simplify-by-decoration --decorate --oneline + # From http://blog.apiaxle.com/post/handy-git-tips-to-stop-you-getting-fired/ + assume = update-index --assume-unchanged + unassume = update-index --no-assume-unchanged + # lower case is with -v for unassume, add s for skip work tree + assumed = "!git ls-files -v | grep ^[hs] | cut -c 3-" + # for skip work tree (S flag in ls-files) + skip = update-index --skip-worktree + unskip = update-index --no-skip-worktree + # small as if unassume set too + skipped = "!git ls-files -v | grep ^[Ss] | cut -c 3-" + # create a snapshot from the current working tree without removing the changes from the tree + snapshot = !git stash save "snapshot: $(date)" && git stash apply "stash@{0}" + # some helpers for basic + # checkout development + cod = co development + # checkout master + com = co master + # merge development (down) + mgd = merge development + # merge master (up) + mgm = merge master + # push to ALL remotes + pushall = !git remote | xargs -L1 git push --all + # list tags in proper order or | sort -V + tl = !git tag --list --sort=v:refname + tlr= !git tag --list --sort=-v:refname + # tag sort date + tld = tag --sort=taggerdate + tldr= tag --sort=-taggerdate diff --git a/etc/gitignore b/etc/gitignore new file mode 100644 index 0000000..70c1032 --- /dev/null +++ b/etc/gitignore @@ -0,0 +1,6 @@ +*~ +.DS_Store +.svn +.svn/* +._* +.*.swp diff --git a/etc/postfix/aliases b/etc/postfix/aliases new file mode 100644 index 0000000..2ccae0b --- /dev/null +++ b/etc/postfix/aliases @@ -0,0 +1,96 @@ +# +# Aliases in this file will NOT be expanded in the header from +# Mail, but WILL be visible over networks or from /bin/mail. +# +# >>>>>>>>>> The program "newaliases" must be run after +# >> NOTE >> this file is updated for any changes to +# >>>>>>>>>> show through to sendmail. +# + +# Basic system aliases -- these MUST be present. +mailer-daemon: postmaster +postmaster: root + +# General redirections for pseudo accounts. +bin: root +daemon: root +adm: root +lp: root +sync: root +shutdown: root +halt: root +mail: root +news: root +uucp: root +operator: root +games: root +gopher: root +ftp: root +nobody: root +radiusd: root +nut: root +dbus: root +vcsa: root +canna: root +wnn: root +rpm: root +nscd: root +pcap: root +apache: root +webalizer: root +dovecot: root +fax: root +quagga: root +radvd: root +pvm: root +amanda: root +privoxy: root +ident: root +named: root +xfs: root +gdm: root +mailnull: root +postgres: root +sshd: root +smmsp: root +postfix: root +netdump: root +ldap: root +squid: root +ntp: root +mysql: root +desktop: root +rpcuser: root +rpc: root +nfsnobody: root + +ingres: root +system: root +toor: root +manager: root +dumper: root +abuse: root + +newsadm: news +newsadmin: news +usenet: news +ftpadm: ftp +ftpadmin: ftp +ftp-adm: ftp +ftp-admin: ftp +www: webmaster +webmaster: root +noc: root +security: root +hostmaster: root +info: postmaster +marketing: postmaster +sales: postmaster +support: postmaster + + +# trap decode to catch security attacks +decode: root + +# Person who should get root's mail +root: hostmaster@tequila.jp diff --git a/home-rc/ReadMe.md b/home-rc/ReadMe.md new file mode 100644 index 0000000..78d403e --- /dev/null +++ b/home-rc/ReadMe.md @@ -0,0 +1,54 @@ +# home-rc +$HOME settings + +dot-files: the actual . files +etc: git global config files + +* vim +NOTE: uses airline, which is installed from package in debian and not via plugin + +vim config + plugins used +- uses pathogen for bundle loading + +Bundles installed are: +- nerdtree + nerdtree git hightlight plugin [subtree] +- undotree (static install) +- bufferline [subtree] +- fugitive git handling [subtree] +- git gutter, show git changes in the vim gutter [subtree] +- signature, show buffer names in gutter [subtree] + +* psqlrc +basic command line settings and a list of helper queries + +Helper Queries: +- tsize/rtsize/etsize: table + index size outputs +- trashindexes/trashindexesall: show unused indexes (all shows ALL of them) +- getindexes '': show all indexes + usage for one table +- missingindexes: possible missing indexes (for foreign keys) +- percentindex: % of times index is used (with rows in table) +- running/runningidle: needs to be set for PostgreSQL version. Currently allowed old/9.6/10. shows all running queries +- missingpk: show missing primary key +- cachehit [not working] +- indexhit: index hits overall +- show_slow_queries: show queries that are slow on average of oaverall run queries +- shsp: show search path (schema) +- setsp '': set search path (schema) +- indexbloat: show bloated indexes (%, size, etc) +- indexusage: never used indexes + size (index/table) +- foreignkeycount: show foreign key connections to tables in numbers +- tablebloat: show table bloat in percent + size of table +- viewlockedqueries: show queries that are locked +- viewlocks: show current table/query locks +- vacuumneed: show if vacuum is needed +- tablebloatscan: more detailed bloat scan and show only truly bloated tables +- vacuumstatus: show status of current vacuum + +* bash config +Basic PS1 settings, plus the use of bash git prompt interface + +* screen +Screen config with hardline/split, etc settings. Also holds some additional line configs + +* git + core etc +Files in etc/ are to be copied into the /etc folder and are core git configs with various aliases diff --git a/home-rc/dot-files/.bash-git-prompt/.gitattributes b/home-rc/dot-files/.bash-git-prompt/.gitattributes new file mode 100644 index 0000000..4c33939 --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/.gitattributes @@ -0,0 +1,3 @@ +# Unix lines endings in bash script files +*.sh text eol=lf +themes/* text eol=lf diff --git a/home-rc/dot-files/.bash-git-prompt/.gitignore b/home-rc/dot-files/.bash-git-prompt/.gitignore new file mode 100644 index 0000000..7707360 --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/.gitignore @@ -0,0 +1,3 @@ +*~ +*.bak +.idea/ diff --git a/home-rc/dot-files/.bash-git-prompt/LICENSE.txt b/home-rc/dot-files/.bash-git-prompt/LICENSE.txt new file mode 100644 index 0000000..d9cf93e --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/LICENSE.txt @@ -0,0 +1,23 @@ +Copyright (c) 2016, Martin Gondermann +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/home-rc/dot-files/.bash-git-prompt/README.md b/home-rc/dot-files/.bash-git-prompt/README.md new file mode 100644 index 0000000..8f7ecff --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/README.md @@ -0,0 +1,396 @@ +# Informative git prompt for bash and fish + +[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/magicmonty/bash-git-prompt?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) + +This prompt is a port of the "Informative git prompt for zsh" which you can +find [here](https://github.com/olivierverdier/zsh-git-prompt) + +A ``bash`` prompt that displays information about the current git repository. +In particular the branch name, difference with remote branch, number of files +staged, changed, etc. + +(an original idea from this [blog post][]). + +`gitstatus.sh` and `git-prompt-help.sh` added by [AKS](http://github.com/aks). + +# ATTENTION! Breaking changes! + +**If you use this prompt already, please update your `.git-prompt-colors.sh`, +if you have one. It now contains a function named `define_git_prompt_colors()` or `override_git_prompt_colors()`!** + +**Please see the ``Custom.bgptemplate`` in the ``themes`` subdirectory of the installation directory!** + +**You can now also use the function `override_git_prompt_colors()`. It should define the variable `GIT_PROMPT_THEME_NAME` +and call the function `reload_git_prompt_colors ` like follows:** + +```sh +override_git_prompt_colors() { + GIT_PROMPT_THEME_NAME="Custom" # needed for reload optimization, should be unique + + # Place your overrides here + ... +} + +# load the theme +reload_git_prompt_colors "Custom" +``` + +The advantage of this approach is, that you only need to specify the parts, that are different to the Default theme. + +--- + +**The variable `GIT_PROMPT_SHOW_LAST_COMMAND_INDICATOR` was replaced with a more general placeholder +named ``_LAST_COMMAND_INDICATOR_``, which is replaced by the state of the last executed command. It is now activated by default.** + +## Examples + +The prompt may look like the following: + +![Example prompt](gitprompt.png) + +* ``(master↑3|✚1)``: on branch ``master``, ahead of remote by 3 commits, 1 file changed but not staged +* ``(status|●2)``: on branch ``status``, 2 files staged +* ``(master|✚7…)``: on branch ``master``, 7 files changed, some files untracked +* ``(master|✖2✚3)``: on branch ``master``, 2 conflicts, 3 files changed +* ``(master|⚑2)``: on branch ``master``, 2 stash entries +* ``(experimental↓2↑3|✔)``: on branch ``experimental``; your branch has diverged by 3 commits, remote by 2 commits; the repository is otherwise clean +* ``(:70c2952|✔)``: not on any branch; parent commit has hash ``70c2952``; the repository is otherwise clean + +## Prompt Structure + +By default, the general appearance of the prompt is:: + + ( |) + +The symbols are as follows: + +- Local Status Symbols + - ``✔``: repository clean + - ``●n``: there are ``n`` staged files + - ``✖n``: there are ``n`` files with merge conflicts + - ``✖-n``: there are ``n`` staged files waiting for removal + - ``✚n``: there are ``n`` changed but *unstaged* files + - ``…n``: there are ``n`` untracked files + - ``⚑n``: there are ``n`` stash entries +- Upstream branch + - Shows the remote tracking branch + - Disabled by default + - Enable by setting GIT_PROMPT_SHOW_UPSTREAM=1 +- Branch Tracking Symbols + - ``↑n``: ahead of remote by ``n`` commits + - ``↓n``: behind remote by ``n`` commits + - ``↓m↑n``: branches diverged, other by ``m`` commits, yours by ``n`` commits + - ``L``: local branch, not remotely tracked +- Branch Symbol:
+ When the branch name starts with a colon ``:``, it means it's actually a hash, not a branch (although it should be pretty clear, unless you name your branches like hashes :-) + +## Installation + +### via [Homebrew][homebrew] on Mac OS X + +- Run `brew update` + +- Run `brew install bash-git-prompt` for the last stable release or `brew install --HEAD bash-git-prompt` for the + latest version directly from the repository + +- Now you can source the file in your `~/.bash_profile` as follows: + +```sh +if [ -f "$(brew --prefix)/opt/bash-git-prompt/share/gitprompt.sh" ]; then + __GIT_PROMPT_DIR=$(brew --prefix)/opt/bash-git-prompt/share + GIT_PROMPT_ONLY_IN_REPO=1 + source "$(brew --prefix)/opt/bash-git-prompt/share/gitprompt.sh" +fi +``` + +### via Git clone + +- Clone this repository to your home directory. + +```sh +git clone https://github.com/magicmonty/bash-git-prompt.git ~/.bash-git-prompt --depth=1 +``` + +Add to the `~/.bashrc`: +``` +if [ -f "$HOME/.bash-git-prompt/gitprompt.sh" ]; then + GIT_PROMPT_ONLY_IN_REPO=1 + source $HOME/.bash-git-prompt/gitprompt.sh +fi +``` + +### install for the fish shell + +- If you cloned the repo to a directory other then ~/.bash-git-prompt , set __GIT_PROMPT_DIR in ~/.config/fish/config.fish + to that path + +- To install as an option in the fish_config GUI + +```sh +sudo install -m 666 gitprompt.fish /usr/share/fish/tools/web_config/sample_prompts/ +fish_config +``` + to install the bash-git-prompt as a choice under the prompt tab of the web config. Selecting this will copy it to + ~/.config/fish/functions/fish_prompt.fish + +- You can also do + +```sh +mkdir -p ~/.config/fish/functions/ +cp gitprompt.fish ~/.config/fish/functions/fish_prompt.fish +``` + to overwrite the current prompt with the bash-git-prompt directly + + +### All configs for .bashrc + +```sh + + # Set config variables first + GIT_PROMPT_ONLY_IN_REPO=1 + + # GIT_PROMPT_FETCH_REMOTE_STATUS=0 # uncomment to avoid fetching remote status + # GIT_PROMPT_IGNORE_SUBMODULES=1 # uncomment to avoid searching for changed files in submodules + # GIT_PROMPT_WITH_VIRTUAL_ENV=0 # uncomment to avoid setting virtual environment infos for node/python/conda environments + + # GIT_PROMPT_SHOW_UPSTREAM=1 # uncomment to show upstream tracking branch + # GIT_PROMPT_SHOW_UNTRACKED_FILES=normal # can be no, normal or all; determines counting of untracked files + + # GIT_PROMPT_SHOW_CHANGED_FILES_COUNT=0 # uncomment to avoid printing the number of changed files + + # GIT_PROMPT_STATUS_COMMAND=gitstatus_pre-1.7.10.sh # uncomment to support Git older than 1.7.10 + + # GIT_PROMPT_START=... # uncomment for custom prompt start sequence + # GIT_PROMPT_END=... # uncomment for custom prompt end sequence + + # as last entry source the gitprompt script + # GIT_PROMPT_THEME=Custom # use custom theme specified in file GIT_PROMPT_THEME_FILE (default ~/.git-prompt-colors.sh) + # GIT_PROMPT_THEME_FILE=~/.git-prompt-colors.sh + # GIT_PROMPT_THEME=Solarized # use theme optimized for solarized color scheme + source ~/.bash-git-prompt/gitprompt.sh +``` + +You can set the `GIT_PROMPT_SHOW_UNTRACKED_FILES` variable to `no` or `normal` to speed things up if you have lots of +untracked files in your repository. This can be the case for build systems that put their build artifacts in +the subdirectory structure of the git repository. Setting it to `all` will count all untracked files, including files +listed in .gitignore. + +- `cd` to a git repository and test it! + +#### Themes + +The most settings are now stored in theme files. To select a theme, set the variable `GIT_PROMPT_THEME` to the name +of the theme located in `/themes` without the extension `.bgptheme` like this: + +```sh +GIT_PROMPT_THEME=Solarized +``` + +If you set `GIT_PROMPT_THEME` to `Custom`, then the `.git-prompt-colors.sh` in the home directory will be used. +This file can now be generated with the command `git_prompt_make_custom_theme []`. If the name of +the base theme is ommitted or the theme file is not found, then the Default theme is used. If you have already a custom +`.git-prompt-colors.sh` in your home directory, a error message will be shown. + +You can display a list of available themes with `git_prompt_list_themes` (the current theme is highlighted) + +**If you omit the `GIT_PROMPT_THEME` variable, the Default theme is used or, if you have a custom `.git-prompt-colors.sh` +in your home directory, then the Custom theme is used.** + +##### Ubuntu Themes + +Ubuntu requires a bit more spacing for some characters so it has its own themes. + +These can be listed with `git_prompt_list_themes`: +```sh +git_prompt_list_themes | grep Ubuntu +``` + +##### Theme structure + +Please see the ``Custom.bgptemplate`` in the ``themes`` subdirectory of the installation directory! + +A theme consists of a function `override_git_prompt_colors()` which defines at least the variable `GIT_PROMPT_THEME_NAME` + with a unique theme identifier and a call to the function `reload_git_prompt_colors ` like follows: + +```sh +override_git_prompt_colors() { + GIT_PROMPT_THEME_NAME="Custom" # needed for reload optimization, should be unique + + # Place your overrides here + ... +} + +# load the theme +reload_git_prompt_colors "Custom" +``` + +The advantage of this approach is, that you only need to specify the parts, that are different to the Default theme. + +If you use a custom theme in `.git-prompt-colors.sh`, please set `GIT_PROMPT_THEME_NAME="Custom"`. + +#### Further customizations + +- You can define `GIT_PROMPT_START` and `GIT_PROMPT_END` to tweak your prompt. + +- The default colors are defined within `prompt-colors.sh`, which is sourced by + `gitprompt.sh`. The colors used for various git status are defined in + `themes/Default.bgptheme`. Both of these files may be overridden by copying + them to $HOME with a `.` prefix. They can also be placed in `$HOME/lib` + without the leading `.`. The defaults are the original files in the + `~/.bash-git-prompt` directory. + +- You can use `GIT_PROMPT_START_USER`, `GIT_PROMPT_START_ROOT`, + `GIT_PROMPT_END_USER` and `GIT_PROMPT_END_ROOT` in your + `.git-prompt-colors.sh` to tweak your prompt. You can also override the start + and end of the prompt by setting `GIT_PROMPT_START` and `GIT_PROMPT_END` + before you source the `gitprompt.sh`. + +- The current git repo information is obtained by the script `gitstatus.sh`. +- You can define `prompt_callback` function to tweak your prompt dynamically. + +```sh +function prompt_callback { + if [ `jobs | wc -l` -ne 0 ]; then + echo -n " jobs:\j" + fi +} +``` + +- There are two helper functions that can be used within `prompt_callback`: + - `gp_set_window_title ` - sets the window title to the given string (should work for XTerm type terminals like in OS X or Ubuntu) + - `gp_truncate_pwd` - a function that returns the current PWD truncated to fit the current terminal width. Specify the length to truncate to as a parameter. Otherwise it defaults to 1/3 of the terminal width. + +- If you want to show the git prompt only if you are in a git repository you + can set `GIT_PROMPT_ONLY_IN_REPO=1` before sourcing the gitprompt script + +- You can show an abbreviated `username/repo` in the prompt by setting `GIT_PROMPT_WITH_USERNAME_AND_REPO=1` and setting the placeholder `_USERNAME_REPO_` in your `GIT_PROMPT_PREFIX`. You can also add a `GIT_PROMPT_USERNAME_REPO_SEPARATOR=" | "` so the `username/repo` is nicely separated if there is a remote and if there is no remote, neither the username/repo part nor the separator will be shown. See the theme `Single_line_username_repo.bgptheme` for an example. + + +- There is an indicator at the start of the prompt, which shows + the result of the last executed command by if you put the placeholder + `_LAST_COMMAND_INDICATOR_` in any of the prompt templates. + It is now by default activated in the default theme: + +```sh + GIT_PROMPT_START_USER="_LAST_COMMAND_INDICATOR_ ${Yellow}${PathShort}${ResetColor}" + GIT_PROMPT_START_ROOT="_LAST_COMMAND_INDICATOR_ ${GIT_PROMPT_START_USER}" +``` + + If you want to display the exit code too, you can use the placeholder + ``_LAST_COMMAND_STATE_`` in ``GIT_PROMPT_COMMAND_OK`` or ``GIT_PROMPT_COMMAND_FAIL`` + in your ``.git-prompt-colors.sh``: + +```sh +GIT_PROMPT_COMMAND_OK="${Green}✔ " # displays as ✔ +GIT_PROMPT_COMMAND_FAIL="${Red}✘-_LAST_COMMAND_STATE_ " # displays as ✘-1 for exit code 1 +``` + +- It is now possible to disable the fetching of the remote repository either + globally by setting ``GIT_PROMPT_FETCH_REMOTE_STATUS=0`` in your .bashrc or + on a per repository basis by creating a file named ``.bash-git-rc`` with the + content ``FETCH_REMOTE_STATUS=0`` in the root of your git repository. + +- You can also ignore a repository completely by creating a file named ``.bash-git-rc`` with the + content ``GIT_PROMPT_IGNORE=1`` in the root of your git repository. + +- If you have a repository with many untracked files, the git prompt can become very slow. + You can disable the display of untracked files on a per repository basis by setting + ``GIT_PROMPT_SHOW_UNTRACKED_FILES=no`` in your ``.bash-git-rc`` in the repository or + by disabling it globally in your ``.bashrc`` + +- If you have a repository with a deep submodule hierarchy, this can also affect performance. + You can disable searching for changes in submodules on a per repository basis by setting + ``GIT_PROMPT_IGNORE_SUBMODULES=1`` in your ``.bash-git-rc`` + +- You can get help on the git prompt with the function ``git_prompt_help``. + Examples are available with ``git_prompt_examples``. + A list of all available named colors is available with `git_prompt_color_samples` + +- If you make any changes to any file that is sourced by `gitprompt.sh`, you + should run this command, so that the next prompt update will find all the + files and source them anew. + +```sh +git_prompt_reset +``` + +- You can disable/enable gitprompt by running: + +```sh +git_prompt_toggle +``` + + +**Enjoy!** + +## Alternative RPM Install + +This project ships an RPM spec to simplify installation on RHEL and +clones. If you wish to install from RPM, you may first build the RPM +from scratch by following this procedure: +* Clone this repository and tag the release with a version number + +````sh + git tag -a -m "Tag release 1.1" 1.1 +```` + +* Run the following command to create a tarball: + +````sh + VER=$(git describe) + # replace dash with underscore to work around + # rpmbuild does not allow dash in version string + VER=${VER//\-/_} + git archive \ + --format tar \ + --prefix=bash-git-prompt-${VER}/ \ + HEAD \ + -- *.sh \ + *.fish \ + README.md \ + themes \ + > bash-git-prompt-${VER}.tar + mkdir -p /tmp/bash-git-prompt-${VER} + sed "s/Version:.*/Version: ${VER}/" \ + bash-git-prompt.spec \ + > /tmp/bash-git-prompt-${VER}/bash-git-prompt.spec + OLDDIR=$(pwd) + cd /tmp + tar -uf ${OLDDIR}/bash-git-prompt-${VER}.tar \ + bash-git-prompt-${VER}/bash-git-prompt.spec + cd ${OLDDIR} + gzip bash-git-prompt-${VER}.tar + mv bash-git-prompt-${VER}.tar.gz bash-git-prompt-${VER}.tgz +```` + +* Log into an RHEL or clones host and run: + +````sh +rpmbuild -ta bash-git-prompt-xxx.tar.gz +```` +Then you may publish or install the rpm from "~/rpmbuild/RPMS/noarch". + +## License +This code is under the [BSD 2 Clause (NetBSD) license][license]. + +## Who Are You? +The current maintainer of the original bash-git-prompt is [Martin Gondermann][magicmonty]. + +## Contributing +If you want to contribute you can look for issues with the label [up-for-grabs][upforgrabs]. +Please leave a comment on the issue, that you want to fix it, so others know, the labels are "taken". + +Pull requests are welcome. I will check them and merge them, if I think they help the project. + +## Donations +I accept tips through [Flattr][flattr]. + +[![Flattr](http://api.flattr.com/button/flattr-badge-large.png)](https://flattr.com/submit/auto?user_id=magicmonty&url=https%3A%2F%2Fgithub.com%2Fmagicmonty%2Fbash-git-prompt) + +[blog post]: http://sebastiancelis.com/2009/nov/16/zsh-prompt-git-users/ +[tip]:https://www.gittip.com/magicmonty/ +[magicmonty]: http://blog.pagansoft.de/pages/about.html +[license]:https://github.com/magicmonty/bash-git-prompt/tree/master/LICENSE.txt +[flattr]: https://flattr.com/submit/auto?user_id=magicmonty&url=https%3A%2F%2Fgithub.com%2Fmagicmonty%2Fbash-git-prompt +[homebrew]: http://brew.sh/ +[upforgrabs]: https://github.com/magicmonty/bash-git-prompt/labels/up-for-grabs diff --git a/home-rc/dot-files/.bash-git-prompt/bash-git-prompt.rb b/home-rc/dot-files/.bash-git-prompt/bash-git-prompt.rb new file mode 100644 index 0000000..7243acc --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/bash-git-prompt.rb @@ -0,0 +1,31 @@ +class BashGitPrompt < Formula + desc "Informative, fancy bash prompt for Git users" + homepage "https://github.com/magicmonty/bash-git-prompt" + url "https://github.com/magicmonty/bash-git-prompt/archive/2.7.1.tar.gz" + sha256 "5e5fc6f5133b65760fede8050d4c3bc8edb8e78bc7ce26c16db442aa94b8a709" + head "https://github.com/magicmonty/bash-git-prompt.git" + + bottle :unneeded + + def install + share.install "gitprompt.sh", "gitprompt.fish", "git-prompt-help.sh", + "gitstatus.py", "gitstatus.sh", "gitstatus_pre-1.7.10.sh", + "prompt-colors.sh" + + (share/"themes").install Dir["themes/*.bgptheme"], "themes/Custom.bgptemplate" + doc.install "README.md" + end + + def caveats; <<~EOS + You should add the following to your .bashrc (or .bash_profile if bash is your login shell): + if [ -f "#{HOMEBREW_PREFIX}/opt/bash-git-prompt/share/gitprompt.sh" ]; then + __GIT_PROMPT_DIR="#{HOMEBREW_PREFIX}/opt/bash-git-prompt/share" + source "#{HOMEBREW_PREFIX}/opt/bash-git-prompt/share/gitprompt.sh" + fi + EOS + end + + test do + system "true" + end +end diff --git a/home-rc/dot-files/.bash-git-prompt/bash-git-prompt.spec b/home-rc/dot-files/.bash-git-prompt/bash-git-prompt.spec new file mode 100644 index 0000000..71efbde --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/bash-git-prompt.spec @@ -0,0 +1,70 @@ +%global START_TOKEN ### Generated by %{name} rpm package +%global END_TOKEN ### Generated by %{name} rpm package + +Name: bash-git-prompt +Version: 2.7.1 +Release: 1%{?dist} +Summary: Informative git prompt for bash and fish + +Group: Development/Tools +License: FreeBSD +URL: https://github.com/magicmonty/bash-git-prompt +Source0: https://github.com/magicmonty/%{name}/archive/%{name}-%{version}.tar.gz +Requires: git +BuildArch: noarch + +%description +A bash prompt that displays information about the current git repository. In particular the branch name, difference with remote branch, number of files staged, changed, etc. + +This package will automatically enable the git prompt for bash after +install. It will disable the prompt accordingly after uninstall. + +%prep +%setup -q + +%build +# No command are required here +# These comments are here to avoid rpm lint issue + +%install +install -dm 755 %{buildroot}%{_datadir}/%{name} +install -pm 755 *.sh %{buildroot}%{_datadir}/%{name} +#install -pm 755 *.py %{buildroot}%{_datadir}/%{name} +install -pm 755 *.fish %{buildroot}%{_datadir}/%{name} +install -pm 644 README.md %{buildroot}%{_datadir}/%{name} +install -dm 755 %{buildroot}%{_datadir}/%{name}/themes +install -pm 644 themes/*.bgptheme %{buildroot}%{_datadir}/%{name}/themes +install -pm 644 themes/*.bgptemplate %{buildroot}%{_datadir}/%{name}/themes + +%post +# enable bash-git-prompt +cat << EOF >> /etc/bashrc +%{START_TOKEN} +if [ -f %{_datadir}/%{name}/gitprompt.sh ]; then + # Set config variables first + + GIT_PROMPT_ONLY_IN_REPO=1 + GIT_PROMPT_THEME=Default + source %{_datadir}/%{name}/gitprompt.sh +fi +%{END_TOKEN} +EOF + +%postun +# remove bash-git-prompt setup +sed -i -e '/^%{START_TOKEN}/, /^%{END_TOKEN}/{d}' /etc/bashrc + +%files +%defattr(-,root,root,-) +%{_datadir}/%{name} + +%doc README.md + +%license LICENSE.txt + +%changelog +* Tue Jun 28 2016 Koustubh Sinkar +- Updating the spec file to reflect more recent changes + +* Fri Aug 08 2014 Justin Zhang ${GIT_PROMPT_SEPARATOR}${GIT_PROMPT_SUFFIX} + +BRANCH is a branch name, such as "master" or "stage", a tag name, or commit +hash prefixed with ':'. + +TRACKING indicates how the local branch differs from the +remote branch. It can be empty, or one of: + + ${GIT_PROMPT_BRANCH}${ResetColor}${GIT_PROMPT_REMOTE}${GIT_PROMPT_SYMBOLS_AHEAD}N${ResetColor} - ahead of remote by N commits + ${GIT_PROMPT_BRANCH}${ResetColor}${GIT_PROMPT_REMOTE}${GIT_PROMPT_SYMBOLS_BEHIND}M${ResetColor} - behind remote by M commits + ${GIT_PROMPT_BRANCH}${ResetColor}${GIT_PROMPT_REMOTE}${GIT_PROMPT_SYMBOLS_AHEAD}N${GIT_PROMPT_SYMBOLS_BEHIND}M${ResetColor} - branches diverged, other by M commits, yours by N commits + +LOCALSTATUS is one of the following: + + ${GIT_PROMPT_CLEAN}${ResetColor} - repository clean + ${GIT_PROMPT_STAGED}N${ResetColor} - N staged files + ${GIT_PROMPT_CONFLICTS}N${ResetColor} - N files with merge conflicts + ${GIT_PROMPT_CHANGED}N${ResetColor} - N changed but *unstaged* files + ${GIT_PROMPT_UNTRACKED}N${ResetColor} - N untracked files + ${GIT_PROMPT_STASHED}N${ResetColor} - N stash entries + +See "git_prompt_examples" for examples. +EOF +} + +help_git_prompt() { git_prompt_help ; } + +git_prompt_examples() { + cat < + +function fish_prompt + + if not set -q __GIT_PROMPT_DIR + set __GIT_PROMPT_DIR ~/.bash-git-prompt + end + + # Colors + # Reset + set ResetColor (set_color normal) # Text Reset + + # Regular Colors + set Red (set_color red) # Red + set Yellow (set_color yellow); # Yellow + set Blue (set_color blue) # Blue + set WHITE (set_color white) + + # Bold + set BGreen (set_color -o green) # Green + + # High Intensty + set IBlack (set_color -o black) # Black + + # Bold High Intensty + set Magenta (set_color -o purple) # Purple + + # Default values for the appearance of the prompt. Configure at will. + set GIT_PROMPT_PREFIX "[" + set GIT_PROMPT_SUFFIX "]" + set GIT_PROMPT_SEPARATOR "|" + set GIT_PROMPT_BRANCH "$Magenta" + set GIT_PROMPT_STAGED "$Red● " + set GIT_PROMPT_CONFLICTS "$Red✖ " + set GIT_PROMPT_CHANGED "$Blue✚ " + set GIT_PROMPT_REMOTE " " + set GIT_PROMPT_UNTRACKED "…" + set GIT_PROMPT_STASHED "⚑ " + set GIT_PROMPT_CLEAN "$BGreen✔" + + # Various variables you might want for your PS1 prompt instead + set Time (date +%R) + set PathShort (pwd|sed "s=$HOME=~=") + + set PROMPT_START "$Yellow$PathShort$ResetColor" + set PROMPT_END " \n$WHITE$Time$ResetColor \$ " + + set -e __CURRENT_GIT_STATUS + set gitstatus "$__GIT_PROMPT_DIR/gitstatus.py" + + set _GIT_STATUS (python $gitstatus) + set __CURRENT_GIT_STATUS $_GIT_STATUS + + set __CURRENT_GIT_STATUS_PARAM_COUNT (count $__CURRENT_GIT_STATUS) + + if not test "0" -eq $__CURRENT_GIT_STATUS_PARAM_COUNT + set GIT_BRANCH $__CURRENT_GIT_STATUS[1] + set GIT_REMOTE "$__CURRENT_GIT_STATUS[2]" + if contains "." "$GIT_REMOTE" + set -e GIT_REMOTE + end + set GIT_STAGED $__CURRENT_GIT_STATUS[3] + set GIT_CONFLICTS $__CURRENT_GIT_STATUS[4] + set GIT_CHANGED $__CURRENT_GIT_STATUS[5] + set GIT_UNTRACKED $__CURRENT_GIT_STATUS[6] + set GIT_STASHED $__CURRENT_GIT_STATUS[7] + set GIT_CLEAN $__CURRENT_GIT_STATUS[8] + end + + if test -n "$__CURRENT_GIT_STATUS" + set STATUS " $GIT_PROMPT_PREFIX$GIT_PROMPT_BRANCH$GIT_BRANCH$ResetColor" + + if set -q GIT_REMOTE + set STATUS "$STATUS$GIT_PROMPT_REMOTE$GIT_REMOTE$ResetColor" + end + + set STATUS "$STATUS$GIT_PROMPT_SEPARATOR" + + if [ $GIT_STAGED != "0" ] + set STATUS "$STATUS$GIT_PROMPT_STAGED$GIT_STAGED$ResetColor" + end + + if [ $GIT_CONFLICTS != "0" ] + set STATUS "$STATUS$GIT_PROMPT_CONFLICTS$GIT_CONFLICTS$ResetColor" + end + + if [ $GIT_CHANGED != "0" ] + set STATUS "$STATUS$GIT_PROMPT_CHANGED$GIT_CHANGED$ResetColor" + end + + if [ "$GIT_UNTRACKED" != "0" ] + set STATUS "$STATUS$GIT_PROMPT_UNTRACKED$GIT_UNTRACKED$ResetColor" + end + + if [ "$GIT_STASHED" != "0" ] + set STATUS "$STATUS$GIT_PROMPT_STASHED$GIT_STASHED$ResetColor" + end + + if [ "$GIT_CLEAN" = "1" ] + set STATUS "$STATUS$GIT_PROMPT_CLEAN" + end + + set STATUS "$STATUS$ResetColor$GIT_PROMPT_SUFFIX" + + set PS1 "$PROMPT_START$STATUS$PROMPT_END" + else + set PS1 "$PROMPT_START$PROMPT_END" + end + + echo -e $PS1 + +end + + diff --git a/home-rc/dot-files/.bash-git-prompt/gitprompt.png b/home-rc/dot-files/.bash-git-prompt/gitprompt.png new file mode 100644 index 0000000000000000000000000000000000000000..c3d5c0580a42085a7ef80de1567e47d201bb8379 GIT binary patch literal 22550 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 /dev/null + }& +} + +function git_prompt_dir() { + # assume the gitstatus.sh is in the same directory as this script + # code thanks to http://stackoverflow.com/questions/59895 + if [[ -z "${__GIT_PROMPT_DIR:+x}" ]]; then + local SOURCE="${BASH_SOURCE[0]}" + while [[ -h "${SOURCE}" ]]; do + local DIR="$( command cd -P "$( dirname "${SOURCE}" )" && pwd )" + SOURCE="$(readlink "${SOURCE}")" + [[ ${SOURCE} != /* ]] && SOURCE="${DIR}/${SOURCE}" + done + __GIT_PROMPT_DIR="$( command cd -P "$( dirname "${SOURCE}" )" && pwd )" + fi +} + +function echoc() { + echo -e "${1}${2}${ResetColor}" | sed 's/\\\]//g' | sed 's/\\\[//g' +} + +function get_theme() { + local CUSTOM_THEME_FILE="${HOME}/.git-prompt-colors.sh" + if [[ ! (-z "${GIT_PROMPT_THEME_FILE:+x}" ) ]]; then + CUSTOM_THEME_FILE="${GIT_PROMPT_THEME_FILE}" + fi + local DEFAULT_THEME_FILE="${__GIT_PROMPT_DIR}/themes/Default.bgptheme" + + if [[ -z "${GIT_PROMPT_THEME+x}" ]]; then + if [[ -r "${CUSTOM_THEME_FILE}" ]]; then + GIT_PROMPT_THEME="Custom" + __GIT_PROMPT_THEME_FILE="${CUSTOM_THEME_FILE}" + else + GIT_PROMPT_THEME="Default" + __GIT_PROMPT_THEME_FILE="${DEFAULT_THEME_FILE}" + fi + else + if [[ "${GIT_PROMPT_THEME}" = "Custom" ]]; then + GIT_PROMPT_THEME="Custom" + __GIT_PROMPT_THEME_FILE="${CUSTOM_THEME_FILE}" + + if [[ ! (-r "${__GIT_PROMPT_THEME_FILE}") ]]; then + GIT_PROMPT_THEME="Default" + __GIT_PROMPT_THEME_FILE="${DEFAULT_THEME_FILE}" + fi + else + local theme="" + + # use default theme, if theme was not found + for themefile in "${__GIT_PROMPT_DIR}/themes/"*.bgptheme; do + local basename=${themefile##*/} + if [[ "${basename%.bgptheme}" = "${GIT_PROMPT_THEME}" ]]; then + theme="${GIT_PROMPT_THEME}" + break + fi + done + + if [[ "${theme}" = "" ]]; then + GIT_PROMPT_THEME="Default" + fi + + __GIT_PROMPT_THEME_FILE="${__GIT_PROMPT_DIR}/themes/${GIT_PROMPT_THEME}.bgptheme" + fi + fi +} + +function git_prompt_load_colors() { + if gp_set_file_var __PROMPT_COLORS_FILE prompt-colors.sh ; then + # outsource the color defs + source "${__PROMPT_COLORS_FILE}" + else + echo 1>&2 "Cannot find prompt-colors.sh!" + fi +} + +function git_prompt_load_theme() { + get_theme + local DEFAULT_THEME_FILE="${__GIT_PROMPT_DIR}/themes/Default.bgptheme" + source "${DEFAULT_THEME_FILE}" + source "${__GIT_PROMPT_THEME_FILE}" +} + +function git_prompt_list_themes() { + git_prompt_load_colors + git_prompt_dir + get_theme + + for themefile in "${__GIT_PROMPT_DIR}/themes/"*.bgptheme; do + local basename="${themefile##*/}" + local theme="${basename%.bgptheme}" + if [[ "${GIT_PROMPT_THEME}" = "${theme}" ]]; then + echoc "${Red}" "*${theme}" + else + echo "${theme}" + fi + done + + if [[ "${GIT_PROMPT_THEME}" = "Custom" ]]; then + echoc "${Magenta}" "*Custom" + else + echoc "${Blue}" "Custom" + fi +} + +function git_prompt_make_custom_theme() { + if [[ -r "${HOME}/.git-prompt-colors.sh" ]]; then + echoc "${Red}" "You have already created a custom theme!" + else + git_prompt_dir + + local base="Default" + if [[ -n "${1}" && -r "${__GIT_PROMPT_DIR}/themes/${1}.bgptheme" ]]; then + base="${1}" + echoc "${Green}" "Using theme ${Magenta}\"${base}\"${Green} as base theme!" + else + echoc "${Green}" "Using theme ${Magenta}\"Default\"${Green} as base theme!" + fi + + if [[ "${base}" = "Custom" ]]; then + echoc "${Red}" "You cannot use the custom theme as base" + else + echoc "${Green}" "Creating new custom theme in \"${HOME}/.git-prompt-colors.sh\"" + echoc "${DimYellow}" "Please add ${Magenta}\"GIT_PROMPT_THEME=Custom\"${DimYellow} to your .bashrc to use this theme" + if [[ "${base}" == "Default" ]]; then + cp "${__GIT_PROMPT_DIR}/themes/Custom.bgptemplate" "${HOME}/.git-prompt-colors.sh" + else + cp "${__GIT_PROMPT_DIR}/themes/${base}.bgptheme" "${HOME}/.git-prompt-colors.sh" + fi + fi + fi +} + +# gp_set_file_var ENVAR SOMEFILE +# +# If ENVAR is set, check that it's value exists as a readable file. Otherwise, +# Set ENVAR to the path to SOMEFILE, based on $HOME, $__GIT_PROMPT_DIR, and the +# directory of the current script. The SOMEFILE can be prefixed with '.', or +# not. +# +# Return 0 (success) if ENVAR not already defined, 1 (failure) otherwise. + +function gp_set_file_var() { + local envar="${1}" + local file="${2}" + if eval "[[ -n \"\${${envar}+x}\" && -r \"\${${envar}+x}\" ]]" ; then # is envar set to a readable file? + local basefile + eval "basefile=\"\`basename \\\"\${${envar}}\\\"\`\"" # assign basefile + if [[ "${basefile}" = "${file}" || "${basefile}" = ".${file}" ]]; then + return 0 + fi + else # envar is not set, or it's set to a different file than requested + eval "${envar}=" # set empty envar + gp_maybe_set_envar_to_path "${envar}" "${HOME}/.${file}" "${HOME}/${file}" "${HOME}/lib/${file}" && return 0 + git_prompt_dir + gp_maybe_set_envar_to_path "${envar}" "${__GIT_PROMPT_DIR}/${file}" "${0##*/}/${file}" && return 0 + fi + return 1 +} + +# gp_maybe_set_envar_to_path ENVAR FILEPATH ... +# +# return 0 (true) if any FILEPATH is readable, set ENVAR to it +# return 1 (false) if not + +function gp_maybe_set_envar_to_path() { + local envar="${1}" + shift + local file + for file in "${@}" ; do + if [[ -r "${file}" ]]; then + eval "${envar}=\"${file}\"" + return 0 + fi + done + return 1 +} + +# git_prompt_reset +# +# unsets selected GIT_PROMPT variables, causing the next prompt callback to +# recalculate them from scratch. + +git_prompt_reset() { + local var + for var in GIT_PROMPT_DIR __GIT_PROMPT_COLORS_FILE __PROMPT_COLORS_FILE __GIT_STATUS_CMD GIT_PROMPT_THEME_NAME; do + unset ${var} + done +} + +# gp_format_exit_status RETVAL +# +# echos the symbolic signal name represented by RETVAL if the process was +# signalled, otherwise echos the original value of RETVAL + +gp_format_exit_status() { + local RETVAL="${1}" + local SIGNAL + # Suppress STDERR in case RETVAL is not an integer (in such cases, RETVAL + # is echoed verbatim) + if [[ "${RETVAL}" -gt 128 ]] 2>/dev/null; then + SIGNAL=$(( RETVAL - 128 )) + kill -l "${SIGNAL}" 2>/dev/null || echo "${RETVAL}" + else + echo "${RETVAL}" + fi +} + +gp_format_username_repo() { + git config --get remote.origin.url | sed 's|^.*//||; s/.*@//; s/[^:/]\+[:/]//; s/.git$//' +} + +function git_prompt_config() { + #Checking if root to change output + _isroot=false + [[ "${UID}" -eq 0 ]] && _isroot=true + + # There are two files related to colors: + # + # prompt-colors.sh -- sets generic color names suitable for bash 'PS1' prompt + # git-prompt-colors.sh -- sets the GIT_PROMPT color scheme, using names from prompt-colors.sh + git_prompt_load_colors + + # source the user's ~/.git-prompt-colors.sh file, or the one that should be + # sitting in the same directory as this script + git_prompt_load_theme + + if is_function prompt_callback; then + prompt_callback="prompt_callback" + else + prompt_callback="prompt_callback_default" + fi + + if [[ "${GIT_PROMPT_LAST_COMMAND_STATE:-0}" = 0 ]]; then + LAST_COMMAND_INDICATOR="${GIT_PROMPT_COMMAND_OK}"; + else + LAST_COMMAND_INDICATOR="${GIT_PROMPT_COMMAND_FAIL}"; + fi + + # replace _LAST_COMMAND_STATE_ token with the actual state + GIT_PROMPT_LAST_COMMAND_STATE=$(gp_format_exit_status "${GIT_PROMPT_LAST_COMMAND_STATE}") + LAST_COMMAND_INDICATOR="${LAST_COMMAND_INDICATOR//_LAST_COMMAND_STATE_/${GIT_PROMPT_LAST_COMMAND_STATE}}" + + # Do this only once to define PROMPT_START and PROMPT_END + + if [[ -z "${PROMPT_START:+x}" || -z "${PROMPT_END:+x}" ]]; then + + if [[ -z "${GIT_PROMPT_START:+x}" ]] ; then + if ${_isroot}; then + PROMPT_START="${GIT_PROMPT_START_ROOT-}" + else + PROMPT_START="${GIT_PROMPT_START_USER-}" + fi + else + PROMPT_START="${GIT_PROMPT_START-}" + fi + + if [[ -z "${GIT_PROMPT_END:+x}" ]] ; then + if $_isroot; then + PROMPT_END="${GIT_PROMPT_END_ROOT-}" + else + PROMPT_END="${GIT_PROMPT_END_USER-}" + fi + else + PROMPT_END="${GIT_PROMPT_END-}" + fi + fi + + # set GIT_PROMPT_LEADING_SPACE to 0 if you want to have no leading space in front of the GIT prompt + if [[ "${GIT_PROMPT_LEADING_SPACE:-1}" = "0" ]]; then + PROMPT_LEADING_SPACE="" + else + PROMPT_LEADING_SPACE=" " + fi + + if [[ "${GIT_PROMPT_ONLY_IN_REPO:-0}" == 1 ]]; then + EMPTY_PROMPT="${OLD_GITPROMPT}" + elif [[ "${GIT_PROMPT_WITH_VIRTUAL_ENV:-1}" == 1 ]]; then + local ps="$(gp_add_virtualenv_to_prompt)${PROMPT_START}$(${prompt_callback})${PROMPT_END}" + EMPTY_PROMPT="${ps//_LAST_COMMAND_INDICATOR_/${LAST_COMMAND_INDICATOR}}" + else + local ps="${PROMPT_START}$(${prompt_callback})${PROMPT_END}" + EMPTY_PROMPT="${ps//_LAST_COMMAND_INDICATOR_/${LAST_COMMAND_INDICATOR}}" + fi + + # fetch remote revisions every other $GIT_PROMPT_FETCH_TIMEOUT (default 5) minutes + if [[ -z "${GIT_PROMPT_FETCH_TIMEOUT:+x}" ]]; then + GIT_PROMPT_FETCH_TIMEOUT="5" + fi + if [[ -z "${__GIT_STATUS_CMD:+x}" ]] ; then # if GIT_STATUS_CMD not defined.. + git_prompt_dir + if ! gp_maybe_set_envar_to_path __GIT_STATUS_CMD "${__GIT_PROMPT_DIR}/${GIT_PROMPT_STATUS_COMMAND}" ; then + echo 1>&2 "Cannot find ${GIT_PROMPT_STATUS_COMMAND}!" + fi + # __GIT_STATUS_CMD defined + fi + unset GIT_BRANCH +} + +function setLastCommandState() { + GIT_PROMPT_LAST_COMMAND_STATE="${?}" +} + +function we_are_on_repo() { + if [[ -e "$(git rev-parse --git-dir 2> /dev/null)" ]]; then + echo 1 + else + echo 0 + fi +} + +function update_old_git_prompt() { + local in_repo=$(we_are_on_repo) + if [[ "${GIT_PROMPT_OLD_DIR_WAS_GIT}" = 0 ]]; then + OLD_GITPROMPT="${PS1}" + fi + + GIT_PROMPT_OLD_DIR_WAS_GIT="${in_repo}" +} + +function setGitPrompt() { + update_old_git_prompt + + local repo=$(git rev-parse --show-toplevel 2> /dev/null) + if [[ ! -e "${repo}" ]] && [[ "${GIT_PROMPT_ONLY_IN_REPO-}" = 1 ]]; then + # we do not permit bash-git-prompt outside git repos, so nothing to do + PS1="${OLD_GITPROMPT}" + return + fi + + local EMPTY_PROMPT + local __GIT_STATUS_CMD + + git_prompt_config + + if [[ ! -e "${repo}" ]] || [[ "${GIT_PROMPT_DISABLE-}" = 1 ]]; then + PS1="${EMPTY_PROMPT}" + return + fi + + local FETCH_REMOTE_STATUS=1 + if [[ "${GIT_PROMPT_FETCH_REMOTE_STATUS}" = 0 ]]; then + FETCH_REMOTE_STATUS=0 + fi + + unset GIT_PROMPT_IGNORE + OLD_GIT_PROMPT_SHOW_UNTRACKED_FILES="${GIT_PROMPT_SHOW_UNTRACKED_FILES}" + unset GIT_PROMPT_SHOW_UNTRACKED_FILES + + OLD_GIT_PROMPT_IGNORE_SUBMODULES="${GIT_PROMPT_IGNORE_SUBMODULES}" + unset GIT_PROMPT_IGNORE_SUBMODULES + + if [[ -e "${repo}/.bash-git-rc" ]]; then + # The config file can only contain variable declarations on the form A_B=0 or G_P=all + local CONFIG_SYNTAX="^(FETCH_REMOTE_STATUS|GIT_PROMPT_SHOW_UNTRACKED_FILES|GIT_PROMPT_IGNORE_SUBMODULES|GIT_PROMPT_IGNORE)=[0-9a-z]+$" + if grep -q -v -E "${CONFIG_SYNTAX}" "${repo}/.bash-git-rc"; then + echo ".bash-git-rc can only contain variable values on the form NAME=value. Ignoring file." >&2 + else + source "${repo}/.bash-git-rc" + fi + fi + + if [[ -z "${GIT_PROMPT_SHOW_UNTRACKED_FILES+x}" ]]; then + GIT_PROMPT_SHOW_UNTRACKED_FILES="${OLD_GIT_PROMPT_SHOW_UNTRACKED_FILES}" + fi + unset OLD_GIT_PROMPT_SHOW_UNTRACKED_FILES + + if [[ -z "${GIT_PROMPT_IGNORE_SUBMODULES+x}" ]]; then + GIT_PROMPT_IGNORE_SUBMODULES="${OLD_GIT_PROMPT_IGNORE_SUBMODULES}" + fi + unset OLD_GIT_PROMPT_IGNORE_SUBMODULES + + if [[ "${GIT_PROMPT_IGNORE-}" = 1 ]]; then + PS1="${EMPTY_PROMPT}" + return + fi + + if [[ "${FETCH_REMOTE_STATUS}" = 1 ]]; then + checkUpstream + fi + + updatePrompt +} + +# some versions of find do not have -mmin +_have_find_mmin=1 + +function olderThanMinutes() { + local matches + local find_exit_code + + if [[ -z "${_find_command+x}" ]]; then + if command -v gfind > /dev/null; then + _find_command="gfind" + else + _find_command="find" + fi + fi + + if [[ "${_have_find_mmin}" = 1 ]]; then + matches=$("${_find_command}" "${1}" -mmin +"${2}" 2> /dev/null) + find_exit_code="${?}" + if [[ -n "${matches}" ]]; then + return 0 + else + if [[ "${find_exit_code}" != 0 ]]; then + _have_find_mmin=0 + else + return 1 + fi + fi + fi + + # try perl, solaris ships with perl + if command -v perl > /dev/null; then + perl -e '((time - (stat("'"${1}"'"))[9]) / 60) > '"${2}"' && exit(0) || exit(1)' + return "${?}" + else + echo >&2 + echo "WARNING: neither a find that supports -mmin (such as GNU find) or perl is available, disabling remote status checking. Install GNU find as gfind or perl to enable this feature, or set GIT_PROMPT_FETCH_REMOTE_STATUS=0 to disable this warning." >&2 + echo >&2 + GIT_PROMPT_FETCH_REMOTE_STATUS=0 + return 1 + fi +} + +function checkUpstream() { + local GIT_PROMPT_FETCH_TIMEOUT + git_prompt_config + + local FETCH_HEAD="${repo}/.git/FETCH_HEAD" + # Fech repo if local is stale for more than $GIT_FETCH_TIMEOUT minutes + if [[ ! -e "${FETCH_HEAD}" ]] || olderThanMinutes "${FETCH_HEAD}" "${GIT_PROMPT_FETCH_TIMEOUT}" + then + if [[ -n $(git remote show) ]]; then + ( + async_run "GIT_TERMINAL_PROMPT=0 git fetch --quiet" + disown -h + ) + fi + fi +} + +function replaceSymbols() { + # Disable globbing, so a * could be used as symbol here + set -f + + if [[ -z ${GIT_PROMPT_SYMBOLS_NO_REMOTE_TRACKING+x} ]]; then + GIT_PROMPT_SYMBOLS_NO_REMOTE_TRACKING=L + fi + + local VALUE="${1//_AHEAD_/${GIT_PROMPT_SYMBOLS_AHEAD}}" + local VALUE1="${VALUE//_BEHIND_/${GIT_PROMPT_SYMBOLS_BEHIND}}" + local VALUE2="${VALUE1//_NO_REMOTE_TRACKING_/${GIT_PROMPT_SYMBOLS_NO_REMOTE_TRACKING}}" + + echo "${VALUE2//_PREHASH_/${GIT_PROMPT_SYMBOLS_PREHASH}}" + + # reenable globbing symbols + set +f +} + +function createPrivateIndex { + # Create a copy of the index to avoid conflicts with parallel git commands, e.g. git rebase. + local __GIT_INDEX_FILE + local __GIT_INDEX_PRIVATE + if [[ -z "${GIT_INDEX_FILE+x}" ]]; then + __GIT_INDEX_FILE="$(git rev-parse --git-dir)/index" + else + __GIT_INDEX_FILE="${GIT_INDEX_FILE}" + fi + __GIT_INDEX_PRIVATE="/tmp/git-index-private$$" + command cp "${__GIT_INDEX_FILE}" "${__GIT_INDEX_PRIVATE}" 2>/dev/null + echo "${__GIT_INDEX_PRIVATE}" +} + +function updatePrompt() { + local LAST_COMMAND_INDICATOR + local PROMPT_LEADING_SPACE + local PROMPT_START + local PROMPT_END + local EMPTY_PROMPT + local Blue="\[\033[0;34m\]" + + git_prompt_config + + __GIT_PROMPT_IGNORE_STASH="${GIT_PROMPT_IGNORE_STASH:-0}" + __GIT_PROMPT_SHOW_UPSTREAM="${GIT_PROMPT_SHOW_UPSTREAM:-0}" + __GIT_PROMPT_IGNORE_SUBMODULES="${GIT_PROMPT_IGNORE_SUBMODULES:-0}" + __GIT_PROMPT_WITH_USERNAME_AND_REPO="${GIT_PROMPT_WITH_USERNAME_AND_REPO:-0}" + export __GIT_PROMPT_SHOW_UNTRACKED_FILES="${GIT_PROMPT_SHOW_UNTRACKED_FILES-normal}" + local __GIT_PROMPT_SHOW_CHANGED_FILES_COUNT="${GIT_PROMPT_SHOW_CHANGED_FILES_COUNT:-1}" + + local GIT_INDEX_PRIVATE="$(createPrivateIndex)" + #important to define GIT_INDEX_FILE as local: This way it only affects this function (and below) - even with the export afterwards + local GIT_INDEX_FILE + export GIT_INDEX_FILE="${GIT_INDEX_PRIVATE}" + + local -a git_status_fields + while IFS=$'\n' read -r line; do git_status_fields+=("${line}"); done < <("${__GIT_STATUS_CMD}" 2>/dev/null) + + export GIT_BRANCH=$(replaceSymbols "${git_status_fields[0]}") + local GIT_REMOTE="$(replaceSymbols "${git_status_fields[1]}")" + if [[ "." == "${GIT_REMOTE}" ]]; then + unset GIT_REMOTE + fi + local GIT_REMOTE_USERNAME_REPO="$(replaceSymbols "${git_status_fields[2]}")" + if [[ "." == "${GIT_REMOTE_USERNAME_REPO}" ]]; then + unset GIT_REMOTE_USERNAME_REPO + fi + + local GIT_FORMATTED_UPSTREAM + local GIT_UPSTREAM_PRIVATE="${git_status_fields[3]}" + if [[ "${__GIT_PROMPT_SHOW_UPSTREAM:-0}" != "1" || "^" == "${GIT_UPSTREAM_PRIVATE}" ]]; then + unset GIT_FORMATTED_UPSTREAM + else + GIT_FORMATTED_UPSTREAM="${GIT_PROMPT_UPSTREAM//_UPSTREAM_/${GIT_UPSTREAM_PRIVATE}}" + fi + + local GIT_STAGED="${git_status_fields[4]}" + local GIT_CONFLICTS="${git_status_fields[5]}" + local GIT_CHANGED="${git_status_fields[6]}" + local GIT_UNTRACKED="${git_status_fields[7]}" + local GIT_STASHED="${git_status_fields[8]}" + local GIT_CLEAN="${git_status_fields[9]}" + + + local NEW_PROMPT="${EMPTY_PROMPT}" + if [[ "${#git_status_fields[@]}" -gt 0 ]]; then + + if [[ -z "${GIT_REMOTE_USERNAME_REPO+x}" ]]; then + local GIT_PROMPT_PREFIX_FINAL="${GIT_PROMPT_PREFIX//_USERNAME_REPO_/${ResetColor}}" + else + if [[ -z "${GIT_PROMPT_USERNAME_REPO_SEPARATOR+x}" ]]; then + local GIT_PROMPT_PREFIX_FINAL="${GIT_PROMPT_PREFIX//_USERNAME_REPO_/${GIT_REMOTE_USERNAME_REPO}${ResetColor}}" + else + local GIT_PROMPT_PREFIX_FINAL="${GIT_PROMPT_PREFIX//_USERNAME_REPO_/${GIT_REMOTE_USERNAME_REPO}${ResetColor}${GIT_PROMPT_USERNAME_REPO_SEPARATOR}}" + fi + fi + + case "${GIT_BRANCH-}" in + ${GIT_PROMPT_MASTER_BRANCHES}) + local STATUS_PREFIX="${PROMPT_LEADING_SPACE}${GIT_PROMPT_PREFIX_FINAL}${GIT_PROMPT_MASTER_BRANCH}${URL_SHORT-}\${GIT_BRANCH}${ResetColor}${GIT_FORMATTED_UPSTREAM-}" + ;; + *) + local STATUS_PREFIX="${PROMPT_LEADING_SPACE}${GIT_PROMPT_PREFIX_FINAL}${GIT_PROMPT_BRANCH}${URL_SHORT-}\${GIT_BRANCH}${ResetColor}${GIT_FORMATTED_UPSTREAM-}" + ;; + esac + local STATUS="" + + # __add_status KIND VALEXPR INSERT + # eg: __add_status 'STAGED' '-ne 0' + + __chk_gitvar_status() { + local v + if [[ "${2-}" = "-n" ]] ; then + v="${2} \"\${GIT_${1}-}\"" + else + v="\${GIT_${1}-} ${2}" + fi + if eval "[[ ${v} ]]" ; then + if [[ "${3-}" != '-' ]] && [[ "${__GIT_PROMPT_SHOW_CHANGED_FILES_COUNT}" == "1" || "${1-}" == "REMOTE" ]]; then + __add_status "\${GIT_PROMPT_${1}}\${GIT_${1}}\${ResetColor}" + else + __add_status "\${GIT_PROMPT_${1}}\${ResetColor}" + fi + fi + } + + __add_gitvar_status() { + __add_status "\${GIT_PROMPT_${1}}\${GIT_${1}}\${ResetColor}" + } + + # __add_status SOMETEXT + __add_status() { + eval "STATUS=\"${STATUS}${1}\"" + } + + __chk_gitvar_status 'REMOTE' '-n' + if [[ "${GIT_CLEAN}" -eq 0 ]] || [[ "${GIT_PROMPT_CLEAN}" != "" ]]; then + __add_status "${GIT_PROMPT_SEPARATOR}" + __chk_gitvar_status 'STAGED' '!= "0" && ${GIT_STAGED-} != "^"' + __chk_gitvar_status 'CONFLICTS' '!= "0"' + __chk_gitvar_status 'CHANGED' '!= "0"' + __chk_gitvar_status 'UNTRACKED' '!= "0"' + __chk_gitvar_status 'STASHED' '!= "0"' + __chk_gitvar_status 'CLEAN' '= "1"' - + fi + __add_status "${ResetColor}${GIT_PROMPT_SUFFIX}" + + NEW_PROMPT="$(gp_add_virtualenv_to_prompt)${PROMPT_START}$(${prompt_callback})${STATUS_PREFIX}${STATUS}${PROMPT_END}" + else + NEW_PROMPT="${EMPTY_PROMPT}" + fi + + PS1="${NEW_PROMPT//_LAST_COMMAND_INDICATOR_/${LAST_COMMAND_INDICATOR}${ResetColor}}" + command rm "${GIT_INDEX_PRIVATE}" 2>/dev/null +} + +# Helper function that returns virtual env information to be set in prompt +# Honors virtualenvs own setting VIRTUAL_ENV_DISABLE_PROMPT +function gp_add_virtualenv_to_prompt { + local ACCUMULATED_VENV_PROMPT="" + local VENV="" + if [[ -n "${VIRTUAL_ENV-}" && -z "${VIRTUAL_ENV_DISABLE_PROMPT+x}" ]]; then + VENV=$(basename "${VIRTUAL_ENV}") + ACCUMULATED_VENV_PROMPT="${ACCUMULATED_VENV_PROMPT}${GIT_PROMPT_VIRTUALENV//_VIRTUALENV_/${VENV}}" + fi + if [[ -n "${NODE_VIRTUAL_ENV-}" && -z "${NODE_VIRTUAL_ENV_DISABLE_PROMPT+x}" ]]; then + VENV=$(basename "${NODE_VIRTUAL_ENV}") + ACCUMULATED_VENV_PROMPT="${ACCUMULATED_VENV_PROMPT}${GIT_PROMPT_VIRTUALENV//_VIRTUALENV_/${VENV}}" + fi + if [[ -n "${CONDA_DEFAULT_ENV-}" ]]; then + VENV=$(basename "${CONDA_DEFAULT_ENV}") + ACCUMULATED_VENV_PROMPT="${ACCUMULATED_VENV_PROMPT}${GIT_PROMPT_VIRTUALENV//_VIRTUALENV_/${VENV}}" + fi + echo "${ACCUMULATED_VENV_PROMPT}" +} + +# Use exit status from declare command to determine whether input argument is a +# bash function +function is_function { + declare -Ff "${1}" >/dev/null; +} + +# Helper function that truncates $PWD depending on window width +# Optionally specify maximum length as parameter (defaults to 1/3 of terminal) +function gp_truncate_pwd { + local tilde="~" + local newPWD="${PWD/#${HOME}/${tilde}}" + local pwdmaxlen="${1:-$((${COLUMNS:-80}/3))}" + [[ "${#newPWD}" -gt "${pwdmaxlen}" ]] && newPWD="...${newPWD:3-$pwdmaxlen}" + echo -n "${newPWD}" +} + +# Sets the window title to the given argument string +function gp_set_window_title { + echo -ne "\[\033]0;"${@}"\007\]" +} + +function prompt_callback_default { + return +} + +# toggle gitprompt +function git_prompt_toggle() { + if [[ "${GIT_PROMPT_DISABLE:-0}" = 1 ]]; then + GIT_PROMPT_DISABLE=0 + else + GIT_PROMPT_DISABLE=1 + fi + return +} + +function gp_install_prompt { + if [[ -z "${OLD_GITPROMPT+x}" ]]; then + OLD_GITPROMPT=${PS1} + fi + + if [[ -z "${GIT_PROMPT_OLD_DIR_WAS_GIT+x}" ]]; then + GIT_PROMPT_OLD_DIR_WAS_GIT=$(we_are_on_repo) + fi + + if [[ -z "${PROMPT_COMMAND:+x}" ]]; then + PROMPT_COMMAND=setGitPrompt + else + PROMPT_COMMAND="${PROMPT_COMMAND//$'\n'/;}" # convert all new lines to semi-colons + PROMPT_COMMAND="${PROMPT_COMMAND#\;}" # remove leading semi-colon + PROMPT_COMMAND="${PROMPT_COMMAND%% }" # remove trailing spaces + PROMPT_COMMAND="${PROMPT_COMMAND%\;}" # remove trailing semi-colon + + local new_entry="setGitPrompt" + case ";${PROMPT_COMMAND};" in + *";${new_entry};"*) + # echo "PROMPT_COMMAND already contains: $new_entry" + :;; + *) + PROMPT_COMMAND="${PROMPT_COMMAND};${new_entry}" + # echo "PROMPT_COMMAND does not contain: $new_entry" + ;; + esac + fi + + local setLastCommandStateEntry="setLastCommandState" + case ";${PROMPT_COMMAND};" in + *";${setLastCommandStateEntry};"*) + # echo "PROMPT_COMMAND already contains: $setLastCommandStateEntry" + :;; + *) + PROMPT_COMMAND="${setLastCommandStateEntry};${PROMPT_COMMAND}" + # echo "PROMPT_COMMAND does not contain: $setLastCommandStateEntry" + ;; + esac + + git_prompt_dir + source "${__GIT_PROMPT_DIR}/git-prompt-help.sh" +} + +gp_install_prompt diff --git a/home-rc/dot-files/.bash-git-prompt/gitstatus.py b/home-rc/dot-files/.bash-git-prompt/gitstatus.py new file mode 100755 index 0000000..bf1d1d9 --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/gitstatus.py @@ -0,0 +1,154 @@ +#!/usr/bin/env python +# -*- coding: UTF-8 -*- + +"""This module defines a Print function to use with python 2.x or 3.x., so we can use the prompt with older versions of +Python too + +It's interface is that of python 3.0's print. See +http://docs.python.org/3.0/library/functions.html?highlight=print#print + +Shamelessly ripped from +http://www.daniweb.com/software-development/python/code/217214/a-print-function-for-different-versions-of-python +""" +# change those symbols to whatever you prefer +symbols = {'ahead of': '↑·', 'behind': '↓·', 'prehash': ':'} + +import sys +import re +from subprocess import Popen, PIPE + +__all__ = ["Print"] + +try: + Print = eval("print") # python 3.0 case + python_version = 3 + to_str = str +except SyntaxError as e: + python_version = 2 + to_str = unicode + D = dict() + try: + exec ("from __future__ import print_function\np=print", D) + Print = D["p"] # 2.6 case + except SyntaxError: + def Print(*args, **kwd): # 2.4, 2.5, define our own Print function + fout = kwd.get("file", sys.stdout) + w = fout.write + if args: + w(str(args[0])) + sep = kwd.get("sep", " ") + for a in args[1:]: + w(sep) + w(str(a)) + w(kwd.get("end", "\n")) + finally: + del D + + +def get_tag_or_hash(): + cmd = Popen(['git', 'describe', '--exact-match'], stdout=PIPE, stderr=PIPE) + so, se = cmd.communicate() + tag = '%s' % so.decode('utf-8').strip() + + if tag: + return tag + else: + cmd = Popen(['git', 'rev-parse', '--short', 'HEAD'], stdout=PIPE, stderr=PIPE) + so, se = cmd.communicate() + hash_name = '%s' % so.decode('utf-8').strip() + return ''.join([symbols['prehash'], hash_name]) + + +def get_stash(): + cmd = Popen(['git', 'rev-parse', '--git-dir'], stdout=PIPE, stderr=PIPE) + so, se = cmd.communicate() + stash_file = '%s%s' % (so.decode('utf-8').rstrip(), '/logs/refs/stash') + + try: + with open(stash_file) as f: + return sum(1 for _ in f) + except IOError: + return 0 + + +# `git status --porcelain --branch` can collect all information +# branch, remote_branch, untracked, staged, changed, conflicts, ahead, behind +po = Popen(['git', 'status', '--porcelain', '--branch'], env={'LC_ALL': 'C'}, stdout=PIPE, stderr=PIPE) +stdout, stderr = po.communicate() +if po.returncode != 0: + sys.exit(0) # Not a git repository + +# collect git status information +untracked, staged, changed, conflicts = [], [], [], [] +num_ahead, num_behind = 0, 0 +ahead, behind = '', '' +branch = '' +remote = '' +status = [(line[0], line[1], line[2:]) for line in stdout.decode('utf-8').splitlines()] +for st in status: + if st[0] == '#' and st[1] == '#': + if re.search('Initial commit on', st[2]): + branch = st[2].split(' ')[-1] + elif re.search('No commits yet on', st[2]): + branch = st[2].split(' ')[-1] + elif re.search('no branch', st[2]): # detached status + branch = get_tag_or_hash() + elif len(st[2].strip().split('...')) == 1: + branch = st[2].strip() + else: + # current and remote branch info + branch, rest = st[2].strip().split('...') + if len(rest.split(' ')) == 1: + # remote_branch = rest.split(' ')[0] + pass + else: + # ahead or behind + divergence = ' '.join(rest.split(' ')[1:]) + divergence = divergence.lstrip('[').rstrip(']') + for div in divergence.split(', '): + if 'ahead' in div: + num_ahead = int(div[len('ahead '):].strip()) + ahead = '%s%s' % (symbols['ahead of'], num_ahead) + elif 'behind' in div: + num_behind = int(div[len('behind '):].strip()) + behind = '%s%s' % (symbols['behind'], num_behind) + remote = ''.join([behind, ahead]) + elif st[0] == '?' and st[1] == '?': + untracked.append(st) + else: + if st[1] == 'M': + changed.append(st) + if st[0] == 'U': + conflicts.append(st) + elif st[0] != ' ': + staged.append(st) + +stashed = get_stash() +if not changed and not staged and not conflicts and not untracked and not stashed: + clean = 1 +else: + clean = 0 + +if remote == "": + remote = '.' + +if python_version == 2: + remote = remote.decode('utf-8') + +out = '\n'.join([ + branch, + remote, + to_str(len(staged)), + to_str(len(conflicts)), + to_str(len(changed)), + to_str(len(untracked)), + to_str(stashed), + to_str(clean), + to_str(python_version), +]) + + +if python_version == 2: + Print(out.encode('utf-8')) +else: + Print(out) diff --git a/home-rc/dot-files/.bash-git-prompt/gitstatus.sh b/home-rc/dot-files/.bash-git-prompt/gitstatus.sh new file mode 100755 index 0000000..7cbda63 --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/gitstatus.sh @@ -0,0 +1,199 @@ +#!/usr/bin/env bash +# -*- coding: utf-8 -*- +# gitstatus.sh -- produce the current git repo status on STDOUT +# Functionally equivalent to 'gitstatus.py', but written in bash (not python). +# +# Alan K. Stebbens [http://github.com/aks] + +set -u + +if [[ -z "${__GIT_PROMPT_DIR:+x}" ]]; then + SOURCE="${BASH_SOURCE[0]}" + while [[ -h "${SOURCE}" ]]; do + DIR="$( cd -P "$( dirname "${SOURCE}" )" && pwd )" + SOURCE="$(readlink "${SOURCE}")" + [[ "${SOURCE}" != /* ]] && SOURCE="${DIR}/${SOURCE}" + done + __GIT_PROMPT_DIR="$( cd -P "$( dirname "${SOURCE}" )" && pwd )" +fi + +if [[ "${__GIT_PROMPT_IGNORE_SUBMODULES:-0}" == "1" ]]; then + _ignore_submodules="--ignore-submodules" +else + _ignore_submodules="" +fi + +if [[ "${__GIT_PROMPT_WITH_USERNAME_AND_REPO:-0}" == "1" ]]; then + # returns "user/repo" from remote.origin.url git variable + # + # supports urls: + # https://user@bitbucket.org/user/repo.git + # https://github.com/user/repo.git + # git@github.com:user/repo.git + # + remote_url=$(git config --get remote.origin.url | sed 's|^.*//||; s/.*@//; s/[^:/]\+[:/]//; s/.git$//') +else + remote_url='.' +fi + +gitstatus=$( LC_ALL=C git status ${_ignore_submodules} --untracked-files="${__GIT_PROMPT_SHOW_UNTRACKED_FILES:-normal}" --porcelain --branch ) + +# if the status is fatal, exit now +[[ ! "${?}" ]] && exit 0 + +git_dir="$(git rev-parse --git-dir 2>/dev/null)" +[[ -z "${git_dir:+x}" ]] && exit 0 + +__git_prompt_read () +{ + local f="${1}" + shift + [[ -r "${f}" ]] && read -r "${@}" <"${f}" +} + +state="" +step="" +total="" +if [[ -d "${git_dir}/rebase-merge" ]]; then + __git_prompt_read "${git_dir}/rebase-merge/msgnum" step + __git_prompt_read "${git_dir}/rebase-merge/end" total + if [[ -f "${git_dir}/rebase-merge/interactive" ]]; then + state="|REBASE-i" + else + state="|REBASE-m" + fi +else + if [[ -d "${git_dir}/rebase-apply" ]]; then + __git_prompt_read "${git_dir}/rebase-apply/next" step + __git_prompt_read "${git_dir}/rebase-apply/last" total + if [[ -f "${git_dir}/rebase-apply/rebasing" ]]; then + state="|REBASE" + elif [[ -f "${git_dir}/rebase-apply/applying" ]]; then + state="|AM" + else + state="|AM/REBASE" + fi + elif [[ -f "${git_dir}/MERGE_HEAD" ]]; then + state="|MERGING" + elif [[ -f "${git_dir}/CHERRY_PICK_HEAD" ]]; then + state="|CHERRY-PICKING" + elif [[ -f "${git_dir}/REVERT_HEAD" ]]; then + state="|REVERTING" + elif [[ -f "${git_dir}/BISECT_LOG" ]]; then + state="|BISECTING" + fi +fi + +if [[ -n "${step}" ]] && [[ -n "${total}" ]]; then + state="${state} ${step}/${total}" +fi + +num_staged=0 +num_changed=0 +num_conflicts=0 +num_untracked=0 +while IFS='' read -r line || [[ -n "${line}" ]]; do + status="${line:0:2}" + while [[ -n ${status} ]]; do + case "${status}" in + #two fixed character matches, loop finished + \#\#) branch_line="${line/\.\.\./^}"; break ;; + \?\?) ((num_untracked++)); break ;; + U?) ((num_conflicts++)); break;; + ?U) ((num_conflicts++)); break;; + DD) ((num_conflicts++)); break;; + AA) ((num_conflicts++)); break;; + #two character matches, first loop + ?M) ((num_changed++)) ;; + ?D) ((num_changed++)) ;; + ?\ ) ;; + #single character matches, second loop + U) ((num_conflicts++)) ;; + \ ) ;; + *) ((num_staged++)) ;; + esac + status="${status:0:(${#status}-1)}" + done +done <<< "${gitstatus}" + +num_stashed=0 +if [[ "${__GIT_PROMPT_IGNORE_STASH:-0}" != "1" ]]; then + stash_file="${git_dir}/logs/refs/stash" + if [[ -e "${stash_file}" ]]; then + while IFS='' read -r wcline || [[ -n "${wcline}" ]]; do + ((num_stashed++)) + done < "${stash_file}" + fi +fi + +clean=0 +if (( num_changed == 0 && num_staged == 0 && num_untracked == 0 && num_stashed == 0 && num_conflicts == 0)) ; then + clean=1 +fi + +IFS="^" read -ra branch_fields <<< "${branch_line/\#\# }" +branch="${branch_fields[0]}" +remote="" +upstream="" + +if [[ "${branch}" == *"Initial commit on"* ]]; then + IFS=" " read -ra fields <<< "${branch}" + branch="${fields[3]}" + remote="_NO_REMOTE_TRACKING_" + remote_url='.' +elif [[ "${branch}" == *"No commits yet on"* ]]; then + IFS=" " read -ra fields <<< "${branch}" + branch="${fields[4]}" + remote="_NO_REMOTE_TRACKING_" + remote_url='.' +elif [[ "${branch}" == *"no branch"* ]]; then + tag=$( git describe --tags --exact-match ) + if [[ -n "${tag}" ]]; then + branch="${tag}" + else + branch="_PREHASH_$( git rev-parse --short HEAD )" + fi +else + if [[ "${#branch_fields[@]}" -eq 1 ]]; then + remote="_NO_REMOTE_TRACKING_" + remote_url='.' + else + IFS="[,]" read -ra remote_fields <<< "${branch_fields[1]}" + upstream="${remote_fields[0]}" + for remote_field in "${remote_fields[@]}"; do + if [[ "${remote_field}" == "ahead "* ]]; then + num_ahead="${remote_field:6}" + ahead="_AHEAD_${num_ahead}" + fi + if [[ "${remote_field}" == "behind "* ]] || [[ "${remote_field}" == " behind "* ]]; then + num_behind="${remote_field:7}" + behind="_BEHIND_${num_behind# }" + fi + done + remote="${behind-}${ahead-}" + fi +fi + +if [[ -z "${remote:+x}" ]] ; then + remote='.' +fi + +if [[ -z "${upstream:+x}" ]] ; then + upstream='^' +fi + +UPSTREAM_TRIMMED=`echo $upstream |xargs` + +printf "%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n" \ + "${branch}${state}" \ + "${remote}" \ + "${remote_url}" \ + "${UPSTREAM_TRIMMED}" \ + "${num_staged}" \ + "${num_conflicts}" \ + "${num_changed}" \ + "${num_untracked}" \ + "${num_stashed}" \ + "${clean}" + +exit diff --git a/home-rc/dot-files/.bash-git-prompt/gitstatus_pre-1.7.10.sh b/home-rc/dot-files/.bash-git-prompt/gitstatus_pre-1.7.10.sh new file mode 100755 index 0000000..7ae7238 --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/gitstatus_pre-1.7.10.sh @@ -0,0 +1,140 @@ +#!/usr/bin/env bash +# -*- coding: UTF-8 -*- +# gitstatus.sh -- produce the current git repo status on STDOUT +# Functionally equivalent to 'gitstatus.py', but written in bash (not python). +# +# Alan K. Stebbens [http://github.com/aks] + +# helper functions +count_lines() { echo "${1}" | egrep -c "^${2}" ; } +all_lines() { echo "${1}" | grep -v "^$" | wc -l ; } + +if [[ -z "${__GIT_PROMPT_DIR-}" ]]; then + SOURCE="${BASH_SOURCE[0]}" + while [[ -h "${SOURCE}" ]]; do + DIR="$( cd -P "$( dirname "${SOURCE}" )" && pwd )" + SOURCE="$(readlink "${SOURCE}")" + [[ "${SOURCE}" != /* ]] && SOURCE="${DIR}/${SOURCE}" + done + __GIT_PROMPT_DIR="$( cd -P "$( dirname "${SOURCE}" )" && pwd )" +fi + +if [[ "${__GIT_PROMPT_WITH_USERNAME_AND_REPO}" == "1" ]]; then + # returns "user/repo" from remote.origin.url git variable + # + # supports urls: + # https://user@bitbucket.org/user/repo.git + # https://github.com/user/repo.git + # git@github.com:user/repo.git + # + remote_url=$(git config --get remote.origin.url | sed 's|^.*//||; s/.*@//; s/[^:/]\+[:/]//; s/.git$//') +else + remote_url='.' +fi + +gitsym=$( git symbolic-ref HEAD 2>/dev/null ) + +#If exit status OK, we have a branch +if [[ "${?}" == 0 ]]; then + # the current branch is the tail end of the symbolic reference + branch="${gitsym##refs/heads/}" # get the basename after "refs/heads/" +fi + +gitstatus=$( git diff --name-status 2>&1 ) + +# if the diff is fatal, exit now +if [[ "${?}" != 0 ]]; then exit 0; fi + +staged_files=$( git diff --staged --name-status ) + +num_changed=$(( $( all_lines "${gitstatus}" ) - $( count_lines "${gitstatus}" U ) )) +num_conflicts=$( count_lines "${staged_files}" U ) +num_staged=$(( $( all_lines "${staged_files}" ) - num_conflicts )) +num_untracked=$( git ls-files --others --exclude-standard $(git rev-parse --show-cdup) | wc -l ) + +num_stashed=0 +if [[ "${__GIT_PROMPT_IGNORE_STASH}" != "1" ]]; then + stash_file="$( git rev-parse --git-dir )/logs/refs/stash" + if [[ -e "${stash_file}" ]]; then + while IFS='' read -r wcline || [[ -n "${wcline}" ]]; do + ((num_stashed++)) + done < "${stash_file}" + fi +fi + +clean=0 +if (( num_changed == 0 && num_staged == 0 && num_untracked == 0 && num_stashed == 0 && num_conflicts == 0 )) ; then + clean=1 +fi + +remote="" +upstream="" + +if [[ -z "${branch-}" ]]; then + tag=$( git describe --tags --exact-match 2>/dev/null ) + if [[ -n "${tag}" ]]; then + branch="${tag}" + else + branch="_PREHASH_$( git rev-parse --short HEAD )" + fi +else + remote_name=$( git config "branch.${branch}.remote" ) + + if [[ -n "$remote_name" ]]; then + merge_name=$( git config "branch.${branch}.merge" ) + else + remote_name='origin' + merge_name="refs/heads/${branch}" + fi + + if [[ "${remote_name}" == '.' ]]; then + remote_ref="${merge_name}" + else + remote_ref="refs/remotes/${remote_name}/${merge_name##refs/heads/}" + fi + + # detect if the local branch have a remote tracking branch + upstream=$( git rev-parse --abbrev-ref "${branch}"@{upstream} 2>&1 ) + + if [[ "${?}" == 0 ]]; then + # get the revision list, and count the leading "<" and ">" + revgit=$( git rev-list --left-right "${remote_ref}...HEAD" 2>/dev/null ) + if [[ "${?}" == 0 ]]; then + num_revs=$( all_lines "${revgit}" ) + num_ahead=$( count_lines "${revgit}" "^>" ) + num_behind=$(( num_revs - num_ahead )) + if (( num_behind > 0 )) ; then + remote="${remote}_BEHIND_${num_behind}" + fi + if (( num_ahead > 0 )) ; then + remote="${remote}_AHEAD_${num_ahead}" + fi + fi + else + remote='_NO_REMOTE_TRACKING_' + remote_url='.' + unset upstream + fi +fi + +if [[ -z "${remote:+x}" ]] ; then + remote='.' +fi + +if [[ -z "${upstream:+x}" ]] ; then + upstream='^' +fi + +printf "%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n" \ + "${branch}" \ + "${remote}" \ + "${remote_url}" \ + "${upstream}" \ + "${num_staged}" \ + "${num_conflicts}" \ + "${num_changed}" \ + "${num_untracked// /}" \ + "${num_stashed}" \ + "${clean}" + +exit diff --git a/home-rc/dot-files/.bash-git-prompt/prompt-colors.sh b/home-rc/dot-files/.bash-git-prompt/prompt-colors.sh new file mode 100644 index 0000000..c8794a6 --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/prompt-colors.sh @@ -0,0 +1,78 @@ +#!/usr/bin/env bash +# prompt-colors.sh +# +# source this file to get color definitions +# are also printed to STDERR. + +define_color_names() { + + ColorNames=( Black Red Green Yellow Blue Magenta Cyan White ) + FgColors=( 30 31 32 33 34 35 36 37 ) + BgColors=( 40 41 42 43 44 45 46 47 ) + + local AttrNorm=0 + local AttrBright=1 + local AttrDim=2 + local AttrUnder=4 + local AttrBlink=5 + local AttrRev=7 + local AttrHide=8 + + # define "BoldCOLOR", "BrightCOLOR", and "DimCOLOR" names + + # _map_colors ATTRNAME ATTRVALUE + # + # Defines three names for every color, attribute combintaion: + # {ATTRNAME}{COLORNAME} + # {ATTRNAME}{COLORNAME}Fg + # {ATTRNAME}{COLORNAME}Bg + # + # Example: BoldRed, BoldRedFg, BoldRedBg + + _map_colors() { + local x=0 + local attrname="${1}" + local attrcode="${2}" + while (( x < 8 )) ; do + local colorname="${ColorNames[x]}" + local fgcolorcode="${FgColors[x]}" + local bgcolorcode="${BgColors[x]}" + longcolorname="${attrname}${colorname}" + _def_color "${longcolorname}" "${attrcode}" "${fgcolorcode}" + _def_color "${longcolorname}Fg" "${attrcode}" "${fgcolorcode}" + _def_color "${longcolorname}Bg" "${attrcode}" "${bgcolorcode}" + (( x++ )) + done + } + + # _term_color [ N | N M ] + _term_color() { + local cv + if [[ "${#}" -gt 1 ]]; then + cv="${1};${2}" + else + cv="${1}" + fi + echo "\[\033[${cv}m\]" + } + + # def_color NAME ATTRCODE COLORCODE + _def_color() { + local def="${1}=\"\`_term_color ${2} ${3}\`\"" + eval "${def}" + } + + _map_colors Bold ${AttrBright} + _map_colors Bright ${AttrBright} + _map_colors Dim ${AttrDim} + _map_colors '' ${AttrNorm} + + _def_color IntenseBlack 0 90 + _def_color ResetColor 0 0 + +} + +# do the color definitions only once +if [[ -z "${ColorNames+x}" || "${#ColorNames[*]}" = 0 || -z "${IntenseBlack:+x}" || -z "${ResetColor:+x}" ]]; then + define_color_names +fi diff --git a/home-rc/dot-files/.bash-git-prompt/themes/Chmike.bgptheme b/home-rc/dot-files/.bash-git-prompt/themes/Chmike.bgptheme new file mode 100644 index 0000000..f6c8852 --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/themes/Chmike.bgptheme @@ -0,0 +1,32 @@ +# This theme for gitprompt.sh is designed for dark color schemes +# it is clone of oh-my-zsh crunch theme style with exit status + +override_git_prompt_colors() { + if [ -e ~/.rvm/bin/rvm-prompt ]; then + RUBY_PROMPT='{$(~/.rvm/bin/rvm-prompt i v)}' + else + if command -v rbenv > /dev/null; then + RUBY_PROMPT='{$(rbenv version | sed -e "s/ (set.*$//")}' + fi + fi + Time12a="\$(date +%H:%M)" + + + GIT_PROMPT_THEME_NAME="Chmike" + GIT_PROMPT_BRANCH="${Green}" + GIT_PROMPT_MASTER_BRANCH="${GIT_PROMPT_BRANCH}" + GIT_PROMPT_REMOTE=" " + GIT_PROMPT_SYMBOLS_NO_REMOTE_TRACKING="⭐" + + GIT_PROMPT_SEPARATOR="|" + GIT_PROMPT_CHANGED="${Cyan}❗" + GIT_PROMPT_STAGED="${Yellow}▸" + GIT_PROMPT_UNTRACKED="${Blue}…" + GIT_PROMPT_CONFLICTS="${BoldRed}❓" + GIT_PROMPT_STASHED="${Magenta}>" + GIT_PROMPT_CLEAN="${Green}✔ " + GIT_PROMPT_COMMAND_OK="${Green}✔" + GIT_PROMPT_COMMAND_FAIL="${Red}✘" +} + +reload_git_prompt_colors "Chmike" diff --git a/home-rc/dot-files/.bash-git-prompt/themes/Crunch.bgptheme b/home-rc/dot-files/.bash-git-prompt/themes/Crunch.bgptheme new file mode 100644 index 0000000..8dd182f --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/themes/Crunch.bgptheme @@ -0,0 +1,34 @@ +# This theme for gitprompt.sh is designed for dark color schemes +# it is clone of oh-my-zsh crunch theme style with exit status + +override_git_prompt_colors() { + if [ -e ~/.rvm/bin/rvm-prompt ]; then + RUBY_PROMPT='{$(~/.rvm/bin/rvm-prompt i v)}' + else + if command -v rbenv > /dev/null; then + RUBY_PROMPT='{$(rbenv version | sed -e "s/ (set.*$//")}' + fi + fi + Time12a="\$(date +%H:%M)" + + GIT_PROMPT_THEME_NAME="Crunch" + GIT_PROMPT_STAGED="${Yellow}● " + GIT_PROMPT_UNTRACKED="${Cyan}… " + GIT_PROMPT_STASHED="${BoldMagenta}⚑ " + GIT_PROMPT_CLEAN="${Green}✔ " + GIT_PROMPT_COMMAND_OK="${Green}✔ " + GIT_PROMPT_COMMAND_FAIL="${Red}✘ " + + KERNEL_PROMPT='‹$(uname -r)›' + + GIT_PROMPT_START_USER="_LAST_COMMAND_INDICATOR_${White}{${Yellow}${Time12a}${White}}[${Magenta}${RUBY_PROMPT}${White}]${Cyan}${PathShort}${White}:" + GIT_PROMPT_START_ROOT="${GIT_PROMPT_START_USER}" + GIT_PROMPT_END_USER="${BoldBlue} ➭ ${ResetColor}" + GIT_PROMPT_END_ROOT="${BoldRed} # ${ResetColor}" + GIT_PROMPT_LEADING_SPACE=0 + GIT_PROMPT_PREFIX="${Green}[" + GIT_PROMPT_SUFFIX="${Green}]" + GIT_PROMPT_SYMBOLS_NO_REMOTE_TRACKING="✭" +} + +reload_git_prompt_colors "Crunch" diff --git a/home-rc/dot-files/.bash-git-prompt/themes/Custom.bgptemplate b/home-rc/dot-files/.bash-git-prompt/themes/Custom.bgptemplate new file mode 100644 index 0000000..ac17c67 --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/themes/Custom.bgptemplate @@ -0,0 +1,65 @@ +# This is the custom theme template for gitprompt.sh + +# These are the defaults from the "Default" theme +# You just need to override what you want to have changed +override_git_prompt_colors() { + GIT_PROMPT_THEME_NAME="Custom" + + # Time12a="\$(date +%H:%M)" + # PathShort="\w"; + + ## These are the color definitions used by gitprompt.sh + # GIT_PROMPT_PREFIX="[" # start of the git info string + # GIT_PROMPT_SUFFIX="]" # the end of the git info string + # GIT_PROMPT_SEPARATOR="|" # separates each item + + # GIT_PROMPT_BRANCH="${Magenta}" # the git branch that is active in the current directory + # GIT_PROMPT_MASTER_BRANCH="${GIT_PROMPT_BRANCH}" # used if the git branch that is active in the current directory is $GIT_PROMPT_MASTER_BRANCHES + # GIT_PROMPT_STAGED="${Red}●" # the number of staged files/directories + # GIT_PROMPT_CONFLICTS="${Red}✖ " # the number of files in conflict + # GIT_PROMPT_CHANGED="${Blue}✚ " # the number of changed files + + # GIT_PROMPT_REMOTE=" " # the remote branch name (if any) and the symbols for ahead and behind + # GIT_PROMPT_UNTRACKED="${Cyan}…" # the number of untracked files/dirs + # GIT_PROMPT_STASHED="${BoldBlue}⚑ " # the number of stashed files/dir + # GIT_PROMPT_CLEAN="${BoldGreen}✔" # a colored flag indicating a "clean" repo + + ## For the command indicator, the placeholder _LAST_COMMAND_STATE_ + ## will be replaced with the exit code of the last command + ## e.g. + ## GIT_PROMPT_COMMAND_OK="${Green}✔-_LAST_COMMAND_STATE_ " # indicator if the last command returned with an exit code of 0 + ## GIT_PROMPT_COMMAND_FAIL="${Red}✘-_LAST_COMMAND_STATE_ " # indicator if the last command returned with an exit code of other than 0 + + # GIT_PROMPT_COMMAND_OK="${Green}✔" # indicator if the last command returned with an exit code of 0 + # GIT_PROMPT_COMMAND_FAIL="${Red}✘-_LAST_COMMAND_STATE_" # indicator if the last command returned with an exit code of other than 0 + + ## template for displaying the current virtual environment + ## use the placeholder _VIRTUALENV_ will be replaced with + ## the name of the current virtual environment (currently CONDA and VIRTUAL_ENV) + # GIT_PROMPT_VIRTUALENV="(${Blue}_VIRTUALENV_${ResetColor}) " + + # template for displaying the current remote tracking branch + # use the placeholder _UPSTREAM_ will be replaced with + # the name of the current remote tracking branch + # GIT_PROMPT_UPSTREAM=" {${Blue}_UPSTREAM_${ResetColor}}" + + ## _LAST_COMMAND_INDICATOR_ will be replaced by the appropriate GIT_PROMPT_COMMAND_OK OR GIT_PROMPT_COMMAND_FAIL + # GIT_PROMPT_START_USER="_LAST_COMMAND_INDICATOR_ ${Yellow}${PathShort}${ResetColor}" + # GIT_PROMPT_START_ROOT="_LAST_COMMAND_INDICATOR_ ${GIT_PROMPT_START_USER}" + # GIT_PROMPT_END_USER=" \n${White}${Time12a}${ResetColor} $ " + # GIT_PROMPT_END_ROOT=" \n${White}${Time12a}${ResetColor} # " + + ## Please do not add colors to these symbols + # GIT_PROMPT_SYMBOLS_AHEAD="↑·" # The symbol for "n versions ahead of origin" + # GIT_PROMPT_SYMBOLS_BEHIND="↓·" # The symbol for "n versions behind of origin" + # GIT_PROMPT_SYMBOLS_PREHASH=":" # Written before hash of commit, if no name could be found + # GIT_PROMPT_SYMBOLS_NO_REMOTE_TRACKING="L" # This symbol is written after the branch, if the branch is not tracked + + # branch name(s) that will use $GIT_PROMPT_MASTER_BRANCH color + # To specify multiple branches, use + # shopt -s extglob + # GIT_PROMPT_MASTER_BRANCHES='@(master|production)' + # GIT_PROMPT_MASTER_BRANCHES="master" +} + +reload_git_prompt_colors "Custom" diff --git a/home-rc/dot-files/.bash-git-prompt/themes/Default.bgptheme b/home-rc/dot-files/.bash-git-prompt/themes/Default.bgptheme new file mode 100644 index 0000000..a43a5f1 --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/themes/Default.bgptheme @@ -0,0 +1,113 @@ +# This is the default theme for gitprompt.sh + +unset_git_prompt_colors() { + unset Time12a + unset PathShort + unset GIT_PROMPT_PREFIX + unset GIT_PROMPT_SUFFIX + unset GIT_PROMPT_SEPARATOR + unset GIT_PROMPT_BRANCH + unset GIT_PROMPT_STAGED + unset GIT_PROMPT_CONFLICTS + unset GIT_PROMPT_CHANGED + unset GIT_PROMPT_REMOTE + unset GIT_PROMPT_UNTRACKED + unset GIT_PROMPT_STASHED + unset GIT_PROMPT_CLEAN + unset GIT_PROMPT_COMMAND_OK + unset GIT_PROMPT_COMMAND_FAIL + unset GIT_PROMPT_VIRTUALENV + unset GIT_PROMPT_UPSTREAM + unset GIT_PROMPT_START_USER + unset GIT_PROMPT_START_ROOT + unset GIT_PROMPT_END_USER + unset GIT_PROMPT_END_ROOT + unset GIT_PROMPT_SYMBOLS_AHEAD + unset GIT_PROMPT_SYMBOLS_BEHIND + unset GIT_PROMPT_SYMBOLS_PREHASH + unset GIT_PROMPT_SYMBOLS_NO_REMOTE_TRACKING +} + +define_helpers() { + Time12a="\$(date +%H:%M)" + PathShort="\w"; +} + +define_undefined_git_prompt_colors() { + if [ -z ${GIT_PROMPT_THEME_NAME:+x} ]; then GIT_PROMPT_THEME_NAME="Default"; fi + + # These are the color definitions used by gitprompt.sh + if [ -z "${GIT_PROMPT_PREFIX+x}" ]; then GIT_PROMPT_PREFIX="["; fi # start of the git info string + if [ -z "${GIT_PROMPT_SUFFIX+x}" ]; then GIT_PROMPT_SUFFIX="]"; fi # the end of the git info string + if [ -z "${GIT_PROMPT_SEPARATOR+x}" ]; then GIT_PROMPT_SEPARATOR="|"; fi # separates each item + + if [ -z "${GIT_PROMPT_BRANCH+x}" ]; then GIT_PROMPT_BRANCH="${Magenta}"; fi # the git branch that is active in the current directory + if [ -z "${GIT_PROMPT_MASTER_BRANCH+x}" ]; then GIT_PROMPT_MASTER_BRANCH="${GIT_PROMPT_BRANCH}"; fi # used if the git branch that is active in the current directory is $GIT_PROMPT_MASTER_BRANCHES + if [ -z "${GIT_PROMPT_STAGED+x}" ]; then GIT_PROMPT_STAGED="${Red}●"; fi # the number of staged files/directories + if [ -z "${GIT_PROMPT_CONFLICTS+x}" ]; then GIT_PROMPT_CONFLICTS="${Red}✖ "; fi # the number of files in conflict + if [ -z "${GIT_PROMPT_CHANGED+x}" ]; then GIT_PROMPT_CHANGED="${Blue}✚ "; fi # the number of changed files + + if [ -z "${GIT_PROMPT_REMOTE+x}" ]; then GIT_PROMPT_REMOTE=" "; fi # the remote branch name (if any) and the symbols for ahead and behind + if [ -z "${GIT_PROMPT_UNTRACKED+x}" ]; then GIT_PROMPT_UNTRACKED="${Cyan}…"; fi # the number of untracked files/dirs + if [ -z "${GIT_PROMPT_STASHED+x}" ]; then GIT_PROMPT_STASHED="${BoldBlue}⚑ "; fi # the number of stashed files/dir + if [ -z "${GIT_PROMPT_CLEAN+x}" ]; then GIT_PROMPT_CLEAN="${BoldGreen}✔"; fi # a colored flag indicating a "clean" repo + + # For the command indicator, the placeholder _LAST_COMMAND_STATE_ + # will be replaced with the exit code of the last command + # e.g. + # GIT_PROMPT_COMMAND_OK="${Green}✔-_LAST_COMMAND_STATE_ " # indicator if the last command returned with an exit code of 0 + # GIT_PROMPT_COMMAND_FAIL="${Red}✘-_LAST_COMMAND_STATE_ " # indicator if the last command returned with an exit code of other than 0 + + if [ -z "${GIT_PROMPT_COMMAND_OK+x}" ]; then GIT_PROMPT_COMMAND_OK="${Green}✔"; fi # indicator if the last command returned with an exit code of 0 + if [ -z "${GIT_PROMPT_COMMAND_FAIL+x}" ]; then GIT_PROMPT_COMMAND_FAIL="${Red}✘-_LAST_COMMAND_STATE_"; fi # indicator if the last command returned with an exit code of other than 0 + + # Possible to change which command is used to create git status information + # There are three options: + # 1) gitstatus.sh (uses git status --branch --porcelain - fast, requires git > 1.7.10) + # 2) gitstatus_pre-1.7.10.sh (Uses a variety of git commands and pipes - slower, works with older git clients) + # 3) gitstatus.py (Unsupported, lack features found in the bash versions) + if [ -z "${GIT_PROMPT_STATUS_COMMAND+x}" ]; then GIT_PROMPT_STATUS_COMMAND="gitstatus.sh"; fi # Point out the command to get the git status from + + # template for displaying the current virtual environment + # use the placeholder _VIRTUALENV_ will be replaced with + # the name of the current virtual environment (currently CONDA and VIRTUAL_ENV) + if [ -z "${GIT_PROMPT_VIRTUALENV+x}" ]; then GIT_PROMPT_VIRTUALENV="(${Blue}_VIRTUALENV_${ResetColor}) "; fi + + # template for displaying the current remote tracking branch + # use the placeholder _UPSTREAM_ will be replaced with + # the name of the current remote tracking branch + if [ -z "${GIT_PROMPT_UPSTREAM+x}" ]; then GIT_PROMPT_UPSTREAM=" {${Blue}_UPSTREAM_${ResetColor}}"; fi + + # _LAST_COMMAND_INDICATOR_ will be replaced by the appropriate GIT_PROMPT_COMMAND_OK OR GIT_PROMPT_COMMAND_FAIL + if [ -z "${GIT_PROMPT_START_USER+x}" ]; then GIT_PROMPT_START_USER="_LAST_COMMAND_INDICATOR_ ${Yellow}${PathShort}${ResetColor}"; fi + if [ -z "${GIT_PROMPT_START_ROOT+x}" ]; then GIT_PROMPT_START_ROOT="${GIT_PROMPT_START_USER}"; fi + if [ -z "${GIT_PROMPT_END_USER+x}" ]; then GIT_PROMPT_END_USER=" \n${White}${Time12a}${ResetColor} $ "; fi + if [ -z "${GIT_PROMPT_END_ROOT+x}" ]; then GIT_PROMPT_END_ROOT=" \n${White}${Time12a}${ResetColor} # "; fi + + # Please do not add colors to these symbols + if [ -z ${GIT_PROMPT_SYMBOLS_AHEAD+x} ]; then GIT_PROMPT_SYMBOLS_AHEAD="↑·"; fi # The symbol for "n versions ahead of origin" + if [ -z ${GIT_PROMPT_SYMBOLS_BEHIND+x} ]; then GIT_PROMPT_SYMBOLS_BEHIND="↓·"; fi # The symbol for "n versions behind of origin" + if [ -z ${GIT_PROMPT_SYMBOLS_PREHASH+x} ]; then GIT_PROMPT_SYMBOLS_PREHASH=":"; fi # Written before hash of commit, if no name could be found + if [ -z ${GIT_PROMPT_SYMBOLS_NO_REMOTE_TRACKING+x} ]; then GIT_PROMPT_SYMBOLS_NO_REMOTE_TRACKING="L"; fi # This symbol is written after the branch, if the branch is not tracked + + # branch name(s) that will use $GIT_PROMPT_MASTER_BRANCH color + # To specify multiple branches, use + # shopt -s extglob + # GIT_PROMPT_MASTER_BRANCHES='@(master|production)' + if [ -z ${GIT_PROMPT_MASTER_BRANCHES+x} ]; then GIT_PROMPT_MASTER_BRANCHES="master"; fi +} + +# call only from theme file +reload_git_prompt_colors() { + if [[ "${GIT_PROMPT_THEME_NAME-}" != "${1}" ]]; then + unset_git_prompt_colors + define_helpers + override_git_prompt_colors + define_undefined_git_prompt_colors + fi +} + +if [[ "${GIT_PROMPT_THEME-}" == "Default" && "${GIT_PROMPT_THEME_NAME-}" != "Default" ]]; then + define_helpers + define_undefined_git_prompt_colors +fi diff --git a/home-rc/dot-files/.bash-git-prompt/themes/Default_NoExitState.bgptheme b/home-rc/dot-files/.bash-git-prompt/themes/Default_NoExitState.bgptheme new file mode 100644 index 0000000..239aae1 --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/themes/Default_NoExitState.bgptheme @@ -0,0 +1,11 @@ +# This is the default theme for gitprompt.sh +# without the indicator of the last command state + +override_git_prompt_colors() { + GIT_PROMPT_THEME_NAME="Default NoExitState" + GIT_PROMPT_COMMAND_FAIL="${Red}✘" # indicator if the last command returned with an exit code of other than 0 + GIT_PROMPT_START_USER="${Yellow}${PathShort}${ResetColor}" + GIT_PROMPT_START_ROOT="${GIT_PROMPT_START_USER}" +} + +reload_git_prompt_colors "Default NoExitState" diff --git a/home-rc/dot-files/.bash-git-prompt/themes/Default_NoExitState_Ubuntu.bgptheme b/home-rc/dot-files/.bash-git-prompt/themes/Default_NoExitState_Ubuntu.bgptheme new file mode 100644 index 0000000..27b78a8 --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/themes/Default_NoExitState_Ubuntu.bgptheme @@ -0,0 +1,15 @@ +# This is the default theme for gitprompt.sh +# without the indicator of the last command state +# tweaked for Ubuntu terminal fonts + +override_git_prompt_colors() { + GIT_PROMPT_THEME_NAME="Default NoExitState Ubuntu" + GIT_PROMPT_STAGED="${Red}● " # the number of staged files/directories + GIT_PROMPT_CLEAN="${BoldGreen}✔ " # a colored flag indicating a "clean" repo + GIT_PROMPT_COMMAND_OK="${Green}✔ " # indicator if the last command returned with an exit code of 0 + GIT_PROMPT_COMMAND_FAIL="${Red}✘ " # indicator if the last command returned with an exit code of other than 0 + GIT_PROMPT_START_USER="${Yellow}${PathShort}${ResetColor}" + GIT_PROMPT_START_ROOT="${GIT_PROMPT_START_USER}" +} + +reload_git_prompt_colors "Default NoExitState Ubuntu" diff --git a/home-rc/dot-files/.bash-git-prompt/themes/Default_Ubuntu.bgptheme b/home-rc/dot-files/.bash-git-prompt/themes/Default_Ubuntu.bgptheme new file mode 100644 index 0000000..e68b7b7 --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/themes/Default_Ubuntu.bgptheme @@ -0,0 +1,11 @@ +# This is the default theme for gitprompt.sh +# tweaked for Ubuntu terminal fonts + +override_git_prompt_colors() { + GIT_PROMPT_THEME_NAME="Default Ubuntu" + GIT_PROMPT_STAGED="${Red}● " # the number of staged files/directories + GIT_PROMPT_CLEAN="${BoldGreen}✔ " # a colored flag indicating a "clean" repo + GIT_PROMPT_COMMAND_OK="${Green}✔ " # indicator if the last command returned with an exit code of 0 +} + +reload_git_prompt_colors "Default Ubuntu" diff --git a/home-rc/dot-files/.bash-git-prompt/themes/Evermeet.bgptheme b/home-rc/dot-files/.bash-git-prompt/themes/Evermeet.bgptheme new file mode 100644 index 0000000..5381407 --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/themes/Evermeet.bgptheme @@ -0,0 +1,31 @@ +# This theme for gitprompt.sh is designed for dark color schemes +# It is most suitable for Retina or high resolution displays + +override_git_prompt_colors() { + GIT_PROMPT_THEME_NAME="Evermeet" + + GIT_PROMPT_PREFIX="" # start of the git info string + GIT_PROMPT_SUFFIX="" # the end of the git info string + GIT_PROMPT_SEPARATOR="|" # separates each item + + GIT_PROMPT_BRANCH="${Magenta}" # the git branch that is active in the current directory + GIT_PROMPT_MASTER_BRANCH="${GIT_PROMPT_BRANCH}" # used if the git branch that is active in the current directory is $GIT_PROMPT_MASTER_BRANCHES + GIT_PROMPT_STAGED="${Cyan}●" # the number of staged files/directories + GIT_PROMPT_CONFLICTS="${BoldRed}✖" # the number of files in conflict + GIT_PROMPT_CHANGED="${Cyan}✚" # the number of changed files + + GIT_PROMPT_UNTRACKED="${Cyan}…" # the number of untracked files/dirs + GIT_PROMPT_STASHED="${Magenta}⚑" # the number of stashed files/dir + GIT_PROMPT_CLEAN="${BoldGreen}✔" # a colored flag indicating a "clean" repo + + GIT_PROMPT_UPSTREAM=" {${Magenta}_UPSTREAM_${ResetColor}}" + + GIT_PROMPT_START_USER="[${BoldGreen}\u@\h${ResetColor} ${BoldYellow}\${?}${ResetColor} ${BoldBlue}\w${ResetColor}" + GIT_PROMPT_START_ROOT="[${BoldRed}\u@\h${ResetColor} ${BoldYellow}\${?}${ResetColor} ${BoldBlue}\w${ResetColor}" + GIT_PROMPT_END_USER="]$ " + GIT_PROMPT_END_ROOT="]# " + + GIT_PROMPT_SYMBOLS_NO_REMOTE_TRACKING="⭑" # This symbol is written after the branch, if the branch is not tracked +} + +reload_git_prompt_colors "Evermeet" diff --git a/home-rc/dot-files/.bash-git-prompt/themes/Evermeet_Lowres.bgptheme b/home-rc/dot-files/.bash-git-prompt/themes/Evermeet_Lowres.bgptheme new file mode 100644 index 0000000..6034535 --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/themes/Evermeet_Lowres.bgptheme @@ -0,0 +1,33 @@ +# This theme for gitprompt.sh is designed for dark color schemes +# On lowres screens unicode characters like ✖ require a space after them +# otherwise the following character may overlap with the unicode character +# tweaked for low resolution and non-retina screens + +override_git_prompt_colors() { + GIT_PROMPT_THEME_NAME="Evermeet_Lowres" + + GIT_PROMPT_PREFIX="" # start of the git info string + GIT_PROMPT_SUFFIX="" # the end of the git info string + GIT_PROMPT_SEPARATOR="|" # separates each item + + GIT_PROMPT_BRANCH="${Magenta}" # the git branch that is active in the current directory + GIT_PROMPT_MASTER_BRANCH="${GIT_PROMPT_BRANCH}" # used if the git branch that is active in the current directory is $GIT_PROMPT_MASTER_BRANCHES + GIT_PROMPT_STAGED="${Cyan}●" # the number of staged files/directories + GIT_PROMPT_CONFLICTS="${BoldRed}✖ " # the number of files in conflict + GIT_PROMPT_CHANGED="${Cyan}✚ " # the number of changed files + + GIT_PROMPT_UNTRACKED="${Cyan}…" # the number of untracked files/dirs + GIT_PROMPT_STASHED="${Magenta}⚑" # the number of stashed files/dir + GIT_PROMPT_CLEAN="${BoldGreen}✔" # a colored flag indicating a "clean" repo + + GIT_PROMPT_UPSTREAM=" {${Magenta}_UPSTREAM_${ResetColor}}" + + GIT_PROMPT_START_USER="[${BoldGreen}\u@\h${ResetColor} ${BoldYellow}\${?}${ResetColor} ${BoldBlue}\w${ResetColor}" + GIT_PROMPT_START_ROOT="[${BoldRed}\u@\h${ResetColor} ${BoldYellow}\${?}${ResetColor} ${BoldBlue}\w${ResetColor}" + GIT_PROMPT_END_USER="]$ " + GIT_PROMPT_END_ROOT="]# " + + GIT_PROMPT_SYMBOLS_NO_REMOTE_TRACKING="⭑ " # This symbol is written after the branch, if the branch is not tracked +} + +reload_git_prompt_colors "Evermeet_Lowres" diff --git a/home-rc/dot-files/.bash-git-prompt/themes/Evermeet_Ubuntu.bgptheme b/home-rc/dot-files/.bash-git-prompt/themes/Evermeet_Ubuntu.bgptheme new file mode 100644 index 0000000..1bf043f --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/themes/Evermeet_Ubuntu.bgptheme @@ -0,0 +1,33 @@ +# This theme for gitprompt.sh is designed for dark color schemes +# On lowres screens unicode characters like ✖ require a space after them +# otherwise the following character may overlap with the unicode character +# tweaked for Ubuntu terminal fonts + +override_git_prompt_colors() { + GIT_PROMPT_THEME_NAME="Evermeet_Ubuntu" + + GIT_PROMPT_PREFIX="" # start of the git info string + GIT_PROMPT_SUFFIX="" # the end of the git info string + GIT_PROMPT_SEPARATOR="|" # separates each item + + GIT_PROMPT_BRANCH="${Magenta}" # the git branch that is active in the current directory + GIT_PROMPT_MASTER_BRANCH="${GIT_PROMPT_BRANCH}" # used if the git branch that is active in the current directory is $GIT_PROMPT_MASTER_BRANCHES + GIT_PROMPT_STAGED="${Cyan}● " # the number of staged files/directories + GIT_PROMPT_CONFLICTS="${BoldRed}✖ " # the number of files in conflict + GIT_PROMPT_CHANGED="${Cyan}✚ " # the number of changed files + + GIT_PROMPT_UNTRACKED="${Cyan}…" # the number of untracked files/dirs + GIT_PROMPT_STASHED="${Magenta}⚑ " # the number of stashed files/dir + GIT_PROMPT_CLEAN="${BoldGreen}✔ " # a colored flag indicating a "clean" repo + + GIT_PROMPT_UPSTREAM=" {${Magenta}_UPSTREAM_${ResetColor}}" + + GIT_PROMPT_START_USER="[${BoldGreen}\u@\h${ResetColor} ${BoldYellow}\${?}${ResetColor} ${BoldBlue}\w${ResetColor}" + GIT_PROMPT_START_ROOT="[${BoldRed}\u@\h${ResetColor} ${BoldYellow}\${?}${ResetColor} ${BoldBlue}\w${ResetColor}" + GIT_PROMPT_END_USER="]$ " + GIT_PROMPT_END_ROOT="]# " + + GIT_PROMPT_SYMBOLS_NO_REMOTE_TRACKING="⭑ " # This symbol is written after the branch, if the branch is not tracked +} + +reload_git_prompt_colors "Evermeet_Ubuntu" diff --git a/home-rc/dot-files/.bash-git-prompt/themes/Minimal.bgptheme b/home-rc/dot-files/.bash-git-prompt/themes/Minimal.bgptheme new file mode 100644 index 0000000..5077715 --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/themes/Minimal.bgptheme @@ -0,0 +1,62 @@ +############################################################################## +# Changes the prompt to a Debian-style one that truncates pwd to a max length +# depending on the terminal column width. Also uses the prompt_callback +# function of bash-git-prompt to set the window title to almost the same +# Debian-style. This version has been tweaked for Ubuntu standard terminal +# fonts. +# +# The prompt will use a Debian-style on the form +# +# relative-path-from-git-toplevel-dir bash-git-prompt-info +# HH:MM:SS ▶ +# +# The window title will have the form +# relative-path-from-git-toplevel-dir +# +# Example usage: +# if [ -f ~/.bash-git-prompt/gitprompt.sh ]; then +# GIT_PROMPT_THEME=Minimal +# source ~/.bash-git-prompt/gitprompt.sh +# fi +# +# Imbibinebe [https://github.com/imbibinebe] +############################################################################## +override_git_prompt_colors() { + GIT_PROMPT_THEME_NAME="Minimal" + + #Overrides the prompt_callback function used by bash-git-prompt + function prompt_callback { + GIT_CONTAINER_FOLDER_FULLPATH=$(git rev-parse --show-toplevel 2> /dev/null) + GIT_CONTAINER_FOLDER=$(basename $GIT_CONTAINER_FOLDER_FULLPATH 2> /dev/null) + CURRENT_FULLPATH=$(pwd) + local PS1=$GIT_CONTAINER_FOLDER${CURRENT_FULLPATH#$GIT_CONTAINER_FOLDER_FULLPATH} + gp_set_window_title "$PS1" + echo -n "${BoldYellow}${PS1}${ResetColor}" + } + + Time12a="\$(date +%H:%M:%S)" + GIT_PROMPT_BRANCH="${BoldMagenta}" # the git branch that is active in the current directory + GIT_PROMPT_MASTER_BRANCH="${GIT_PROMPT_MASTER_BRANCH}" # used if the git branch that is active in the current directory is $GIT_PROMPT_MASTER_BRANCHES + GIT_PROMPT_PREFIX="" # start of the git info string + GIT_PROMPT_SUFFIX="" # the end of the git info string + GIT_PROMPT_SEPARATOR="" # separates each item + GIT_PROMPT_STAGED=" ${Green}●" # the number of staged files/directories + GIT_PROMPT_CONFLICTS=" ${BoldRed}✖" # the number of files in conflict + GIT_PROMPT_CHANGED=" ${BoldBlue}✚" # the number of changed files + + # GIT_PROMPT_REMOTE=" " # the remote branch name (if any) and the symbols for ahead and behind + GIT_PROMPT_UNTRACKED=" ${Cyan}…" # the number of untracked files/dirs + GIT_PROMPT_STASHED=" ${BoldCyan}⚑" # the number of stashed files/dir + GIT_PROMPT_CLEAN=" ${BoldGreen}✔" # a colored flag indicating a "clean" repo + + local gp_end="_LAST_COMMAND_INDICATOR_\n${White}${Time12a}${ResetColor}" + + GIT_PROMPT_START_USER="" + GIT_PROMPT_END_USER="${gp_end} ▶ " + GIT_PROMPT_END_ROOT="${gp_end} /!!!\ " + + GIT_PROMPT_COMMAND_OK="${Green} ✔ " # indicator if the last command returned with an exit code of 0 + GIT_PROMPT_COMMAND_FAIL="${BoldRed} ✘-_LAST_COMMAND_STATE_" # indicator if the last command returned with an exit code of other than 0 +} + +reload_git_prompt_colors "Minimal" diff --git a/home-rc/dot-files/.bash-git-prompt/themes/Minimal_Chevron.bgptheme b/home-rc/dot-files/.bash-git-prompt/themes/Minimal_Chevron.bgptheme new file mode 100644 index 0000000..1219055 --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/themes/Minimal_Chevron.bgptheme @@ -0,0 +1,72 @@ +############################################################################## +# Changes the prompt to a Debian-style one that truncates pwd to a max length +# depending on the terminal column width. Also uses the prompt_callback +# function of bash-git-prompt to set the window title to almost the same +# Debian-style. This version has been tweaked for Ubuntu standard terminal +# fonts. +# +# The prompt will use a Debian-style on the form +# +# relative-path-from-git-toplevel-dir bash-git-prompt-info +# HH:MM ▶ +# +# ● ✖ ◆ ➤ ▶ ❚❖ ⬅ ◀ ✔ ✘ ⬆ ⬇ ✚ ❮❮ ❯❯ ✦ ✛ ✲ +# +# The window title will have the form +# relative-path-from-git-toplevel-dir +# +# Example usage: +# if [ -f ~/.bash-git-prompt/gitprompt.sh ]; then +# GIT_PROMPT_THEME=Minimal_Time +# source ~/.bash-git-prompt/gitprompt.sh +# fi +# +# [https://github.com/modib] +############################################################################## +override_git_prompt_colors() { + GIT_PROMPT_THEME_NAME="Minimal_Time" + + #Overrides the prompt_callback function used by bash-git-prompt + function prompt_callback { + GIT_CONTAINER_FOLDER_FULLPATH=$(git rev-parse --show-toplevel 2> /dev/null) + GIT_CONTAINER_FOLDER=$(basename $GIT_CONTAINER_FOLDER_FULLPATH 2> /dev/null) + CURRENT_FULLPATH=$(pwd) + local PS1=$GIT_CONTAINER_FOLDER${CURRENT_FULLPATH#$GIT_CONTAINER_FOLDER_FULLPATH} + gp_set_window_title "$PS1" + echo "${Cyan}${PS1}${ResetColor}" + } + + Time12a="\$(date +%H:%M)" + GIT_PROMPT_BRANCH="${Magenta}" # the git branch that is active in the current directory + GIT_PROMPT_MASTER_BRANCH="${White}" # used if the git branch that is active in the current directory is $GIT_PROMPT_MASTER_BRANCHES + + GIT_PROMPT_PREFIX="[" + GIT_PROMPT_SUFFIX="]" + GIT_PROMPT_SEPARATOR="" # separates each item + GIT_PROMPT_STAGED=" ${Green}●" # the number of staged files/directories + GIT_PROMPT_CONFLICTS=" ${Red}❮❮" # the number of files in conflict + GIT_PROMPT_CHANGED=" ${Yellow}✚." # the number of changed files + + GIT_PROMPT_REMOTE=" " # the remote branch name (if any) and the symbols for ahead and behind + GIT_PROMPT_UNTRACKED=" ${Cyan}…" # the number of untracked files/dirs + GIT_PROMPT_STASHED=" ${Cyan}⚑" # the number of stashed files/dir + GIT_PROMPT_CLEAN=" ${Green}❯❯" # a colored flag indicating a "clean" repo + GIT_PROMPT_SYMBOLS_NO_REMOTE_TRACKING="${Red}✭" + + GIT_PROMPT_COMMAND_OK="${Green}❯❯" # indicator if the last command returned with an exit code of 0 + GIT_PROMPT_COMMAND_FAIL="${Red}❮❮ _LAST_COMMAND_STATE_" # indicator if the last command returned with an exit code of other than 0 + + local gp_start="_LAST_COMMAND_INDICATOR_" + local gp_end="\n${White}${Time12a}${ResetColor} ❯❯" + + GIT_PROMPT_START_USER="\n${gp_start} " + GIT_PROMPT_END_USER="${gp_end} " + + #GIT_PROMPT_SYMBOLS_AHEAD="↑·" + GIT_PROMPT_SYMBOLS_AHEAD="⬆." + #GIT_PROMPT_SYMBOLS_BEHIND="↓·" + GIT_PROMPT_SYMBOLS_BEHIND="⬇." + +} + +reload_git_prompt_colors "Minimal_Time" diff --git a/home-rc/dot-files/.bash-git-prompt/themes/Minimal_UserHost.bgptheme b/home-rc/dot-files/.bash-git-prompt/themes/Minimal_UserHost.bgptheme new file mode 100644 index 0000000..d446302 --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/themes/Minimal_UserHost.bgptheme @@ -0,0 +1,70 @@ +############################################################################## +# Changes the prompt to a Debian-style one that truncates pwd to a max length +# depending on the terminal column width. Also uses the prompt_callback +# function of bash-git-prompt to set the window title to almost the same +# Debian-style. This version has been tweaked for Ubuntu standard terminal +# fonts. +# +# The prompt will use a Debian-style on the form +# +# relative-path-from-git-toplevel-dir bash-git-prompt-info +# HH:MM:SS User@Host ▶ +# +# The window title will have the form +# relative-path-from-git-toplevel-dir +# +# Example usage: +# if [ -f ~/.bash-git-prompt/gitprompt.sh ]; then +# GIT_PROMPT_THEME=Minimal_UserHost +# source ~/.bash-git-prompt/gitprompt.sh +# fi +# +# Gert Pellin [https://github.com/switch87] +# +# Based on Minimal by Imbibinebe [https://github.com/imbibinebe] +############################################################################## +override_git_prompt_colors() { + GIT_PROMPT_THEME_NAME="Minimal_UserHost" + + #Overrides the prompt_callback function used by bash-git-prompt + function prompt_callback { + GIT_CONTAINER_FOLDER_FULLPATH=$(git rev-parse --show-toplevel 2> /dev/null) + GIT_CONTAINER_FOLDER=$(basename $GIT_CONTAINER_FOLDER_FULLPATH 2> /dev/null) + CURRENT_FULLPATH=$(pwd) + local PS1=$GIT_CONTAINER_FOLDER${CURRENT_FULLPATH#$GIT_CONTAINER_FOLDER_FULLPATH} + gp_set_window_title "$PS1" + echo -n "${BoldYellow}${PS1}${ResetColor}" + } + + Time12a="\$(date +%H:%M:%S)" + if [ "$(id -u)" != "0" ]; then + UserHost_Color="${BoldGreen}" + else + UserHost_Color="${BoldRed}" + fi + + GIT_PROMPT_BRANCH="${BoldMagenta}" # the git branch that is active in the current directory + GIT_PROMPT_MASTER_BRANCH="${GIT_PROMPT_MASTER_BRANCH}" # used if the git branch that is active in the current directory is $GIT_PROMPT_MASTER_BRANCHES + GIT_PROMPT_PREFIX="" # start of the git info string + GIT_PROMPT_SUFFIX="" # the end of the git info string + GIT_PROMPT_SEPARATOR="" # separates each item + GIT_PROMPT_STAGED=" ${Green}●" # the number of staged files/directories + GIT_PROMPT_CONFLICTS=" ${BoldRed}✖" # the number of files in conflict + GIT_PROMPT_CHANGED=" ${BoldBlue}✚" # the number of changed files + + # GIT_PROMPT_REMOTE=" " # the remote branch name (if any) and the symbols for ahead and behind + GIT_PROMPT_UNTRACKED=" ${Cyan}…" # the number of untracked files/dirs + GIT_PROMPT_STASHED=" ${BoldCyan}⚑" # the number of stashed files/dir + GIT_PROMPT_CLEAN=" ${BoldGreen}✔" # a colored flag indicating a "clean" repo + + local gp_end="_LAST_COMMAND_INDICATOR_\n${BoldBlack}${Time12a} ${UserHost_Color}$(whoami)@$(hostname)${ResetColor}" + + GIT_PROMPT_START_USER="" + GIT_PROMPT_END_USER="${gp_end} ▶ " + GIT_PROMPT_END_ROOT="${gp_end} /!!!\ " + + GIT_PROMPT_COMMAND_OK="${Green} ✔ " # indicator if the last command returned with an exit code of 0 + GIT_PROMPT_COMMAND_FAIL="${BoldRed} ✘-_LAST_COMMAND_STATE_" # indicator if the last command returned with an exit code of other than 0 +} + +reload_git_prompt_colors "Minimal_UserHost" diff --git a/home-rc/dot-files/.bash-git-prompt/themes/Plague_Doctor.bgptheme b/home-rc/dot-files/.bash-git-prompt/themes/Plague_Doctor.bgptheme new file mode 100644 index 0000000..f399f68 --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/themes/Plague_Doctor.bgptheme @@ -0,0 +1,41 @@ +# Plague Doctor's bash-git-prompt theme. +# +# Note 1: The theme is designed to work only in GIT Repos. +# If one needs a coresponding prompt for non GIT locations, here is the code: +# +# if [ -f ]; then +# source +# MYPROMPT="${White}\A${ResetColor} ${BoldGreen}\\u${White}@${BoldYellow}\\h ${Cyan}\w${ResetColor}${BoldWhite} $ ${ResetColor}" +# else +# MYPROMPT="\[\033[37m\]\A \[\033[1m\]\[\033[32m\]\u\[\033[0m\]\[\033[37m\]@\[\033[1m\]\[\033[33m\]\h:\[\033[0m\]\[\033[36m\] \w\[\033[0m\]\[\033[1m\]\[\033[37m\] \$ \[\033[0m\]" +# fi +# export PS1=$MYPROMPT +# +# Note 2: The theme looks very nice with "FantasqueSansMono Nerd Font" https://github.com/ryanoasis/nerd-fonts + +override_git_prompt_colors() { + GIT_PROMPT_THEME_NAME="Plague Doctor" + GIT_PROMPT_ONLY_IN_REPO=1 + GIT_PROMPT_LEADING_SPACE=0 + + GIT_PROMPT_PREFIX="[ " + GIT_PROMPT_SUFFIX=" ]" + GIT_PROMPT_SEPARATOR=" |" + GIT_PROMPT_STAGED=" ${Red}● ${ResetColor}" + GIT_PROMPT_CONFLICTS=" ${Red}✖ ${ResetColor}" + GIT_PROMPT_CHANGED=" ${Blue}✚ ${ResetColor}" + GIT_PROMPT_UNTRACKED=" ${Cyan}…${ResetColor}" + GIT_PROMPT_STASHED=" ${BoldBlue}⚑ ${ResetColor}" + GIT_PROMPT_CLEAN=" ${BoldGreen}✔ ${ResetColor}" + GIT_PROMPT_SYMBOLS_NO_REMOTE_TRACKING="✭" + + GIT_PROMPT_COMMAND_OK="${Green}✔ " + GIT_PROMPT_COMMAND_FAIL="${Red}✘ " + + GIT_PROMPT_START_USER="${BoldBlue} ${ResetColor}" + GIT_PROMPT_START_ROOT="${BoldRed}❖ ${ResetColor}" + GIT_PROMPT_END_USER="\n_LAST_COMMAND_INDICATOR_${White}${Time12a}${ResetColor} ${BoldGreen}\\u${White}@${BoldYellow}\\h ${Cyan}${PathShort}${ResetColor}${BoldWhite} $ ${ResetColor}" + GIT_PROMPT_END_ROOT="\n_LAST_COMMAND_INDICATOR_${White}${Time12a}${ResetColor} ${BoldRed}\\u${White}@${BoldYellow}\\h ${Cyan}${PathShort}${ResetColor}${BoldRed} # ${ResetColor}" +} + +reload_git_prompt_colors "Plague Doctor" diff --git a/home-rc/dot-files/.bash-git-prompt/themes/Single_line.bgptheme b/home-rc/dot-files/.bash-git-prompt/themes/Single_line.bgptheme new file mode 100644 index 0000000..124c1d5 --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/themes/Single_line.bgptheme @@ -0,0 +1,11 @@ +# This is an alternative approach. Single line in git repo. +override_git_prompt_colors() { + GIT_PROMPT_THEME_NAME="Single_line" + + GIT_PROMPT_START_USER="_LAST_COMMAND_INDICATOR_ ${White}${Time12a}${ResetColor} ${BoldYellow}${PathShort}${ResetColor}" + GIT_PROMPT_END_USER="${ResetColor} $ " + GIT_PROMPT_END_ROOT="${BoldRed} # " +} + +reload_git_prompt_colors "Single_line" + diff --git a/home-rc/dot-files/.bash-git-prompt/themes/Single_line_Dark.bgptheme b/home-rc/dot-files/.bash-git-prompt/themes/Single_line_Dark.bgptheme new file mode 100644 index 0000000..c68a198 --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/themes/Single_line_Dark.bgptheme @@ -0,0 +1,20 @@ +# This is a theme for gitprompt.sh, +# it uses the default openSUSE bash prompt style with exit status + +override_git_prompt_colors() { + GIT_PROMPT_THEME_NAME="Single_line_nono031" + GIT_PROMPT_BRANCH="${Cyan}" + GIT_PROMPT_MASTER_BRANCH="${GIT_PROMPT_BRANCH}" + GIT_PROMPT_UNTRACKED=" ${Cyan}…${ResetColor}" + GIT_PROMPT_CHANGED="${Yellow}✚ " + GIT_PROMPT_STAGED="${Magenta}●" + + GIT_PROMPT_START_USER="_LAST_COMMAND_INDICATOR_ ${BoldGreen}\h:${BoldBlue}\w${ResetColor}" + GIT_PROMPT_START_ROOT="_LAST_COMMAND_INDICATOR_ ${BoldRed}\h:${BoldBlue}\w${ResetColor}" + + GIT_PROMPT_END_USER="${ResetColor}> " + GIT_PROMPT_END_ROOT=" # ${ResetColor}" +} + +reload_git_prompt_colors "Single_line_nono031" + diff --git a/home-rc/dot-files/.bash-git-prompt/themes/Single_line_Minimalist.bgptheme b/home-rc/dot-files/.bash-git-prompt/themes/Single_line_Minimalist.bgptheme new file mode 100644 index 0000000..1f73687 --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/themes/Single_line_Minimalist.bgptheme @@ -0,0 +1,33 @@ +# This is an alternative approach. Single line minimalist in git repo. +override_git_prompt_colors() { + GIT_PROMPT_THEME_NAME="Single_line_Minimalist" + + function prompt_callback { + local PS1="$(gp_truncate_pwd)" + gp_set_window_title "$PS1" + } + + Time12a="\$(date +%H:%M:%S)" + PathShort="\W"; + + GIT_PROMPT_PREFIX="[" + GIT_PROMPT_SUFFIX="]" + GIT_PROMPT_SEPARATOR=" " + GIT_PROMPT_STAGED="${Red}●${ResetColor}" + GIT_PROMPT_CONFLICTS="${Red}✖${ResetColor}" + GIT_PROMPT_CHANGED="${Blue}✚${ResetColor}" + GIT_PROMPT_UNTRACKED="${Cyan}…${ResetColor}" + GIT_PROMPT_STASHED="${BoldBlue}⚑${ResetColor}" + GIT_PROMPT_CLEAN="${BoldGreen}✔${ResetColor}" + + GIT_PROMPT_COMMAND_OK="${Green}✔" + GIT_PROMPT_COMMAND_FAIL="${Red}✘" + + GIT_PROMPT_START_USER="_LAST_COMMAND_INDICATOR_ ${White}${Time12a}${ResetColor} ${Cyan}${PathShort}${ResetColor}" + GIT_PROMPT_END_USER="${ResetColor} $ " + GIT_PROMPT_END_ROOT="${BoldRed} # " + +} + +reload_git_prompt_colors "Single_line_Minimalist" + diff --git a/home-rc/dot-files/.bash-git-prompt/themes/Single_line_NoExitState.bgptheme b/home-rc/dot-files/.bash-git-prompt/themes/Single_line_NoExitState.bgptheme new file mode 100644 index 0000000..46f7000 --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/themes/Single_line_NoExitState.bgptheme @@ -0,0 +1,12 @@ +# This is an alternative approach. Single line in git repo. +override_git_prompt_colors() { + GIT_PROMPT_THEME_NAME="Single_line_NoExitState" + + GIT_PROMPT_COMMAND_FAIL="${Red}✘" + GIT_PROMPT_START_USER="_LAST_COMMAND_INDICATOR_ ${White}${Time12a}${ResetColor} ${BoldYellow}${PathShort}${ResetColor}" + GIT_PROMPT_END_USER="${ResetColor} $ " + GIT_PROMPT_END_ROOT="${BoldRed} # " +} + +reload_git_prompt_colors "Single_line_NoExitState" + diff --git a/home-rc/dot-files/.bash-git-prompt/themes/Single_line_NoExitState_Gentoo.bgptheme b/home-rc/dot-files/.bash-git-prompt/themes/Single_line_NoExitState_Gentoo.bgptheme new file mode 100644 index 0000000..21d9657 --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/themes/Single_line_NoExitState_Gentoo.bgptheme @@ -0,0 +1,20 @@ +# This is a theme for gitprompt.sh, +# it uses the default Gentoo bash prompt style. + +override_git_prompt_colors() { + GIT_PROMPT_THEME_NAME="Single_line_NoExitState_Gentoo" + GIT_PROMPT_BRANCH="${Cyan}" + GIT_PROMPT_MASTER_BRANCH="${GIT_PROMPT_BRANCH}" + GIT_PROMPT_UNTRACKED=" ${Cyan}…${ResetColor}" + GIT_PROMPT_CHANGED="${Yellow}✚ " + GIT_PROMPT_STAGED="${Magenta}●" + + GIT_PROMPT_START_USER="${BoldGreen}\u@\h ${BrightBlue}\w${ResetColor}" + GIT_PROMPT_START_ROOT="${BoldRed}\h ${BrightBlue}\w${ResetColor}" + + GIT_PROMPT_END_USER="${BrightBlue} \$ ${ResetColor}" + GIT_PROMPT_END_ROOT="${BrightBlue} \$ ${ResetColor}" +} + +reload_git_prompt_colors "Single_line_NoExitState_Gentoo" + diff --git a/home-rc/dot-files/.bash-git-prompt/themes/Single_line_NoExitState_openSUSE.bgptheme b/home-rc/dot-files/.bash-git-prompt/themes/Single_line_NoExitState_openSUSE.bgptheme new file mode 100644 index 0000000..72d0d6d --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/themes/Single_line_NoExitState_openSUSE.bgptheme @@ -0,0 +1,20 @@ +# This is a theme for gitprompt.sh, +# it uses the default openSUSE bash prompt style + +override_git_prompt_colors() { + GIT_PROMPT_THEME_NAME="Single_line_NoExitState_openSUSE" + GIT_PROMPT_BRANCH="${Cyan}" + GIT_PROMPT_MASTER_BRANCH="${GIT_PROMPT_BRANCH}" + GIT_PROMPT_UNTRACKED=" ${Cyan}…${ResetColor}" + GIT_PROMPT_CHANGED="${Yellow}✚ " + GIT_PROMPT_STAGED="${Magenta}●" + + GIT_PROMPT_START_USER="\u@\h:\w" + GIT_PROMPT_START_ROOT="${BoldRed}\h:\w" + + GIT_PROMPT_END_USER="> " + GIT_PROMPT_END_ROOT=" # ${ResetColor}" +} + +reload_git_prompt_colors "Single_line_NoExitState_openSUSE" + diff --git a/home-rc/dot-files/.bash-git-prompt/themes/Single_line_Solarized.bgptheme b/home-rc/dot-files/.bash-git-prompt/themes/Single_line_Solarized.bgptheme new file mode 100644 index 0000000..95725bf --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/themes/Single_line_Solarized.bgptheme @@ -0,0 +1,34 @@ +# This is an alternative approach. Single line in git repo. +# Theme optimised for Terminus and PowerLine compatible fonts. +# This theme for gitprompt.sh is optimized for the "Solarized Dark" and "Solarized Light" color schemes +# without the indicator of the last command state +# tweaked for Ubuntu terminal fonts + +define_helpers() { + PathShort="${BoldBlue}\u:${Cyan}\W" +} + +override_git_prompt_colors() { + GIT_PROMPT_THEME_NAME="Single_line_Solarized" + + + GIT_PROMPT_PREFIX="[ " + GIT_PROMPT_SUFFIX=" ]" + GIT_PROMPT_SEPARATOR=" |" + GIT_PROMPT_STAGED=" ${Yellow}● ${ResetColor}" + GIT_PROMPT_CONFLICTS=" ${Red}✖ ${ResetColor}" + GIT_PROMPT_CHANGED=" ${Blue}✚ ${ResetColor}" + GIT_PROMPT_UNTRACKED=" ${Cyan}…${ResetColor}" + GIT_PROMPT_STASHED=" ${BoldMagenta}⚑ ${ResetColor}" + GIT_PROMPT_CLEAN=" ${Green}✔ ${ResetColor}" + + GIT_PROMPT_COMMAND_FAIL="${Red}✘" + + GIT_PROMPT_START_USER="_LAST_COMMAND_INDICATOR_ ${Yellow}${PathShort}${ResetColor}" + GIT_PROMPT_END_USER="${BoldBlue} ➭ ${ResetColor}" + GIT_PROMPT_END_ROOT="${BoldRed} # ${ResetColor}" + + GIT_PROMPT_SYMBOLS_NO_REMOTE_TRACKING="✭" +} + +reload_git_prompt_colors "Single_line_Solarized" diff --git a/home-rc/dot-files/.bash-git-prompt/themes/Single_line_Solarized_Lamda.bgptheme b/home-rc/dot-files/.bash-git-prompt/themes/Single_line_Solarized_Lamda.bgptheme new file mode 100644 index 0000000..690062b --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/themes/Single_line_Solarized_Lamda.bgptheme @@ -0,0 +1,48 @@ +# This is an alternative approach. Single line in git repo. +# Theme optimised for Terminus and PowerLine compatible fonts. +# This theme for gitprompt.sh is optimized for the "Solarized Dark" and "Solarized Light" color schemes +# without the indicator of the last command state +# tweaked for Ubuntu terminal fonts + + +define_helpers() { + YELLOW=$(tput setaf 3) + PathShort="\[$YELLOW\][\A] ${Cyan}\w" +} + +override_git_prompt_colors() { + YELLOW=$(tput setaf 3) + ORANGE=$(tput setaf 9) + RED=$(tput setaf 1) + MAGENTA=$(tput setaf 5) + VIOLET=$(tput setaf 13) + BLUE=$(tput setaf 4) + CYAN=$(tput setaf 6) + GREEN=$(tput setaf 2) + BOLD=$(tput bold) + RESET=$(tput sgr0) + + + GIT_PROMPT_THEME_NAME="Single_line_Solarized_Lamda" + + + GIT_PROMPT_PREFIX="[ " + GIT_PROMPT_SUFFIX=" ]" + GIT_PROMPT_SEPARATOR=" |" + GIT_PROMPT_STAGED=" ${Yellow}● ${ResetColor}" + GIT_PROMPT_CONFLICTS=" ${Red}✖ ${ResetColor}" + GIT_PROMPT_CHANGED=" ${Blue}✚ ${ResetColor}" + GIT_PROMPT_UNTRACKED=" ${Cyan}…${ResetColor}" + GIT_PROMPT_STASHED=" ${BoldMagenta}⚑ ${ResetColor}" + GIT_PROMPT_CLEAN=" ${Green}✔ ${ResetColor}" + + GIT_PROMPT_COMMAND_FAIL="${Red}✘" + + GIT_PROMPT_START_USER="_LAST_COMMAND_INDICATOR_ ${Yellow}${PathShort}${ResetColor}" + GIT_PROMPT_END_USER="\[$ORANGE\] λ ${ResetColor}" + GIT_PROMPT_END_ROOT="${BoldRed} # ${ResetColor}" + + GIT_PROMPT_SYMBOLS_NO_REMOTE_TRACKING="✭" +} + +reload_git_prompt_colors "Single_line_Solarized_Lamda" diff --git a/home-rc/dot-files/.bash-git-prompt/themes/Single_line_Ubuntu.bgptheme b/home-rc/dot-files/.bash-git-prompt/themes/Single_line_Ubuntu.bgptheme new file mode 100644 index 0000000..7dd3a4f --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/themes/Single_line_Ubuntu.bgptheme @@ -0,0 +1,25 @@ +# This is an alternative approach. Single line in git repo. +override_git_prompt_colors() { + GIT_PROMPT_THEME_NAME="Single_line_Ubuntu" + + GIT_PROMPT_PREFIX="[ " + GIT_PROMPT_SUFFIX=" ]" + GIT_PROMPT_SEPARATOR=" |" + GIT_PROMPT_STAGED=" ${Red}● ${ResetColor}" + GIT_PROMPT_CONFLICTS=" ${Red}✖ ${ResetColor}" + GIT_PROMPT_CHANGED=" ${Blue}✚ ${ResetColor}" + GIT_PROMPT_UNTRACKED=" ${Cyan}…${ResetColor}" + GIT_PROMPT_STASHED=" ${BoldBlue}⚑ ${ResetColor}" + GIT_PROMPT_CLEAN=" ${BoldGreen}✔ ${ResetColor}" + + GIT_PROMPT_COMMAND_OK="${Green}✔ " + GIT_PROMPT_COMMAND_FAIL="${Red}✘ " + + GIT_PROMPT_START_USER="_LAST_COMMAND_INDICATOR_ ${White}${Time12a}${ResetColor} ${Cyan}${PathShort}${ResetColor}" + GIT_PROMPT_END_USER="${ResetColor} $ " + GIT_PROMPT_END_ROOT="${BoldRed} # " + +} + +reload_git_prompt_colors "Single_line_Ubuntu" + diff --git a/home-rc/dot-files/.bash-git-prompt/themes/Single_line_openSUSE.bgptheme b/home-rc/dot-files/.bash-git-prompt/themes/Single_line_openSUSE.bgptheme new file mode 100644 index 0000000..faf24bf --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/themes/Single_line_openSUSE.bgptheme @@ -0,0 +1,20 @@ +# This is a theme for gitprompt.sh, +# it uses the default openSUSE bash prompt style with exit status + +override_git_prompt_colors() { + GIT_PROMPT_THEME_NAME="Single_line_openSUSE" + GIT_PROMPT_BRANCH="${Cyan}" + GIT_PROMPT_MASTER_BRANCH="${GIT_PROMPT_BRANCH}" + GIT_PROMPT_UNTRACKED=" ${Cyan}…${ResetColor}" + GIT_PROMPT_CHANGED="${Yellow}✚ " + GIT_PROMPT_STAGED="${Magenta}●" + + GIT_PROMPT_START_USER="_LAST_COMMAND_INDICATOR_ ${ResetColor}\u@\h:\w" + GIT_PROMPT_START_ROOT="_LAST_COMMAND_INDICATOR_ ${BoldRed}\h:\w" + + GIT_PROMPT_END_USER="${ResetColor}> " + GIT_PROMPT_END_ROOT=" # ${ResetColor}" +} + +reload_git_prompt_colors "Single_line_openSUSE" + diff --git a/home-rc/dot-files/.bash-git-prompt/themes/Single_line_username_repo.bgptheme b/home-rc/dot-files/.bash-git-prompt/themes/Single_line_username_repo.bgptheme new file mode 100644 index 0000000..b4a3dff --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/themes/Single_line_username_repo.bgptheme @@ -0,0 +1,13 @@ +# This is an alternative approach. Single line in git repo. +override_git_prompt_colors() { + GIT_PROMPT_THEME_NAME="Single_line_username_repo" + GIT_PROMPT_WITH_USERNAME_AND_REPO=1 + GIT_PROMPT_USERNAME_REPO_SEPARATOR=" | " + GIT_PROMPT_PREFIX="[ ${Blue}_USERNAME_REPO_" + GIT_PROMPT_START_USER="_LAST_COMMAND_INDICATOR_ ${White}${Time12a}${ResetColor} ${BoldYellow}${PathShort}${ResetColor}" + GIT_PROMPT_END_USER="${ResetColor} $ " + GIT_PROMPT_END_ROOT="${BoldRed} # " +} + +reload_git_prompt_colors "Single_line_username_repo" + diff --git a/home-rc/dot-files/.bash-git-prompt/themes/Solarized.bgptheme b/home-rc/dot-files/.bash-git-prompt/themes/Solarized.bgptheme new file mode 100644 index 0000000..caf1ea8 --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/themes/Solarized.bgptheme @@ -0,0 +1,13 @@ +# This theme for gitprompt.sh is optimized for the "Solarized Dark" and "Solarized Light" color schemes +# tweaked for Ubuntu terminal fonts + +override_git_prompt_colors() { + GIT_PROMPT_THEME_NAME="Solarized" + GIT_PROMPT_STAGED="${Yellow}●" + GIT_PROMPT_STASHED="${BoldMagenta}⚑ " + GIT_PROMPT_CLEAN="${Green}✔" + GIT_PROMPT_END_USER=" \n${BoldBlue}${Time12a}${ResetColor} $ " + GIT_PROMPT_END_ROOT=" \n${BoldBlue}${Time12a}${ResetColor} # " +} + +reload_git_prompt_colors "Solarized" \ No newline at end of file diff --git a/home-rc/dot-files/.bash-git-prompt/themes/Solarized_Extravagant.bgptheme b/home-rc/dot-files/.bash-git-prompt/themes/Solarized_Extravagant.bgptheme new file mode 100644 index 0000000..f87ccb4 --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/themes/Solarized_Extravagant.bgptheme @@ -0,0 +1,41 @@ +# This theme for gitprompt.sh is optimized for the "Solarized Dark" and "Solarized Light" color schemes +# tweaked for Ubuntu terminal fonts +# some modifications on colors +# added ruby prompt, and kernel version as well + +override_git_prompt_colors() { + if [ -e ~/.rvm/bin/rvm-prompt ]; then + RUBY_PROMPT='{$(~/.rvm/bin/rvm-prompt i v)}' + else + if command -v rbenv > /dev/null; then + RUBY_PROMPT='{$(rbenv version | sed -e "s/ (set.*$//")}' + fi + fi + Time12a="\$(date +%H:%M:%S)" + + GIT_PROMPT_THEME_NAME="Solarized Extravagant" + GIT_PROMPT_STAGED="${Yellow}● " + GIT_PROMPT_UNTRACKED="${Cyan}… " + GIT_PROMPT_STASHED="${BoldMagenta}⚑ " + GIT_PROMPT_CLEAN="${Green}✔ " + GIT_PROMPT_COMMAND_OK="${Green}✔ " + GIT_PROMPT_COMMAND_FAIL="${Red}✘ " + + KERNEL_PROMPT='‹$(uname -r)›' + + GIT_PROMPT_START_USER="_LAST_COMMAND_INDICATOR_ ${BoldBlueFg}${Time12a} ${Green}${KERNEL_PROMPT} ${Cyan}${RUBY_PROMPT} ${Yellow}${PathShort}" + GIT_PROMPT_START_ROOT="${GIT_PROMPT_START_USER}" + if [ -n "$SSH_CLIENT" ]; then + GIT_PROMPT_END_USER="\n${BoldRed} ➤ ${ResetColor}" + GIT_PROMPT_END_ROOT="\n${BoldRed} » ${ResetColor}" + else + GIT_PROMPT_END_USER="\n${BoldBlue} ➭ ${ResetColor}" + GIT_PROMPT_END_ROOT="\n${BoldRed} # ${ResetColor}" + fi + GIT_PROMPT_LEADING_SPACE=1 + GIT_PROMPT_PREFIX="${Cyan}[" + GIT_PROMPT_SUFFIX="${Cyan}]" + GIT_PROMPT_SYMBOLS_NO_REMOTE_TRACKING="✭" +} + +reload_git_prompt_colors "Solarized Extravagant" diff --git a/home-rc/dot-files/.bash-git-prompt/themes/Solarized_NoExitState.bgptheme b/home-rc/dot-files/.bash-git-prompt/themes/Solarized_NoExitState.bgptheme new file mode 100644 index 0000000..77f8e50 --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/themes/Solarized_NoExitState.bgptheme @@ -0,0 +1,16 @@ +# This theme for gitprompt.sh is optimized for the "Solarized Dark" and "Solarized Light" color schemes +# without the indicator of the last command state + +override_git_prompt_colors() { + GIT_PROMPT_THEME_NAME="Solarized NoExitState" + GIT_PROMPT_STAGED="${Yellow}●" + GIT_PROMPT_STASHED="${BoldMagenta}⚑ " + GIT_PROMPT_CLEAN="${Green}✔" + GIT_PROMPT_COMMAND_FAIL="${Red}✘" + GIT_PROMPT_START_USER="${Yellow}${PathShort}${ResetColor}" + GIT_PROMPT_START_ROOT="${GIT_PROMPT_START_USER}" + GIT_PROMPT_END_USER=" \n${BoldBlue}${Time12a}${ResetColor} $ " + GIT_PROMPT_END_ROOT=" \n${BoldBlue}${Time12a}${ResetColor} # " +} + +reload_git_prompt_colors "Solarized NoExitState" \ No newline at end of file diff --git a/home-rc/dot-files/.bash-git-prompt/themes/Solarized_NoExitState_Ubuntu.bgptheme b/home-rc/dot-files/.bash-git-prompt/themes/Solarized_NoExitState_Ubuntu.bgptheme new file mode 100644 index 0000000..be6be1f --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/themes/Solarized_NoExitState_Ubuntu.bgptheme @@ -0,0 +1,18 @@ +# This theme for gitprompt.sh is optimized for the "Solarized Dark" and "Solarized Light" color schemes +# without the indicator of the last command state +# tweaked for Ubuntu terminal fonts + +override_git_prompt_colors() { + GIT_PROMPT_THEME_NAME="Solarized NoExitState Ubuntu" + GIT_PROMPT_STAGED="${Yellow}● " + GIT_PROMPT_STASHED="${BoldMagenta}⚑ " + GIT_PROMPT_CLEAN="${Green}✔ " + GIT_PROMPT_COMMAND_OK="${Green}✔ " + GIT_PROMPT_COMMAND_FAIL="${Red}✘ " + GIT_PROMPT_START_USER="${Yellow}${PathShort}${ResetColor}" + GIT_PROMPT_START_ROOT="${GIT_PROMPT_START_USER}" + GIT_PROMPT_END_USER=" \n${BoldBlue}${Time12a}${ResetColor} $ " + GIT_PROMPT_END_ROOT=" \n${BoldBlue}${Time12a}${ResetColor} # " +} + +reload_git_prompt_colors "Solarized NoExitState Ubuntu" diff --git a/home-rc/dot-files/.bash-git-prompt/themes/Solarized_Ubuntu.bgptheme b/home-rc/dot-files/.bash-git-prompt/themes/Solarized_Ubuntu.bgptheme new file mode 100644 index 0000000..99589c4 --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/themes/Solarized_Ubuntu.bgptheme @@ -0,0 +1,14 @@ +# This theme for gitprompt.sh is optimized for the "Solarized Dark" and "Solarized Light" color schemes +# tweaked for Ubuntu terminal fonts + +override_git_prompt_colors() { + GIT_PROMPT_THEME_NAME="Solarized Ubuntu" + GIT_PROMPT_STAGED="${Yellow}● " + GIT_PROMPT_STASHED="${BoldMagenta}⚑ " + GIT_PROMPT_CLEAN="${Green}✔ " + GIT_PROMPT_COMMAND_OK="${Green}✔ " + GIT_PROMPT_END_USER=" \n${BoldBlue}${Time12a}${ResetColor} $ " + GIT_PROMPT_END_ROOT=" \n${BoldBlue}${Time12a}${ResetColor} # " +} + +reload_git_prompt_colors "Solarized Ubuntu" diff --git a/home-rc/dot-files/.bash-git-prompt/themes/Solarized_UserHost.bgptheme b/home-rc/dot-files/.bash-git-prompt/themes/Solarized_UserHost.bgptheme new file mode 100644 index 0000000..4eea2f1 --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/themes/Solarized_UserHost.bgptheme @@ -0,0 +1,23 @@ +# This theme for gitprompt.sh is optimized for the "Solarized Dark" and "Solarized Light" color schemes +# based on "Solarized Extravagant", with user@host on the second line and some things removed. + +function override_git_prompt_colors() { + GIT_PROMPT_THEME_NAME='Solarized UserHost' + GIT_PROMPT_STAGED="${Yellow}● " + GIT_PROMPT_UNTRACKED="${Cyan}… " + GIT_PROMPT_STASHED="${BoldMagenta}⚑ " + GIT_PROMPT_CLEAN="${Green}✔ " + GIT_PROMPT_COMMAND_OK="${Green}✔ " + GIT_PROMPT_COMMAND_FAIL="${Red}✘ " + + GIT_PROMPT_START_USER="_LAST_COMMAND_INDICATOR_ ${Yellow}${PathShort}" + GIT_PROMPT_START_ROOT="${GIT_PROMPT_START_USER}" + GIT_PROMPT_END_USER="\n${Blue}\\u${White}@${BoldBlue}\\h ${BoldRed} ➤ ${ResetColor} " + GIT_PROMPT_END_ROOT="\n${Blue}\\u${White}@${BoldBlue}\\h ${BoldRed} #️ ${ResetColor} " + GIT_PROMPT_LEADING_SPACE=1 + GIT_PROMPT_PREFIX="${Cyan}[" + GIT_PROMPT_SUFFIX="${Cyan}]" + GIT_PROMPT_SYMBOLS_NO_REMOTE_TRACKING="✭" +} + +reload_git_prompt_colors 'Solarized UserHost' diff --git a/home-rc/dot-files/.bash-git-prompt/themes/TruncatedPwd_WindowTitle.bgptheme b/home-rc/dot-files/.bash-git-prompt/themes/TruncatedPwd_WindowTitle.bgptheme new file mode 100644 index 0000000..1c1f5ee --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/themes/TruncatedPwd_WindowTitle.bgptheme @@ -0,0 +1,40 @@ +############################################################################## +# Changes the prompt to a Debian-style one that truncates pwd to a max length +# depending on the terminal column width. Also uses the prompt_callback +# function of bash-git-prompt to set the window title to almost the same +# Debian-style. +# +# The prompt will use a Debian-style on the form +# +# [user@host: ] [bash-git-prompt-info] +# HH:MM $ +# +# The window title will have the form +# user@host: +# +# Example usage: +# if [ -f ~/.bash-git-prompt/gitprompt.sh ]; then +# GIT_PROMPT_THEME=TruncatedPwd_WindowTitle +# source ~/.bash-git-prompt/gitprompt.sh +# fi +# +# oGre [https://github.com/ogr3] +############################################################################## +override_git_prompt_colors() { + GIT_PROMPT_THEME_NAME="TruncatedPwd_WindowTitle" + + #Overrides the prompt_callback function used by bash-git-prompt + function prompt_callback { + local PS1="\u@\h: $(gp_truncate_pwd)" + gp_set_window_title "$PS1" + echo -n "${Yellow}[${PS1}]${ResetColor}" + } + + local gp_end=" _LAST_COMMAND_INDICATOR_\n${White}${Time12a}${ResetColor}" + + GIT_PROMPT_START_USER="" + GIT_PROMPT_END_USER="${gp_end} $ " + GIT_PROMPT_END_ROOT="${gp_end} # " +} + +reload_git_prompt_colors "TruncatedPwd_WindowTitle" diff --git a/home-rc/dot-files/.bash-git-prompt/themes/TruncatedPwd_WindowTitle_NoExitState.bgptheme b/home-rc/dot-files/.bash-git-prompt/themes/TruncatedPwd_WindowTitle_NoExitState.bgptheme new file mode 100644 index 0000000..566bf51 --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/themes/TruncatedPwd_WindowTitle_NoExitState.bgptheme @@ -0,0 +1,40 @@ +############################################################################## +# Changes the prompt to a Debian-style one that truncates pwd to a max length +# depending on the terminal column width. Also uses the prompt_callback +# function of bash-git-prompt to set the window title to almost the same +# Debian-style. +# +# The prompt will use a Debian-style on the form +# +# [user@host: ] [bash-git-prompt-info] +# HH:MM $ +# +# The window title will have the form +# user@host: +# +# Example usage: +# if [ -f ~/.bash-git-prompt/gitprompt.sh ]; then +# GIT_PROMPT_THEME=TruncatedPwd_WindowTitle_NoExitState +# source ~/.bash-git-prompt/gitprompt.sh +# fi +# +# oGre [https://github.com/ogr3] +############################################################################## +override_git_prompt_colors() { + GIT_PROMPT_THEME_NAME="TruncatedPwd_WindowTitle_NoExitState" + + #Overrides the prompt_callback function used by bash-git-prompt + function prompt_callback { + local PS1="\u@\h: $(gp_truncate_pwd)" + gp_set_window_title "${PS1}" + echo -n "${Yellow}[${PS1}]${ResetColor}" + } + + local gp_end=" _LAST_COMMAND_INDICATOR_\n${White}${Time12a}${ResetColor}" + + GIT_PROMPT_START_USER="" + GIT_PROMPT_END_USER="${gp_end} $ " + GIT_PROMPT_END_ROOT="${gp_end} # " +} + +reload_git_prompt_colors "TruncatedPwd_WindowTitle_NoExitState" diff --git a/home-rc/dot-files/.bash-git-prompt/themes/TruncatedPwd_WindowTitle_NoExitState_Ubuntu.bgptheme b/home-rc/dot-files/.bash-git-prompt/themes/TruncatedPwd_WindowTitle_NoExitState_Ubuntu.bgptheme new file mode 100644 index 0000000..1d4a1d0 --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/themes/TruncatedPwd_WindowTitle_NoExitState_Ubuntu.bgptheme @@ -0,0 +1,46 @@ +############################################################################## +# Changes the prompt to a Debian-style one that truncates pwd to a max length +# depending on the terminal column width. Also uses the prompt_callback +# function of bash-git-prompt to set the window title to almost the same +# Debian-style. This version has been tweaked for Ubuntu standard terminal +# fonts. +# +# The prompt will use a Debian-style on the form +# +# [user@host: ] [bash-git-prompt-info] +# HH:MM $ +# +# The window title will have the form +# user@host: +# +# Example usage: +# if [ -f ~/.bash-git-prompt/gitprompt.sh ]; then +# GIT_PROMPT_THEME=TruncatedPwd_WindowTitle_NoExitState_Ubuntu +# source ~/.bash-git-prompt/gitprompt.sh +# fi +# +# oGre [https://github.com/ogr3] +############################################################################## +override_git_prompt_colors() { + GIT_PROMPT_THEME_NAME="TruncatedPwd_WindowTitle_NoExitState_Ubuntu" + + #Overrides the prompt_callback function used by bash-git-prompt + function prompt_callback { + local PS1="\u@\h: $(gp_truncate_pwd)" + gp_set_window_title "${PS1}" + echo -n "${Yellow}[${PS1}]${ResetColor}" + } + + local gp_end=" _LAST_COMMAND_INDICATOR_\n${White}${Time12a}${ResetColor}" + + GIT_PROMPT_START_USER="" + GIT_PROMPT_END_USER="${gp_end} $ " + GIT_PROMPT_END_ROOT="${gp_end} # " + + GIT_PROMPT_STAGED="${Red}● " # the number of staged files/directories + GIT_PROMPT_CLEAN="${BoldGreen}✔ " # a colored flag indicating a "clean" repo + GIT_PROMPT_COMMAND_OK="${Green}✔ " # indicator if the last command returned with an exit code of 0 + GIT_PROMPT_COMMAND_FAIL="${Red}✘ " # indicator if the last command returned with an exit code of other than 0 +} + +reload_git_prompt_colors "TruncatedPwd_WindowTitle_NoExitState_Ubuntu" diff --git a/home-rc/dot-files/.bash-git-prompt/themes/TruncatedPwd_WindowTitle_Ubuntu.bgptheme b/home-rc/dot-files/.bash-git-prompt/themes/TruncatedPwd_WindowTitle_Ubuntu.bgptheme new file mode 100644 index 0000000..709497b --- /dev/null +++ b/home-rc/dot-files/.bash-git-prompt/themes/TruncatedPwd_WindowTitle_Ubuntu.bgptheme @@ -0,0 +1,45 @@ +############################################################################## +# Changes the prompt to a Debian-style one that truncates pwd to a max length +# depending on the terminal column width. Also uses the prompt_callback +# function of bash-git-prompt to set the window title to almost the same +# Debian-style. This version has been tweaked for Ubuntu standard terminal +# fonts. +# +# The prompt will use a Debian-style on the form +# +# [user@host: ] [bash-git-prompt-info] +# HH:MM $ +# +# The window title will have the form +# user@host: +# +# Example usage: +# if [ -f ~/.bash-git-prompt/gitprompt.sh ]; then +# GIT_PROMPT_THEME=TruncatedPwd_WindowTitle_Ubuntu +# source ~/.bash-git-prompt/gitprompt.sh +# fi +# +# oGre [https://github.com/ogr3] +############################################################################## +override_git_prompt_colors() { + GIT_PROMPT_THEME_NAME="TruncatedPwd_WindowTitle_Ubuntu" + + #Overrides the prompt_callback function used by bash-git-prompt + function prompt_callback { + local PS1="\u@\h: $(gp_truncate_pwd)" + gp_set_window_title "${PS1}" + echo -n "${Yellow}[${PS1}]${ResetColor}" + } + + local gp_end=" _LAST_COMMAND_INDICATOR_\n${White}${Time12a}${ResetColor}" + + GIT_PROMPT_START_USER="" + GIT_PROMPT_END_USER="${gp_end} $ " + GIT_PROMPT_END_ROOT="${gp_end} # " + + GIT_PROMPT_STAGED="${Red}● " # the number of staged files/directories + GIT_PROMPT_CLEAN="${BoldGreen}✔ " # a colored flag indicating a "clean" repo + GIT_PROMPT_COMMAND_OK="${Green}✔ " # indicator if the last command returned with an exit code of 0 +} + +reload_git_prompt_colors "TruncatedPwd_WindowTitle_Ubuntu" diff --git a/home-rc/dot-files/.bash_profile b/home-rc/dot-files/.bash_profile new file mode 100644 index 0000000..2d1debe --- /dev/null +++ b/home-rc/dot-files/.bash_profile @@ -0,0 +1,18 @@ +# ~/.bash_profile: executed by bash(1) for login shells. +# see /usr/share/doc/bash/examples/startup-files for examples. +# the files are located in the bash-doc package. + +# the default umask is set in /etc/login.defs +#umask 022 + +# include .bashrc if it exists +if [ -f ~/.bashrc ]; then + . ~/.bashrc +fi + +# set PATH so it includes user's private bin if it exists +if [ -d ~/bin ] ; then + PATH=~/bin:"${PATH}" +fi + +export LANG=en_US.UTF-8 diff --git a/home-rc/dot-files/.bashrc-amazon-linux-v2-root b/home-rc/dot-files/.bashrc-amazon-linux-v2-root new file mode 100644 index 0000000..f60905b --- /dev/null +++ b/home-rc/dot-files/.bashrc-amazon-linux-v2-root @@ -0,0 +1,38 @@ +# .bashrc + +# User specific aliases and functions + +alias rm='rm -i' +alias cp='cp -i' +alias mv='mv -i' + +# Source global definitions +if [ -f /etc/bashrc ]; then + . /etc/bashrc +fi + +# ASCII COLORS +red='\[\033[0;31m\]' +RED='\[\033[1;31m\]' +green='\[\033[0;32m\]' +GREEN='\[\033[1;32m\]' +yellow='\[\033[0;33m\]' +YELLOW='\[\033[1;33m\]' +blue='\[\033[0;34m\]' +BLUE='\[\033[1;34m\]' +magenta='\[\033[0;35m\]' +MAGENTA='\[\033[1;35m\]' +cyan='\[\033[0;36m\]' +CYAN='\[\033[1;36m\]' +white='\[\033[0;37m\]' +WHITE='\[\033[1;37m\]' +NC='\[\033[0m\]' + +export EDITOR="vim" +# if we use git prompt, override so we get the current PS1 set +# GET: git clone https://github.com/magicmonty/bash-git-prompt.git .bash-git-prompt --depth=1 +export GIT_PROMPT_ONLY_IN_REPO=1 +export GIT_PROMPT_LEADING_SPACE=0 +export GIT_PROMPT_START="[$yellow\t$NC][$GREEN\u$NC@$RED\H$NC:$BLUE\w$NC][$cyan\j$NC]{_LAST_COMMAND_INDICATOR_$ResetColor}" +export GIT_PROMPT_END='\$ ' +source ~/.bash-git-prompt/gitprompt.sh diff --git a/home-rc/dot-files/.bashrc-amazon-linux-v2-user b/home-rc/dot-files/.bashrc-amazon-linux-v2-user new file mode 100644 index 0000000..e4a88b2 --- /dev/null +++ b/home-rc/dot-files/.bashrc-amazon-linux-v2-user @@ -0,0 +1,41 @@ +# .bashrc + +# Source global definitions +if [ -f /etc/bashrc ]; then + . /etc/bashrc +fi + +# Uncomment the following line if you don't like systemctl's auto-paging feature: +# export SYSTEMD_PAGER= + +# User specific aliases and functions + +# ASCII COLORS +red='\[\033[0;31m\]' +RED='\[\033[1;31m\]' +green='\[\033[0;32m\]' +GREEN='\[\033[1;32m\]' +yellow='\[\033[0;33m\]' +YELLOW='\[\033[1;33m\]' +blue='\[\033[0;34m\]' +BLUE='\[\033[1;34m\]' +magenta='\[\033[0;35m\]' +MAGENTA='\[\033[1;35m\]' +cyan='\[\033[0;36m\]' +CYAN='\[\033[1;36m\]' +white='\[\033[0;37m\]' +WHITE='\[\033[1;37m\]' +NC='\[\033[0m\]' + +# If this is an xterm set the title to user@host:dir +case "$TERM" in +xterm*|rxvt*) + PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD/$HOME/~}\007"' + ;; +screen*) + PROMPT_COMMAND='echo -ne "\033_${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/~}\033\\"' + ;; +*) + ;; +esac +export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND" diff --git a/home-rc/dot-files/.bashrc-debian b/home-rc/dot-files/.bashrc-debian new file mode 100644 index 0000000..0efa7a3 --- /dev/null +++ b/home-rc/dot-files/.bashrc-debian @@ -0,0 +1,146 @@ +# ~/.bashrc: executed by bash(1) for non-login shells. +# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc) +# for examples + +# If not running interactively, don't do anything +case $- in + *i*) ;; + *) return;; +esac + +# ASCII COLORS +red='\[\033[0;31m\]' +RED='\[\033[1;31m\]' +green='\[\033[0;32m\]' +GREEN='\[\033[1;32m\]' +yellow='\[\033[0;33m\]' +YELLOW='\[\033[1;33m\]' +blue='\[\033[0;34m\]' +BLUE='\[\033[1;34m\]' +magenta='\[\033[0;35m\]' +MAGENTA='\[\033[1;35m\]' +cyan='\[\033[0;36m\]' +CYAN='\[\033[1;36m\]' +white='\[\033[0;37m\]' +WHITE='\[\033[1;37m\]' +NC='\[\033[0m\]' + +# don't put duplicate lines or lines starting with space in the history. +# See bash(1) for more options +HISTCONTROL=ignoreboth + +# append to the history file, don't overwrite it +shopt -s histappend + +# for setting history length see HISTSIZE and HISTFILESIZE in bash(1) +HISTSIZE=1000 +HISTFILESIZE=2000 + +# check the window size after each command and, if necessary, +# update the values of LINES and COLUMNS. +shopt -s checkwinsize + +# If set, the pattern "**" used in a pathname expansion context will +# match all files and zero or more directories and subdirectories. +#shopt -s globstar + +# make less more friendly for non-text input files, see lesspipe(1) +[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)" + +# set variable identifying the chroot you work in (used in the prompt below) +if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then + debian_chroot=$(cat /etc/debian_chroot) +fi + +# set a fancy prompt (non-color, unless we know we "want" color) +case "$TERM" in + xterm-color|*-256color) color_prompt=yes;; +esac + +# uncomment for a colored prompt, if the terminal has the capability; turned +# off by default to not distract the user: the focus in a terminal window +# should be on the output of commands, not on the prompt +#force_color_prompt=yes + +if [ -n "$force_color_prompt" ]; then + if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then + # We have color support; assume it's compliant with Ecma-48 + # (ISO/IEC-6429). (Lack of such support is extremely rare, and such + # a case would tend to support setf rather than setaf.) + color_prompt=yes + else + color_prompt= + fi +fi + +if [ "$color_prompt" = yes ]; then + PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\H\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' +else + PS1='${debian_chroot:+($debian_chroot)}\u@\H:\w\$ ' +fi +unset color_prompt force_color_prompt + +# Comment in the above and uncomment this below for a color prompt +#PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\H\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' +PS1="[$yellow\t$NC][$GREEN\u$NC@$RED\H$NC:$BLUE\w$NC][$cyan\j$NC]\\$ " + +# If this is an xterm set the title to user@host:dir +case "$TERM" in +xterm*|rxvt*) + PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\H: \w\a\]$PS1" + ;; +screen*) + PROMPT_COMMAND='echo -ne "\033_${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/~}\033\\"' + ;; +*) + ;; +esac + +# enable color support of ls and also add handy aliases +if [ -x /usr/bin/dircolors ]; then + test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)" + alias ls='ls --color=auto' + #alias dir='dir --color=auto' + #alias vdir='vdir --color=auto' + + alias grep='grep --color=auto' + alias fgrep='fgrep --color=auto' + alias egrep='egrep --color=auto' +fi + +# colored GCC warnings and errors +#export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01' + +# some more ls aliases +#alias ll='ls -l' +#alias la='ls -A' +#alias l='ls -CF' + +# Alias definitions. +# You may want to put all your additions into a separate file like +# ~/.bash_aliases, instead of adding them here directly. +# See /usr/share/doc/bash-doc/examples in the bash-doc package. + +if [ -f ~/.bash_aliases ]; then + . ~/.bash_aliases +fi + +# enable programmable completion features (you don't need to enable +# this, if it's already enabled in /etc/bash.bashrc and /etc/profile +# sources /etc/bash.bashrc). +if ! shopt -oq posix; then + if [ -f /usr/share/bash-completion/bash_completion ]; then + . /usr/share/bash-completion/bash_completion + elif [ -f /etc/bash_completion ]; then + . /etc/bash_completion + fi +fi + +export EDITOR="vim" +# if we use git prompt, override so we get the current PS1 set +# GET: git clone https://github.com/magicmonty/bash-git-prompt.git .bash-git-prompt --depth=1 +export GIT_PROMPT_ONLY_IN_REPO=1 +export GIT_PROMPT_LEADING_SPACE=0 +export GIT_PROMPT_START="[$yellow\t$NC][$GREEN\u$NC@$RED\H$NC:$BLUE\w$NC][$cyan\j$NC]{_LAST_COMMAND_INDICATOR_$ResetColor}" +export GIT_PROMPT_END='\$ ' +source ~/.bash-git-prompt/gitprompt.sh diff --git a/home-rc/dot-files/.bashrc-general b/home-rc/dot-files/.bashrc-general new file mode 100644 index 0000000..6eb0eff --- /dev/null +++ b/home-rc/dot-files/.bashrc-general @@ -0,0 +1,105 @@ +# ~/.bashrc: executed by bash(1) for non-login shells. +# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc) +# for examples + +# If not running interactively, don't do anything +[ -z "$PS1" ] && return + +# ASCII COLORS +red='\[\033[0;31m\]' +RED='\[\033[1;31m\]' +green='\[\033[0;32m\]' +GREEN='\[\033[1;32m\]' +yellow='\[\033[0;33m\]' +YELLOW='\[\033[1;33m\]' +blue='\[\033[0;34m\]' +BLUE='\[\033[1;34m\]' +magenta='\[\033[0;35m\]' +MAGENTA='\[\033[1;35m\]' +cyan='\[\033[0;36m\]' +CYAN='\[\033[1;36m\]' +white='\[\033[0;37m\]' +WHITE='\[\033[1;37m\]' +NC='\[\033[0m\]' + +# don't put duplicate lines in the history. See bash(1) for more options +export HISTCONTROL=ignoredups +export HISTSIZE=10000 +shopt -s histappend + +# check the window size after each command and, if necessary, +# update the values of LINES and COLUMNS. +shopt -s checkwinsize + +# make less more friendly for non-text input files, see lesspipe(1) +[ -x /usr/bin/lesspipe ] && eval "$(lesspipe)" + +# set variable identifying the chroot you work in (used in the prompt below) +if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then + debian_chroot=$(cat /etc/debian_chroot) +fi + +# set a fancy prompt (non-color, unless we know we "want" color) +case "$TERM" in +xterm-color) + PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\H\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' + ;; +*) + PS1='${debian_chroot:+($debian_chroot)}\u@\H:\w [\j]\$ ' + ;; +esac + +# Comment in the above and uncomment this below for a color prompt +#PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\H\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' + +# If this is an xterm set the title to user@host:dir +case "$TERM" in +xterm*|rxvt*) + PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD/$HOME/~}\007"' + ;; +screen*) + PROMPT_COMMAND='echo -ne "\033_${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/~}\033\\"' + ;; +*) + ;; +esac +export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND" + +# Alias definitions. +# You may want to put all your additions into a separate file like +# ~/.bash_aliases, instead of adding them here directly. +# See /usr/share/doc/bash-doc/examples in the bash-doc package. + +#if [ -f ~/.bash_aliases ]; then +# . ~/.bash_aliases +#fi + +# enable color support of ls and also add handy aliases +if [ "$TERM" != "dumb" ]; then + eval "`dircolors -b`" + alias ls='ls --color=auto' + #alias dir='ls --color=auto --format=vertical' + #alias vdir='ls --color=auto --format=long' +fi + +# some more ls aliases +#alias ll='ls -l' +#alias la='ls -A' +#alias l='ls -CF' +alias lsd="ls -d */" + +# enable programmable completion features (you don't need to enable +# this, if it's already enabled in /etc/bash.bashrc and /etc/profile +# sources /etc/bash.bashrc). +if [ -f /etc/bash_completion ]; then + . /etc/bash_completion +fi + +export EDITOR="vim" +# if we use git prompt, override so we get the current PS1 set +# GET: git clone https://github.com/magicmonty/bash-git-prompt.git .bash-git-prompt --depth=1 +export GIT_PROMPT_ONLY_IN_REPO=1 +export GIT_PROMPT_LEADING_SPACE=0 +export GIT_PROMPT_START="[$yellow\t$NC][$GREEN\u$NC@$RED\H$NC:$BLUE\w$NC][$cyan\j$NC]{_LAST_COMMAND_INDICATOR_$ResetColor}" +export GIT_PROMPT_END='\$ ' +source ~/.bash-git-prompt/gitprompt.sh diff --git a/home-rc/dot-files/.bashrc-ubuntu b/home-rc/dot-files/.bashrc-ubuntu new file mode 100644 index 0000000..5476bb4 --- /dev/null +++ b/home-rc/dot-files/.bashrc-ubuntu @@ -0,0 +1,149 @@ +# ~/.bashrc: executed by bash(1) for non-login shells. +# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc) +# for examples + +# If not running interactively, don't do anything +case $- in + *i*) ;; + *) return;; +esac + +# ASCII COLORS +red='\[\033[0;31m\]' +RED='\[\033[1;31m\]' +green='\[\033[0;32m\]' +GREEN='\[\033[1;32m\]' +yellow='\[\033[0;33m\]' +YELLOW='\[\033[1;33m\]' +blue='\[\033[0;34m\]' +BLUE='\[\033[1;34m\]' +magenta='\[\033[0;35m\]' +MAGENTA='\[\033[1;35m\]' +cyan='\[\033[0;36m\]' +CYAN='\[\033[1;36m\]' +white='\[\033[0;37m\]' +WHITE='\[\033[1;37m\]' +NC='\[\033[0m\]' + +# don't put duplicate lines or lines starting with space in the history. +# See bash(1) for more options +HISTCONTROL=ignoreboth + +# append to the history file, don't overwrite it +shopt -s histappend + +# for setting history length see HISTSIZE and HISTFILESIZE in bash(1) +HISTSIZE=1000 +HISTFILESIZE=2000 + +# check the window size after each command and, if necessary, +# update the values of LINES and COLUMNS. +shopt -s checkwinsize + +# If set, the pattern "**" used in a pathname expansion context will +# match all files and zero or more directories and subdirectories. +#shopt -s globstar + +# make less more friendly for non-text input files, see lesspipe(1) +[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)" + +# set variable identifying the chroot you work in (used in the prompt below) +if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then + debian_chroot=$(cat /etc/debian_chroot) +fi + +# set a fancy prompt (non-color, unless we know we "want" color) +case "$TERM" in + xterm-color|*-256color) color_prompt=yes;; +esac + +# uncomment for a colored prompt, if the terminal has the capability; turned +# off by default to not distract the user: the focus in a terminal window +# should be on the output of commands, not on the prompt +#force_color_prompt=yes + +if [ -n "$force_color_prompt" ]; then + if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then + # We have color support; assume it's compliant with Ecma-48 + # (ISO/IEC-6429). (Lack of such support is extremely rare, and such + # a case would tend to support setf rather than setaf.) + color_prompt=yes + else + color_prompt= + fi +fi + +if [ "$color_prompt" = yes ]; then + PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\H\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' +else + PS1='${debian_chroot:+($debian_chroot)}\u@\H:\w\$ ' +fi +unset color_prompt force_color_prompt + +# If this is an xterm set the title to user@host:dir +case "$TERM" in +xterm*|rxvt*) + PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\H: \w\a\]$PS1" + ;; +screen*) + PROMPT_COMMAND='echo -ne "\033_${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/~}\033\\"' + ;; +*) + ;; +esac + +# enable color support of ls and also add handy aliases +if [ -x /usr/bin/dircolors ]; then + test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)" + alias ls='ls --color=auto' + #alias dir='dir --color=auto' + #alias vdir='vdir --color=auto' + + alias grep='grep --color=auto' + alias fgrep='fgrep --color=auto' + alias egrep='egrep --color=auto' +fi + +# colored GCC warnings and errors +#export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01' + +# some more ls aliases +alias ll='ls -alF' +alias la='ls -A' +alias l='ls -CF' +alias lsd="ls -d */" + +# Add an "alert" alias for long running commands. Use like so: +# sleep 10; alert +alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"' + +# Alias definitions. +# You may want to put all your additions into a separate file like +# ~/.bash_aliases, instead of adding them here directly. +# See /usr/share/doc/bash-doc/examples in the bash-doc package. + +if [ -f ~/.bash_aliases ]; then + . ~/.bash_aliases +fi + +# enable programmable completion features (you don't need to enable +# this, if it's already enabled in /etc/bash.bashrc and /etc/profile +# sources /etc/bash.bashrc). +if ! shopt -oq posix; then + if [ -f /usr/share/bash-completion/bash_completion ]; then + . /usr/share/bash-completion/bash_completion + elif [ -f /etc/bash_completion ]; then + . /etc/bash_completion + fi +fi + +export EDITOR="vim" +# if we use git prompt, override so we get the current PS1 set +# GET: git clone https://github.com/magicmonty/bash-git-prompt.git .bash-git-prompt --depth=1 +export GIT_PROMPT_ONLY_IN_REPO=1 +export GIT_PROMPT_LEADING_SPACE=0 +export GIT_PROMPT_START="[$yellow\t$NC][$GREEN\u$NC@$RED\H$NC:$BLUE\w$NC][$cyan\j$NC]{_LAST_COMMAND_INDICATOR_$ResetColor}" +export GIT_PROMPT_END='\$ ' +source ~/.bash-git-prompt/gitprompt.sh + + diff --git a/home-rc/dot-files/.psqlrc b/home-rc/dot-files/.psqlrc new file mode 100644 index 0000000..9e7d528 --- /dev/null +++ b/home-rc/dot-files/.psqlrc @@ -0,0 +1,97 @@ +\set HISTFILE ~/.psql_history-:DBNAME +--\set HISTSIZE 5000 +--\set FETCH_COUNT 1000 +\set HISTCONTROL ignoredups +\set COMP_KEYWORD_CASE upper +\set ON_ERROR_STOP on +\set ON_ERROR_ROLLBACK interactive +\set VERBOSITY verbose +\set version 'SELECT version();' +\set extensions 'select * from pg_available_extensions;' + +\timing +-- alt char ¤ +--\set null NULL +--\pset null 'Ø' +\pset null '∅' +-- set line type ascii or unicde +--\pset linestyle unicode +\pset linestyle ascii +-- from 0-2-- +\pset border 1 +-- turn off pager (more like) +--\pset pager off +-- wrap long lines +\set format wrapped + +\setenv PAGER 'pspg -bX --no-mouse' + +-- PROMPT +-- [ USER (%n) @ DATABASE (%/) % HOST(full) (%M) : PORT (%>) ] { :ENCODING: } [transaction %x (4)] PROMPT %R SUPERUSER %# +-- * one line color +--\set PROMPT1 '[%[%033[1;32m%]%n%[%033[0m%]@%[%033[1;35m%]%/%[%033[0m%]%%%[%033[1;31m%]%M%[%033[0m%]:%[%033[1;33m%]%>%[%033[0m%]]{%[%033[0;36m%]%:ENCODING:%[%033[0m%]}%x%x%x%R%# ' +--\set PROMPT2 '(%[%033[1;35m%]%/%[%033[0m%])%x%x%x%[%033[1;36m%]%R%[%033[0m%]%# ' +-- * two line color +\set PROMPT1 '[%[%033[1;32m%]%n%[%033[0m%]@%[%033[1;35m%]%/%[%033[0m%]%%%[%033[1;31m%]%M%[%033[0m%]:%[%033[1;33m%]%>%[%033[0m%]]{%[%033[0;36m%]%:ENCODING:%[%033[0m%]}\n%x%x%x%[%033[1;34m%]%R%[%033[0m%]%# ' +\set PROMPT2 '%x%x%x%[%033[1;36m%]%R%[%033[0m%]%# ' +-- * one line no color +--\set PROMPT1 '[%n@%/%%%M:%>]{%:ENCODING:}%x%x%x%R%# ' + +-- switch linestyle +\set la '\\pset linestyle ascii' +\set lu '\\pset linestyle unicode' + +-- switch pagers +\set x '\\setenv PAGER less' +\set xx '\\setenv PAGER \'pspg -bX --no-mouse\'' + +-- like tsize below, but without converting data into bytes +\set rtsize '(select table_schema, table_name, pg_relation_size( quote_ident( table_schema ) || \'.\' || quote_ident( table_name ) ) as size, pg_indexes_size( quote_ident( table_schema ) || \'.\' || quote_ident( table_name ) ) as index_size, pg_total_relation_size( quote_ident( table_schema ) || \'.\' || quote_ident( table_name ) ) as total_size from information_schema.tables where table_type = \'BASE TABLE\' and table_schema not in (\'information_schema\', \'pg_catalog\') order by pg_relation_size( quote_ident( table_schema ) || \'.\' || quote_ident( table_name ) ) desc, table_schema, table_name)' +-- compact size output for tables + indexes +\set tsize '(select table_schema, table_name, pg_size_pretty(size) as size, pg_size_pretty(index_size) as index_size, pg_size_pretty(total_size) as total_size from (:rtsize) x order by x.size desc, x.total_size desc, table_schema, table_name)' +-- extended size output for tables and indexes +\set etsize 'SELECT pgn.nspname, relname, pg_size_pretty(relpages::bigint * 8 * 1024) AS size, CASE WHEN relkind = \'t\' THEN (SELECT pgd.relname FROM pg_class pgd WHERE pgd.reltoastrelid = pg.oid) WHEN nspname = \'pg_toast\' AND relkind = \'i\' THEN (SELECT pgt.relname FROM pg_class pgt WHERE SUBSTRING(pgt.relname FROM 10) = REPLACE(SUBSTRING(pg.relname FROM 10), \'_index\', \'\')) ELSE (SELECT pgc.relname FROM pg_class pgc WHERE pg.reltoastrelid = pgc.oid) END::varchar AS refrelname, CASE WHEN nspname = \'pg_toast\' AND relkind = \'i\' THEN (SELECT pgts.relname FROM pg_class pgts WHERE pgts.reltoastrelid = (SELECT pgt.oid FROM pg_class pgt WHERE SUBSTRING(pgt.relname FROM 10) = REPLACE(SUBSTRING(pg.relname FROM 10), \'_index\', \'\'))) END AS relidxrefrelname, relfilenode, relkind, reltuples::bigint, relpages FROM pg_class pg, pg_namespace pgn WHERE pg.relnamespace = pgn.oid AND pgn.nspname NOT IN (\'information_schema\', \'pg_catalog\') ORDER BY relpages DESC' +-- get useless indexes +\set trashindexes '( select s.schemaname as sch, s.relname as rel, s.indexrelname as idx, s.idx_scan as scans, pg_size_pretty(pg_relation_size(s.relid)) as ts, pg_size_pretty(pg_relation_size(s.indexrelid)) as "is" from pg_stat_user_indexes s join pg_index i on i.indexrelid=s.indexrelid left join pg_constraint c on i.indrelid=c.conrelid and array_to_string(i.indkey, '' '') = array_to_string(c.conkey, '' '') where i.indisunique is false and pg_relation_size(s.relid) > 1000000 and s.idx_scan < 100000 and c.confrelid is null order by s.idx_scan asc, pg_relation_size(s.indexrelid) desc, pg_relation_size(s.relid) desc )' +-- get useless indexes (full read) +\set trashindexesall '( select s.schemaname as sch, s.relname as rel, s.indexrelname as idx, s.idx_scan as scans, pg_size_pretty(pg_relation_size(s.relid)) as ts, pg_size_pretty(pg_relation_size(s.indexrelid)) as "is", c.confrelid, c.conkey from pg_stat_user_indexes s join pg_index i on i.indexrelid=s.indexrelid left join pg_constraint c on i.indrelid=c.conrelid and array_to_string(i.indkey, '' '') = array_to_string(c.conkey, '' '') where i.indisunique is false and pg_relation_size(s.relid) > 1000000 and s.idx_scan < 100000 order by s.idx_scan asc, pg_relation_size(s.indexrelid) desc, pg_relation_size(s.relid) desc )' +-- get all indexes for a relation ('table') +\set getindexes 'select s.schemaname as sch, s.relname as rel, s.indexrelname as idx, s.idx_scan as scans, pg_size_pretty(pg_relation_size(s.relid)) as ts, pg_size_pretty(pg_relation_size(s.indexrelid)) as "is", c.confrelid, c.conkey from pg_stat_user_indexes s join pg_index i on i.indexrelid=s.indexrelid left join pg_constraint c on i.indrelid=c.conrelid and array_to_string(i.indkey, '' '') = array_to_string(c.conkey, '' '') where s.relname = ' +-- possible missing indexes +\set missingindexes '( select src_table, dst_table, fk_name, pg_size_pretty(s_size) as s_size, pg_size_pretty(d_size) as d_size, d from ( select distinct on (1,2,3,4,5) textin(regclassout(c.conrelid)) as src_table, textin(regclassout(c.confrelid)) as dst_table, c.conname as fk_name, pg_relation_size(c.conrelid) as s_size, pg_relation_size(c.confrelid) as d_size, array_upper(di.indkey::int[], 1) + 1 - array_upper(c.conkey::int[], 1) as d from pg_constraint c left join pg_index di on di.indrelid = c.conrelid and array_to_string(di.indkey, '' '') ~ (''^'' || array_to_string(c.conkey, '' '') || ''( |$)'') join pg_stat_user_tables st on st.relid = c.conrelid where c.contype = ''f'' order by 1,2,3,4,5,6 asc) mfk where mfk.d is distinct from 0 and mfk.s_size > 1000000 order by mfk.s_size desc, mfk.d desc )' +-- overal percentage of index hits for a table +\set percentindexes 'SELECT relname, 100 * idx_scan / (seq_scan + idx_scan) percent_of_times_index_used, n_live_tup rows_in_table FROM pg_stat_user_tables ORDER BY n_live_tup DESC' +-- current running queries +\set running 'SELECT datname, client_addr, pid, now() - query_start AS runtime, state, wait_event_type, wait_event, query FROM pg_stat_activity WHERE query <> '''' AND state <> ''idle'' ORDER BY 1, 5, 4 DESC;' +\set runningidle 'SELECT datname, client_addr, pid, now() - query_start AS runtime, state, wait_event_type, wait_event, query FROM pg_stat_activity WHERE query <> '''' ORDER BY 1, 5, 4 DESC;' +\set runningold 'SELECT datname, client_addr, pid, now() - query_start AS runtime, state, case when waiting then ''WAIT'' else '''' end AS wait, query FROM pg_stat_activity WHERE query <> '''' AND state <> ''idle'' ORDER BY 1, 5, 4 DESC;' +\set runningidleold 'SELECT datname, client_addr, pid, now() - query_start AS runtime, state, case when waiting then ''WAIT'' else '''' end AS wait, query FROM pg_stat_activity WHERE query <> '''' ORDER BY 1, 5, 4 DESC;' +-- misses primary key +\set missingpk 'SELECT table_catalog, table_schema, table_name FROM information_schema.tables WHERE (table_catalog, table_schema, table_name) NOT IN (SELECT table_catalog, table_schema, table_name FROM information_schema.table_constraints WHERE constraint_type = ''PRIMARY KEY'') AND table_schema NOT IN (''information_schema'', ''pg_catalog'')' +-- chance of hitting the cache +\set cachehit 'SELECT sum(heap_blks_read) as heap_read, sum(heap_blks_hit) as heap_hit, (sum(heap_blks_hit) - sum(heap_blks_read)) / sum(heap_blks_hit) as ratio;' +-- chance of hitting the index during a read +\set indexhit 'SELECT sum(idx_blks_read) as idx_read, sum(idx_blks_hit) as idx_hit, (sum(idx_blks_hit) - sum(idx_blks_read)) / sum(idx_blks_hit) as ratio FROM pg_statio_user_indexes;' +-- show slow queries +\set show_slow_queries 'SELECT (total_time / 1000 / 60) as total_minutes, (total_time/calls) as average_time, query FROM pg_stat_statements ORDER BY 1 DESC LIMIT 100;' +-- show current search path +\set shsp 'SHOW search_path;' +-- set new search path +\set setsp 'SET search_path TO' +-- INDEX BLOAT read +\set indexbloat 'WITH btree_index_atts AS ( SELECT nspname, relname, reltuples, relpages, indrelid, relam, regexp_split_to_table(indkey::text, '' '')::smallint AS attnum, indexrelid as index_oid FROM pg_index JOIN pg_class ON pg_class.oid=pg_index.indexrelid JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace JOIN pg_am ON pg_class.relam = pg_am.oid WHERE pg_am.amname = ''btree''), index_item_sizes AS ( SELECT i.nspname, i.relname, i.reltuples, i.relpages, i.relam, (quote_ident(s.schemaname) || ''.'' || quote_ident(s.tablename))::regclass AS starelid, a.attrelid AS table_oid, index_oid, current_setting(''block_size'')::numeric AS bs, CASE WHEN version() ~ ''mingw32'' OR version() ~ ''64-bit'' THEN 8 ELSE 4 END AS maxalign, 24 AS pagehdr, CASE WHEN max(coalesce(s.null_frac,0)) = 0 THEN 2 ELSE 6 END AS index_tuple_hdr, sum( (1-coalesce(s.null_frac, 0)) * coalesce(s.avg_width, 2048) ) AS nulldatawidth FROM pg_attribute AS a JOIN pg_stats AS s ON (quote_ident(s.schemaname) || ''.'' || quote_ident(s.tablename))::regclass=a.attrelid AND s.attname = a.attname JOIN btree_index_atts AS i ON i.indrelid = a.attrelid AND a.attnum = i.attnum WHERE a.attnum > 0 GROUP BY 1, 2, 3, 4, 5, 6, 7, 8, 9), index_aligned AS ( SELECT maxalign, bs, nspname, relname AS index_name, reltuples, relpages, relam, table_oid, index_oid, ( 2 + maxalign - CASE WHEN 2%maxalign = 0 THEN maxalign ELSE 2%maxalign END + nulldatawidth + maxalign - CASE WHEN nulldatawidth::integer%maxalign = 0 THEN maxalign ELSE nulldatawidth::integer%maxalign END)::numeric AS nulldatahdrwidth, pagehdr FROM index_item_sizes AS s1), otta_calc AS ( SELECT bs, nspname, table_oid, index_oid, index_name, relpages, coalesce( ceil((reltuples*(4+nulldatahdrwidth))/(bs-pagehdr::float)) + CASE WHEN am.amname IN (''hash'',''btree'') THEN 1 ELSE 0 END , 0 ) AS otta FROM index_aligned AS s2 LEFT JOIN pg_am am ON s2.relam = am.oid), raw_bloat AS ( SELECT current_database() as dbname, nspname, c.relname AS table_name, index_name, bs*(sub.relpages)::bigint AS totalbytes, CASE WHEN sub.relpages <= otta THEN 0 ELSE bs*(sub.relpages-otta)::bigint END AS wastedbytes, CASE WHEN sub.relpages <= otta THEN 0 ELSE bs*(sub.relpages-otta)::bigint * 100 / (bs*(sub.relpages)::bigint) END AS realbloat, pg_relation_size(sub.table_oid) as table_bytes, stat.idx_scan as index_scans FROM otta_calc AS sub JOIN pg_class AS c ON c.oid=sub.table_oid JOIN pg_stat_user_indexes AS stat ON sub.index_oid = stat.indexrelid) SELECT dbname as database_name, nspname as schema_name, table_name, index_name, round(realbloat, 1) as bloat_pct, wastedbytes as bloat_bytes, pg_size_pretty(wastedbytes) as bloat_size, totalbytes as index_bytes, pg_size_pretty(totalbytes) as index_size, table_bytes, pg_size_pretty(table_bytes) as table_size, index_scans FROM raw_bloat WHERE ( ( realbloat > 50 and wastedbytes > 50000000 ) or wastedbytes > 50000000 ) ORDER BY wastedbytes DESC;' +-- never used index check +\set indexusage 'WITH table_scans as (SELECT relid, tables.idx_scan + tables.seq_scan as all_scans, ( tables.n_tup_ins + tables.n_tup_upd + tables.n_tup_del ) as writes, pg_relation_size(relid) as table_size FROM pg_stat_user_tables as tables), all_writes as (SELECT sum(writes) as total_writes FROM table_scans), indexes as (SELECT idx_stat.relid, idx_stat.indexrelid, idx_stat.schemaname, idx_stat.relname as tablename, idx_stat.indexrelname as indexname, idx_stat.idx_scan, pg_relation_size(idx_stat.indexrelid) as index_bytes, indexdef ~* ''USING btree'' AS idx_is_btree FROM pg_stat_user_indexes as idx_stat JOIN pg_index USING (indexrelid) JOIN pg_indexes as indexes ON idx_stat.schemaname = indexes.schemaname AND idx_stat.relname = indexes.tablename AND idx_stat.indexrelname = indexes.indexname WHERE pg_index.indisunique = FALSE), index_ratios AS (SELECT schemaname, tablename, indexname, idx_scan, all_scans, round(( CASE WHEN all_scans = 0 THEN 0.0::NUMERIC ELSE idx_scan::NUMERIC/all_scans * 100 END),2) as index_scan_pct, writes, round((CASE WHEN writes = 0 THEN idx_scan::NUMERIC ELSE idx_scan::NUMERIC/writes END),2) as scans_per_write, pg_size_pretty(index_bytes) as index_size, pg_size_pretty(table_size) as table_size, idx_is_btree, index_bytes FROM indexes JOIN table_scans USING (relid)), index_groups AS (SELECT ''Never Used Indexes'' as reason, *, 1 as grp FROM index_ratios WHERE idx_scan = 0 and idx_is_btree UNION ALL SELECT ''Low Scans, High Writes'' as reason, *, 2 as grp FROM index_ratios WHERE scans_per_write <= 1 and index_scan_pct < 10 and idx_scan > 0 and writes > 100 and idx_is_btree UNION ALL SELECT ''Seldom Used Large Indexes'' as reason, *, 3 as grp FROM index_ratios WHERE index_scan_pct < 5 and scans_per_write > 1 and idx_scan > 0 and idx_is_btree and index_bytes > 100000000 UNION ALL SELECT ''High-Write Large Non-Btree'' as reason, index_ratios.*, 4 as grp FROM index_ratios, all_writes WHERE ( writes::NUMERIC / ( total_writes + 1 ) ) > 0.02 AND NOT idx_is_btree AND index_bytes > 100000000 ORDER BY grp, index_bytes DESC ) SELECT reason, schemaname, tablename, indexname, index_scan_pct, scans_per_write, index_size, table_size FROM index_groups;' +-- foreign key count for all tables in database +\set foreignkeycount 'SELECT t.oid::regclass::text AS table_name, count(1) AS total FROM pg_constraint c JOIN pg_class t ON (t.oid = c.confrelid) GROUP BY table_name ORDER BY total DESC;' +-- ALSO from view 'bloat': SELECT * from bloat +-- bloat for tables and indexes +\set tablebloat 'SELECT sml.schemaname, sml.tablename, sml.reltuples::bigint AS reltuples, sml.relpages::bigint AS relpages, sml.otta, round( CASE WHEN sml.otta = 0::double precision THEN 0.0 ELSE sml.relpages::numeric / sml.otta::numeric END, 1) AS tbloat, sml.relpages::bigint::double precision - sml.otta AS wastedpages, sml.bs * (sml.relpages::double precision - sml.otta)::bigint::numeric AS wastedbytes, pg_size_pretty((sml.bs::double precision * (sml.relpages::double precision - sml.otta))::bigint) AS wastedsize, sml.iname, sml.ituples::bigint AS ituples, sml.ipages::bigint AS ipages, sml.iotta, round( CASE WHEN sml.iotta = 0::double precision OR sml.ipages = 0 THEN 0.0 ELSE sml.ipages::numeric / sml.iotta::numeric END, 1) AS ibloat, CASE WHEN sml.ipages::double precision < sml.iotta THEN 0::double precision ELSE sml.ipages::bigint::double precision - sml.iotta END AS wastedipages, CASE WHEN sml.ipages::double precision < sml.iotta THEN 0::double precision ELSE sml.bs::double precision * (sml.ipages::double precision - sml.iotta) END AS wastedibytes, CASE WHEN sml.ipages::double precision < sml.iotta THEN pg_size_pretty(0::bigint) ELSE pg_size_pretty((sml.bs::double precision * (sml.ipages::double precision - sml.iotta))::bigint) END AS wastedisize FROM ( SELECT rs.schemaname, rs.tablename, cc.reltuples, cc.relpages, rs.bs, ceil(cc.reltuples * ((rs.datahdr + rs.ma::numeric - CASE WHEN (rs.datahdr % rs.ma::numeric) = 0::numeric THEN rs.ma::numeric ELSE rs.datahdr % rs.ma::numeric END)::double precision + rs.nullhdr2 + 4::double precision) / (rs.bs::double precision - 20::double precision)) AS otta, COALESCE(c2.relname, ''?''::name) AS iname, COALESCE(c2.reltuples, 0::real) AS ituples, COALESCE(c2.relpages, 0) AS ipages, COALESCE(ceil(c2.reltuples * (rs.datahdr - 12::numeric)::double precision / (rs.bs::double precision - 20::double precision)), 0::double precision) AS iotta FROM ( SELECT foo.ma, foo.bs, foo.schemaname, foo.tablename, (foo.datawidth + (foo.hdr + foo.ma - CASE WHEN (foo.hdr % foo.ma) = 0 THEN foo.ma ELSE foo.hdr % foo.ma END)::double precision)::numeric AS datahdr, foo.maxfracsum * (foo.nullhdr + foo.ma - CASE WHEN (foo.nullhdr % foo.ma::bigint) = 0 THEN foo.ma::bigint ELSE foo.nullhdr % foo.ma::bigint END)::double precision AS nullhdr2 FROM ( SELECT s.schemaname, s.tablename, constants.hdr, constants.ma, constants.bs, sum((1::double precision - s.null_frac) * s.avg_width::double precision) AS datawidth, max(s.null_frac) AS maxfracsum, constants.hdr + (( SELECT 1 + count(*) / 8 FROM pg_stats s2 WHERE s2.null_frac <> 0::double precision AND s2.schemaname = s.schemaname AND s2.tablename = s.tablename)) AS nullhdr FROM pg_stats s, ( SELECT ( SELECT current_setting(''block_size''::text)::numeric AS current_setting) AS bs, CASE WHEN "substring"(foo_1.v, 12, 3) = ANY (ARRAY[''8.0''::text, ''8.1''::text, ''8.2''::text]) THEN 27 ELSE 23 END AS hdr, CASE WHEN foo_1.v ~ ''mingw32''::text THEN 8 ELSE 4 END AS ma FROM ( SELECT version() AS v) foo_1) constants GROUP BY s.schemaname, s.tablename, constants.hdr, constants.ma, constants.bs) foo) rs JOIN pg_class cc ON cc.relname = rs.tablename JOIN pg_namespace nn ON cc.relnamespace = nn.oid AND nn.nspname = rs.schemaname LEFT JOIN pg_index i ON i.indrelid = cc.oid LEFT JOIN pg_class c2 ON c2.oid = i.indexrelid) sml WHERE (sml.relpages::double precision - sml.otta) > 0::double precision OR (sml.ipages::double precision - sml.iotta) > 10::double precision ORDER BY sml.bs * (sml.relpages::double precision - sml.otta)::bigint::numeric DESC, CASE WHEN sml.ipages::double precision < sml.iotta THEN 0::double precision ELSE sml.bs::double precision * (sml.ipages::double precision - sml.iotta) END DESC;' +-- view locks +\set viewlockedquery 'SELECT COALESCE(blockingl.relation::regclass::text,blockingl.locktype) as locked_item, now() - blockeda.query_start AS waiting_duration, blockeda.pid AS blocked_pid, blockeda.query as blocked_query, blockedl.mode as blocked_mode, blockinga.pid AS blocking_pid, blockinga.query as blocking_query, blockingl.mode as blocking_mode FROM pg_catalog.pg_locks blockedl JOIN pg_stat_activity blockeda ON blockedl.pid = blockeda.pid JOIN pg_catalog.pg_locks blockingl ON( ( (blockingl.transactionid=blockedl.transactionid) OR (blockingl.relation=blockedl.relation AND blockingl.locktype=blockedl.locktype)) AND blockedl.pid != blockingl.pid) JOIN pg_stat_activity blockinga ON blockingl.pid = blockinga.pid AND blockinga.datid = blockeda.datid WHERE NOT blockedl.granted AND blockinga.datname = current_database();' +\set viewlocks 'select (SELECT datname FROM pg_stat_database WHERE datid = database) AS database, pid, locktype, relation::regclass AS relation, mode, virtualxid AS vtid, transactionid AS tid, classid, objid, objsubid, virtualtransaction AS vtrans, granted, fastpath FROM pg_locks ORDER BY pid;' +-- tables that need vacuum +\set vacuumneed 'WITH table_opts AS ( SELECT c.oid, c.relname, c.relfrozenxid, c.relminmxid, n.nspname, array_to_string(c.reloptions, '''') AS relopts FROM pg_class c INNER JOIN pg_namespace n ON c.relnamespace = n.oid WHERE c.relkind IN (''r'', ''t'') AND n.nspname NOT IN (''pg_catalog'', ''information_schema'') AND n.nspname !~ ''^pg_temp''), vacuum_settings AS ( SELECT oid, relname, nspname, relfrozenxid, relminmxid, CASE WHEN relopts LIKE ''%autovacuum_vacuum_threshold%'' THEN regexp_replace(relopts, ''.*autovacuum_vacuum_threshold=([0-9.]+).*'', E''\\1'')::integer ELSE current_setting(''autovacuum_vacuum_threshold'')::integer END AS autovacuum_vacuum_threshold, CASE WHEN relopts LIKE ''%autovacuum_vacuum_scale_factor%'' THEN regexp_replace(relopts, ''.*autovacuum_vacuum_scale_factor=([0-9.]+).*'', E''\\1'')::real ELSE current_setting(''autovacuum_vacuum_scale_factor'')::real END AS autovacuum_vacuum_scale_factor, CASE WHEN relopts LIKE ''%autovacuum_analyze_threshold%'' THEN regexp_replace(relopts, ''.*autovacuum_analyze_threshold=([0-9.]+).*'', E''\\1'')::integer ELSE current_setting(''autovacuum_analyze_threshold'')::integer END AS autovacuum_analyze_threshold, CASE WHEN relopts LIKE ''%autovacuum_analyze_scale_factor%'' THEN regexp_replace(relopts, ''.*autovacuum_analyze_scale_factor=([0-9.]+).*'', E''\\1'')::real ELSE current_setting(''autovacuum_analyze_scale_factor'')::real END AS autovacuum_analyze_scale_factor, CASE WHEN relopts LIKE ''%autovacuum_freeze_max_age%'' THEN least(regexp_replace(relopts, ''.*autovacuum_freeze_max_age=([0-9.]+).*'', E''\\1'')::bigint,current_setting(''autovacuum_freeze_max_age'')::bigint) ELSE current_setting(''autovacuum_freeze_max_age'')::bigint END AS autovacuum_freeze_max_age, CASE WHEN relopts LIKE ''%autovacuum_multixact_freeze_max_age%'' THEN least(regexp_replace(relopts, ''.*autovacuum_multixact_freeze_max_age=([0-9.]+).*'', E''\\1'')::bigint,current_setting(''autovacuum_multixact_freeze_max_age'')::bigint) ELSE current_setting(''autovacuum_multixact_freeze_max_age'')::bigint END AS autovacuum_multixact_freeze_max_age FROM table_opts) SELECT s.schemaname ||''.''|| s.relname, CASE WHEN v.autovacuum_vacuum_threshold + (v.autovacuum_vacuum_scale_factor::numeric * c.reltuples) < s.n_dead_tup THEN true ELSE false END AS need_vacuum, CASE WHEN v.autovacuum_analyze_threshold + (v.autovacuum_analyze_scale_factor::numeric * c.reltuples) < s.n_mod_since_analyze THEN true ELSE false END AS need_analyze, CASE WHEN (age(v.relfrozenxid)::bigint > v.autovacuum_freeze_max_age) OR (mxid_age(v.relminmxid)::bigint > v.autovacuum_multixact_freeze_max_age) THEN true ELSE false END AS need_wraparound FROM pg_stat_user_tables s INNER JOIN pg_class c ON s.relid = c.oid INNER JOIN vacuum_settings v ON c.oid = v.oid WHERE (v.autovacuum_vacuum_threshold + (v.autovacuum_vacuum_scale_factor::numeric * c.reltuples) < s.n_dead_tup) OR (v.autovacuum_analyze_threshold + (v.autovacuum_analyze_scale_factor::numeric * c.reltuples) < s.n_mod_since_analyze) OR (age(v.relfrozenxid)::bigint > v.autovacuum_freeze_max_age) OR (mxid_age(v.relminmxid)::bigint > v.autovacuum_multixact_freeze_max_age)' +\set tablebloatscan 'WITH constants AS (SELECT current_setting(''block_size'')::numeric AS bs, 23 AS hdr, 8 AS ma), no_stats AS (SELECT table_schema, table_name, n_live_tup::numeric as est_rows, pg_table_size(relid)::numeric as table_size FROM information_schema.columns JOIN pg_stat_user_tables as psut ON table_schema = psut.schemaname AND table_name = psut.relname LEFT OUTER JOIN pg_stats ON table_schema = pg_stats.schemaname AND table_name = pg_stats.tablename AND column_name = attname WHERE attname IS NULL AND table_schema NOT IN (''pg_catalog'', ''information_schema'') GROUP BY table_schema, table_name, relid, n_live_tup), null_headers AS (SELECT hdr+1+(sum(case when null_frac <> 0 THEN 1 else 0 END)/8) as nullhdr, SUM((1-null_frac)*avg_width) as datawidth, MAX(null_frac) as maxfracsum, schemaname, tablename, hdr, ma, bs FROM pg_stats CROSS JOIN constants LEFT OUTER JOIN no_stats ON schemaname = no_stats.table_schema AND tablename = no_stats.table_name WHERE schemaname NOT IN (''pg_catalog'', ''information_schema'') AND no_stats.table_name IS NULL AND EXISTS ( SELECT 1 FROM information_schema.columns WHERE schemaname = columns.table_schema AND tablename = columns.table_name ) GROUP BY schemaname, tablename, hdr, ma, bs), data_headers AS (SELECT ma, bs, hdr, schemaname, tablename, (datawidth+(hdr+ma-(case when hdr%ma=0 THEN ma ELSE hdr%ma END)))::numeric AS datahdr, (maxfracsum*(nullhdr+ma-(case when nullhdr%ma=0 THEN ma ELSE nullhdr%ma END))) AS nullhdr2 FROM null_headers), table_estimates AS (SELECT schemaname, tablename, bs, reltuples::numeric as est_rows, relpages * bs as table_bytes, CEIL((reltuples*(datahdr + nullhdr2 + 4 + ma - (CASE WHEN datahdr%ma=0 THEN ma ELSE datahdr%ma END))/(bs-20))) * bs AS expected_bytes, reltoastrelid FROM data_headers JOIN pg_class ON tablename = relname JOIN pg_namespace ON relnamespace = pg_namespace.oid AND schemaname = nspname WHERE pg_class.relkind = ''r''), estimates_with_toast AS (SELECT schemaname, tablename, TRUE as can_estimate, est_rows, table_bytes + ( coalesce(toast.relpages, 0) * bs ) as table_bytes, expected_bytes + ( ceil( coalesce(toast.reltuples, 0) / 4 ) * bs ) as expected_bytes FROM table_estimates LEFT OUTER JOIN pg_class as toast ON table_estimates.reltoastrelid = toast.oid AND toast.relkind = ''t''), table_estimates_plus AS (SELECT current_database() as databasename, schemaname, tablename, can_estimate, est_rows, CASE WHEN table_bytes > 0 THEN table_bytes::NUMERIC ELSE NULL::NUMERIC END AS table_bytes, CASE WHEN expected_bytes > 0 THEN expected_bytes::NUMERIC ELSE NULL::NUMERIC END AS expected_bytes, CASE WHEN expected_bytes > 0 AND table_bytes > 0 AND expected_bytes <= table_bytes THEN (table_bytes - expected_bytes)::NUMERIC ELSE 0::NUMERIC END AS bloat_bytes FROM estimates_with_toast UNION ALL SELECT current_database() as databasename, table_schema, table_name, FALSE, est_rows, table_size, NULL::NUMERIC, NULL::NUMERIC FROM no_stats), bloat_data AS (select current_database() as databasename, schemaname, tablename, can_estimate, table_bytes, round(table_bytes/(1024^2)::NUMERIC,3) as table_mb, expected_bytes, round(expected_bytes/(1024^2)::NUMERIC,3) as expected_mb, round(bloat_bytes*100/table_bytes) as pct_bloat, round(bloat_bytes/(1024::NUMERIC^2),2) as mb_bloat, table_bytes, expected_bytes, est_rows FROM table_estimates_plus) SELECT databasename, schemaname, tablename, can_estimate, est_rows, pct_bloat, mb_bloat, table_mb FROM bloat_data WHERE ( pct_bloat >= 50 AND mb_bloat >= 20 ) OR ( pct_bloat >= 25 AND mb_bloat >= 1000 ) ORDER BY pct_bloat DESC;' +-- current vacuum status +\set vacuumstatus 'SELECT p.pid, now() - a.xact_start AS duration, coalesce(wait_event_type ||''.''|| wait_event, ''f'') AS waiting, CASE WHEN a.query ~ ''^autovacuum.*to prevent wraparound'' THEN ''wraparound'' WHEN a.query ~ ''^vacuum'' THEN ''user'' ELSE ''regular'' END AS mode, p.datname AS database, p.relid::regclass AS table, p.phase, pg_size_pretty(p.heap_blks_total * current_setting(''block_size'')::int) AS table_size, pg_size_pretty(pg_total_relation_size(relid)) AS total_size, pg_size_pretty(p.heap_blks_scanned * current_setting(''block_size'')::int) AS scanned, pg_size_pretty(p.heap_blks_vacuumed * current_setting(''block_size'')::int) AS vacuumed, round(100.0 * p.heap_blks_scanned / p.heap_blks_total, 1) AS scanned_pct, round(100.0 * p.heap_blks_vacuumed / p.heap_blks_total, 1) AS vacuumed_pct, p.index_vacuum_count, round(100.0 * p.num_dead_tuples / p.max_dead_tuples,1) AS dead_pct FROM pg_stat_progress_vacuum p JOIN pg_stat_activity a using (pid) ORDER BY now() - a.xact_start DESC;' diff --git a/home-rc/dot-files/.screenrc b/home-rc/dot-files/.screenrc new file mode 100644 index 0000000..68f79c4 --- /dev/null +++ b/home-rc/dot-files/.screenrc @@ -0,0 +1,42 @@ +# enable scrollback, does not work in konsole +defscrollback 50000 + +# hardstatus line at the bottom +hardstatus alwayslastline "%{.kw}[%{..g}%H%{..w}] [%{..M}%S%{..w}:%{..m}%n %{..M}%t%{..w}] [%{..W}%h%{..w}]%= %{..w}[%{..r}%l%{..w}][%{..y}%D, %y/%m/%d %{..Y}%c:%s%{..w}]" +# hardstatus if we have a split layout +caption splitonly "%{rw}%n%f %t %{wk} | %>%{wk}%?%-Lw%?[%{..M}%n*%f %t%{.kw}]%?(%u)%?%{wk}%?%+Lw%?%<" + +# "~" stands for the "bell" character +# use %n to display the window number and %t for its title: +activity "activity in %f%n (%t) [%c:%s]~" +# pass on the "beep" (CTRL-G) by adding a '~': +bell "bell in %f%n (%t) [%c:%s]~" +# vbell_msg: Message shown when the +# "virtual bell" rings. +vbell_msg " *beep* " + +# to be able to select screens n > 9 -> +# press "C-a - #" instead of just "C-a #" +bind - command -c select_1n +bind -c select_1n 0 select 10 +bind -c select_1n 1 select 11 +bind -c select_1n 2 select 12 +bind -c select_1n 3 select 13 +bind -c select_1n 4 select 14 +bind -c select_1n 5 select 15 +bind -c select_1n 6 select 16 +bind -c select_1n 7 select 17 +bind -c select_1n 8 select 18 +bind -c select_1n 9 select 19 +bind -c select_1n - command -c select_2n +bind -c select_2n 0 select 20 +bind -c select_2n 1 select 21 +bind -c select_2n 2 select 22 +bind -c select_2n 3 select 23 +bind -c select_2n 4 select 24 +bind -c select_2n 5 select 25 +bind -c select_2n 6 select 26 +bind -c select_2n 7 select 27 +bind -c select_2n 8 select 28 +bind -c select_2n 9 select 29 +bind -c select_2n - select - diff --git a/home-rc/dot-files/.vim/.netrwhist b/home-rc/dot-files/.vim/.netrwhist new file mode 100644 index 0000000..97d0282 --- /dev/null +++ b/home-rc/dot-files/.vim/.netrwhist @@ -0,0 +1,4 @@ +let g:netrw_dirhistmax =10 +let g:netrw_dirhist_cnt =2 +let g:netrw_dirhist_1='/storage/var/www/html/developers/clemens/php/php-diff-master/lib/Diff' +let g:netrw_dirhist_2='/storage/var/www/html/developers/clemens/core_data/php_libraries/trunk/www/configs' diff --git a/home-rc/dot-files/.vim/autoload/pathogen.vim b/home-rc/dot-files/.vim/autoload/pathogen.vim new file mode 100644 index 0000000..3582fbf --- /dev/null +++ b/home-rc/dot-files/.vim/autoload/pathogen.vim @@ -0,0 +1,264 @@ +" pathogen.vim - path option manipulation +" Maintainer: Tim Pope +" Version: 2.4 + +" Install in ~/.vim/autoload (or ~\vimfiles\autoload). +" +" For management of individually installed plugins in ~/.vim/bundle (or +" ~\vimfiles\bundle), adding `execute pathogen#infect()` to the top of your +" .vimrc is the only other setup necessary. +" +" The API is documented inline below. + +if exists("g:loaded_pathogen") || &cp + finish +endif +let g:loaded_pathogen = 1 + +" Point of entry for basic default usage. Give a relative path to invoke +" pathogen#interpose() or an absolute path to invoke pathogen#surround(). +" Curly braces are expanded with pathogen#expand(): "bundle/{}" finds all +" subdirectories inside "bundle" inside all directories in the runtime path. +" If no arguments are given, defaults "bundle/{}", and also "pack/{}/start/{}" +" on versions of Vim without native package support. +function! pathogen#infect(...) abort + if a:0 + let paths = filter(reverse(copy(a:000)), 'type(v:val) == type("")') + else + let paths = ['bundle/{}', 'pack/{}/start/{}'] + endif + if has('packages') + call filter(paths, 'v:val !~# "^pack/[^/]*/start/[^/]*$"') + endif + let static = '^\%([$~\\/]\|\w:[\\/]\)[^{}*]*$' + for path in filter(copy(paths), 'v:val =~# static') + call pathogen#surround(path) + endfor + for path in filter(copy(paths), 'v:val !~# static') + if path =~# '^\%([$~\\/]\|\w:[\\/]\)' + call pathogen#surround(path) + else + call pathogen#interpose(path) + endif + endfor + call pathogen#cycle_filetype() + if pathogen#is_disabled($MYVIMRC) + return 'finish' + endif + return '' +endfunction + +" Split a path into a list. +function! pathogen#split(path) abort + if type(a:path) == type([]) | return a:path | endif + if empty(a:path) | return [] | endif + let split = split(a:path,'\\\@]','\\&','') + endif +endfunction + +" Like findfile(), but hardcoded to use the runtimepath. +function! pathogen#runtime_findfile(file,count) abort + let rtp = pathogen#join(1,pathogen#split(&rtp)) + let file = findfile(a:file,rtp,a:count) + if file ==# '' + return '' + else + return fnamemodify(file,':p') + endif +endfunction + +" vim:set et sw=2 foldmethod=expr foldexpr=getline(v\:lnum)=~'^\"\ Section\:'?'>1'\:getline(v\:lnum)=~#'^fu'?'a1'\:getline(v\:lnum)=~#'^endf'?'s1'\:'=': diff --git a/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/.github/ISSUE_TEMPLATE/bug.md b/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/.github/ISSUE_TEMPLATE/bug.md new file mode 100644 index 0000000..10aaa95 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/.github/ISSUE_TEMPLATE/bug.md @@ -0,0 +1,41 @@ +--- +name: "Bug Report" +about: "nerdtree-git-plugin is misbehaving? Tell us about it." +labels: bug +--- + + +#### Self-Diagnosis + +- [ ] I have searched the [issues](https://github.com/Xuyuanp/nerdtree-git-plugin/issues) for an answer to my question. +- [ ] I have reviewed the NERDTree documentation(README.md). +- [ ] I have searched the web for an answer to my question. + +#### Environment (for bug reports) +- [ ] Operating System: +- [ ] vimrc settings + ```vim + " all settings about nerdtree and other plugins + ``` + - Other NERDTree-dependent Plugins + - [ ] jistr/vim-nerdtree-tabs + - [ ] ryanoasis/vim-devicons + - [ ] tiagofumo/vim-nerdtree-syntax-highlight + - [ ] Others (specify): + - [ ] I've verified the issue occurs with only `nerdtree-git-plugin` installed. +- [ ] Copy-Paste `call gitstatus#doctor#Say()` outputs + +#### Steps to Reproduce the Issue +1. + +#### Current Result (Include screenshots where appropriate.) + +#### Expected Result diff --git a/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/.github/ISSUE_TEMPLATE/feature_request.md b/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..36480ad --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,8 @@ +--- +name: "Feature Request" +about: "What new feature are you requesting for nerdtree-git-plugin?" +labels: "feature request" +--- + +#### Description + diff --git a/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/.github/ISSUE_TEMPLATE/question.md b/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/.github/ISSUE_TEMPLATE/question.md new file mode 100644 index 0000000..5e5355d --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/.github/ISSUE_TEMPLATE/question.md @@ -0,0 +1,23 @@ +--- +name: "General Question" +about: "Having trouble setting up nerdtree-git-plugin? Need clarification on a setting? Ask your question here." +labels: "general question" +--- + + +#### Self-Diagnosis + +- [ ] I have searched the [issues](https://github.com/Xuyuanp/nerdtree-git-plugin/issues) for an answer to my question. +- [ ] I have reviewed the NERDTree documentation(README.md). +- [ ] I have searched the web for an answer to my question. + +#### State Your Question + diff --git a/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/.github/PULL_REQUEST_TEMPLATE.md b/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..b42a972 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,3 @@ +### Description of Changes +Closes # + diff --git a/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/.github/stale.yml b/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/.github/stale.yml new file mode 100644 index 0000000..8708b91 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/.github/stale.yml @@ -0,0 +1,17 @@ +# Number of days of inactivity before an issue becomes stale +daysUntilStale: 30 +# Number of days of inactivity before a stale issue is closed +daysUntilClose: 7 +# Issues with these labels will never be considered stale +exemptLabels: + - pinned + - security +# Label to use when marking an issue as stale +staleLabel: stale +# Comment to post when marking an issue as stale. Set to `false` to disable +markComment: > + This issue has been automatically marked as stale because it has not had + recent activity. It will be closed if no further activity occurs. Thank you + for your contributions. +# Comment to post when closing a stale issue. Set to `false` to disable +closeComment: false diff --git a/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/.github/workflows/ci.yml b/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/.github/workflows/ci.yml new file mode 100644 index 0000000..2e3df1a --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/.github/workflows/ci.yml @@ -0,0 +1,57 @@ +name: CI +on: [push, pull_request] +jobs: + vint: + name: Vint + strategy: + fail-fast: false + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Run vint with reviewdog + uses: reviewdog/action-vint@v1.0.1 + with: + github_token: ${{ secrets.github_token }} + reporter: github-pr-review + test: + name: Unit tests + strategy: + matrix: + os: [macos-latest, ubuntu-latest, windows-latest] + neovim: [true, false] + version: [stable, nightly] + runs-on: ${{ matrix.os }} + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Checkout themis.vim + uses: actions/checkout@v2 + with: + repository: thinca/vim-themis + path: tmp/vim-themis + - name: Checkout nerdtree + uses: actions/checkout@v2 + with: + repository: preservim/nerdtree + path: tmp/nerdtree + # Remove apt repos that are known to break from time to time + # See https://github.com/actions/virtual-environments/issues/323 + - name: Remove broken apt repos [Ubuntu] + if: matrix.os == 'ubuntu-latest' + run: | + for apt_file in `grep -lr microsoft /etc/apt/sources.list.d/`; do sudo rm $apt_file; done + - name: Install Vim or Neovim + uses: rhysd/action-setup-vim@v1 + id: vim + with: + neovim: ${{ matrix.neovim }} + version: ${{ matrix.version }} + - name: Run unit tests + env: + THEMIS_VIM: ${{ steps.vim.outputs.executable }} + THEMIS_PROFILE: profile.txt + run: | + echo $THEMIS_VIM + ./tmp/vim-themis/bin/themis --runtimepath ./tmp/nerdtree --reporter spec tests/ + # TODO: coverage diff --git a/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/.pre-commit-config.yaml b/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/.pre-commit-config.yaml new file mode 100644 index 0000000..c30be40 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/.pre-commit-config.yaml @@ -0,0 +1,14 @@ +# See https://pre-commit.com for more information +# See https://pre-commit.com/hooks.html for more hooks +repos: +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v2.4.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-added-large-files + - id: mixed-line-ending +- repo: https://github.com/Vimjas/vint + rev: master + hooks: + - id: vint diff --git a/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/.vintrc.yaml b/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/.vintrc.yaml new file mode 100644 index 0000000..bc69ca8 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/.vintrc.yaml @@ -0,0 +1,40 @@ +cmdargs: + # Checking more strictly + severity: style_problem + + # Enable coloring + color: false + + # Enable Neovim syntax + env: + neovim: true + +policies: + ProhibitAutocmdWithNoGroup: + enabled: true + ProhibitCommandRelyOnUser: + enabled: true + ProhibitCommandWithUnintendedSideEffect: + enabled: true + ProhibitEncodingOptionAfterScriptEncoding: + enabled: true + ProhibitEqualTildeOperator: + enabled: true + ProhibitImplicitScopeBuiltinVariable: + enabled: true + ProhibitMissingScriptEncoding: + enabled: true + ProhibitNoAbortFunction: + enabled: true + ProhibitSetNoCompatible: + enabled: true + ProhibitUnnecessaryDoubleQuote: + enabled: true + ProhibitUnusedVariable: + enabled: true + ProhibitUsingUndeclaredVariable: + enabled: true + ProhibitAbbreviationOption: + enabled: true + ProhibitImplicitScopeVariable: + enabled: true diff --git a/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/LICENSE b/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/LICENSE new file mode 100644 index 0000000..5a8e332 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/LICENSE @@ -0,0 +1,14 @@ + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + + Copyright (C) 2004 Sam Hocevar + + Everyone is permitted to copy and distribute verbatim or modified + copies of this license document, and changing it is allowed as long + as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. + diff --git a/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/README.md b/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/README.md new file mode 100644 index 0000000..229a85c --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/README.md @@ -0,0 +1,104 @@ +nerdtree-git-plugin +=================== +[![Github Action](https://img.shields.io/github/workflow/status/Xuyuanp/nerdtree-git-plugin/CI)](https://github.com/Xuyuanp/nerdtree-git-plugin/actions?query=workflow%3ACI) +[![License: WTFPL](https://img.shields.io/github/license/Xuyuanp/nerdtree-git-plugin)](http://www.wtfpl.net/about/) +[![GitHub contributors](https://img.shields.io/github/contributors/Xuyuanp/nerdtree-git-plugin)](https://github.com/Xuyuanp/nerdtree-git-plugin/graphs/contributors) + +A plugin of [NERDTree](https://github.com/preservim/nerdtree) showing git status flags. + +The original project [git-nerdtree](https://github.com/Xuyuanp/git-nerdtree) will not be maintained any longer. + +![Imgur](http://i.imgur.com/jSCwGjU.gif?1) + +## Installation + +Use your favorite package manager. Here is the example of using [vim-plug](https://github.com/junegunn/vim-plug) + +```vim script +Plug 'preservim/nerdtree' | + \ Plug 'Xuyuanp/nerdtree-git-plugin' +``` + +## FAQ + +> Got error message like `Error detected while processing function +177[2]..178[22]..181[7]..144[9]..142[36]..238[4]..NERDTreeGitStatusRefreshListener[2]..NERDTreeGitStatusRefresh: +line 6: +E484: Can't open file /tmp/vZEZ6gM/1` while nerdtree opening in fish, how to resolve this problem? + +This was because that vim couldn't execute `system` function in `fish`. Add `set shell=sh` in your vimrc. + +This issue has been fixed. + +> How to config custom symbols? + +Use this variable to change symbols. + +```vim +let g:NERDTreeGitStatusIndicatorMapCustom = { + \ 'Modified' :'✹', + \ 'Staged' :'✚', + \ 'Untracked' :'✭', + \ 'Renamed' :'➜', + \ 'Unmerged' :'═', + \ 'Deleted' :'✖', + \ 'Dirty' :'✗', + \ 'Ignored' :'☒', + \ 'Clean' :'✔︎', + \ 'Unknown' :'?', + \ } +``` + +There is a predefined map used *nerdfonts*, to enable it + +```vim +let g:NERDTreeGitStatusUseNerdFonts = 1 " you should install nerdfonts by yourself. default: 0 +``` + +> How to show `ignored` status? + +```vim +let g:NERDTreeGitStatusShowIgnored = 1 " a heavy feature may cost much more time. default: 0 +``` + +> How to cooperate with [vim-devicons](https://github.com/ryanoasis/vim-devicons) + +```vim +Plug 'preservim/nerdtree' | + \ Plug 'Xuyuanp/nerdtree-git-plugin' | + \ Plug 'ryanoasis/vim-devicons' +``` + +Make sure they are in the right order. + +> How to indicate every single `untracked` file under an `untracked` dir? + +```vim +let g:NERDTreeGitStatusUntrackedFilesMode = 'all' " a heave feature too. default: normal +``` + +> How to set `git` executable file path? + +```vim +let g:NERDTreeGitStatusGitBinPath = '/your/file/path' " defualt: git (auto find in path) +``` + +> How to show `Clean` indicator? + +```vim +let g:NERDTreeGitStatusShowClean = 1 " default: 0 +``` + +> How to hide the boring brackets(`[ ]`)? + +```vim +let g:NERDTreeGitStatusConcealBrackets = 1 " default: 0 +``` + +**NOTICE**: DO NOT enable this feature if you have also installed [vim-devicons](https://github.com/ryanoasis/vim-devicons). + +## Credits + +* [scrooloose](https://github.com/scrooloose): Open API for me. +* [git\_nerd](https://github.com/swerner/git_nerd): Where my idea comes from. +* [PickRelated](https://github.com/PickRelated): Add custom indicators & Review code. diff --git a/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/after/syntax/nerdtree.vim b/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/after/syntax/nerdtree.vim new file mode 100644 index 0000000..930f453 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/after/syntax/nerdtree.vim @@ -0,0 +1,58 @@ +" ============================================================================ +" File: autoload/gitstatus/job.vim +" Description: git status indicator syntax highlighting +" Maintainer: Xuyuan Pang +" License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +" ============================================================================ +if !get(g:, 'NERDTreeGitStatusEnable', 0) + finish +endif + +function! s:getIndicator(status) abort + return gitstatus#getIndicator(a:status) +endfunction + +if gitstatus#shouldConceal() + " Hide the backets + syntax match hideBracketsInNerdTreeL "\]" contained conceal containedin=NERDTreeFlags + syntax match hideBracketsInNerdTreeR "\[" contained conceal containedin=NERDTreeFlags + setlocal conceallevel=3 + setlocal concealcursor=nvic +endif + +function! s:highlightFromGroup(group) abort + let l:synid = synIDtrans(hlID(a:group)) + let [l:ctermfg, l:guifg] = [synIDattr(l:synid, 'fg', 'cterm'), synIDattr(l:synid, 'fg', 'gui')] + return 'cterm=NONE ctermfg=' . l:ctermfg . ' ctermbg=NONE gui=NONE guifg=' . l:guifg . ' guibg=NONE' +endfunction + +function! s:setHightlighting() abort + let l:synlist = [ + \ ['Unmerged', 'Function'], + \ ['Modified', 'Special'], + \ ['Staged', 'Function'], + \ ['Renamed', 'Title'], + \ ['Unmerged', 'Label'], + \ ['Untracked', 'Comment'], + \ ['Dirty', 'Tag'], + \ ['Deleted', 'Operator'], + \ ['Ignored', 'SpecialKey'], + \ ['Clean', 'Method'], + \ ] + + for [l:name, l:group] in l:synlist + let l:indicator = escape(s:getIndicator(l:name), '\#-*.$') + let l:synname = 'NERDTreeGitStatus' . l:name + execute 'silent! syntax match ' . l:synname . ' #\m\C\zs[' . l:indicator . ']\ze[^\]]*\]# containedin=NERDTreeFlags' + let l:hipat = get(get(g:, 'NERDTreeGitStatusHighlightingCustom', {}), + \ l:name, + \ s:highlightFromGroup(l:group)) + execute 'silent! highlight ' . l:synname . ' ' . l:hipat + endfor +endfunction + +silent! call s:setHightlighting() diff --git a/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/autoload/gitstatus.vim b/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/autoload/gitstatus.vim new file mode 100644 index 0000000..3d87e6f --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/autoload/gitstatus.vim @@ -0,0 +1,69 @@ +" ============================================================================ +" File: autoload/gitstatus.vim +" Description: library for indicators +" Maintainer: Xuyuan Pang +" License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +" ============================================================================ +if exists('g:loaded_nerdtree_git_status_autoload') + finish +endif +let g:loaded_nerdtree_git_status_autoload = 1 + +function! gitstatus#isWin() abort + return has('win16') || has('win32') || has('win64') +endfunction + +if get(g:, 'NERDTreeGitStatusUseNerdFonts', 0) + let s:indicatorMap = { + \ 'Modified' :nr2char(61545), + \ 'Staged' :nr2char(61543), + \ 'Untracked' :nr2char(61736), + \ 'Renamed' :nr2char(62804), + \ 'Unmerged' :nr2char(61556), + \ 'Deleted' :nr2char(63167), + \ 'Dirty' :nr2char(61453), + \ 'Ignored' :nr2char(61738), + \ 'Clean' :nr2char(61452), + \ 'Unknown' :nr2char(61832) + \ } +elseif &encoding ==? 'utf-8' + let s:indicatorMap = { + \ 'Modified' :nr2char(10041), + \ 'Staged' :nr2char(10010), + \ 'Untracked' :nr2char(10029), + \ 'Renamed' :nr2char(10140), + \ 'Unmerged' :nr2char(9552), + \ 'Deleted' :nr2char(10006), + \ 'Dirty' :nr2char(10007), + \ 'Ignored' :nr2char(33), + \ 'Clean' :nr2char(10004), + \ 'Unknown' :nr2char(120744) + \ } +else + let s:indicatorMap = { + \ 'Modified' :'*', + \ 'Staged' :'+', + \ 'Untracked' :'!', + \ 'Renamed' :'R', + \ 'Unmerged' :'=', + \ 'Deleted' :'D', + \ 'Dirty' :'X', + \ 'Ignored' :'?', + \ 'Clean' :'C', + \ 'Unknown' :'E' + \ } +endif + +function! gitstatus#getIndicator(status) abort + return get(get(g:, 'NERDTreeGitStatusIndicatorMapCustom', {}), + \ a:status, + \ s:indicatorMap[a:status]) +endfunction + +function! gitstatus#shouldConceal() abort + return has('conceal') && g:NERDTreeGitStatusConcealBrackets +endfunction diff --git a/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/autoload/gitstatus/doctor.vim b/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/autoload/gitstatus/doctor.vim new file mode 100644 index 0000000..1da3423 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/autoload/gitstatus/doctor.vim @@ -0,0 +1,167 @@ +" ============================================================================ +" File: autoload/gitstatus/doctor.vim +" Description: what does the doctor say? +" Maintainer: Xuyuan Pang +" License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +" ============================================================================ + +let s:types = { + \ 'NUMBER': type(0), + \ 'STRING': type(''), + \ 'FUNCREF': type(function('tr')), + \ 'LIST': type([]), + \ 'DICT': type({}), + \ 'FLOAT': type(0.0), + \ 'BOOL': type(v:true), + \ 'NULL': type(v:null) + \ } + +let s:type_formatters = {} +let s:type_formatters[s:types.NUMBER] = { nbr -> string(nbr) } +let s:type_formatters[s:types.STRING] = { str -> printf("'%s'", str) } +let s:type_formatters[s:types.FUNCREF] = { fn -> string(fn) } +let s:type_formatters[s:types.LIST] = { lst -> s:prettifyList(lst, ' \ ', 0, ' ') } +let s:type_formatters[s:types.DICT] = { dct -> s:prettifyDict(dct, ' \ ', 0, ' ') } +let s:type_formatters[s:types.FLOAT] = { flt -> string(flt) } +let s:type_formatters[s:types.BOOL] = { bol -> bol ? 'v:true' : 'v:false' } +let s:type_formatters[s:types.NULL] = { nul -> string(nul) } + +function! s:get_git_version() abort + return split(system('git version'), "\n")[0] +endfunction + +function! s:get_git_status_output(workdir) abort + return system(join(gitstatus#util#BuildGitStatusCommand(a:workdir, g:), ' ')) +endfunction + +function! s:prettifyDict(obj, prefix, level, indent) abort + let l:prefix = a:prefix . repeat(a:indent, a:level) + if empty(a:obj) + return '{}' + endif + let l:res = "{\n" + for [l:key, l:val] in items(a:obj) + let l:type = type(l:val) + if l:type is# s:types.DICT + let l:val = s:prettifyDict(l:val, a:prefix, a:level + 1, a:indent) + elseif l:type is# s:types.LIST + let l:val = s:prettifyList(l:val, a:prefix , a:level + 1, a:indent) + else + let l:val = s:prettify(l:val) + endif + let l:res .= l:prefix . a:indent . "'" . l:key . "': " . l:val . ",\n" + endfor + let l:res .= l:prefix . '}' + return l:res +endfunction + +function! s:prettifyList(obj, prefix, level, indent) abort + let l:prefix = a:prefix . repeat(a:indent, a:level) + if empty(a:obj) + return '[]' + endif + let l:res = "[\n" + for l:val in a:obj + let l:type = type(l:val) + if l:type is# s:types.LIST + let l:val = s:prettifyList(l:val, a:prefix, a:level + 1, a:indent) + elseif l:type is# s:types.DICT + let l:val = s:prettifyDict(l:val, a:prefix, a:level + 1, a:indent) + else + let l:val = s:prettify(l:val) + endif + let l:res .= l:prefix . a:indent . l:val . ",\n" + endfor + let l:res .= l:prefix . ']' + return l:res +endfunction + +function! s:prettify(obj) abort + let l:type = type(a:obj) + return call(s:type_formatters[l:type], [a:obj]) +endfunction + +function! s:loaded_vim_devicons() abort + return get(g:, 'loaded_webdevicons', 0) && get(g:, 'webdevicons_enable', 0) && get(g:, 'webdevicons_enable_nerdtree', 0) +endfunction + +function! s:loaded_vim_nerdtree_syntax_highlight() abort + return exists('g:NERDTreeSyntaxEnabledExtensions') +endfunction + +function! s:loaded_vim_nerdtree_tabs() abort + return exists('g:nerdtree_tabs_open_on_gui_startup') +endfunction + +function! gitstatus#doctor#Say() abort + call g:NERDTree.MustBeOpen() + call g:NERDTree.CursorToTreeWin() + + let l:line = repeat('=', 80) + + echo has('nvim') ? 'Neovim:' : 'Vim:' + echo execute('version') + echo l:line + + echo 'NERDTree:' + echo 'version: ' . nerdtree#version() + echo 'root: ' . b:NERDTree.root.path.str() + + echo l:line + + echo 'Git:' + echo 'version: ' . s:get_git_version() + let l:git_workdir = get(g:, 'NTGitWorkdir', '') + echo 'workdir: ' . l:git_workdir + if !empty(l:git_workdir) + echo 'status output:' + echo s:get_git_status_output(l:git_workdir) + endif + + echo l:line + + echo 'Options:' + for [l:key, l:val] in items(g:) + if l:key =~# 'NERDTreeGitStatus*' + echo '' . l:key . ' = ' . s:prettify(l:val) + endif + endfor + + echo l:line + + echo 'Others:' + echo 'vim-devicons: ' . (s:loaded_vim_devicons() ? 'yes' : 'no') + if s:loaded_vim_devicons() + for [l:key, l:val] in items(g:) + if l:key =~# 'WebDevIconsNerdTree*' + echo '' . l:key . ' = ' . s:prettify(l:val) + endif + endfor + endif + + echo repeat('-', 40) + echo 'vim-nerdtree-syntax-highlight: ' . (s:loaded_vim_nerdtree_syntax_highlight() ? 'yes': 'no') + if s:loaded_vim_nerdtree_syntax_highlight() + for [l:key, l:val] in items(g:) + if l:key =~# 'NERDTreeSyntax*' + echo '' . l:key . ' = ' . s:prettify(l:val) + endif + endfor + endif + + echo repeat('-', 40) + echo 'vim-nerdtree-tabs: ' . (s:loaded_vim_nerdtree_tabs() ? 'yes': 'no') + if s:loaded_vim_nerdtree_tabs() + for [l:key, l:val] in items(g:) + if l:key =~# 'nerdtree_tabs_*' + echo '' . l:key . ' = ' . s:prettify(l:val) + endif + endfor + endif + + echo l:line +endfunction diff --git a/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/autoload/gitstatus/job.vim b/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/autoload/gitstatus/job.vim new file mode 100644 index 0000000..d5bf426 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/autoload/gitstatus/job.vim @@ -0,0 +1,131 @@ +" ============================================================================ +" File: autoload/gitstatus/job.vim +" Description: async-jobs +" Maintainer: Xuyuan Pang +" License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +" ============================================================================ +if exists('g:loaded_nerdtree_git_status_job') + finish +endif +let g:loaded_nerdtree_git_status_job = 1 + +" stolen from vim-plug +let s:nvim = has('nvim-0.2') || (has('nvim') && exists('*jobwait')) +let s:vim8 = has('patch-8.0.0039') && exists('*job_start') + +let s:Job = { + \ 'running': 0, + \ 'failed': 0, + \ 'chunks': [''], + \ 'err_chunks': [''], + \ } + +" disabled ProhibitImplicitScopeVariable because we will use lots of `self` +" disabled ProhibitUnusedVariable because lambda +" vint: -ProhibitImplicitScopeVariable -ProhibitUnusedVariable +function! s:newJob(name, opts) abort + return extend(deepcopy(s:Job), { + \ 'name': a:name, + \ 'opts': a:opts + \ }) +endfunction + +function! s:Job.onStdoutCB(data) abort + let self.chunks[-1] .= a:data[0] + call extend(self.chunks, a:data[1:]) +endfunction + +function! s:Job.onStderrCB(data) abort + let self.failed = self.failed || !s:isEOF(a:data) + let self.err_chunks[-1] .= a:data[0] + call extend(self.err_chunks, a:data[1:]) +endfunction + +function! s:Job.onExitCB() abort + let self.running = 0 + if self.failed + call self.onFailed() + else + call self.onSuccess() + endif +endfunction + +function! s:Job.onFailed() abort + if has_key(self.opts, 'on_failed_cb') + call call(self.opts.on_failed_cb, [self]) + endif +endfunction + +function! s:Job.onSuccess() abort + if has_key(self.opts, 'on_success_cb') + call call(self.opts.on_success_cb, [self]) + endif +endfunction + +if s:nvim + function! s:Job.run(cmd) abort + let jid = jobstart(a:cmd, { + \ 'on_stdout': {_job_id, data, _event -> self.onStdoutCB(data)}, + \ 'on_stderr': {_job_id, data, _event -> self.onStderrCB(data)}, + \ 'on_exit': {_job_id, _data, _event -> self.onExitCB()}, + \ }) + let self.id = jid + let self.running = jid > 0 + if jid <= 0 + let self.failed = 1 + let self.err_chunks = jid == 0 ? + \ ['invalid arguments'] : + \ ['command is not executable'] + call self.onExitCB() + endif + endfunction +elseif s:vim8 + function! s:Job.run(cmd) abort + let options = { + \ 'out_cb': { _ch, data -> self.onStdoutCB([data]) }, + \ 'err_cb': { _ch, data -> self.onStderrCB([data]) }, + \ 'close_cb': { _ch -> self.onExitCB() }, + \ 'out_mode': 'nl', + \ 'err_mode': 'nl', + \ } + if has('patch-8.1.350') + let options['noblock'] = 1 + endif + let jid = job_start(a:cmd, options) + if job_status(jid) ==# 'run' + let self.id = jid + let self.running = 1 + else + let self.running = 0 + let self.failed = 1 + let self.err_chunks = ['failed to start job'] + call self.onExitCB() + endif + endfunction +else + function! s:Job.run(cmd) abort + let output = substitute(system(join(a:cmd, ' ')), "\", "\n", 'g') + let self.failed = v:shell_error isnot# 0 + if self.failed + let self.err_chunks = [output] + else + let self.chunks = [output] + endif + call self.onExitCB() + endfunction +endif +" vint: +ProhibitImplicitScopeVariable +ProhibitUnusedVariable + +function! s:isEOF(data) abort + return len(a:data) == 1 && a:data[0] is# '' +endfunction + +function! gitstatus#job#Spawn(name, cmd, opts) abort + let l:job = s:newJob(a:name, a:opts) + call l:job.run(a:cmd) + return l:job +endfunction diff --git a/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/autoload/gitstatus/listener.vim b/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/autoload/gitstatus/listener.vim new file mode 100644 index 0000000..13e9d1e --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/autoload/gitstatus/listener.vim @@ -0,0 +1,112 @@ +" ============================================================================ +" File: autoload/gitstatus/listener.vim +" Description: nerdtree event listener +" Maintainer: Xuyuan Pang +" License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +" ============================================================================ +if exists('g:loaded_nerdtree_git_status_listener') + finish +endif +let g:loaded_nerdtree_git_status_listener = 1 + +let s:Listener = { + \ 'current': {}, + \ 'next': {}, + \ } + +" disabled ProhibitImplicitScopeVariable because we will use lots of `self` +" vint: -ProhibitImplicitScopeVariable +function! s:Listener.OnInit(event) abort + call self.callback(a:event) +endfunction + +function! s:Listener.OnRefresh(event) abort + call self.callback(a:event) +endfunction + +function! s:Listener.OnRefreshFlags(event) abort + call self.callback(a:event) +endfunction + +function! s:Listener.callback(event) abort + let l:path = a:event.subject + let l:indicator = self.getIndicatorByPath(l:path) + call l:path.flagSet.clearFlags('git') + if l:indicator !=# '' + if gitstatus#shouldConceal() + let l:indicator = printf(' %s ', l:indicator) + endif + call l:path.flagSet.addFlag('git', l:indicator) + endif +endfunction + +function!s:Listener.getIndicatorByPath(path) abort + let l:pathStr = gitstatus#util#FormatPath(a:path) + let l:statusKey = get(self.current, l:pathStr, '') + + if l:statusKey !=# '' + return gitstatus#getIndicator(l:statusKey) + endif + + if self.getOption('ShowClean', 0) + return gitstatus#getIndicator('Clean') + endif + + if self.getOption('ConcealBrackets', 0) && self.getOption('AlignIfConceal', 0) + return ' ' + endif + return '' +endfunction + +function! s:Listener.SetNext(cache) abort + let self.next = a:cache +endfunction + +function! s:Listener.HasPath(path_str) abort + return has_key(self.current, a:path_str) +endfunction + +function! s:Listener.changed() abort + return self.current !=# self.next +endfunction + +function! s:Listener.update() abort + let self.current = self.next +endfunction + +function! s:Listener.TryUpdateNERDTreeUI() abort + if !g:NERDTree.IsOpen() + return + endif + + if !self.changed() + return + endif + + call self.update() + + let l:winnr = winnr() + let l:altwinnr = winnr('#') + + try + call g:NERDTree.CursorToTreeWin() + call b:NERDTree.root.refreshFlags() + call NERDTreeRender() + finally + exec l:altwinnr . 'wincmd w' + exec l:winnr . 'wincmd w' + endtry +endfunction + +function! s:Listener.getOption(name, default) abort + return get(self.opts, 'NERDTreeGitStatus' . a:name, a:default) +endfunction +" vint: +ProhibitImplicitScopeVariable + +function! gitstatus#listener#New(opts) abort + return extend(deepcopy(s:Listener), {'opts': a:opts}) +endfunction diff --git a/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/autoload/gitstatus/log.vim b/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/autoload/gitstatus/log.vim new file mode 100644 index 0000000..56d4625 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/autoload/gitstatus/log.vim @@ -0,0 +1,56 @@ +" ============================================================================ +" File: autoload/gitstatus/job.vim +" Description: leveled-logger +" Maintainer: Xuyuan Pang +" License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +" ============================================================================ +if exists('g:loaded_nerdtree_git_status_log') + finish +endif +let g:loaded_nerdtree_git_status_log = 1 + +let s:debug = 0 | :lockvar s:debug +let s:info = 1 | :lockvar s:info +let s:warning = 2 | :lockvar s:warning +let s:error = 3 | :lockvar s:error + +let s:Logger = {} + +" vint: -ProhibitImplicitScopeVariable +function! s:Logger.output(level, msg) abort + if a:level < self.level + return + endif + echomsg '[nerdtree-git-status] ' . a:msg +endfunction + +function! s:Logger.debug(msg) abort + echohl LineNr | + \ call self.output(s:debug, a:msg) | + \ echohl None +endfunction + +function! s:Logger.info(msg) abort + call self.output(s:info, a:msg) +endfunction + +function! s:Logger.warning(msg) abort + echohl WarningMsg | + \ call self.output(s:warning, a:msg) | + \ echohl None +endfunction + +function! s:Logger.error(msg) abort + echohl ErrorMsg | + \ call self.output(s:error, a:msg) | + \ echohl None +endfunction +" vint: +ProhibitImplicitScopeVariable + +function! gitstatus#log#NewLogger(level) abort + return extend(copy(s:Logger), {'level': a:level}) +endfunction diff --git a/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/autoload/gitstatus/util.vim b/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/autoload/gitstatus/util.vim new file mode 100644 index 0000000..7d5ab15 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/autoload/gitstatus/util.vim @@ -0,0 +1,225 @@ +" ============================================================================ +" File: autoload/git_status/util.vim +" Description: utils +" Maintainer: Xuyuan Pang +" License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +" ============================================================================ +if exists('g:loaded_nerdtree_git_status_util') + finish +endif +let g:loaded_nerdtree_git_status_util = 1 + +" FUNCTION: gitstatus#utilFormatPath +" This function is used to format nerdtree.Path. +" For Windows, returns in format 'C:/path/to/file' +" +" ARGS: +" path: nerdtree.Path +" +" RETURNS: +" absolute path +if gitstatus#isWin() + if exists('+shellslash') + function! gitstatus#util#FormatPath(path) abort + let l:sslbak = &shellslash + try + set shellslash + return a:path.str() + finally + let &shellslash = l:sslbak + endtry + endfunction + else + function! gitstatus#util#FormatPath(path) abort + let l:pathStr = a:path.str() + let l:pathStr = a:path.WinToUnixPath(l:pathStr) + let l:pathStr = a:path.drive . l:pathStr + return l:pathStr + endfunction + endif +else + function! gitstatus#util#FormatPath(path) abort + return a:path.str() + endfunction +endif + +function! gitstatus#util#BuildGitWorkdirCommand(root, opts) abort + return [ + \ get(a:opts, 'NERDTreeGitStatusGitBinPath', 'git'), + \ '-C', a:root, + \ 'rev-parse', + \ '--show-toplevel', + \ ] +endfunction + +function! gitstatus#util#BuildGitStatusCommand(root, opts) abort + let l:cmd = [ + \ get(a:opts, 'NERDTreeGitStatusGitBinPath', 'git'), + \ '-C', a:root, + \ 'status', + \ '--porcelain' . (get(a:opts, 'NERDTreeGitStatusPorcelainVersion', 2) ==# 2 ? '=v2' : ''), + \ '-z' + \ ] + if has_key(a:opts, 'NERDTreeGitStatusUntrackedFilesMode') + let l:cmd += ['--untracked-files=' . a:opts['NERDTreeGitStatusUntrackedFilesMode']] + endif + + if get(a:opts, 'NERDTreeGitStatusShowIgnored', 0) + let l:cmd += ['--ignored=traditional'] + endif + + if has_key(a:opts, 'NERDTreeGitStatusIgnoreSubmodules') + let l:cmd += ['--ignore-submodules=' . a:opts['NERDTreeGitStatusIgnoreSubmodules']] + endif + + return l:cmd +endfunction + +function! gitstatus#util#ParseGitStatusLines(root, statusLines, opts) abort + let l:result = {} + let l:is_rename = 0 + for l:line in a:statusLines + if l:is_rename + call gitstatus#util#UpdateParentDirsStatus(l:result, a:root, a:root . '/' . l:line, 'Dirty', a:opts) + let l:is_rename = 0 + continue + endif + let [l:pathStr, l:statusKey] = gitstatus#util#ParseGitStatusLine(l:line, a:opts) + + let l:pathStr = a:root . '/' . l:pathStr + if l:pathStr[-1:-1] is# '/' + let l:pathStr = l:pathStr[:-2] + endif + let l:is_rename = l:statusKey is# 'Renamed' + let l:result[l:pathStr] = l:statusKey + + call gitstatus#util#UpdateParentDirsStatus(l:result, a:root, l:pathStr, l:statusKey, a:opts) + endfor + return l:result +endfunction + +let s:unmerged_status = { + \ 'DD': 1, + \ 'AU': 1, + \ 'UD': 1, + \ 'UA': 1, + \ 'DU': 1, + \ 'AA': 1, + \ 'UU': 1, + \ } + +" Function: s:getStatusKey() function {{{2 +" This function is used to get git status key +" +" Args: +" x: index tree +" y: work tree +" +"Returns: +" status key +" +" man git-status +" X Y Meaning +" ------------------------------------------------- +" [MD] not updated +" M [ MD] updated in index +" A [ MD] added to index +" D [ M] deleted from index +" R [ MD] renamed in index +" C [ MD] copied in index +" [MARC] index and work tree matches +" [ MARC] M work tree changed since index +" [ MARC] D deleted in work tree +" ------------------------------------------------- +" D D unmerged, both deleted +" A U unmerged, added by us +" U D unmerged, deleted by them +" U A unmerged, added by them +" D U unmerged, deleted by us +" A A unmerged, both added +" U U unmerged, both modified +" ------------------------------------------------- +" ? ? untracked +" ! ! ignored +" ------------------------------------------------- +function! s:getStatusKey(x, y) abort + let l:xy = a:x . a:y + if get(s:unmerged_status, l:xy, 0) + return 'Unmerged' + elseif l:xy ==# '??' + return 'Untracked' + elseif l:xy ==# '!!' + return 'Ignored' + elseif a:y ==# 'M' + return 'Modified' + elseif a:y ==# 'D' + return 'Deleted' + elseif a:y =~# '[RC]' + return 'Renamed' + elseif a:x ==# 'D' + return 'Deleted' + elseif a:x =~# '[MA]' + return 'Staged' + elseif a:x =~# '[RC]' + return 'Renamed' + else + return 'Unknown' + endif +endfunction + +function! gitstatus#util#ParseGitStatusLine(statusLine, opts) abort + if get(a:opts, 'NERDTreeGitStatusPorcelainVersion', 2) ==# 2 + if a:statusLine[0] ==# '1' + let l:statusKey = s:getStatusKey(a:statusLine[2], a:statusLine[3]) + let l:pathStr = a:statusLine[113:] + elseif a:statusLine[0] ==# '2' + let l:statusKey = 'Renamed' + let l:pathStr = a:statusLine[113:] + let l:pathStr = l:pathStr[stridx(l:pathStr, ' ')+1:] + elseif a:statusLine[0] ==# 'u' + let l:statusKey = 'Unmerged' + let l:pathStr = a:statusLine[161:] + elseif a:statusLine[0] ==# '?' + let l:statusKey = 'Untracked' + let l:pathStr = a:statusLine[2:] + elseif a:statusLine[0] ==# '!' + let l:statusKey = 'Ignored' + let l:pathStr = a:statusLine[2:] + else + throw '[nerdtree_git_status] unknown status: ' . a:statusLine + endif + return [l:pathStr, l:statusKey] + else + let l:pathStr = a:statusLine[3:] + let l:statusKey = s:getStatusKey(a:statusLine[0], a:statusLine[1]) + return [l:pathStr, l:statusKey] + endif +endfunction + +function! gitstatus#util#UpdateParentDirsStatus(cache, root, pathStr, statusKey, opts) abort + let l:dirtyPath = fnamemodify(a:pathStr, ':h') + let l:dir_dirty_only = get(a:opts, 'NERDTreeGitStatusDirDirtyOnly', 1) + while l:dirtyPath !=# a:root + let l:key = get(a:cache, l:dirtyPath, '') + if l:dir_dirty_only + if l:key ==# '' + let a:cache[l:dirtyPath] = 'Dirty' + else + return + endif + else + if l:key ==# '' + let a:cache[l:dirtyPath] = a:statusKey + elseif l:key ==# 'Dirty' || l:key ==# a:statusKey + return + else + let a:cache[l:dirtyPath] = 'Dirty' + endif + endif + let l:dirtyPath = fnamemodify(l:dirtyPath, ':h') + endwhile +endfunction diff --git a/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/nerdtree_plugin/git_status.vim b/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/nerdtree_plugin/git_status.vim new file mode 100644 index 0000000..2ca085f --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/nerdtree_plugin/git_status.vim @@ -0,0 +1,343 @@ +" ============================================================================ +" File: git_status.vim +" Description: plugin for NERD Tree that provides git status support +" Maintainer: Xuyuan Pang +" License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +" ============================================================================ +scriptencoding utf-8 + +if exists('g:loaded_nerdtree_git_status') + finish +endif +let g:loaded_nerdtree_git_status = 1 + +let s:is_win = gitstatus#isWin() + +" stolen from nerdtree +"Function: s:initVariable() function {{{2 +"This function is used to initialise a given variable to a given value. The +"variable is only initialised if it does not exist prior +" +"Args: +"var: the name of the var to be initialised +"value: the value to initialise var to +" +"Returns: +"1 if the var is set, 0 otherwise +function! s:initVariable(var, value) abort + if !exists(a:var) + exec 'let ' . a:var . ' = ' . "'" . substitute(a:value, "'", "''", 'g') . "'" + return 1 + endif + return 0 +endfunction + +let s:default_vals = { + \ 'g:NERDTreeGitStatusEnable': 1, + \ 'g:NERDTreeGitStatusUpdateOnWrite': 1, + \ 'g:NERDTreeGitStatusUpdateOnCursorHold': 1, + \ 'g:NERDTreeGitStatusShowIgnored': 0, + \ 'g:NERDTreeGitStatusUseNerdFonts': 0, + \ 'g:NERDTreeGitStatusDirDirtyOnly': 1, + \ 'g:NERDTreeGitStatusConcealBrackets': 0, + \ 'g:NERDTreeGitStatusAlignIfConceal': 1, + \ 'g:NERDTreeGitStatusShowClean': 0, + \ 'g:NERDTreeGitStatusLogLevel': 2, + \ 'g:NERDTreeGitStatusPorcelainVersion': 2, + \ 'g:NERDTreeGitStatusMapNextHunk': ']c', + \ 'g:NERDTreeGitStatusMapPrevHunk': '[c', + \ 'g:NERDTreeGitStatusUntrackedFilesMode': 'normal', + \ 'g:NERDTreeGitStatusGitBinPath': 'git', + \ } + +for [s:var, s:value] in items(s:default_vals) + call s:initVariable(s:var, s:value) +endfor + +let s:logger = gitstatus#log#NewLogger(g:NERDTreeGitStatusLogLevel) + +function! s:deprecated(oldv, newv) abort + call s:logger.warning(printf("option '%s' is deprecated, please use '%s'", a:oldv, a:newv)) +endfunction + +function! s:migrateVariable(oldv, newv) abort + if exists(a:oldv) + call s:deprecated(a:oldv, a:newv) + exec 'let ' . a:newv . ' = ' . a:oldv + return 1 + endif + return 0 +endfunction + +let s:need_migrate_vals = { + \ 'g:NERDTreeShowGitStatus': 'g:NERDTreeGitStatusEnable', + \ 'g:NERDTreeUpdateOnWrite': 'g:NERDTreeGitStatusUpdateOnWrite', + \ 'g:NERDTreeMapNextHunk': 'g:NERDTreeGitStatusMapNextHunk', + \ 'g:NERDTreeMapPrevHunk': 'g:NERDTreeGitStatusMapPrevHunk', + \ 'g:NERDTreeShowIgnoredStatus': 'g:NERDTreeGitStatusShowIgnored', + \ 'g:NERDTreeIndicatorMapCustom': 'g:NERDTreeGitStatusIndicatorMapCustom', + \ } + +for [s:oldv, s:newv] in items(s:need_migrate_vals) + call s:migrateVariable(s:oldv, s:newv) +endfor + +if !g:NERDTreeGitStatusEnable + finish +endif + +if !executable(g:NERDTreeGitStatusGitBinPath) + call s:logger.error('git command not found') + finish +endif + +" FUNCTION: path2str +" This function is used to format nerdtree.Path. +" For Windows, returns in format 'C:/path/to/file' +" +" ARGS: +" path: nerdtree.Path +" +" RETURNS: +" absolute path +function! s:path2str(path) abort + return gitstatus#util#FormatPath(a:path) +endfunction + +" disable ProhibitUnusedVariable because these three functions used to callback +" vint: -ProhibitUnusedVariable +function! s:onGitWorkdirSuccessCB(job) abort + let g:NTGitWorkdir = split(join(a:job.chunks, ''), "\n")[0] + call s:logger.debug(printf("'%s' is in a git repo: '%s'", a:job.opts.cwd, g:NTGitWorkdir)) + call s:enableLiveUpdate() + + call s:refreshGitStatus('init', g:NTGitWorkdir) +endfunction + +function! s:onGitWorkdirFailedCB(job) abort + let l:errormsg = join(a:job.err_chunks, '') + if l:errormsg =~# 'fatal: Not a git repository' + call s:logger.debug(printf("'%s' is not in a git repo", a:job.opts.cwd)) + endif + call s:disableLiveUpdate() + unlet! g:NTGitWorkdir +endfunction + +function! s:getGitWorkdir(ntRoot) abort + call gitstatus#job#Spawn('git-workdir', + \ s:buildGitWorkdirCommand(a:ntRoot), + \ { + \ 'on_success_cb': function('s:onGitWorkdirSuccessCB'), + \ 'on_failed_cb': function('s:onGitWorkdirFailedCB'), + \ 'cwd': a:ntRoot, + \ }) +endfunction +" vint: +ProhibitUnusedVariable + +function! s:buildGitWorkdirCommand(root) abort + return gitstatus#util#BuildGitWorkdirCommand(a:root, g:) +endfunction + +function! s:buildGitStatusCommand(workdir) abort + return gitstatus#util#BuildGitStatusCommand(a:workdir, g:) +endfunction + +function! s:refreshGitStatus(name, workdir) abort + let l:opts = { + \ 'on_failed_cb': function('s:onGitStatusFailedCB'), + \ 'on_success_cb': function('s:onGitStatusSuccessCB'), + \ 'cwd': a:workdir + \ } + let l:job = gitstatus#job#Spawn(a:name, s:buildGitStatusCommand(a:workdir), l:opts) + return l:job +endfunction + +" vint: -ProhibitUnusedVariable +function! s:onGitStatusSuccessCB(job) abort + if !exists('g:NTGitWorkdir') || g:NTGitWorkdir !=# a:job.opts.cwd + call s:logger.debug(printf("git workdir has changed: '%s' -> '%s'", a:job.opts.cwd, get(g:, 'NTGitWorkdir', ''))) + return + endif + let l:output = join(a:job.chunks, '') + let l:lines = split(l:output, "\n") + let l:cache = gitstatus#util#ParseGitStatusLines(a:job.opts.cwd, l:lines, g:) + + call s:listener.SetNext(l:cache) + call s:listener.TryUpdateNERDTreeUI() +endfunction + +function! s:onGitStatusFailedCB(job) abort + let l:errormsg = join(a:job.err_chunks, '') + if l:errormsg =~# "error: option `porcelain' takes no value" + call s:logger.error(printf("'git status' command failed, please upgrade your git binary('v2.11.0' or higher) or set option 'g:NERDTreeGitStatusPorcelainVersion' to 1 in vimrc")) + call s:disableLiveUpdate() + unlet! g:NTGitWorkdir + elseif l:errormsg =~# '^warning: could not open .* Permission denied' + call s:onGitStatusSuccessCB(a:job) + else + call s:logger.error(printf('job[%s] failed: %s', a:job.name, l:errormsg)) + endif +endfunction + +" FUNCTION: s:onCursorHold(fname) {{{2 +function! s:onCursorHold(fname) + " Do not update when a special buffer is selected + if !empty(&l:buftype) + return + endif + let l:fname = s:is_win ? + \ substitute(a:fname, '\', '/', 'g') : + \ a:fname + + if !exists('g:NTGitWorkdir') || !s:hasPrefix(l:fname, g:NTGitWorkdir) + return + endif + + let l:job = s:refreshGitStatus('cursor-hold', g:NTGitWorkdir) + call s:logger.debug('run cursor-hold job: ' . l:job.id) +endfunction + +" FUNCTION: s:onFileUpdate(fname) {{{2 +function! s:onFileUpdate(fname) + let l:fname = s:is_win ? + \ substitute(a:fname, '\', '/', 'g') : + \ a:fname + if !exists('g:NTGitWorkdir') || !s:hasPrefix(l:fname, g:NTGitWorkdir) + return + endif + let l:job = s:refreshGitStatus('file-update', g:NTGitWorkdir) + call s:logger.debug('run file-update job: ' . l:job.id) +endfunction +" vint: +ProhibitUnusedVariable + +function! s:hasPrefix(text, prefix) abort + return len(a:text) >= len(a:prefix) && a:text[:len(a:prefix)-1] ==# a:prefix +endfunction + +function! s:setupNERDTreeListeners(listener) abort + call g:NERDTreePathNotifier.AddListener('init', a:listener.OnInit) + call g:NERDTreePathNotifier.AddListener('refresh', a:listener.OnRefresh) + call g:NERDTreePathNotifier.AddListener('refreshFlags', a:listener.OnRefreshFlags) +endfunction + +" FUNCTION: s:findHunk(node, direction) +" Args: +" node: the current node +" direction: next(>0) or prev(<0) +" +" Returns: +" lineNum if the hunk found, -1 otherwise +function! s:findHunk(node, direction) abort + let l:ui = b:NERDTree.ui + let l:rootLn = l:ui.getRootLineNum() + let l:totalLn = line('$') + let l:currLn = l:ui.getLineNum(a:node) + let l:currLn = l:currLn <= l:rootLn ? l:rootLn+1 : l:currLn + let l:step = a:direction > 0 ? 1 : -1 + let l:lines = a:direction > 0 ? + \ range(l:currLn+1, l:totalLn, l:step) + range(l:rootLn+1, l:currLn-1, l:step) : + \ range(l:currLn-1, l:rootLn+1, l:step) + range(l:totalLn, l:currLn+1, l:step) + for l:ln in l:lines + let l:path = s:path2str(l:ui.getPath(l:ln)) + if s:listener.HasPath(l:path) + return l:ln + endif + endfor + return -1 +endfunction + +" vint: -ProhibitUnusedVariable +" FUNCTION: s:jumpToNextHunk(node) {{{2 +function! s:jumpToNextHunk(node) + let l:ln = s:findHunk(a:node, 1) + if l:ln > 0 + exec '' . l:ln + call s:logger.info('Jump to next hunk') + endif +endfunction + +" FUNCTION: s:jumpToPrevHunk(node) {{{2 +function! s:jumpToPrevHunk(node) + let l:ln = s:findHunk(a:node, -1) + if l:ln > 0 + exec '' . l:ln + call s:logger.info('Jump to prev hunk') + endif +endfunction +" vint: +ProhibitUnusedVariable + +" Function: s:SID() {{{2 +function s:SID() + if !exists('s:sid') + let s:sid = matchstr(expand(''), '\zs\d\+\ze_SID$') + endif + return s:sid +endfun + +" FUNCTION: s:setupNERDTreeKeyMappings {{{2 +function! s:setupNERDTreeKeyMappings() + let l:s = '' . s:SID() . '_' + + call NERDTreeAddKeyMap({ + \ 'key': g:NERDTreeGitStatusMapNextHunk, + \ 'scope': 'Node', + \ 'callback': l:s.'jumpToNextHunk', + \ 'quickhelpText': 'Jump to next git hunk' }) + + call NERDTreeAddKeyMap({ + \ 'key': g:NERDTreeGitStatusMapPrevHunk, + \ 'scope': 'Node', + \ 'callback': l:s.'jumpToPrevHunk', + \ 'quickhelpText': 'Jump to prev git hunk' }) +endfunction + + +" I don't know why, but vint said they are unused. +" vint: -ProhibitUnusedVariable +function! s:onNERDTreeDirChanged(path) abort + call s:getGitWorkdir(a:path) +endfunction + +function! s:onNERDTreeInit(path) abort + call s:getGitWorkdir(a:path) +endfunction +" vint: +ProhibitUnusedVariable + +function! s:enableLiveUpdate() abort + augroup nerdtreegitplugin_liveupdate + autocmd! + if g:NERDTreeGitStatusUpdateOnWrite + autocmd BufWritePost * silent! call s:onFileUpdate(expand('%:p')) + endif + + if g:NERDTreeGitStatusUpdateOnCursorHold + autocmd CursorHold * silent! call s:onCursorHold(expand('%:p')) + endif + + " TODO: is it necessary to pass the buffer name? + autocmd User FugitiveChanged silent! call s:onFileUpdate(expand('%:p')) + + autocmd BufEnter NERD_tree_* call s:onNERDTreeInit(s:path2str(b:NERDTree.root.path)) + augroup end +endfunction + +function! s:disableLiveUpdate() abort + augroup nerdtreegitplugin_liveupdate + autocmd! + augroup end +endfunction + +augroup nerdtreegitplugin + autocmd! + autocmd User NERDTreeInit call s:onNERDTreeInit(s:path2str(b:NERDTree.root.path)) + autocmd User NERDTreeNewRoot call s:onNERDTreeDirChanged(s:path2str(b:NERDTree.root.path)) +augroup end + +call s:setupNERDTreeKeyMappings() + +let s:listener = gitstatus#listener#New(g:) +call s:setupNERDTreeListeners(s:listener) diff --git a/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/tests/.themisrc b/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/tests/.themisrc new file mode 100644 index 0000000..bfaca4e --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/tests/.themisrc @@ -0,0 +1,4 @@ +if exists('$THEMIS_PROFILE') + execute 'profile' 'start' $THEMIS_PROFILE + profile! file ./autoload/* +endif diff --git a/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/tests/test_all.vim b/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/tests/test_all.vim new file mode 100644 index 0000000..d9e4dd6 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree-git-plugin/tests/test_all.vim @@ -0,0 +1,109 @@ +let s:suite = themis#suite('Test for nerdtree-git-plugin') +let s:assert = themis#helper('assert') +call themis#helper('command').with(s:) + +function! s:suite.Initializing() abort + NERDTreeFocus + call s:assert.exists('g:NERDTree') + call s:assert.exists('g:loaded_nerdtree_git_status') + call g:NERDTree.CursorToTreeWin() + call s:assert.exists('b:NERDTree') +endfunction + +function! s:suite.BuildGitWorkdirCommand() abort + let l:cmd = gitstatus#util#BuildGitWorkdirCommand('/workdir', {}) + call s:assert.equal(l:cmd, ['git', '-C', '/workdir', 'rev-parse', '--show-toplevel']) + + let l:cmd = gitstatus#util#BuildGitWorkdirCommand('/workdir', {'NERDTreeGitStatusGitBinPath': '/path/to/git'}) + call s:assert.equal(l:cmd, ['/path/to/git', '-C', '/workdir', 'rev-parse', '--show-toplevel']) +endfunction + +function! s:suite.BuildGitStatusCommand() abort + let l:cmd = gitstatus#util#BuildGitStatusCommand('/workdir', {}) + call s:assert.equal(l:cmd, ['git', '-C', '/workdir', 'status', '--porcelain=v2', '-z']) + + let l:cmd = gitstatus#util#BuildGitStatusCommand('/workdir', { + \ 'NERDTreeGitStatusPorcelainVersion': 1 + \ }) + call s:assert.equal(l:cmd, ['git', '-C', '/workdir', 'status', '--porcelain', '-z']) + + let l:cmd = gitstatus#util#BuildGitStatusCommand('/workdir', { + \ 'NERDTreeGitStatusUntrackedFilesMode': 'all' + \ }) + call s:assert.equal(l:cmd, ['git', '-C', '/workdir', 'status', '--porcelain=v2', '-z', '--untracked-files=all']) + + let l:cmd = gitstatus#util#BuildGitStatusCommand('/workdir', { + \ 'NERDTreeGitStatusShowIgnored': 1 + \ }) + call s:assert.equal(l:cmd, ['git', '-C', '/workdir', 'status', '--porcelain=v2', '-z', '--ignored=traditional']) + + let l:cmd = gitstatus#util#BuildGitStatusCommand('/workdir', { + \ 'NERDTreeGitStatusShowIgnored': 0 + \ }) + call s:assert.equal(l:cmd, ['git', '-C', '/workdir', 'status', '--porcelain=v2', '-z']) + + let l:cmd = gitstatus#util#BuildGitStatusCommand('/workdir', { + \ 'NERDTreeGitStatusIgnoreSubmodules': 'dirty' + \ }) + call s:assert.equal(l:cmd, ['git', '-C', '/workdir', 'status', '--porcelain=v2', '-z', '--ignore-submodules=dirty']) + + let l:cmd = gitstatus#util#BuildGitStatusCommand('/workdir', { + \ 'NERDTreeGitStatusPorcelainVersion': 1, + \ 'NERDTreeGitStatusUntrackedFilesMode': 'all', + \ 'NERDTreeGitStatusShowIgnored': 1, + \ 'NERDTreeGitStatusIgnoreSubmodules': 'dirty' + \ }) + call s:assert.equal(l:cmd, ['git', '-C', '/workdir', 'status', '--porcelain', '-z', + \ '--untracked-files=all', + \ '--ignored=traditional', + \ '--ignore-submodules=dirty']) +endfunction + +function! s:suite.Logger() abort + let l:logger = gitstatus#log#NewLogger(1) " info + let l:messages = execute('messages') + + call l:logger.debug('debug') + call s:assert.equal(execute('messages'), l:messages) + + call l:logger.error('error') + call s:assert.equal(execute('messages'), l:messages . "\n[nerdtree-git-status] error") +endfunction + +function! s:suite.CustomIndicator() abort + let g:NERDTreeGitStatusIndicatorMapCustom = {'Untracked': '~'} + + let l:staged = gitstatus#getIndicator('Staged') + + call s:assert.equal(gitstatus#getIndicator('Staged'), l:staged) + call s:assert.equal(gitstatus#getIndicator('Untracked'), '~') + + " Vim(return):E716: Key not present in Dictionary + Throws /E716/ gitstatus#getIndicator('no such status') +endfunction + +function! s:suite.UpdateParentDirsStatus() abort + let l:opts = {'NERDTreeGitStatusDirDirtyOnly': 1} + let l:root = '/root' + let l:cache = {} + let l:pathStr = '/root/dir1/dir2/dir3' + let l:cache[l:pathStr] = 'Untracked' + call gitstatus#util#UpdateParentDirsStatus(l:cache, l:root, l:pathStr, 'Untracked', l:opts) + call s:assert.equal({'/root/dir1': 'Dirty', '/root/dir1/dir2': 'Dirty', '/root/dir1/dir2/dir3': 'Untracked'}, l:cache) + + let l:pathStr = '/root/dir1/dir2/file0' + let l:cache[l:pathStr] = 'Staged' + call gitstatus#util#UpdateParentDirsStatus(l:cache, l:root, l:pathStr, 'Staged', l:opts) + call s:assert.equal({'/root/dir1': 'Dirty', '/root/dir1/dir2': 'Dirty', '/root/dir1/dir2/dir3': 'Untracked', '/root/dir1/dir2/file0': 'Staged'}, l:cache) + + let l:opts = {'NERDTreeGitStatusDirDirtyOnly': 0} + let l:cache = {} + let l:pathStr = '/root/dir1/dir2/dir3' + let l:cache[l:pathStr] = 'Untracked' + call gitstatus#util#UpdateParentDirsStatus(l:cache, l:root, l:pathStr, 'Untracked', l:opts) + call s:assert.equal({'/root/dir1': 'Untracked', '/root/dir1/dir2': 'Untracked', '/root/dir1/dir2/dir3': 'Untracked'}, l:cache) + + let l:cache['/root/dir1/file1'] = 'Staged' + call gitstatus#util#UpdateParentDirsStatus(l:cache, l:root, '/root/dir1/file1', 'Staged', l:opts) + call s:assert.equal({'/root/dir1': 'Dirty','/root/dir1/file1': 'Staged', '/root/dir1/dir2': 'Untracked', '/root/dir1/dir2/dir3': 'Untracked'}, l:cache) +endfunction diff --git a/home-rc/dot-files/.vim/bundle/nerdtree/.github/ISSUE_TEMPLATE/bug.md b/home-rc/dot-files/.vim/bundle/nerdtree/.github/ISSUE_TEMPLATE/bug.md new file mode 100644 index 0000000..e2ce07b --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree/.github/ISSUE_TEMPLATE/bug.md @@ -0,0 +1,46 @@ +--- +name: "Bug Report" +about: "NERDTree is misbehaving? Tell us about it." +labels: bug +--- + + +#### Self-Diagnosis +Before creating an issue, take some time to search these resources for an answer. It's possible that someone else has already seen and solved your issue. +- [old NERDTree issues](https://github.com/preservim/nerdtree/issues?q=is%3Aissue) +- NERDTree documentation - `:h NERDTree` +- [NERDTree Wiki](https://github.com/preservim/nerdtree/wiki) +- Other resources: , , etc. + +#### Environment +- Operating System: +- Vim/Neovim version `:version`: +- NERDTree version, found on first line of quickhelp `?`: +- Are you using any of these NERDTree-dependent plugins? + - [ ] [Xuyuanp/nerdtree-git-plugin](https://github.com/Xuyuanp/nerdtree-git-plugin) + - [ ] [ryanoasis/vim-devicons](https://github.com/ryanoasis/vim-devicons) + - [ ] [tiagofumo/vim-nerdtree-syntax-highlight](https://github.com/tiagofumo/vim-nerdtree-syntax-highlight) + - [ ] [scrooloose/nerdtree-project-plugin](https://github.com/scrooloose/nerdtree-project-plugin) + - [ ] [PhilRunninger/nerdtree-buffer-ops](https://github.com/PhilRunninger/nerdtree-buffer-ops) + - [ ] [PhilRunninger/nerdtree-visual-selection](https://github.com/PhilRunninger/nerdtree-visual-selection) + - [ ] [jistr/vim-nerdtree-tabs](https://github.com/jistr/vim-nerdtree-tabs) + - [ ] Others (specify): +- Provide a minimal **.vimrc** file that will reproduce the issue. +```vim +``` + +#### Steps to Reproduce the Issue +1. + +#### Current Behavior (Include screenshots where appropriate.) + +#### Expected Result + diff --git a/home-rc/dot-files/.vim/bundle/nerdtree/.github/ISSUE_TEMPLATE/feature_request.md b/home-rc/dot-files/.vim/bundle/nerdtree/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..35db0f6 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,8 @@ +--- +name: "Feature Request" +about: "What new feature are you requesting for NERDTree?" +labels: "feature request" +--- + +#### Description + diff --git a/home-rc/dot-files/.vim/bundle/nerdtree/.github/ISSUE_TEMPLATE/question.md b/home-rc/dot-files/.vim/bundle/nerdtree/.github/ISSUE_TEMPLATE/question.md new file mode 100644 index 0000000..7e13b7a --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree/.github/ISSUE_TEMPLATE/question.md @@ -0,0 +1,13 @@ +--- +name: "General Question" +about: "Having trouble setting up NERDTree? Need clarification on a setting? Ask your question here." +labels: "general question" +--- +Before creating an issue, take some time to search these resources. It's possible that someone else has already asked your question and gotten an answer. +- [old NERDTree issues](https://github.com/preservim/nerdtree/issues?q=is%3Aissue) +- NERDTree documentation - `:h NERDTree` +- [NERDTree Wiki](https://github.com/preservim/nerdtree/wiki) +- Other resource: , , etc. + +#### State Your Question + diff --git a/home-rc/dot-files/.vim/bundle/nerdtree/.github/PULL_REQUEST_TEMPLATE.md b/home-rc/dot-files/.vim/bundle/nerdtree/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..d2e3b7d --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,22 @@ +### Description of Changes +Closes # + + +--- +### New Version Info + +#### Author's Instructions +- [ ] Derive a new `MAJOR.MINOR.PATCH` version number. Increment the: + - `MAJOR` version when you make incompatible API changes + - `MINOR` version when you add functionality in a backwards-compatible manner + - `PATCH` version when you make backwards-compatible bug fixes +- [ ] Update [CHANGELOG.md](https://github.com/scrooloose/nerdtree/blob/master/CHANGELOG.md), following the established pattern. +#### Collaborator's Instructions +- [ ] Review [CHANGELOG.md](https://github.com/scrooloose/nerdtree/blob/master/CHANGELOG.md), suggesting a different version number if necessary. +- [ ] After merging, tag the commit using these (Mac-compatible) bash commands: + ```bash + git checkout master + git pull + sed -n "$(grep -n -m2 '####' CHANGELOG.md | cut -f1 -d: | sed 'N;s/\n/,/')p" CHANGELOG.md | sed '$d' + git tag -a $(read -p "Tag Name: " tag;echo $tag) -m"$(git show --quiet --pretty=%s)";git push origin --tags + ``` diff --git a/home-rc/dot-files/.vim/bundle/nerdtree/.github/workflows/vint.yml b/home-rc/dot-files/.vim/bundle/nerdtree/.github/workflows/vint.yml new file mode 100644 index 0000000..36d7258 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree/.github/workflows/vint.yml @@ -0,0 +1,15 @@ +name: Vint +on: [push, pull_request] +jobs: + vint: + strategy: + fail-fast: false + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@master + - name: Run vint with reviewdog + uses: reviewdog/action-vint@v1.0.1 + with: + github_token: ${{ secrets.github_token }} + reporter: github-pr-review diff --git a/home-rc/dot-files/.vim/bundle/nerdtree/.gitignore b/home-rc/dot-files/.vim/bundle/nerdtree/.gitignore new file mode 100644 index 0000000..3698c0e --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree/.gitignore @@ -0,0 +1,3 @@ +*~ +*.swp +tags diff --git a/home-rc/dot-files/.vim/bundle/nerdtree/.vintrc.yaml b/home-rc/dot-files/.vim/bundle/nerdtree/.vintrc.yaml new file mode 100644 index 0000000..c44b6ab --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree/.vintrc.yaml @@ -0,0 +1,5 @@ +cmdargs: + severity: style_problem + color: true + env: + neovim: false diff --git a/home-rc/dot-files/.vim/bundle/nerdtree/CHANGELOG.md b/home-rc/dot-files/.vim/bundle/nerdtree/CHANGELOG.md new file mode 100644 index 0000000..6e6893a --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree/CHANGELOG.md @@ -0,0 +1,307 @@ +# NERDTree Change Log + +#### 6.10 +- **.16**: Fix documentation errors. (lifecrisis) [#1269](https://github.com/preservim/nerdtree/pull/1269) +- **.15**: Ensure backward compatible testing of types. (lifecrisis) [#1266](https://github.com/preservim/nerdtree/pull/1266) +- **.14**: Replace trim() with a version-compatible alternative. (PhilRunninger) [#1265](https://github.com/preservim/nerdtree/pull/1265) +- **.13**: Change highlighting of bookmarks in the tree. (PhilRunninger) [#1261](https://github.com/preservim/nerdtree/pull/1261) +- **.12**: Answer the question about accessing files over scp or ftp. (PhilRunninger) [#1259](https://github.com/preservim/nerdtree/pull/1259) +- **.11**: Trim filenames created via the fs_menu (elanorigby) [#1243](https://github.com/preservim/nerdtree/pull/1243) +- **.10**: Improve F.A.Q. Answers and Issue Templates (PhilRunninger) [#1249](https://github.com/preservim/nerdtree/pull/1249) +- **.9**: `go` on a bookmark directory will NERDTreeFind it. (PhilRunninger) [#1236](https://github.com/preservim/nerdtree/pull/1236) +- **.8**: Put `Callback` function variables in local scope. (PhilRunninger) [#1230](https://github.com/preservim/nerdtree/pull/1230) +- **.7**: Fix mouse-clicking a file to open it. (PhilRunninger) [#1225](https://github.com/preservim/nerdtree/pull/1225) +- **.6**: Restore the default behavior of the `` key. (PhilRunninger) [#1221](https://github.com/preservim/nerdtree/pull/1221) +- **.5**: Fix `{'keepopen':0}` in NERDTreeCustomOpenArgs (PhilRunninger) [#1217](https://github.com/preservim/nerdtree/pull/1217) +- **.4**: Removed directory separator from sort key (Daniel E) [#1219](https://github.com/preservim/nerdtree/pull/1219) +- **.3**: Add new FAQ and answer: How to prevent buffers replacing NERDTree. (PhilRunninger) [#1215](https://github.com/preservim/nerdtree/pull/1215) +- **.2**: New menu command: Run a system command in this directory. (PhilRunninger) [#1214](https://github.com/preservim/nerdtree/pull/1214) +- **.1**: Escape quotation marks so they can be used in key mappings. (PhilRunninger) [#1213](https://github.com/preservim/nerdtree/pull/1213) +- **.0**: Enable full path specifications for NERDTreeIgnore (PhilRunninger) [#1207](https://github.com/preservim/nerdtree/pull/1207) +#### 6.9 +- **.12**: Respect NERDTreeCustomOpenArgs when opening bookmark (przepompownia) [#1200](https://github.com/preservim/nerdtree/pull/1200) +- **.11**: Revamp the README. (buncis, PhilRunninger) [#1192](https://github.com/preservim/nerdtree/pull/1192), [#1193](https://github.com/preservim/nerdtree/pull/1193) +- **.10**: Open a mirrored NERDTree with correct width (PhilRunninger) [#1177](https://github.com/preservim/nerdtree/pull/1177) +- **.9**: Updated Readme, removed typo (H3RSKO) [#1167](https://github.com/preservim/nerdtree/pull/1167) +- **.8**: Refactor sort comparison functions, removing redundancy (PhilRunninger) [#1166](https://github.com/preservim/nerdtree/pull/1166) +- **.7**: Fix argument of `exists()` function calls checking for autocommands. (PhilRunninger) [#1165](https://github.com/preservim/nerdtree/pull/1165) +- **.6**: Don't use silent when raising User events (PhilRunninger) [#1164](https://github.com/preservim/nerdtree/pull/1164) +- **.5**: Fix highlight for file node. (pirey) [#1157](https://github.com/preservim/nerdtree/pull/1157) +- **.4**: Make sure symbolic links' flags are highlighted correctly. (PhilRunninger) [#1156](https://github.com/preservim/nerdtree/pull/1156) +- **.3**: Fix new NERDTrees' width when previous one was in the only window. (PhilRunninger) [#1153](https://github.com/preservim/nerdtree/pull/1153) +- **.2**: Fix the scope of several key mappings (lifecrisis, PhilRunninger) [#1151](https://github.com/preservim/nerdtree/pull/1151) +- **.1**: Respect user's `&shellslash` setting in CopyNode and RemoveNode functions (PhilRunninger) [#1150](https://github.com/preservim/nerdtree/pull/1150) +- **.0**: Enable opening bookmarks in split windows. (PhilRunninger) [#1144](https://github.com/preservim/nerdtree/pull/1144) +#### 6.8 +- **.0**: Allow concealed characters to show another character. (PhilRunninger) [#1138](https://github.com/preservim/nerdtree/pull/1138) +#### 6.7 +- **.15**: Add curly braces to the list of characters to be escaped. (PhilRunninger) [#1128](https://github.com/preservim/nerdtree/pull/1128) +- **.14**: Use backward-compatible `nerdtree#and()` in one place that was missed. (PhilRunninger) [#1134](https://github.com/preservim/nerdtree/pull/1134) +- **.13**: `cmd.exe /c start "" ` for windows default viewer support. (J. Altayó) [#1130](https://github.com/preservim/nerdtree/pull/1130) +- **.12**: Fixed a bug that caused the file-tree construction to slow down significantly. (Eugenij-W) [#1126](https://github.com/preservim/nerdtree/pull/1126) +- **.11**: Fix exception in NERDTreeFind (on windows OS and If the file is located in the root directory of the disk) (Eugenij-W) [#1122](https://github.com/preservim/nerdtree/pull/1122) +- **.10**: Do not consider the tree root to be "cascadable". (lifecrisis) [#1120](https://github.com/preservim/nerdtree/pull/1120) +- **.9**: Force `:NERDTreeFocus` to allow events to be fired when switching windows. (PhilRunninger) [#1118](https://github.com/preservim/nerdtree/pull/1118) +- **.8**: Fix example code for the `NERDTreeAddKeyMap()` function. (PhilRunninger) [#1116](https://github.com/preservim/nerdtree/pull/1116) +- **.7**: Put `'%'` argument in `bufname()` for backwards compatibility. (PhilRunninger) [#1105](https://github.com/preservim/nerdtree/pull/1105) +- **.6**: If a file's already open in the window, don't edit it again. (PhilRunninger) [#1103](https://github.com/preservim/nerdtree/pull/1103) +- **.5**: Prevent unneeded tree creation in `:NERDTreeToggle[VCS] ` (PhilRunninger) [#1101](https://github.com/preservim/nerdtree/pull/1101) +- **.4**: Add missing calls to the `shellescape()` function (lifecrisis) [#1099](https://github.com/preservim/nerdtree/pull/1099) +- **.3**: Fix vsplit to not open empty buffers when opening previously closed file (AwkwardKore) [#1098](https://github.com/preservim/nerdtree/pull/1098) +- **.2**: Fix infinity loop (on winvim) in FindParentVCSRoot (Eugenij-W) [#1095](https://github.com/preservim/nerdtree/pull/1095) +- **.1**: File Move: Escape existing directory name when looking for open files. (PhilRunninger) [#1094](https://github.com/preservim/nerdtree/pull/1094) +- **.0**: Open the parent directory when revealing a non-existent file with :NERDTreeFind (bouk) [#1090](https://github.com/preservim/nerdtree/pull/1090) +#### 6.6 +- **.1**: [add] How to install using dein.vim (kazukazuinaina) [#1087](https://github.com/preservim/nerdtree/pull/1087) +- **.0**: Add the ability to turn off directory arrows (PhilRunninger) [#1085](https://github.com/preservim/nerdtree/pull/1085) +#### 6.5 +- **.0**: `NERDTreeToggle ` always sets NERDTree root. (PhilRunninger) [#1083](https://github.com/preservim/nerdtree/pull/1083) +#### 6.4 +- **.6**: NERDTreeFind shows expected message if file doesn't exist e.g. with vim-startify (andys8). [#1081](https://github.com/preservim/nerdtree/pull/1081) +- **.5**: Ensure events are (or aren't) being ignored correctly. (PhilRunninger) [#1080](https://github.com/preservim/nerdtree/pull/1080) +- **.4**: Prevent overwriting existing files/dirs on node move. (PhilRunninger) [#1079](https://github.com/preservim/nerdtree/pull/1079) +- **.3**: Fix regex that finds keyword for minimal menu. (PhilRunninger) [#1075](https://github.com/preservim/nerdtree/pull/1075) +- **.2**: Lint vimscript, fix errors and warnings, add CI job to review PRs (Caleb Maclennan) [#1071](https://github.com/preservim/nerdtree/pull/1071) +- **.1**: Ensure backward compatibility. v:t_func is not available before Vim 8.0 (Phil Runninger) +- **.0**: Allow use of function references as callbacks (HiPhish) [#1067](https://github.com/preservim/nerdtree/pull/1067) +#### 6.3 +- **.0**: Add new command that behaves like NERDTreeToggle but defaults to the root of a VCS repository. (willfindlay) [#1060](https://github.com/preservim/nerdtree/pull/1060) +#### 6.2 +- **.1**: Menu option, 'copy path to clipboard' is aware of VIM clipboard option (jhzn) [#1056](https://github.com/preservim/nerdtree/pull/1056) +- **.0**: Support tab-specific CWDs (PhilRunninger) [#1032](https://github.com/preservim/nerdtree/pull/1032) +#### 6.1 +- **.4**: Add VIM built-in package management to read me file. (pesarkhobeee) [#1049](https://github.com/preservim/nerdtree/pull/1049) +- **.3**: Save/Set screen state also on WinLeave and WinEnter. (PhilRunninger) [#1048](https://github.com/preservim/nerdtree/pull/1048) +- **.2**: Wrap saveScreenState's statements in a try-catch block. (PhilRunninger) [#1047](https://github.com/preservim/nerdtree/pull/1047) +- **.1**: Catch errors when trying to read CHANGELOG.md. (PhilRunninger) [#1045](https://github.com/preservim/nerdtree/pull/1045) +- **.0**: If file path doesn't exist, :NERDTreeFind its parent directory instead. (PhilRunninger) [#1043](https://github.com/preservim/nerdtree/pull/1043) +#### 6.0 +- **.1**: Reintroduce necessary variable mistakenly removed. (PhilRunninger) [#1040](https://github.com/preservim/nerdtree/pull/1040) +- **.0**: Make the behavior of window splits consistent (dragonxlwang, PhilRunninger) [#1035](https://github.com/preservim/nerdtree/pull/1035) +#### 5.3 +- **.3**: Fix (p)ath not displaying in the minimal menu (tuzz) [#1038](https://github.com/preservim/nerdtree/pull/1038) +- **.2**: Enable events when closing NerdTree window. (PhilRunninger) [#1037](https://github.com/preservim/nerdtree/pull/1037) +- **.1**: Fix the `e` key mapping to use netrw if desired (PhilRunninger) [#1031](https://github.com/preservim/nerdtree/pull/1031) +- **.0**: Add file extension and size to sorting capabilities (PhilRunninger) [#1029](https://github.com/preservim/nerdtree/pull/1029) +#### 5.2 +- **.9**: Suppress events for intermediate window/tab/buffer changes (PhilRunninger) [#1026](https://github.com/preservim/nerdtree/pull/1026) +- **.8**: Revert [#1019](https://github.com/preservim/nerdtree/pull/1019) to fix nvim artifacts and flickering. (PhilRunninger) [#1021](https://github.com/preservim/nerdtree/pull/1021) +- **.7**: Use :mode only in neovim. MacVim still needs to use :redraw! (PhilRunninger) [#1019](https://github.com/preservim/nerdtree/pull/1019) +- **.6**: In CHANGELOG.md and PR template, make reference to PR a true HTML link. (PhilRunninger) [#1017](https://github.com/preservim/nerdtree/pull/1017) +- **.5**: Use `:mode` instead of `:redraw!` when updating menu. (PhilRunninger) [#1016](https://github.com/preservim/nerdtree/pull/1016) +- **.4**: When searching for root line num, stop at end of file. (PhilRunninger) [#1015](https://github.com/preservim/nerdtree/pull/1015) +- **.3**: Fix `` key map on the bookmark (lkebin) [#1014](https://github.com/preservim/nerdtree/pull/1014) +- **.2**: Make Enter work on the `.. ( up a dir )` line (PhilRunninger) [#1013](https://github.com/preservim/nerdtree/pull/1013) +- **.1**: Fix nerdtree#version() on Windows. (PhilRunninger) +- **.0**: Expand functionality of `` mapping. (PhilRunninger) [#1011](https://github.com/preservim/nerdtree/pull/1011) +#### 5.1 +- **.3**: Remove @mentions from PR template and change log. They weren't working. (PhilRunninger) [#1009](https://github.com/preservim/nerdtree/pull/1009) +- **.2**: Fix NERDTree opening with the wrong size. (PhilRunninger) [#1008](https://github.com/preservim/nerdtree/pull/1008) +- **.1**: Update Changelog and create PR Template (PhilRunninger) [#1007](https://github.com/preservim/nerdtree/pull/1007) +- **.0**: Too many changes for one patch... + - Refresh a dir_node if the file wasn't found in it, and look once more. (PhilRunninger) [#1005](https://github.com/preservim/nerdtree/pull/1005) + - Add a "copy path to clipboard" menu option (PhilRunninger) [#1002](https://github.com/preservim/nerdtree/pull/1002) + - Enable root refresh on "vim ." a different way than [#999](https://github.com/preservim/nerdtree/pull/999). (PhilRunninger) [#1001](https://github.com/preservim/nerdtree/pull/1001) + - Fix refreshroot (PhilRunninger) [#999](https://github.com/preservim/nerdtree/pull/999) + - Change version check to look for 703 not 730 (vhalis) [#994](https://github.com/preservim/nerdtree/pull/994) + - Change minimum vim (PhilRunninger) [#991](https://github.com/preservim/nerdtree/pull/991) + - Allow multi-character DirArrows (PhilRunninger) [#985](https://github.com/preservim/nerdtree/pull/985) + - Remove redraw! while still clearing last message empty string. (PhilRunninger) [#979](https://github.com/preservim/nerdtree/pull/979) + - fix `_initChildren` function value set to numChildrenCached error (terryding77) [#969](https://github.com/preservim/nerdtree/pull/969) + - On Windows, do a case-insensitive comparison of paths. (PhilRunninger) [#967](https://github.com/preservim/nerdtree/pull/967) + - Remove the **Please wait... DONE** messages. (PhilRunninger) [#966](https://github.com/preservim/nerdtree/pull/966) + - Smarter delimiter default (PhilRunninger) [#963](https://github.com/preservim/nerdtree/pull/963) + - Update directory .vimdc readme example (spencerdcarlson) [#961](https://github.com/preservim/nerdtree/pull/961) + - Preview bookmarks (PhilRunninger) [#956](https://github.com/preservim/nerdtree/pull/956) + - Add new value to NERDTreeQuitOnOpen to close bookmark table (PhilRunninger) [#955](https://github.com/preservim/nerdtree/pull/955) + - Add an :EditBookmarks command to edit the bookmarks file (PhilRunninger) [#954](https://github.com/preservim/nerdtree/pull/954) + - Before copying, turn off &shellslash. Restore after copy is finished. (PhilRunninger) [#952](https://github.com/preservim/nerdtree/pull/952) + - Set a maximum window size when zooming. (PhilRunninger) [#950](https://github.com/preservim/nerdtree/pull/950) + - Confirm the wipeout of a unsaved buffer whose file has been renamed. (PhilRunninger) [#949](https://github.com/preservim/nerdtree/pull/949) + - Escape a backslash so it can be used in a key mapping. (PhilRunninger) [#948](https://github.com/preservim/nerdtree/pull/948) + - Add a NERDTreeMinimalMenu feature (tuzz) [#938](https://github.com/preservim/nerdtree/pull/938) + - fixed root path error for windows (zcodes) [#935](https://github.com/preservim/nerdtree/pull/935) + - Restore getDirChildren for use in nerdtree-project-plugin. (PhilRunninger) [#929](https://github.com/preservim/nerdtree/pull/929) + - Document NERDTreeNodeDelimiter [#912](https://github.com/preservim/nerdtree/pull/912) (PhilRunninger) [#926](https://github.com/preservim/nerdtree/pull/926) + - Allow modification of menu keybindings (Leandros) [#923](https://github.com/preservim/nerdtree/pull/923) + - Add two more disqualifications for isCascadable(). (PhilRunninger) [#914](https://github.com/preservim/nerdtree/pull/914) + - Allow highlighting more than one flag. (kristijanhusak) [#908](https://github.com/preservim/nerdtree/pull/908) + - Support sorting files and directories by modification time. (PhilRunninger) [#901](https://github.com/preservim/nerdtree/pull/901) + - Parse . and .. from path string with trailing slash. (PhilRunninger) [#899](https://github.com/preservim/nerdtree/pull/899) + - Force sort to recalculate the cached sortKey. (PhilRunninger) [#898](https://github.com/preservim/nerdtree/pull/898) + - Add NERDTreeRefreshRoot command (wgfm) [#897](https://github.com/preservim/nerdtree/pull/897) + - Call Resolve on the file's path when calling :NERDTreeFind. (PhilRunninger) [#896](https://github.com/preservim/nerdtree/pull/896) + - Catch all errors, not just NERDTree errors. (PhilRunninger) [#894](https://github.com/preservim/nerdtree/pull/894) + - Fix typo in help file (lvoisin) [#892](https://github.com/preservim/nerdtree/pull/892) + - Make NERDTreeCreator set the `'nolist'` option (lifecrisis) [#889](https://github.com/preservim/nerdtree/pull/889) + - Refresh buffers after `m`, `m` operation on a folder (PhilRunninger) [#888](https://github.com/preservim/nerdtree/pull/888) + - Use a better arg for FINDSTR when using the m,l command in Windows. (PhilRunninger) [#887](https://github.com/preservim/nerdtree/pull/887) + - Fix the / motions, which currently fail with cascades (lifecrisis) [#886](https://github.com/preservim/nerdtree/pull/886) + - Function "s:UI.getLineNum()" doesn't always work on cascades. (lifecrisis) [#882](https://github.com/preservim/nerdtree/pull/882) + - NERDTreeCWD: reset CWD if changed by NERDTreeFocus (PhilRunninger) [#878](https://github.com/preservim/nerdtree/pull/878) + - Use tabnext instead of gt to allow users to remap gt. (PhilRunninger) [#877](https://github.com/preservim/nerdtree/pull/877) + - Do a case sensitive comparison of new/existing buffers. (PhilRunninger) [#875](https://github.com/preservim/nerdtree/pull/875) + - Fix opening sub-directories that have commas in their name. (PhilRunninger) [#873](https://github.com/preservim/nerdtree/pull/873) + - Add new command to open NERDTree in the root of a VCS repository. (PhilRunninger) [#872](https://github.com/preservim/nerdtree/pull/872) + - Make sure the path to the bookmarks file exists before writing it. (PhilRunninger) [#871](https://github.com/preservim/nerdtree/pull/871) + - Unzoom NERDTree when opening a file (PhilRunninger) [#870](https://github.com/preservim/nerdtree/pull/870) + - Support unusual characters in file and directory names (PhilRunninger) [#868](https://github.com/preservim/nerdtree/pull/868) + - Reword renamed-buffer prompt to be more clear (aflock) [#867](https://github.com/preservim/nerdtree/pull/867) + - Default to placing cursor on root when closing bookmark table (lifecrisis) [#866](https://github.com/preservim/nerdtree/pull/866) + - Fix issues with sorting of nodes (PhilRunninger) [#856](https://github.com/preservim/nerdtree/pull/856) + - Better OSX detection (bubba-h57) [#853](https://github.com/preservim/nerdtree/pull/853) + - Bugfix - ensure keymaps dictionary exists before using it (mnussbaum) [#852](https://github.com/preservim/nerdtree/pull/852) + - Decrease startup-time by avoiding linear-time iteration over key mappings (mnussbaum) [#851](https://github.com/preservim/nerdtree/pull/851) + - Add code to sort mappings in quickhelp (lifecrisis) [#849](https://github.com/preservim/nerdtree/pull/849) + - Use ":clearjumps" in new NERDTree windows (lifecrisis) [#844](https://github.com/preservim/nerdtree/pull/844) + - Like m-c did before, create parent directories if needed on m-m. (PhilRunninger) [#840](https://github.com/preservim/nerdtree/pull/840) + - BUGFIX: Repair a problem with the `'u'` mapping. (lifecrisis) [#838](https://github.com/preservim/nerdtree/pull/838) + - Make the NERDTree buffer writable when rendering it. (PhilRunninger) [#837](https://github.com/preservim/nerdtree/pull/837) + - Code cleanup: Remove unsupported bookmark table mappings (lifecrisis) [#835](https://github.com/preservim/nerdtree/pull/835) + - Replace strcharpart() with substitute() for backward compatibility (bravestarr) [#834](https://github.com/preservim/nerdtree/pull/834) + - Fixed error `unknown function strcharpart` for older versions of Vim (hav4ik) [#833](https://github.com/preservim/nerdtree/pull/833) + - Clear output when NERDTree menu is aborted (lifecrisis) [#832](https://github.com/preservim/nerdtree/pull/832) + - Display a path with multi-byte characters correctly when it is truncated (bravestarr) [#830](https://github.com/preservim/nerdtree/pull/830) + - Support revealing file and executing file with xdg-open for Linux (ngnmhieu) [#824](https://github.com/preservim/nerdtree/pull/824) + - If node isn't open, count children on disk before deleting. (PhilRunninger) [#822](https://github.com/preservim/nerdtree/pull/822) + - Add new variable g:NERDTreeRemoveFileCmd (kutsan) [#816](https://github.com/preservim/nerdtree/pull/816) + - Use a better check for existence of the NERDTree buffer. (PhilRunninger) [#814](https://github.com/preservim/nerdtree/pull/814) + - Fix focussing previous buffer when closing NERDTree (mrubli) [#801](https://github.com/preservim/nerdtree/pull/801) + - Update the docs for "NERDTreeStatusline" (lifecrisis) [#796](https://github.com/preservim/nerdtree/pull/796) + - BUGFIX: Unstable behavior in the "getPath()" method (lifecrisis) [#795](https://github.com/preservim/nerdtree/pull/795) + - Revert the bugfix from pull request [#785](https://github.com/preservim/nerdtree/pull/785) (lifecrisis) [#794](https://github.com/preservim/nerdtree/pull/794) + - BUGFIX: Allow ":NERDTreeFind" to discover hidden files (lifecrisis) [#786](https://github.com/preservim/nerdtree/pull/786) + - BUGFIX: Allow ":NERDTreeFind" to reveal new files (lifecrisis) [#785](https://github.com/preservim/nerdtree/pull/785) + - Add modelines (lifecrisis) [#782](https://github.com/preservim/nerdtree/pull/782) + - Change the type of completion used by NERDTreeFind (lifecrisis) [#781](https://github.com/preservim/nerdtree/pull/781) + - change NERDTreeFind with args (zhenyangze) [#778](https://github.com/preservim/nerdtree/pull/778) + - Style Choice: Using confirm() when deleting a bookmark (lifecrisis) [#777](https://github.com/preservim/nerdtree/pull/777) + - remove useless substitute when `file =~# "/$"` (skyblueee) [#773](https://github.com/preservim/nerdtree/pull/773) + - remove useless removeLeadingSpaces in _stripMarkup (skyblueee) [#772](https://github.com/preservim/nerdtree/pull/772) + - Make the "o" mapping consistent with "x" (lifecrisis) [#769](https://github.com/preservim/nerdtree/pull/769) + - Fix a problem with the "x" handler (lifecrisis) [#768](https://github.com/preservim/nerdtree/pull/768) + - Clean up the handler for the "x" mapping (lifecrisis) [#767](https://github.com/preservim/nerdtree/pull/767) + - Revert change to tab opening method (lifecrisis) [#766](https://github.com/preservim/nerdtree/pull/766) + - BUGFIX: Add back support for "b:NERDTreeRoot" (lifecrisis) [#765](https://github.com/preservim/nerdtree/pull/765) + - Fix broken "t" and "T" mappings, tabs now open at end (lifecrisis) [#759](https://github.com/preservim/nerdtree/pull/759) + - Update doc with already existing mapping variables (asnr) [#699](https://github.com/preservim/nerdtree/pull/699) + - Fix the broken g:NERDTreeBookmarksSort setting (lifecrisis) [#696](https://github.com/preservim/nerdtree/pull/696) + - Correct NERDTreeIgnore pattern in doc (cntoplolicon) [#648](https://github.com/preservim/nerdtree/pull/648) + - Remove empty segments when splitting path (sooth-sayer) [#574](https://github.com/preservim/nerdtree/pull/574) + - Suppress autocmds less agressively (wincent) [#578](https://github.com/preservim/nerdtree/pull/578) [#691](https://github.com/preservim/nerdtree/pull/691) + - Add an Issues template to ask for more info initially. + - Fix markdown headers in readme (josephfrazier) [#676](https://github.com/preservim/nerdtree/pull/676) + - Don't touch `@o` and `@h` registers when rendering + - Fix bug with files and directories with dollar signs (alegen) [#649](https://github.com/preservim/nerdtree/pull/649) + - Reuse/reopen existing window trees where possible [#244](https://github.com/preservim/nerdtree/pull/244) + - Remove NERDTree.previousBuf() + - Change color of arrow (Leeiio) [#630](https://github.com/preservim/nerdtree/pull/630) + - Improved a tip in README.markdown (ggicci) [#628](https://github.com/preservim/nerdtree/pull/628) + - Shorten delete confimration of empty directory to `y` (mikeperri) [#530](https://github.com/preservim/nerdtree/pull/530) + - Fix API call to open directory tree in window (devm33) [#533](https://github.com/preservim/nerdtree/pull/533) + - Change default arrows on non-Windows platforms (gwilk) [#546](https://github.com/preservim/nerdtree/pull/546) + - Update to README - combine cd and git clone (zwhitchcox) [#584](https://github.com/preservim/nerdtree/pull/584) + - Update to README - Tip: start NERDTree when vim starts (therealplato) [#593](https://github.com/preservim/nerdtree/pull/593) + - Escape filename when moving an open buffer (zacharyvoase) [#595](https://github.com/preservim/nerdtree/pull/595) + - Fixed incorrect :helptags command in README (curran) [#619](https://github.com/preservim/nerdtree/pull/619) + - Fixed incomplete escaping of folder arrows (adityanatraj) [#548](https://github.com/preservim/nerdtree/pull/548) + - Added NERDTreeCascadeSingleChildDir option (juanibiapina) [#558](https://github.com/preservim/nerdtree/pull/558) + - Replace strchars() with backward compatible workaround. + - Add support for copy command in Windows (SkylerLipthay) [#231](https://github.com/preservim/nerdtree/pull/231) + - Fixed typo in README.markdown - :Helptags -> :helptags + - Rename "primary" and "secondary" trees to "tab" and "window" trees. + - Move a bunch of buffer level variables into the NERDTree and UI classes. + - Display cascading dirs on one line to save vertical/horizontal space (matt-gardner: brainstorming/testing) + - Remove the old style UI - Remove `NERDTreeDirArrows` option. + - On windows default to + and ~ for expand/collapse directory symbols. + - Lots more refactoring. Move a bunch of b: level vars into b:NERDTree and friends. + +#### 5.0.0 +- Refactor the code significantly: + * Break the classes out into their own files. + * Make the majority of the code OO - previously large parts were effectively a tangle of "global" methods. +- Add an API to assign flags to nodes. This allows VCS plugins like https://github.com/Xuyuanp/nerdtree-git-plugin to exist. Thanks to **Xuyuanp** for helping design/test/build said API. +- add `scope` argument to the key map API see :help NERDTreeAddKeyMap() +- add magic [[dir]] and [[file]] flags to NERDTreeIgnore +- add support for custom path filters. See :help NERDTreeAddPathFilter() +- add path listener API. See :help NERDTreePathListenerAPI. +- expand the fs menu functionality to list file properties (PhilRunninger, apbarrero, JESii) +- make bookmarks work with `~` home shortcuts (hiberabyss) +- show OSX specific fsmenu options in regular vim on mac (evindor) +- make dir arrow icons configurable (PickRelated) +- optimise node sorting performance when opening large dirs (vtsang) +- make the root note render prettier by truncating it at a path slash (gcmt) +- remove NERDChristmasTree option - its always christmas now +- add "cascade" open and closing for dirs containing only another single dir. See :help NERDTreeCascadeOpenSingleChildDir (pendulm) +- Many other fixes, doc updates and contributions from: **actionshrimp**, **agrussellknives**, **alvan**, **AndrewRadev**, **cperl82** (*many small fixes*), **devmanhinton**, **egalpin**, **franksort**, **gastropoda**, **handcraftedbits**, **kelaban**, **lucascaton**, **mixvin**, **pendulm**, **SchDen**, **shanesmith**, **staeff**, **stephenprater**, **toiffel**, **Twinside**, **WoLpH**, **xiaodili**, **zhangoose** + +#### 4.2.0 +- Add NERDTreeDirArrows option to make the UI use pretty arrow chars instead of the old +~| chars to define the tree structure (sickill) +- shift the syntax highlighting out into its own syntax file (gnap) +- add some mac specific options to the filesystem menu - for macvim only (andersonfreitas) +- Add NERDTreeMinimalUI option to remove some non functional parts of the nerdtree ui (camthompson) +- tweak the behaviour of :NERDTreeFind - see :help :NERDTreeFind for the new behaviour (benjamingeiger) +- if no name is given to :Bookmark, make it default to the name of the target file/dir (minyoung) +- use `file` completion when doing copying, create, and move operations (EvanDotPro) +- lots of misc bug fixes from: **AndrewRadev**, **Bogdanov**, **camthompson**, **kml**, **mathias**, **paddyoloughlin**, **scottstvnsn**, **sdewald**, **Vitaly**, **wycats**, me RAWR! + +#### 4.1.0 +- features: + - NERDTreeFind to reveal the node for the current buffer in the tree, see `|NERDTreeFind|`. This effectively merges the FindInNERDTree plugin (by **Doug McInnes**) into the script. + - make NERDTreeQuitOnOpen apply to the t/T keymaps too. Thanks to **Stefan Ritter** and **Rémi Prévost**. + - truncate the root node if wider than the tree window. Thanks to **Victor Gonzalez**. + +- bugfixes: + - really fix window state restoring + - fix some win32 path escaping issues. Thanks to **Stephan Baumeister**, **Ricky**, **jfilip1024**, and **Chris Chambers**. + +#### 4.0.0 +- add a new programmable menu system (see `:help NERDTreeMenu`). +- add new APIs to add menus/menu-items to the menu system as well as custom key mappings to the NERD tree buffer (see `:help NERDTreeAPI`). +- removed the old API functions +- added a mapping to maximize/restore the size of nerd tree window, thanks to Guillaume Duranceau for the patch. See :help NERDTree-A for details. +- fix a bug where secondary nerd trees (netrw hijacked trees) and NERDTreeQuitOnOpen didnt play nicely, thanks to **Curtis Harvey**. +- fix a bug where the script ignored directories whose name ended in a dot, thanks to **Aggelos Orfanakos** for the patch. +- fix a bug when using the x mapping on the tree root, thanks to **Bryan Venteicher** for the patch. +- fix a bug where the cursor position/window size of the nerd tree buffer wasnt being stored on closing the window, thanks to **Richard Hart**. +- fix a bug where NERDTreeMirror would mirror the wrong tree + +#### 3.1.1 +- fix a bug where a non-listed no-name buffer was getting created every time the tree windows was created, thanks to **Derek Wyatt** and **owen1** +- make `` behave the same as the `o` mapping +- some helptag fixes in the doc, thanks **strull**. +- fix a bug when using `:set nohidden` and opening a file where the previous buf was modified. Thanks **iElectric**. +- other minor fixes + +#### 3.1.0 +- New features: + - add mappings to open files in a vsplit, see `:help NERDTree-s` and `:help NERDTree-gs` + - make the statusline for the nerd tree window default to something hopefully more useful. See `:help 'NERDTreeStatusline'` +- Bugfixes: + - make the hijack netrw functionality work when vim is started with `vim ` (thanks to **Alf Mikula** for the patch). + - fix a bug where the CWD wasnt being changed for some operations even when NERDTreeChDirMode==2 (thanks to **Lucas S. Buchala**) + - add -bar to all the nerd tree :commands so they can chain with other :commands (thanks to **tpope**) + - fix bugs when ignorecase was set (thanks to **nach**) + - fix a bug with the relative path code (thanks to **nach**) + - fix a bug where doing a `:cd` would cause `:NERDTreeToggle` to fail (thanks **nach**) + + +#### 3.0.1 +- Bugfixes: + - fix bugs with :NERDTreeToggle and :NERDTreeMirror when `'hidden'` was not set + - fix a bug where `:NERDTree ` would fail if `` was relative and didnt start with a `./` or `../` Thanks to **James Kanze**. + - make the `q` mapping work with secondary (`:e ` style) trees, thanks to **jamessan** + - fix a bunch of small bugs with secondary trees +- More insane refactoring. + +#### 3.0.0 +- hijack netrw so that doing an `:edit ` will put a NERD tree in the window rather than a netrw browser. See :help 'NERDTreeHijackNetrw' +- allow sharing of trees across tabs, see `:help :NERDTreeMirror` +- remove "top" and "bottom" as valid settings for NERDTreeWinPos +- change the `''` mapping to `'i'` +- change the `'H'` mapping to `'I'` +- lots of refactoring diff --git a/home-rc/dot-files/.vim/bundle/nerdtree/LICENCE b/home-rc/dot-files/.vim/bundle/nerdtree/LICENCE new file mode 100644 index 0000000..8b1a9d8 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree/LICENCE @@ -0,0 +1,13 @@ + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + +Copyright (C) 2004 Sam Hocevar + +Everyone is permitted to copy and distribute verbatim or modified +copies of this license document, and changing it is allowed as long +as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. diff --git a/home-rc/dot-files/.vim/bundle/nerdtree/README.markdown b/home-rc/dot-files/.vim/bundle/nerdtree/README.markdown new file mode 100644 index 0000000..27aa314 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree/README.markdown @@ -0,0 +1,227 @@ +![Help Wanted](http://blog.ncce.org/wp-content/uploads/2013/12/help-wanted.jpg) + +**NERDTree** is on the lookout for a new maintainer. See [issue #1280](https://github.com/preservim/nerdtree/issues/1280) to submit your name for consideration. + +--- + +# The NERDTree [![Vint](https://github.com/preservim/nerdtree/workflows/Vint/badge.svg)](https://github.com/preservim/nerdtree/actions?workflow=Vint) + +## Introduction + +The NERDTree is a file system explorer for the Vim editor. Using this plugin, users can visually browse complex directory hierarchies, quickly open files for reading or editing, and perform basic file system operations. + +![NERDTree Screenshot](https://github.com/preservim/nerdtree/raw/master/screenshot.png) + +## Installation + +Use your favorite plugin manager to install this plugin. [tpope/vim-pathogen](https://github.com/tpope/vim-pathogen), [VundleVim/Vundle.vim](https://github.com/VundleVim/Vundle.vim), [junegunn/vim-plug](https://github.com/junegunn/vim-plug), and [Shougo/dein.vim](https://github.com/Shougo/dein.vim) are some of the more popular ones. A lengthy discussion of these and other managers can be found on [vi.stackexchange.com](https://vi.stackexchange.com/questions/388/what-is-the-difference-between-the-vim-plugin-managers). Basic instructions are provided below, but please **be sure to read, understand, and follow all the safety rules that come with your ~~power tools~~ plugin manager.** + +If you have no favorite, or want to manage your plugins without 3rd-party dependencies, consider using Vim 8+ packages, as described in Greg Hurrell's excellent Youtube video: [Vim screencast #75: Plugin managers](https://www.youtube.com/watch?v=X2_R3uxDN6g). + +
+Pathogen +Pathogen is more of a runtime path manager than a plugin manager. You must clone the plugins' repositories yourself to a specific location, and Pathogen makes sure they are available in Vim. + + +1. In the terminal, + ```bash + git clone https://github.com/preservim/nerdtree.git ~/.vim/bundle/nerdtree + ``` +1. In your `vimrc`, + ```vim + call pathogen#infect() + syntax on + filetype plugin indent on + ``` +1. Restart Vim, and run `:helptags ~/.vim/bundle/nerdtree/doc/` or `:Helptags`. +
+ +
+ Vundle + +1. Install Vundle, according to its instructions. +1. Add the following text to your `vimrc`. + ```vim + call vundle#begin() + Plugin 'preservim/nerdtree' + call vundle#end() + ``` +1. Restart Vim, and run the `:PluginInstall` statement to install your plugins. +
+ +
+ Vim-Plug + +1. Install Vim-Plug, according to its instructions. +1. Add the following text to your `vimrc`. +```vim +call plug#begin() + Plug 'preservim/nerdtree' +call plug#end() +``` +1. Restart Vim, and run the `:PlugInstall` statement to install your plugins. +
+ +
+ Dein + +1. Install Dein, according to its instructions. +1. Add the following text to your `vimrc`. + ```vim + call dein#begin() + call dein#add('preservim/nerdtree') + call dein#end() + ``` +1. Restart Vim, and run the `:call dein#install()` statement to install your plugins. +
+ +
+Vim 8+ packages + +If you are using Vim version 8 or higher you can use its built-in package management; see `:help packages` for more information. Just run these commands in your terminal: + +```bash +git clone https://github.com/preservim/nerdtree.git ~/.vim/pack/vendor/start/nerdtree +vim -u NONE -c "helptags ~/.vim/pack/vendor/start/nerdtree/doc" -c q +``` +
+ +## Getting Started +After installing NERDTree, the best way to learn it is to turn on the Quick Help. Open NERDTree with the `:NERDTree` command, and press `?` to turn on the Quick Help, which will show you all the mappings and commands available in the NERDTree. Of course, your most complete source of information is the documentation: `:help NERDTree`. + +## NERDTree Plugins +NERDTree can be extended with custom mappings and functions using its built-in API. The details of this API are described in the included documentation. Several plugins have been written, and are available on Github for installation like any other plugin. The plugins in this list are maintained (or not) by their respective owners, and certain combinations may be incompatible. + +* [Xuyuanp/nerdtree-git-plugin](https://github.com/Xuyuanp/nerdtree-git-plugin): Shows Git status flags for files and folders in NERDTree. +* [ryanoasis/vim-devicons](https://github.com/ryanoasis/vim-devicons): Adds filetype-specific icons to NERDTree files and folders, +* [tiagofumo/vim-nerdtree-syntax-highlight](https://github.com/tiagofumo/vim-nerdtree-syntax-highlight): Adds syntax highlighting to NERDTree based on filetype. +* [scrooloose/nerdtree-project-plugin](https://github.com/scrooloose/nerdtree-project-plugin): Saves and restores the state of the NERDTree between sessions. +* [PhilRunninger/nerdtree-buffer-ops](https://github.com/PhilRunninger/nerdtree-buffer-ops): 1) Highlights open files in a different color. 2) Closes a buffer directly from NERDTree. +* [PhilRunninger/nerdtree-visual-selection](https://github.com/PhilRunninger/nerdtree-visual-selection): Enables NERDTree to open, delete, move, or copy multiple Visually-selected files at once. + +If any others should be listed, mention them in an issue or pull request. + + +## Frequently Asked Questions + +In the answers to these questions, you will see code blocks that you can put in your `vimrc` file. + +### How can I map a specific key or shortcut to open NERDTree? + +NERDTree doesn't create any shortcuts outside of the NERDTree window, so as not to overwrite any of your other shortcuts. Use the `nnoremap` command in your `vimrc`. You, of course, have many keys and NERDTree commands to choose from. Here are but a few examples. +```vim +nnoremap n :NERDTreeFocus +nnoremap :NERDTree +nnoremap :NERDTreeToggle +nnoremap :NERDTreeFind +``` + +### How do I open NERDTree automatically when Vim starts? +Each code block below is slightly different, as described in the `" Comment lines`. + +```vim +" Start NERDTree and leave the cursor in it. +autocmd VimEnter * NERDTree +``` +--- +```vim +" Start NERDTree and put the cursor back in the other window. +autocmd VimEnter * NERDTree | wincmd p +``` +--- +```vim +" Start NERDTree when Vim is started without file arguments. +autocmd StdinReadPre * let s:std_in=1 +autocmd VimEnter * if argc() == 0 && !exists('s:std_in') | NERDTree | endif +``` +--- +```vim +" Start NERDTree. If a file is specified, move the cursor to its window. +autocmd StdinReadPre * let s:std_in=1 +autocmd VimEnter * NERDTree | if argc() > 0 || exists("s:std_in") | wincmd p | endif +``` +--- +```vim +" Start NERDTree, unless a file or session is specified, eg. vim -S session_file.vim. +autocmd StdinReadPre * let s:std_in=1 +autocmd VimEnter * if argc() == 0 && !exists('s:std_in') && v:this_session == '' | NERDTree | endif +``` +--- +```vim +" Start NERDTree when Vim starts with a directory argument. +autocmd StdinReadPre * let s:std_in=1 +autocmd VimEnter * if argc() == 1 && isdirectory(argv()[0]) && !exists('s:std_in') | + \ execute 'NERDTree' argv()[0] | wincmd p | enew | execute 'cd '.argv()[0] | endif +``` + +### How can I close Vim or a tab automatically when NERDTree is the last window? + +```vim +" Exit Vim if NERDTree is the only window remaining in the only tab. +autocmd BufEnter * if tabpagenr('$') == 1 && winnr('$') == 1 && exists('b:NERDTree') && b:NERDTree.isTabTree() | quit | endif +``` +--- +```vim +" Close the tab if NERDTree is the only window remaining in it. +autocmd BufEnter * if winnr('$') == 1 && exists('b:NERDTree') && b:NERDTree.isTabTree() | quit | endif +``` + +### How can I prevent other buffers replacing NERDTree in its window? + +```vim +" If another buffer tries to replace NERDTree, put it in the other window, and bring back NERDTree. +autocmd BufEnter * if bufname('#') =~ 'NERD_tree_\d\+' && bufname('%') !~ 'NERD_tree_\d\+' && winnr('$') > 1 | + \ let buf=bufnr() | buffer# | execute "normal! \w" | execute 'buffer'.buf | endif +``` + +### Can I have the same NERDTree on every tab automatically? + +```vim +" Open the existing NERDTree on each new tab. +autocmd BufWinEnter * if getcmdwintype() == '' | silent NERDTreeMirror | endif +``` +or change your NERDTree-launching shortcut key like so: +```vim +" Mirror the NERDTree before showing it. This makes it the same on all tabs. +nnoremap :NERDTreeMirror:NERDTreeFocus +``` + +### How can I change the default arrows? + +```vim +let g:NERDTreeDirArrowExpandable = '?' +let g:NERDTreeDirArrowCollapsible = '?' +``` +The preceding values are the non-Windows default arrow symbols. Setting these variables to empty strings will remove the arrows completely and shift the entire tree two character positions to the left. See `:h NERDTreeDirArrowExpandable` for more details. + +### Can NERDTree access remote files via scp or ftp? + +Short answer: No, and there are no plans to add that functionality. However, Vim ships with a plugin that does just that. It's called netrw, and by adding the following lines to your `.vimrc`, you can use it to open files over the `scp:`, `ftp:`, or other protocols, while still using NERDTree for all local files. The function seamlessly makes the decision to open NERDTree or netrw, and other supported protocols can be added to the regular expression. + +```vim +" Function to open the file or NERDTree or netrw. +" Returns: 1 if either file explorer was opened; otherwise, 0. +function! s:OpenFileOrExplorer(...) + if a:0 == 0 || a:1 == '' + NERDTree + elseif filereadable(a:1) + execute 'edit '.a:1 + return 0 + elseif a:1 =~? '^\(scp\|ftp\)://' " Add other protocols as needed. + execute 'Vexplore '.a:1 + elseif isdirectory(a:1) + execute 'NERDTree '.a:1 + endif + return 1 +endfunction + +" Auto commands to handle OS commandline arguments +autocmd StdinReadPre * let s:std_in=1 +autocmd VimEnter * if argc()==1 && !exists('s:std_in') | if OpenFileOrExplorer(argv()[0]) | wincmd p | enew | wincmd p | endif | endif + +" Command to call the OpenFileOrExplorer function. +command! -n=? -complete=file -bar Edit :call OpenFileOrExplorer('') + +" Command-mode abbreviation to replace the :edit Vim command. +cnoreabbrev e Edit +``` diff --git a/home-rc/dot-files/.vim/bundle/nerdtree/_config.yml b/home-rc/dot-files/.vim/bundle/nerdtree/_config.yml new file mode 100644 index 0000000..c419263 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree/_config.yml @@ -0,0 +1 @@ +theme: jekyll-theme-cayman \ No newline at end of file diff --git a/home-rc/dot-files/.vim/bundle/nerdtree/autoload/nerdtree.vim b/home-rc/dot-files/.vim/bundle/nerdtree/autoload/nerdtree.vim new file mode 100644 index 0000000..ba70871 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree/autoload/nerdtree.vim @@ -0,0 +1,249 @@ +if exists('g:loaded_nerdtree_autoload') + finish +endif +let g:loaded_nerdtree_autoload = 1 + +let s:rootNERDTreePath = resolve(expand(':p:h:h')) + +"FUNCTION: nerdtree#version(...) {{{1 +" If any value is given as an argument, the entire line of text from the +" change log is shown for the current version; otherwise, only the version +" number is shown. +function! nerdtree#version(...) abort + let l:text = 'Unknown' + try + let l:changelog = readfile(join([s:rootNERDTreePath, 'CHANGELOG.md'], nerdtree#slash())) + let l:line = 0 + while l:line <= len(l:changelog) + if l:changelog[l:line] =~# '\d\+\.\d\+' + let l:text = substitute(l:changelog[l:line], '.*\(\d\+.\d\+\).*', '\1', '') + let l:text .= substitute(l:changelog[l:line+1], '^.\{-}\(\.\d\+\).\{-}:\(.*\)', a:0>0 ? '\1:\2' : '\1', '') + break + endif + let l:line += 1 + endwhile + catch + endtry + return l:text +endfunction + +" SECTION: General Functions {{{1 +"============================================================ + +" FUNCTION: nerdtree#closeTreeOnOpen() {{{2 +function! nerdtree#closeTreeOnOpen() abort + return g:NERDTreeQuitOnOpen == 1 || g:NERDTreeQuitOnOpen == 3 +endfunction + +" FUNCTION: nerdtree#closeBookmarksOnOpen() {{{2 +function! nerdtree#closeBookmarksOnOpen() abort + return g:NERDTreeQuitOnOpen == 2 || g:NERDTreeQuitOnOpen == 3 +endfunction + +" FUNCTION: nerdtree#slash() {{{2 +" Return the path separator used by the underlying file system. Special +" consideration is taken for the use of the 'shellslash' option on Windows +" systems. +function! nerdtree#slash() abort + if nerdtree#runningWindows() + if exists('+shellslash') && &shellslash + return '/' + endif + + return '\' + endif + + return '/' +endfunction + +"FUNCTION: nerdtree#checkForBrowse(dir) {{{2 +"inits a window tree in the current buffer if appropriate +function! nerdtree#checkForBrowse(dir) abort + if !isdirectory(a:dir) + return + endif + + if s:reuseWin(a:dir) + return + endif + + call g:NERDTreeCreator.CreateWindowTree(a:dir) +endfunction + +"FUNCTION: s:reuseWin(dir) {{{2 +"finds a NERDTree buffer with root of dir, and opens it. +function! s:reuseWin(dir) abort + let path = g:NERDTreePath.New(fnamemodify(a:dir, ':p')) + + for i in range(1, bufnr('$')) + unlet! nt + let nt = getbufvar(i, 'NERDTree') + if empty(nt) + continue + endif + + if nt.isWinTree() && nt.root.path.equals(path) + call nt.setPreviousBuf(bufnr('#')) + exec 'buffer ' . i + return 1 + endif + endfor + + return 0 +endfunction + +" FUNCTION: nerdtree#completeBookmarks(A,L,P) {{{2 +" completion function for the bookmark commands +function! nerdtree#completeBookmarks(A,L,P) abort + return filter(g:NERDTreeBookmark.BookmarkNames(), 'v:val =~# "^' . a:A . '"') +endfunction + +"FUNCTION: nerdtree#compareNodes(n1, n2) {{{2 +function! nerdtree#compareNodes(n1, n2) abort + return nerdtree#compareNodePaths(a:n1.path, a:n2.path) +endfunction + +"FUNCTION: nerdtree#compareNodePaths(p1, p2) {{{2 +function! nerdtree#compareNodePaths(p1, p2) abort + let sortKey1 = a:p1.getSortKey() + let sortKey2 = a:p2.getSortKey() + let i = 0 + while i < min([len(sortKey1), len(sortKey2)]) + " Compare chunks upto common length. + " If chunks have different type, the one which has + " integer type is the lesser. + if type(sortKey1[i]) == type(sortKey2[i]) + if sortKey1[i] <# sortKey2[i] + return - 1 + elseif sortKey1[i] ># sortKey2[i] + return 1 + endif + elseif type(sortKey1[i]) == type(0) + return -1 + elseif type(sortKey2[i]) == type(0) + return 1 + endif + let i += 1 + endwhile + + " Keys are identical upto common length. + " The key which has smaller chunks is the lesser one. + if len(sortKey1) < len(sortKey2) + return -1 + elseif len(sortKey1) > len(sortKey2) + return 1 + else + return 0 + endif +endfunction + +" FUNCTION: nerdtree#deprecated(func, [msg]) {{{2 +" Issue a deprecation warning for a:func. If a second arg is given, use this +" as the deprecation message +function! nerdtree#deprecated(func, ...) abort + let msg = a:0 ? a:func . ' ' . a:1 : a:func . ' is deprecated' + + if !exists('s:deprecationWarnings') + let s:deprecationWarnings = {} + endif + if !has_key(s:deprecationWarnings, a:func) + let s:deprecationWarnings[a:func] = 1 + echomsg msg + endif +endfunction + +" FUNCTION: nerdtree#exec(cmd, ignoreAll) {{{2 +" Same as :exec cmd but, if ignoreAll is TRUE, set eventignore=all for the duration +function! nerdtree#exec(cmd, ignoreAll) abort + let old_ei = &eventignore + if a:ignoreAll + set eventignore=all + endif + try + exec a:cmd + finally + let &eventignore = old_ei + endtry +endfunction + +" FUNCTION: nerdtree#has_opt(options, name) {{{2 +function! nerdtree#has_opt(options, name) abort + return has_key(a:options, a:name) && a:options[a:name] ==# 1 +endfunction + +" FUNCTION: nerdtree#loadClassFiles() {{{2 +function! nerdtree#loadClassFiles() abort + runtime lib/nerdtree/path.vim + runtime lib/nerdtree/menu_controller.vim + runtime lib/nerdtree/menu_item.vim + runtime lib/nerdtree/key_map.vim + runtime lib/nerdtree/bookmark.vim + runtime lib/nerdtree/tree_file_node.vim + runtime lib/nerdtree/tree_dir_node.vim + runtime lib/nerdtree/opener.vim + runtime lib/nerdtree/creator.vim + runtime lib/nerdtree/flag_set.vim + runtime lib/nerdtree/nerdtree.vim + runtime lib/nerdtree/ui.vim + runtime lib/nerdtree/event.vim + runtime lib/nerdtree/notifier.vim +endfunction + +" FUNCTION: nerdtree#postSourceActions() {{{2 +function! nerdtree#postSourceActions() abort + call g:NERDTreeBookmark.CacheBookmarks(1) + call nerdtree#ui_glue#createDefaultBindings() + + "load all nerdtree plugins + runtime! nerdtree_plugin/**/*.vim +endfunction + +"FUNCTION: nerdtree#runningWindows(dir) {{{2 +function! nerdtree#runningWindows() abort + return has('win16') || has('win32') || has('win64') +endfunction + +"FUNCTION: nerdtree#runningCygwin(dir) {{{2 +function! nerdtree#runningCygwin() abort + return has('win32unix') +endfunction + +" SECTION: View Functions {{{1 +"============================================================ + +"FUNCTION: nerdtree#echo {{{2 +"A wrapper for :echo. Appends 'NERDTree:' on the front of all messages +" +"Args: +"msg: the message to echo +function! nerdtree#echo(msg) abort + redraw + echomsg empty(a:msg) ? '' : ('NERDTree: ' . a:msg) +endfunction + +"FUNCTION: nerdtree#echoError {{{2 +"Wrapper for nerdtree#echo, sets the message type to errormsg for this message +"Args: +"msg: the message to echo +function! nerdtree#echoError(msg) abort + echohl errormsg + call nerdtree#echo(a:msg) + echohl normal +endfunction + +"FUNCTION: nerdtree#echoWarning {{{2 +"Wrapper for nerdtree#echo, sets the message type to warningmsg for this message +"Args: +"msg: the message to echo +function! nerdtree#echoWarning(msg) abort + echohl warningmsg + call nerdtree#echo(a:msg) + echohl normal +endfunction + +"FUNCTION: nerdtree#renderView {{{2 +function! nerdtree#renderView() abort + call b:NERDTree.render() +endfunction + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/home-rc/dot-files/.vim/bundle/nerdtree/autoload/nerdtree/ui_glue.vim b/home-rc/dot-files/.vim/bundle/nerdtree/autoload/nerdtree/ui_glue.vim new file mode 100644 index 0000000..fc22f21 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree/autoload/nerdtree/ui_glue.vim @@ -0,0 +1,732 @@ +if exists('g:loaded_nerdtree_ui_glue_autoload') + finish +endif +let g:loaded_nerdtree_ui_glue_autoload = 1 + +" FUNCTION: nerdtree#ui_glue#createDefaultBindings() {{{1 +function! nerdtree#ui_glue#createDefaultBindings() abort + let s = '' . s:SID() . '_' + + call NERDTreeAddKeyMap({ 'key': '', 'scope': 'all', 'callback': s . 'handleMiddleMouse' }) + call NERDTreeAddKeyMap({ 'key': '', 'scope': 'all', 'callback': s.'handleLeftClick' }) + call NERDTreeAddKeyMap({ 'key': '<2-LeftMouse>', 'scope': 'DirNode', 'callback': s.'activateDirNode' }) + call NERDTreeAddKeyMap({ 'key': '<2-LeftMouse>', 'scope': 'FileNode', 'callback': s.'activateFileNode' }) + call NERDTreeAddKeyMap({ 'key': '<2-LeftMouse>', 'scope': 'Bookmark', 'callback': s.'activateBookmark' }) + call NERDTreeAddKeyMap({ 'key': '<2-LeftMouse>', 'scope': 'all', 'callback': s.'activateAll' }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapCustomOpen, 'scope':'FileNode', 'callback': s.'customOpenFile'}) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapCustomOpen, 'scope':'DirNode', 'callback': s.'customOpenDir'}) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapCustomOpen, 'scope':'Bookmark', 'callback': s.'customOpenBookmark'}) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapCustomOpen, 'scope':'all', 'callback': s.'activateAll' }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapActivateNode, 'scope': 'DirNode', 'callback': s.'activateDirNode' }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapActivateNode, 'scope': 'FileNode', 'callback': s.'activateFileNode' }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapActivateNode, 'scope': 'Bookmark', 'callback': s.'activateBookmark' }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapPreview, 'scope': 'Bookmark', 'callback': s.'previewBookmark' }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapActivateNode, 'scope': 'all', 'callback': s.'activateAll' }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenSplit, 'scope': 'FileNode', 'callback': s.'openHSplit' }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenSplit, 'scope': 'Bookmark', 'callback': s.'openHSplitBookmark' }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenVSplit, 'scope': 'FileNode', 'callback': s.'openVSplit' }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenVSplit, 'scope': 'Bookmark', 'callback': s.'openVSplitBookmark' }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapPreview, 'scope': 'FileNode', 'callback': s.'previewNodeCurrent' }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapPreviewSplit, 'scope': 'FileNode', 'callback': s.'previewNodeHSplit' }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapPreviewSplit, 'scope': 'Bookmark', 'callback': s.'previewNodeHSplitBookmark' }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapPreviewVSplit, 'scope': 'FileNode', 'callback': s.'previewNodeVSplit' }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapPreviewVSplit, 'scope': 'Bookmark', 'callback': s.'previewNodeVSplitBookmark' }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenRecursively, 'scope': 'DirNode', 'callback': s.'openNodeRecursively' }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapUpdir, 'scope': 'all', 'callback': s . 'upDirCurrentRootClosed' }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapUpdirKeepOpen, 'scope': 'all', 'callback': s . 'upDirCurrentRootOpen' }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapChangeRoot, 'scope': 'Node', 'callback': s . 'chRoot' }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapChdir, 'scope': 'Node', 'callback': s.'chCwd' }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapQuit, 'scope': 'all', 'callback': s.'closeTreeWindow' }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapCWD, 'scope': 'all', 'callback': 'nerdtree#ui_glue#chRootCwd' }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapRefreshRoot, 'scope': 'all', 'callback': s.'refreshRoot' }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapRefresh, 'scope': 'Node', 'callback': s.'refreshCurrent' }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapHelp, 'scope': 'all', 'callback': s.'displayHelp' }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapToggleZoom, 'scope': 'all', 'callback': s.'toggleZoom' }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapToggleHidden, 'scope': 'all', 'callback': s.'toggleShowHidden' }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapToggleFilters, 'scope': 'all', 'callback': s.'toggleIgnoreFilter' }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapToggleFiles, 'scope': 'all', 'callback': s.'toggleShowFiles' }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapToggleBookmarks, 'scope': 'all', 'callback': s.'toggleShowBookmarks' }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapCloseDir, 'scope': 'Node', 'callback': s.'closeCurrentDir' }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapCloseChildren, 'scope': 'DirNode', 'callback': s.'closeChildren' }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapMenu, 'scope': 'Node', 'callback': s.'showMenu' }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapJumpParent, 'scope': 'Node', 'callback': s.'jumpToParent' }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapJumpFirstChild, 'scope': 'Node', 'callback': s.'jumpToFirstChild' }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapJumpLastChild, 'scope': 'Node', 'callback': s.'jumpToLastChild' }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapJumpRoot, 'scope': 'all', 'callback': s.'jumpToRoot' }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapJumpNextSibling, 'scope': 'Node', 'callback': s.'jumpToNextSibling' }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapJumpPrevSibling, 'scope': 'Node', 'callback': s.'jumpToPrevSibling' }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenInTab, 'scope': 'Node', 'callback': s . 'openInNewTab' }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenInTabSilent, 'scope': 'Node', 'callback': s . 'openInNewTabSilent' }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenInTab, 'scope': 'Bookmark', 'callback': s . 'openInNewTab' }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenInTabSilent, 'scope': 'Bookmark', 'callback': s . 'openInNewTabSilent' }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenExpl, 'scope': 'DirNode', 'callback': s.'openExplorer' }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenExpl, 'scope': 'FileNode', 'callback': s.'openExplorer' }) + + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapDeleteBookmark, 'scope': 'Bookmark', 'callback': s.'deleteBookmark' }) +endfunction + + +"SECTION: Interface bindings {{{1 +"============================================================ + +"FUNCTION: s:customOpenFile() {{{1 +" Open file node with the 'custom' key, initially . +function! s:customOpenFile(node) abort + call a:node.activate(s:initCustomOpenArgs().file) +endfunction + +"FUNCTION: s:customOpenDir() {{{1 +" Open directory node with the 'custom' key, initially . +function! s:customOpenDir(node) abort + call s:activateDirNode(a:node, s:initCustomOpenArgs().dir) +endfunction + +"FUNCTION: s:customOpenBookmark() {{{1 +" Open bookmark node with the 'custom' key, initially . +function! s:customOpenBookmark(node) abort + if a:node.path.isDirectory + call a:node.activate(b:NERDTree, s:initCustomOpenArgs().dir) + else + call a:node.activate(b:NERDTree, s:initCustomOpenArgs().file) + endif +endfunction + +"FUNCTION: s:initCustomOpenArgs() {{{1 +function! s:initCustomOpenArgs() abort + let l:defaultOpenArgs = {'file': {'reuse': 'all', 'where': 'p', 'keepopen':!nerdtree#closeTreeOnOpen()}, 'dir': {}} + try + let g:NERDTreeCustomOpenArgs = get(g:, 'NERDTreeCustomOpenArgs', {}) + call extend(g:NERDTreeCustomOpenArgs, l:defaultOpenArgs, 'keep') + catch /^Vim(\a\+):E712:/ + call nerdtree#echoWarning('g:NERDTreeCustomOpenArgs is not set properly. Using default value.') + let g:NERDTreeCustomOpenArgs = l:defaultOpenArgs + finally + return g:NERDTreeCustomOpenArgs + endtry +endfunction + +"FUNCTION: s:activateAll() {{{1 +"handle the user activating the updir line +function! s:activateAll() abort + if getline('.') ==# g:NERDTreeUI.UpDirLine() + return nerdtree#ui_glue#upDir(0) + endif +endfunction + +" FUNCTION: s:activateDirNode(directoryNode, options) {{{1 +" Open a directory with optional options +function! s:activateDirNode(directoryNode, ...) abort + + if a:directoryNode.isRoot() && a:directoryNode.isOpen + call nerdtree#echo('cannot close tree root') + return + endif + + call a:directoryNode.activate((a:0 > 0) ? a:1 : {}) +endfunction + +"FUNCTION: s:activateFileNode() {{{1 +"handle the user activating a tree node +function! s:activateFileNode(node) abort + call a:node.activate({'reuse': 'all', 'where': 'p', 'keepopen': !nerdtree#closeTreeOnOpen()}) +endfunction + +"FUNCTION: s:activateBookmark(bookmark) {{{1 +"handle the user activating a bookmark +function! s:activateBookmark(bm) abort + call a:bm.activate(b:NERDTree, !a:bm.path.isDirectory ? {'where': 'p', 'keepopen': !nerdtree#closeTreeOnOpen()} : {}) +endfunction + +" FUNCTION: nerdtree#ui_glue#bookmarkNode(name) {{{1 +" Associate the current node with the given name +function! nerdtree#ui_glue#bookmarkNode(...) abort + let currentNode = g:NERDTreeFileNode.GetSelected() + if currentNode !=# {} + let name = a:1 + if empty(name) + let name = currentNode.path.getLastPathComponent(0) + endif + try + call currentNode.bookmark(name) + call b:NERDTree.render() + catch /^NERDTree.IllegalBookmarkNameError/ + call nerdtree#echo('bookmark names must not contain spaces') + endtry + else + call nerdtree#echo('select a node first') + endif +endfunction + +" FUNCTION: s:chCwd(node) {{{1 +function! s:chCwd(node) abort + try + call a:node.path.changeToDir() + catch /^NERDTree.PathChangeError/ + call nerdtree#echoWarning('could not change cwd') + endtry +endfunction + +" FUNCTION: s:chRoot(node) {{{1 +" changes the current root to the selected one +function! s:chRoot(node) abort + call b:NERDTree.changeRoot(a:node) +endfunction + +" FUNCTION: s:nerdtree#ui_glue#chRootCwd() {{{1 +" Change the NERDTree root to match the current working directory. +function! nerdtree#ui_glue#chRootCwd() abort + NERDTreeCWD +endfunction + +" FUNCTION: nnerdtree#ui_glue#clearBookmarks(bookmarks) {{{1 +function! nerdtree#ui_glue#clearBookmarks(bookmarks) abort + if a:bookmarks ==# '' + let currentNode = g:NERDTreeFileNode.GetSelected() + if currentNode !=# {} + call currentNode.clearBookmarks() + endif + else + for name in split(a:bookmarks, ' ') + let bookmark = g:NERDTreeBookmark.BookmarkFor(name) + call bookmark.delete() + endfor + endif + call b:NERDTree.root.refresh() + call b:NERDTree.render() +endfunction + +" FUNCTION: s:closeChildren(node) {{{1 +" closes all childnodes of the current node +function! s:closeChildren(node) abort + call a:node.closeChildren() + call b:NERDTree.render() + call a:node.putCursorHere(0, 0) +endfunction + +" FUNCTION: s:closeCurrentDir(node) {{{1 +" Close the parent directory of the current node. +function! s:closeCurrentDir(node) abort + + if a:node.isRoot() + call nerdtree#echo('cannot close parent of tree root') + return + endif + + let l:parent = a:node.parent + + while l:parent.isCascadable() + let l:parent = l:parent.parent + endwhile + + if l:parent.isRoot() + call nerdtree#echo('cannot close tree root') + return + endif + + call l:parent.close() + call b:NERDTree.render() + call l:parent.putCursorHere(0, 0) +endfunction + +" FUNCTION: s:closeTreeWindow() {{{1 +" close the tree window +function! s:closeTreeWindow() abort + if b:NERDTree.isWinTree() && b:NERDTree.previousBuf() !=# -1 + exec 'buffer ' . b:NERDTree.previousBuf() + else + if winnr('$') > 1 + call g:NERDTree.Close() + else + call nerdtree#echo('Cannot close last window') + endif + endif +endfunction + +" FUNCTION: s:deleteBookmark(bookmark) {{{1 +" Prompt the user to confirm the deletion of the selected bookmark. +function! s:deleteBookmark(bookmark) abort + let l:message = 'Delete the bookmark "' . a:bookmark.name + \ . '" from the bookmark list?' + + let l:choices = "&Yes\n&No" + + echo | redraw + let l:selection = confirm(l:message, l:choices, 1, 'Warning') + + if l:selection !=# 1 + call nerdtree#echo('bookmark not deleted') + return + endif + + try + call a:bookmark.delete() + silent call b:NERDTree.root.refresh() + call b:NERDTree.render() + echo | redraw + catch /^NERDTree/ + call nerdtree#echoWarning('could not remove bookmark') + endtry +endfunction + +" FUNCTION: s:displayHelp() {{{1 +" toggles the help display +function! s:displayHelp() abort + call b:NERDTree.ui.toggleHelp() + call b:NERDTree.render() + call b:NERDTree.ui.centerView() +endfunction + +" FUNCTION: s:findAndRevealPath(pathStr) {{{1 +function! s:findAndRevealPath(pathStr) abort + let l:pathStr = !empty(a:pathStr) ? a:pathStr : expand('%:p') + let l:revealOpts = {} + + if empty(l:pathStr) + call nerdtree#echoWarning('no file for the current buffer') + return + endif + + if !filereadable(l:pathStr) + let l:pathStr = fnamemodify(l:pathStr, ':h') + let l:revealOpts['open'] = 1 + endif + + try + let l:pathStr = g:NERDTreePath.Resolve(l:pathStr) + let l:pathObj = g:NERDTreePath.New(l:pathStr) + catch /^NERDTree.InvalidArgumentsError/ + call nerdtree#echoWarning('invalid path') + return + endtry + + if !g:NERDTree.ExistsForTab() + try + let l:cwd = g:NERDTreePath.New(getcwd()) + catch /^NERDTree.InvalidArgumentsError/ + call nerdtree#echo('current directory does not exist.') + let l:cwd = l:pathObj.getParent() + endtry + + if l:pathObj.isUnder(l:cwd) + call g:NERDTreeCreator.CreateTabTree(l:cwd.str()) + else + call g:NERDTreeCreator.CreateTabTree(l:pathObj.getParent().str()) + endif + else + NERDTreeFocus + + if !l:pathObj.isUnder(b:NERDTree.root.path) + call s:chRoot(g:NERDTreeDirNode.New(l:pathObj.getParent(), b:NERDTree)) + endif + endif + + if l:pathObj.isHiddenUnder(b:NERDTree.root.path) + call b:NERDTree.ui.setShowHidden(1) + endif + + let l:node = b:NERDTree.root.reveal(l:pathObj, l:revealOpts) + call b:NERDTree.render() + call l:node.putCursorHere(1, 0) +endfunction + +"FUNCTION: s:handleLeftClick() {{{1 +"Checks if the click should open the current node +function! s:handleLeftClick() abort + let currentNode = g:NERDTreeFileNode.GetSelected() + if currentNode !=# {} + + "the dir arrows are multibyte chars, and vim's string functions only + "deal with single bytes - so split the line up with the hack below and + "take the line substring manually + let line = split(getline(line('.')), '\zs') + let startToCur = '' + for i in range(0,len(line)-1) + let startToCur .= line[i] + endfor + + if currentNode.path.isDirectory + if startToCur =~# g:NERDTreeUI.MarkupReg() && startToCur =~# '[+~'.g:NERDTreeDirArrowExpandable.g:NERDTreeDirArrowCollapsible.'] \?$' + call currentNode.activate() + return + endif + endif + + if (g:NERDTreeMouseMode ==# 2 && currentNode.path.isDirectory) || g:NERDTreeMouseMode ==# 3 + let char = strpart(startToCur, strlen(startToCur)-1, 1) + if char !~# g:NERDTreeUI.MarkupReg() + if currentNode.path.isDirectory + call currentNode.activate() + else + call currentNode.activate({'reuse': 'all', 'where': 'p', 'keepopen':!nerdtree#closeTreeOnOpen()}) + endif + return + endif + endif + endif +endfunction + +" FUNCTION: s:handleMiddleMouse() {{{1 +function! s:handleMiddleMouse() abort + + " A middle mouse click does not automatically position the cursor as one + " would expect. Forcing the execution of a regular left mouse click here + " fixes this problem. + execute "normal! \" + + let l:currentNode = g:NERDTreeFileNode.GetSelected() + if empty(l:currentNode) + call nerdtree#echoError('use the pointer to select a node') + return + endif + + if l:currentNode.path.isDirectory + call l:currentNode.openExplorer() + else + call l:currentNode.open({'where': 'h'}) + endif +endfunction + +" FUNCTION: nerdtree#ui_glue#invokeKeyMap(key) {{{1 +"this is needed since I cant figure out how to invoke dict functions from a +"key map +function! nerdtree#ui_glue#invokeKeyMap(key) abort + call g:NERDTreeKeyMap.Invoke(a:key) +endfunction + +" FUNCTION: s:jumpToFirstChild(node) {{{1 +function! s:jumpToFirstChild(node) abort + call s:jumpToChild(a:node, 0) +endfunction + +" FUNCTION: s:jumpToLastChild(node) {{{1 +function! s:jumpToLastChild(node) abort + call s:jumpToChild(a:node, 1) +endfunction + +" FUNCTION: s:jumpToChild(node, last) {{{1 +" Jump to the first or last child node at the same file system level. +" +" Args: +" node: the node on which the cursor currently sits +" last: 1 (true) if jumping to last child, 0 (false) if jumping to first +function! s:jumpToChild(node, last) abort + let l:node = a:node.path.isDirectory ? a:node.getCascadeRoot() : a:node + + if l:node.isRoot() + return + endif + + let l:parent = l:node.parent + let l:children = l:parent.getVisibleChildren() + + let l:target = a:last ? l:children[len(l:children) - 1] : l:children[0] + + call l:target.putCursorHere(1, 0) + call b:NERDTree.ui.centerView() +endfunction + +" FUNCTION: s:jumpToParent(node) {{{1 +" Move the cursor to the parent of the specified node. For a cascade, move to +" the parent of the cascade's first node. At the root node, do nothing. +function! s:jumpToParent(node) abort + let l:node = a:node.path.isDirectory ? a:node.getCascadeRoot() : a:node + + if l:node.isRoot() + return + endif + + if empty(l:node.parent) + call nerdtree#echo('could not jump to parent node') + return + endif + + call l:node.parent.putCursorHere(1, 0) + call b:NERDTree.ui.centerView() +endfunction + +" FUNCTION: s:jumpToRoot() {{{1 +" moves the cursor to the root node +function! s:jumpToRoot() abort + call b:NERDTree.root.putCursorHere(1, 0) + call b:NERDTree.ui.centerView() +endfunction + +" FUNCTION: s:jumpToNextSibling(node) {{{1 +function! s:jumpToNextSibling(node) abort + call s:jumpToSibling(a:node, 1) +endfunction + +" FUNCTION: s:jumpToPrevSibling(node) {{{1 +function! s:jumpToPrevSibling(node) abort + call s:jumpToSibling(a:node, 0) +endfunction + +" FUNCTION: s:jumpToSibling(node, forward) {{{1 +" Move the cursor to the next or previous node at the same file system level. +" +" Args: +" node: the node on which the cursor currently sits +" forward: 0 to jump to previous sibling, 1 to jump to next sibling +function! s:jumpToSibling(node, forward) abort + let l:node = a:node.path.isDirectory ? a:node.getCascadeRoot() : a:node + let l:sibling = l:node.findSibling(a:forward) + + if empty(l:sibling) + return + endif + + call l:sibling.putCursorHere(1, 0) + call b:NERDTree.ui.centerView() +endfunction + +" FUNCTION: nerdtree#ui_glue#openBookmark(name) {{{1 +" Open the Bookmark that has the specified name. This function provides the +" implementation for the :OpenBookmark command. +function! nerdtree#ui_glue#openBookmark(name) abort + try + let l:bookmark = g:NERDTreeBookmark.BookmarkFor(a:name) + catch /^NERDTree.BookmarkNotFoundError/ + call nerdtree#echoError('bookmark "' . a:name . '" not found') + return + endtry + if l:bookmark.path.isDirectory + call l:bookmark.open(b:NERDTree) + return + endif + + call l:bookmark.open(b:NERDTree, s:initCustomOpenArgs().file) +endfunction + +" FUNCTION: s:openHSplit(target) {{{1 +function! s:openHSplit(target) abort + call a:target.activate({'where': 'h', 'keepopen': !nerdtree#closeTreeOnOpen()}) +endfunction + +" FUNCTION: s:openVSplit(target) {{{1 +function! s:openVSplit(target) abort + call a:target.activate({'where': 'v', 'keepopen': !nerdtree#closeTreeOnOpen()}) +endfunction + +"FUNCTION: s:openHSplitBookmark(bookmark) {{{1 +"handle the user activating a bookmark +function! s:openHSplitBookmark(bm) abort + call a:bm.activate(b:NERDTree, !a:bm.path.isDirectory ? {'where': 'h', 'keepopen': !nerdtree#closeTreeOnOpen()} : {}) +endfunction + +"FUNCTION: s:openVSplitBookmark(bookmark) {{{1 +"handle the user activating a bookmark +function! s:openVSplitBookmark(bm) abort + call a:bm.activate(b:NERDTree, !a:bm.path.isDirectory ? {'where': 'v', 'keepopen': !nerdtree#closeTreeOnOpen()} : {}) +endfunction + +" FUNCTION: s:previewHSplitBookmark(bookmark) {{{1 +function! s:previewNodeHSplitBookmark(bookmark) abort + call a:bookmark.activate(b:NERDTree, !a:bookmark.path.isDirectory ? {'stay': 1, 'where': 'h', 'keepopen': 1} : {}) +endfunction + +" FUNCTION: s:previewVSplitBookmark(bookmark) {{{1 +function! s:previewNodeVSplitBookmark(bookmark) abort + call a:bookmark.activate(b:NERDTree, !a:bookmark.path.isDirectory ? {'stay': 1, 'where': 'v', 'keepopen': 1} : {}) +endfunction + +" FUNCTION: s:openExplorer(node) {{{1 +function! s:openExplorer(node) abort + call a:node.openExplorer() +endfunction + +" FUNCTION: s:openInNewTab(target) {{{1 +function! s:openInNewTab(target) abort + let l:opener = g:NERDTreeOpener.New(a:target.path, {'where': 't', 'keepopen': !nerdtree#closeTreeOnOpen()}) + call l:opener.open(a:target) +endfunction + +" FUNCTION: s:openInNewTabSilent(target) {{{1 +function! s:openInNewTabSilent(target) abort + let l:opener = g:NERDTreeOpener.New(a:target.path, {'where': 't', 'keepopen': !nerdtree#closeTreeOnOpen(), 'stay': 1}) + call l:opener.open(a:target) +endfunction + +" FUNCTION: s:openNodeRecursively(node) {{{1 +function! s:openNodeRecursively(node) abort + call nerdtree#echo('Recursively opening node. Please wait...') + call a:node.openRecursively() + call b:NERDTree.render() + call nerdtree#echo('') +endfunction + +" FUNCTION: s:previewBookmark(bookmark) {{{1 +function! s:previewBookmark(bookmark) abort + if a:bookmark.path.isDirectory + execute 'NERDTreeFind '.a:bookmark.path.str() + else + call a:bookmark.activate(b:NERDTree, {'stay': 1, 'where': 'p', 'keepopen': 1}) + endif +endfunction + +"FUNCTION: s:previewNodeCurrent(node) {{{1 +function! s:previewNodeCurrent(node) abort + call a:node.open({'stay': 1, 'where': 'p', 'keepopen': 1}) +endfunction + +"FUNCTION: s:previewNodeHSplit(node) {{{1 +function! s:previewNodeHSplit(node) abort + call a:node.open({'stay': 1, 'where': 'h', 'keepopen': 1}) +endfunction + +"FUNCTION: s:previewNodeVSplit(node) {{{1 +function! s:previewNodeVSplit(node) abort + call a:node.open({'stay': 1, 'where': 'v', 'keepopen': 1}) +endfunction + +" FUNCTION: nerdtree#ui_glue#revealBookmark(name) {{{1 +" put the cursor on the node associate with the given name +function! nerdtree#ui_glue#revealBookmark(name) abort + try + let targetNode = g:NERDTreeBookmark.GetNodeForName(a:name, 0, b:NERDTree) + call targetNode.putCursorHere(0, 1) + catch /^NERDTree.BookmarkNotFoundError/ + call nerdtree#echo('Bookmark isn''t cached under the current root') + endtry +endfunction + +" FUNCTION: s:refreshRoot() {{{1 +" Reloads the current root. All nodes below this will be lost and the root dir +" will be reloaded. +function! s:refreshRoot() abort + if !g:NERDTree.IsOpen() + return + endif + call nerdtree#echo('Refreshing the root node. This could take a while...') + + let l:curWin = winnr() + call nerdtree#exec(g:NERDTree.GetWinNum() . 'wincmd w', 1) + call b:NERDTree.root.refresh() + call b:NERDTree.render() + redraw + call nerdtree#exec(l:curWin . 'wincmd w', 1) + call nerdtree#echo('') +endfunction + +" FUNCTION: s:refreshCurrent(node) {{{1 +" refreshes the root for the current node +function! s:refreshCurrent(node) abort + let node = a:node + if !node.path.isDirectory + let node = node.parent + endif + + call nerdtree#echo('Refreshing node. This could take a while...') + call node.refresh() + call b:NERDTree.render() + call nerdtree#echo('') +endfunction + +" FUNCTION: nerdtree#ui_glue#setupCommands() {{{1 +function! nerdtree#ui_glue#setupCommands() abort + command! -n=? -complete=dir -bar NERDTree :call g:NERDTreeCreator.CreateTabTree('') + command! -n=? -complete=dir -bar NERDTreeToggle :call g:NERDTreeCreator.ToggleTabTree('') + command! -n=0 -bar NERDTreeClose :call g:NERDTree.Close() + command! -n=1 -complete=customlist,nerdtree#completeBookmarks -bar NERDTreeFromBookmark call g:NERDTreeCreator.CreateTabTree('') + command! -n=0 -bar NERDTreeMirror call g:NERDTreeCreator.CreateMirror() + command! -n=? -complete=file -bar NERDTreeFind call s:findAndRevealPath('') + command! -n=0 -bar NERDTreeRefreshRoot call s:refreshRoot() + command! -n=0 -bar NERDTreeFocus call NERDTreeFocus() + command! -n=0 -bar NERDTreeCWD call NERDTreeCWD() +endfunction + +" Function: s:SID() {{{1 +function! s:SID() abort + if !exists('s:sid') + let s:sid = matchstr(expand(''), '\zs\d\+\ze_SID$') + endif + return s:sid +endfun + +" FUNCTION: s:showMenu(node) {{{1 +function! s:showMenu(node) abort + let mc = g:NERDTreeMenuController.New(g:NERDTreeMenuItem.AllEnabled()) + call mc.showMenu() +endfunction + +" FUNCTION: s:toggleIgnoreFilter() {{{1 +function! s:toggleIgnoreFilter() abort + call b:NERDTree.ui.toggleIgnoreFilter() +endfunction + +" FUNCTION: s:toggleShowBookmarks() {{{1 +function! s:toggleShowBookmarks() abort + call b:NERDTree.ui.toggleShowBookmarks() +endfunction + +" FUNCTION: s:toggleShowFiles() {{{1 +function! s:toggleShowFiles() abort + call b:NERDTree.ui.toggleShowFiles() +endfunction + +" FUNCTION: s:toggleShowHidden() {{{1 +" toggles the display of hidden files +function! s:toggleShowHidden() abort + call b:NERDTree.ui.toggleShowHidden() +endfunction + +" FUNCTION: s:toggleZoom() {{{1 +function! s:toggleZoom() abort + call b:NERDTree.ui.toggleZoom() +endfunction + +" FUNCTION: nerdtree#ui_glue#upDir(preserveState) {{{1 +" Move the NERDTree up one level. +" +" Args: +" preserveState: if 1, the current root is left open when the new tree is +" rendered; if 0, the current root node is closed +function! nerdtree#ui_glue#upDir(preserveState) abort + + try + call b:NERDTree.root.cacheParent() + catch /^NERDTree.CannotCacheParentError/ + call nerdtree#echo('already at root directory') + return + endtry + + let l:oldRoot = b:NERDTree.root + let l:newRoot = b:NERDTree.root.parent + + call l:newRoot.open() + call l:newRoot.transplantChild(l:oldRoot) + + if !a:preserveState + call l:oldRoot.close() + endif + + call b:NERDTree.changeRoot(l:newRoot) + call l:oldRoot.putCursorHere(0, 0) +endfunction + +" FUNCTION: s:upDirCurrentRootOpen() {{{1 +function! s:upDirCurrentRootOpen() abort + call nerdtree#ui_glue#upDir(1) +endfunction + +" FUNCTION: s:upDirCurrentRootClosed() {{{1 +function! s:upDirCurrentRootClosed() abort + call nerdtree#ui_glue#upDir(0) +endfunction + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/home-rc/dot-files/.vim/bundle/nerdtree/doc/NERDTree.txt b/home-rc/dot-files/.vim/bundle/nerdtree/doc/NERDTree.txt new file mode 100644 index 0000000..55c25cd --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree/doc/NERDTree.txt @@ -0,0 +1,1534 @@ +*NERDTree.txt* A tree explorer plugin to rule the Vim world. Bwahahaha!! + + # #### #### ~ + ### \/#|### |/#### ~ + d8 888 ##\/#/ \||/##/_/##/_# ~ + d88 888 ee ,e e, ### \/###|/ \/ # ### ~ + d88888 888 88b d88 88b ##_\_#\_\## | #/###_/_#### ~ + 888 888 888 888 , ## #### # \ #| / #### ##/## ~ + 888 888 888 "YeeP" __#_--###`. |{,###---###-~ ~ + \ % @% ~ + Y88b Y88 888'Y88 888 88e 888 88e \%@% 88P'888'Y88 ~ + Y88b Y8 888 ,'Y 888 888D 888 888b %o% P' 888 'Y 888,8, ,e e, ,e e, ~ + b Y88b Y 888C8 888 88" 888 8888D %@% 888 888 " d88 88b d88 88b ~ + 8b Y88b 888 ",d 888 b, 888 888P %@% 888 888 888 , 888 , ~ + 88b Y88b 888,d88 888 88b, 888 88" %@% 888 888 "YeeP" "YeeP" ~ + , -=-%{@%-^- _ ~ + ejm `} Reference Manual ~ + { ~ +============================================================================== +CONTENTS *NERDTree-contents* + + 1.Intro...................................|NERDTree| + 2.Functionality provided..................|NERDTreeFunctionality| + 2.1.Global commands...................|NERDTreeGlobalCommands| + 2.2.Bookmarks.........................|NERDTreeBookmarks| + 2.2.1.The bookmark table..........|NERDTreeBookmarkTable| + 2.2.2.Bookmark commands...........|NERDTreeBookmarkCommands| + 2.2.3.Invalid bookmarks...........|NERDTreeInvalidBookmarks| + 2.3.NERDTree mappings.................|NERDTreeMappings| + 2.4.The NERDTree menu.................|NERDTreeMenu| + 3.Settings................................|NERDTreeSettings| + 3.1.Settings summary..................|NERDTreeSettingsSummary| + 3.2.Settings details..................|NERDTreeSettingsDetails| + 4.The NERDTree API........................|NERDTreeAPI| + 4.1.Key map API.......................|NERDTreeKeymapAPI| + 4.2.Menu API..........................|NERDTreeMenuAPI| + 4.3.Menu API..........................|NERDTreeAddPathFilter()| + 4.4.Path Listener API.................|NERDTreePathListenerAPI| + 5.About...................................|NERDTreeAbout| + 6.License.................................|NERDTreeLicense| + +============================================================================== +1. Intro *NERDTree* + +What is this "NERDTree"?? + +The NERDTree allows you to explore your filesystem and to open files and +directories. It presents the filesystem to you in the form of a tree which you +manipulate with the keyboard and/or mouse. It also allows you to perform +simple filesystem operations. + +The following features and functionality are provided by the NERDTree: + * Files and directories are displayed in a hierarchical tree structure + * Different highlighting is provided for the following types of nodes: + * files + * directories + * sym-links + * windows .lnk files + * read-only files + * executable files + * Many (customisable) mappings are provided to manipulate the tree: + * Mappings to open/close/explore directory nodes + * Mappings to open files in new/existing windows/tabs + * Mappings to change the current root of the tree + * Mappings to navigate around the tree + * ... + * Directories and files can be bookmarked. + * Most NERDTree navigation can also be done with the mouse + * Filtering of tree content (can be toggled at runtime) + * custom file filters to prevent e.g. vim backup files being displayed + * optional displaying of hidden files (. files) + * files can be "turned off" so that only directories are displayed + * The position and size of the NERDTree window can be customised + * The order in which the nodes in the tree are listed can be customised. + * A model of your filesystem is created/maintained as you explore it. This + has several advantages: + * All filesystem information is cached and is only re-read on demand + * If you revisit a part of the tree that you left earlier in your + session, the directory nodes will be opened/closed as you left them + * The script remembers the cursor position and window position in the NERD + tree so you can toggle it off (or just close the tree window) and then + reopen it (with NERDTreeToggle) the NERDTree window will appear exactly + as you left it + * You can have a separate NERDTree for each tab, share trees across tabs, + or a mix of both. + * By default the script overrides the default file browser (netrw), so if + you :edit a directory a (slightly modified) NERDTree will appear in the + current window + * A programmable menu system is provided (simulates right clicking on a + node) + * one default menu plugin is provided to perform basic filesystem + operations (create/delete/move/copy files/directories) + * There's an API for adding your own keymappings + + +============================================================================== +2. Functionality provided *NERDTreeFunctionality* + +------------------------------------------------------------------------------ +2.1. Global Commands *NERDTreeGlobalCommands* + +:NERDTree [ | ] *:NERDTree* + Opens a fresh NERDTree. The root of the tree depends on the argument + given. There are 3 cases: If no argument is given, the current directory + will be used. If a directory is given, that will be used. If a bookmark + name is given, the corresponding directory will be used. For example: > + :NERDTree /home/marty/vim7/src + :NERDTree foo (foo is the name of a bookmark) +< +:NERDTreeVCS [ | ] *:NERDTreeVCS* + Like |:NERDTree|, but searches up the directory tree to find the top of + the version control system repository, and roots the NERDTree there. It + works with Git, Subversion, Mercurial, Bazaar, and Darcs repositories. A + couple of examples: > + :NERDTreeVCS /home/marty/nerdtree/doc (opens /home/marty/nerdtree) + :NERDTreeVCS (opens root of repository containing CWD) +< +:NERDTreeFromBookmark *:NERDTreeFromBookmark* + Opens a fresh NERDTree with the root initialized to the directory for + . The only reason to use this command over :NERDTree is for + the completion (which is for bookmarks rather than directories). + +:NERDTreeToggle [ | ] *:NERDTreeToggle* + If a NERDTree already exists for this tab, it is reopened and rendered + again. If or is given, the root of NERDTree + is set to that path. If no NERDTree exists for this tab then this command + acts the same as the |:NERDTree| command. + +:NERDTreeToggleVCS [ | ] *:NERDTreeToggleVCS* + Like |:NERDTreeToggle|, but searches up the directory tree to find the top of + the version control system repository, and roots the NERDTree there. It + works with Git, Subversion, Mercurial, Bazaar, and Darcs repositories. A + couple of examples: > + :NERDTreeToggleVCS /home/marty/nerdtree/doc (opens /home/marty/nerdtree) + :NERDTreeToggleVCS (opens root of repository containing CWD) + +:NERDTreeFocus *:NERDTreeFocus* + Opens (or reopens) the NERDTree if it is not currently visible; + otherwise, the cursor is moved to the already-open NERDTree. + +:NERDTreeMirror *:NERDTreeMirror* + Shares an existing NERDTree, from another tab, in the current tab. + Changes made to one tree are reflected in both as they are actually the + same buffer. + + If only one other NERDTree exists, that tree is automatically mirrored. + If more than one exists, the script will ask which tree to mirror. + +:NERDTreeClose *:NERDTreeClose* + Close the NERDTree in this tab. + +:NERDTreeFind [] *:NERDTreeFind* + Without the optional argument, find and reveal the file for the active + buffer in the NERDTree window. With the argument, find and + reveal the specified path. + + Focus will be shifted to the NERDTree window, and the cursor will be + placed on the tree node for the determined path. If a NERDTree for the + current tab does not exist, a new one will be initialized. + +:NERDTreeCWD *:NERDTreeCWD* + Change the NERDTree root to the current working directory. If no + NERDTree exists for this tab, a new one is opened. + +:NERDTreeRefreshRoot *:NERDTreeRefreshRoot* + Refreshes the NERDTree root node. + +------------------------------------------------------------------------------ +2.2. Bookmarks *NERDTreeBookmarks* + +Bookmarks in the NERDTree are a way to tag files or directories of interest. +For example, you could use bookmarks to tag all of your project directories. + +------------------------------------------------------------------------------ +2.2.1. The Bookmark Table *NERDTreeBookmarkTable* + +If the bookmark table is active (see |NERDTree-B| and +|NERDTreeShowBookmarks|), it will be rendered above the tree. You can double +click bookmarks or use the |NERDTree-o| mapping to activate them. See also, +|NERDTree-t| and |NERDTree-T| + +------------------------------------------------------------------------------ +2.2.2. Bookmark commands *NERDTreeBookmarkCommands* + +Note: The following commands are only available within the NERDTree buffer. + +:Bookmark [] + Bookmark the current node as . If there is already a + bookmark, it is overwritten. must not contain spaces. + If is not provided, it defaults to the file or directory name. + For directories, a trailing slash is present. + +:BookmarkToRoot + Make the directory corresponding to the new root. If a treenode + corresponding to is already cached somewhere in the tree then + the current tree will be used, otherwise a fresh tree will be opened. + Note that if points to a file then its parent will be used + instead. + +:RevealBookmark + If the node is cached under the current root then it will be revealed + (i.e. directory nodes above it will be opened) and the cursor will be + placed on it. + +:OpenBookmark + The Bookmark named is opened as if |NERDTree-o| was applied to + its entry in the Bookmark table. If the Bookmark points to a directory, + it is made the new root of the current NERDTree. If the Bookmark points + to a file, that file is opened for editing in another window. + +:ClearBookmarks [] + Remove all the given bookmarks. If no bookmarks are given then remove all + bookmarks on the current node. + +:ClearAllBookmarks + Remove all bookmarks. + +:EditBookmarks + Opens the bookmarks file for manual editing, e.g. for removing invalid + bookmarks. + +:ReadBookmarks + Re-read the bookmarks in the |NERDTreeBookmarksFile|. + +See also |:NERDTree| and |:NERDTreeFromBookmark|. + +------------------------------------------------------------------------------ +2.2.3. Invalid Bookmarks *NERDTreeInvalidBookmarks* + +If invalid bookmarks are detected, the script will issue an error message and +the invalid bookmarks will become unavailable for use. + +These bookmarks will still be stored in the bookmarks file (see +|NERDTreeBookmarksFile|), down at the bottom. There will always be a blank line +after the valid bookmarks but before the invalid ones. + +Each line in the bookmarks file represents one bookmark. The proper format is: + + +You can use the :EditBookmarks command to open the bookmarks file for editing. +After you have corrected any invalid bookmarks, either restart vim, or run +:ReadBookmarks from the NERDTree window. + +------------------------------------------------------------------------------ +2.3. NERDTree Mappings *NERDTreeMappings* + +Default~ +Key Description help-tag~ + +o........Open files, directories and bookmarks......................|NERDTree-o| +go.......Open selected file, but leave cursor in the NERDTree......|NERDTree-go| + Find selected bookmark directory in current NERDTree +t........Open selected node/bookmark in a new tab...................|NERDTree-t| +T........Same as 't' but keep the focus on the current tab..........|NERDTree-T| +i........Open selected file in a split window.......................|NERDTree-i| +gi.......Same as i, but leave the cursor on the NERDTree...........|NERDTree-gi| +s........Open selected file in a new vsplit.........................|NERDTree-s| +gs.......Same as s, but leave the cursor on the NERDTree...........|NERDTree-gs| +.....User-definable custom open action.......................|NERDTree-| +O........Recursively open the selected directory....................|NERDTree-O| +x........Close the current nodes parent.............................|NERDTree-x| +X........Recursively close all children of the current node.........|NERDTree-X| +e........Edit the current directory.................................|NERDTree-e| + +double-click....same as |NERDTree-o|. +middle-click....same as |NERDTree-i| for files, and |NERDTree-e| for directories. + +D........Delete the current bookmark ...............................|NERDTree-D| + +P........Jump to the root node......................................|NERDTree-P| +p........Jump to current nodes parent...............................|NERDTree-p| +K........Jump up inside directories at the current tree depth.......|NERDTree-K| +J........Jump down inside directories at the current tree depth.....|NERDTree-J| +....Jump down to next sibling of the current directory.......|NERDTree-C-J| +....Jump up to previous sibling of the current directory.....|NERDTree-C-K| + +C........Change the tree root to the selected directory.............|NERDTree-C| +u........Move the tree root up one directory........................|NERDTree-u| +U........Same as 'u' except the old root node is left open..........|NERDTree-U| +r........Recursively refresh the current directory..................|NERDTree-r| +R........Recursively refresh the current root.......................|NERDTree-R| +m........Display the NERDTree menu..................................|NERDTree-m| +cd.......Change the CWD to the directory of the selected node......|NERDTree-cd| +CD.......Change tree root to the CWD...............................|NERDTree-CD| + +I........Toggle whether hidden files displayed......................|NERDTree-I| +f........Toggle whether the file filters are used...................|NERDTree-f| +F........Toggle whether files are displayed.........................|NERDTree-F| +B........Toggle whether the bookmark table is displayed.............|NERDTree-B| + +q........Close the NERDTree window..................................|NERDTree-q| +A........Zoom (maximize/minimize) the NERDTree window...............|NERDTree-A| +?........Toggle the display of the quick help.......................|NERDTree-?| + +------------------------------------------------------------------------------ + *NERDTree-o* +Default key: o +Map setting: NERDTreeMapActivateNode +Applies to: files and directories. + +If a file node is selected, it is opened in the previous window. + +If a directory is selected it is opened or closed depending on its current +state. + +If a bookmark that links to a directory is selected then that directory +becomes the new root. + +If a bookmark that links to a file is selected then that file is opened in the +previous window. + +------------------------------------------------------------------------------ + *NERDTree-go* +Default key: go +Map setting: NERDTreeMapPreview +Applies to: files. + +If a file node or a bookmark that links to a file is selected, it is opened in +the previous window, but the cursor does not move. + +If a bookmark that links to a directory is selected then that directory +becomes the new root. + +The default key combo for this mapping is "g" + NERDTreeMapActivateNode (see +|NERDTree-o|). + +------------------------------------------------------------------------------ + *NERDTree-t* +Default key: t +Map setting: *NERDTreeMapOpenInTab* +Applies to: files and directories. + +Opens the selected file in a new tab. If a directory is selected, a fresh +NERDTree for that directory is opened in a new tab. + +If a bookmark which points to a directory is selected, open a NERDTree for +that directory in a new tab. If the bookmark points to a file, open that file +in a new tab. + +------------------------------------------------------------------------------ + *NERDTree-T* +Default key: T +Map setting: *NERDTreeMapOpenInTabSilent* +Applies to: files and directories. + +The same as |NERDTree-t| except that the focus is kept in the current tab. + +------------------------------------------------------------------------------ + *NERDTree-i* +Default key: i +Map setting: *NERDTreeMapOpenSplit* +Applies to: files, and bookmarks pointing to files. + +Opens the selected file in a new split window and puts the cursor in the new +window. + +------------------------------------------------------------------------------ + *NERDTree-gi* +Default key: gi +Map setting: *NERDTreeMapPreviewSplit* +Applies to: files, and bookmarks pointing to files. + +The same as |NERDTree-i| except that the cursor is not moved. + +The default key combo for this mapping is "g" + NERDTreeMapOpenSplit (see +|NERDTree-i|). + +------------------------------------------------------------------------------ + *NERDTree-s* +Default key: s +Map setting: *NERDTreeMapOpenVSplit* +Applies to: files, and bookmarks pointing to files. + +Opens the selected file in a new vertically split window and puts the cursor +in the new window. + +------------------------------------------------------------------------------ + *NERDTree-gs* +Default key: gs +Map setting: *NERDTreeMapPreviewVSplit* +Applies to: files, and bookmarks pointing to files. + +The same as |NERDTree-s| except that the cursor is not moved. + +The default key combo for this mapping is "g" + NERDTreeMapOpenVSplit (see +|NERDTree-s|). + +------------------------------------------------------------------------------ + *NERDTree-* +Default key: +Map setting: *NERDTreeMapCustomOpen* +Applies to: files, directories, and bookmarks + +Performs a customized open action on the selected node. This allows the user +to define an action that behaves differently from any of the standard +keys. See |NERDTreeCustomOpenArgs| for more details. +------------------------------------------------------------------------------ + *NERDTree-O* +Default key: O +Map setting: *NERDTreeMapOpenRecursively* +Applies to: directories. + +Recursively opens the selected directory. + +All files and directories are cached, but if a directory would not be +displayed due to file filters (see |NERDTreeIgnore| |NERDTree-f|) or the +hidden file filter (see |NERDTreeShowHidden|) then its contents are not +cached. This is handy, especially if you have .svn directories. + +------------------------------------------------------------------------------ + *NERDTree-x* +Default key: x +Map setting: *NERDTreeMapCloseDir* +Applies to: files and directories. + +Closes the parent of the selected node. + +------------------------------------------------------------------------------ + *NERDTree-X* +Default key: X +Map setting: *NERDTreeMapCloseChildren* +Applies to: directories. + +Recursively closes all children of the selected directory. + +Tip: To quickly "reset" the tree, use |NERDTree-P| with this mapping. + +------------------------------------------------------------------------------ + *NERDTree-e* +Default key: e +Map setting: *NERDTreeMapOpenExpl* +Applies to: files and directories. + +|:edit|s the selected directory, or the selected file's directory. This could +result in a NERDTree or a netrw being opened, depending on +|NERDTreeHijackNetrw|. + +------------------------------------------------------------------------------ + *NERDTree-D* +Default key: D +Map setting: *NERDTreeMapDeleteBookmark* +Applies to: lines in the bookmarks table + +Deletes the currently selected bookmark. + +------------------------------------------------------------------------------ + *NERDTree-P* +Default key: P +Map setting: *NERDTreeMapJumpRoot* +Applies to: no restrictions. + +Jump to the tree root. + +------------------------------------------------------------------------------ + *NERDTree-p* +Default key: p +Map setting: *NERDTreeMapJumpParent* +Applies to: files and directories. + +Jump to the parent node of the selected node. + +------------------------------------------------------------------------------ + *NERDTree-K* +Default key: K +Map setting: *NERDTreeMapJumpFirstChild* +Applies to: files and directories. + +Jump to the first child of the current nodes parent. + +If the cursor is already on the first node then do the following: + * loop back thru the siblings of the current nodes parent until we find an + open directory with children + * go to the first child of that node + +------------------------------------------------------------------------------ + *NERDTree-J* +Default key: J +Map setting: *NERDTreeMapJumpLastChild* +Applies to: files and directories. + +Jump to the last child of the current nodes parent. + +If the cursor is already on the last node then do the following: + * loop forward thru the siblings of the current nodes parent until we find + an open directory with children + * go to the last child of that node + +------------------------------------------------------------------------------ + *NERDTree-C-J* +Default key: +Map setting: *NERDTreeMapJumpNextSibling* +Applies to: files and directories. + +Jump to the next sibling of the selected node. + +------------------------------------------------------------------------------ + *NERDTree-C-K* +Default key: +Map setting: *NERDTreeMapJumpPrevSibling* +Applies to: files and directories. + +Jump to the previous sibling of the selected node. + +------------------------------------------------------------------------------ + *NERDTree-C* +Default key: C +Map setting: *NERDTreeMapChangeRoot* +Applies to: files and directories. + +Make the selected directory node the new tree root. If a file is selected, its +parent is used. + +------------------------------------------------------------------------------ + *NERDTree-u* +Default key: u +Map setting: *NERDTreeMapUpdir* +Applies to: no restrictions. + +Move the tree root up a directory (like doing a "cd .."). + +------------------------------------------------------------------------------ + *NERDTree-U* +Default key: U +Map setting: *NERDTreeMapUpdirKeepOpen* +Applies to: no restrictions. + +Like |NERDTree-u| except that the old tree root is kept open. + +------------------------------------------------------------------------------ + *NERDTree-r* +Default key: r +Map setting: *NERDTreeMapRefresh* +Applies to: files and directories. + +If a directory is selected, recursively refresh that directory, i.e. scan the +filesystem for changes and represent them in the tree. + +If a file node is selected then the above is done on it's parent. + +------------------------------------------------------------------------------ + *NERDTree-R* +Default key: R +Map setting: *NERDTreeMapRefreshRoot* +Applies to: no restrictions. + +Recursively refresh the tree root. + +------------------------------------------------------------------------------ + *NERDTree-m* +Default key: m +Map setting: *NERDTreeMapMenu* +Applies to: files and directories. + +Display the NERDTree menu. See |NERDTreeMenu| for details. + +------------------------------------------------------------------------------ + *NERDTree-cd* +Default key: cd +Map setting: *NERDTreeMapChdir* +Applies to: files and directories. + +Change Vim's current working directory to that of the selected node. + +------------------------------------------------------------------------------ + *NERDTree-CD* +Default key: CD +Map setting: *NERDTreeMapCWD* +Applies to: no restrictions. + +Change the NERDTree root to Vim's current working directory. + +------------------------------------------------------------------------------ + *NERDTree-I* +Default key: I +Map setting: *NERDTreeMapToggleHidden* +Applies to: no restrictions. + +Toggles whether hidden files (i.e. "dot files") are displayed. + +------------------------------------------------------------------------------ + *NERDTree-f* +Default key: f +Map setting: *NERDTreeMapToggleFilters* +Applies to: no restrictions. + +Toggles whether file filters are used. See |NERDTreeIgnore| for details. + +------------------------------------------------------------------------------ + *NERDTree-F* +Default key: F +Map setting: *NERDTreeMapToggleFiles* +Applies to: no restrictions. + +Toggles whether file nodes are displayed. + +------------------------------------------------------------------------------ + *NERDTree-B* +Default key: B +Map setting: *NERDTreeMapToggleBookmarks* +Applies to: no restrictions. + +Toggles whether the bookmarks table is displayed. + +------------------------------------------------------------------------------ + *NERDTree-q* +Default key: q +Map setting: *NERDTreeMapQuit* +Applies to: no restrictions. + +Closes the NERDTree window. + +------------------------------------------------------------------------------ + *NERDTree-A* +Default key: A +Map setting: *NERDTreeMapToggleZoom* +Applies to: no restrictions. + +Maximize (zoom) and minimize the NERDTree window. + +------------------------------------------------------------------------------ + *NERDTree-?* +Default key: ? +Map setting: *NERDTreeMapHelp* +Applies to: no restrictions. + +Toggles whether the quickhelp is displayed. + +------------------------------------------------------------------------------ + 2.3. The NERDTree menu *NERDTreeMenu* + +The NERDTree has a menu that can be programmed via the an API (see +|NERDTreeMenuAPI|). The idea is to simulate the "right click" menus that most +file explorers have. + +The script comes with two default menu plugins: exec_menuitem.vim and +fs_menu.vim. fs_menu.vim adds some basic filesystem operations to the menu for +creating/deleting/moving/copying files and directories. exec_menuitem.vim +provides a menu item to execute executable files. + +Related tags: |NERDTree-m| |NERDTreeApi| + +------------------------------------------------------------------------------ + *NERDTreeMenu-j* +Default key: j +Map option: *NERDTreeMenuDown* +Applies to: The NERDTree menu. + +Moves the cursor down. + +------------------------------------------------------------------------------ + *NERDTreeMenu-k* +Default key: k +Map option: *NERDTreeMenuUp* +Applies to: The NERDTree menu. + +Moves the cursor up. + +============================================================================== +3. Customisation *NERDTreeSettings* + + +------------------------------------------------------------------------------ +3.1. Customisation summary *NERDTreeSettingsSummary* + +The plugin provides the following settings that can customise the behaviour +the NERDTree. These settings should be set in your vimrc, using `:let`. + +|loaded_nerd_tree| Turns off the script. + +|NERDTreeAutoCenter| Controls whether the NERDTree window centers + when the cursor moves within a specified + distance to the top/bottom of the window. + +|NERDTreeAutoCenterThreshold| Controls the sensitivity of autocentering. + +|NERDTreeCaseSensitiveSort| Tells the NERDTree whether to be case + sensitive or not when sorting nodes. + +|NERDTreeNaturalSort| Tells the NERDTree whether to use natural sort + order or not when sorting nodes. + +|NERDTreeSortHiddenFirst| Tells the NERDTree whether to take the dot at + the beginning of the hidden file names into + account when sorting nodes. + +|NERDTreeChDirMode| Tells the NERDTree if/when it should change + vim's current working directory. + +|NERDTreeHighlightCursorline| Tell the NERDTree whether to highlight the + current cursor line. + +|NERDTreeHijackNetrw| Tell the NERDTree whether to replace the netrw + autocommands for exploring local directories. + +|NERDTreeIgnore| Tells the NERDTree which files to ignore. + +|NERDTreeRespectWildIgnore| Tells the NERDTree to respect `'wildignore'`. + +|NERDTreeBookmarksFile| Where the bookmarks are stored. + +|NERDTreeBookmarksSort| Control how the Bookmark table is sorted. + +|NERDTreeMarkBookmarks| Render bookmarked nodes with markers. + +|NERDTreeMouseMode| Manage the interpretation of mouse clicks. + +|NERDTreeQuitOnOpen| Closes the tree window or bookmark table after + opening a file. + +|NERDTreeShowBookmarks| Tells the NERDTree whether to display the + bookmarks table on startup. + +|NERDTreeShowFiles| Tells the NERDTree whether to display files in + the tree on startup. + +|NERDTreeShowHidden| Tells the NERDTree whether to display hidden + files on startup. + +|NERDTreeShowLineNumbers| Tells the NERDTree whether to display line + numbers in the tree window. + +|NERDTreeSortOrder| Tell the NERDTree how to sort the nodes in the + tree. + +|NERDTreeStatusline| Set a statusline for NERDTree windows. + +|NERDTreeWinPos| Tells the script where to put the NERDTree + window. + +|NERDTreeWinSize| Sets the window size when the NERDTree is + opened. + +|NERDTreeWinSizeMax| Sets the maximum window size when the NERDTree + is zoomed. + +|NERDTreeMinimalUI| Disables display of the 'Bookmarks' label and + 'Press ? for help' text. + +|NERDTreeMinimalMenu| Use a compact menu that fits on a single line + for adding, copying, deleting, etc + +|NERDTreeCascadeSingleChildDir| + Collapses on the same line directories that have + only one child directory. + +|NERDTreeCascadeOpenSingleChildDir| + Cascade open while selected directory has only + one child that also is a directory. + +|NERDTreeAutoDeleteBuffer| Tells the NERDTree to automatically remove a + buffer when a file is being deleted or renamed + via a context menu command. + +|NERDTreeCreatePrefix| Specify a prefix to be used when creating the + NERDTree window. + +|NERDTreeRemoveFileCmd| Specify a custom shell command to be used when + deleting files. Note that it should include one + space character at the end of the command and it + applies only to files. + +|NERDTreeRemoveDirCmd| Specify a custom shell command to be used when + deleting directories. Note that it should + include one space character at the end of the + command and it applies only to directories. + +|NERDTreeDirArrowCollapsible| These characters indicate when a directory is +|NERDTreeDirArrowExpandable| either collapsible or expandable. + +|NERDTreeNodeDelimiter| A single character that is used to separate the + file or directory name from the rest of the + characters on the line of text. + +|NERDTreeCustomOpenArgs| A dictionary with values that control how a node + is opened with the |NERDTree-| key. + +------------------------------------------------------------------------------ +3.2. Customisation details *NERDTreeSettingsDetails* + +To enable any of the below settings you should put an appropriate > + let = + + let loaded_nerd_tree=1 +< +------------------------------------------------------------------------------ + *NERDTreeAutoCenter* +Values: 0 or 1. +Default: 1 + +If set to 1, the NERDTree window will center around the cursor if it moves to +within |NERDTreeAutoCenterThreshold| lines of the top/bottom of the window. + +This is ONLY done in response to tree navigation mappings, +i.e. |NERDTree-J| |NERDTree-K| |NERDTree-C-J| |NERDTree-C-K| |NERDTree-p| +|NERDTree-P| + +The centering is done with a |zz| operation. + +------------------------------------------------------------------------------ + *NERDTreeAutoCenterThreshold* +Values: Any natural number. +Default: 3 + +This setting controls the "sensitivity" of the NERDTree auto centering. See +|NERDTreeAutoCenter| for details. + +------------------------------------------------------------------------------ + *NERDTreeCaseSensitiveSort* +Values: 0 or 1. +Default: 0. + +By default the NERDTree does not sort nodes case sensitively, i.e. nodes +could appear like this: > + bar.c + Baz.c + blarg.c + boner.c + Foo.c +< +But, if you set this setting to 1 then the case of the nodes will be taken +into account. The above nodes would then be sorted like this: > + Baz.c + Foo.c + bar.c + blarg.c + boner.c +< +------------------------------------------------------------------------------ + *NERDTreeNaturalSort* +Values: 0 or 1. +Default: 0. + +By default the NERDTree does not sort nodes in natural sort order, i.e. nodes +could appear like this: > + z1.txt + z10.txt + z100.txt + z11.txt + z110.txt + z2.txt + z20.txt + z3.txt +< +But if you set this setting to 1 then the natural sort order will be used. The +above nodes would then be sorted like this: > + z1.txt + z2.txt + z3.txt + z10.txt + z11.txt + z20.txt + z100.txt + z110.txt +< +------------------------------------------------------------------------------ + *NERDTreeUseTCD* +Values: 0 or 1. +Default: 0. + +By default, NERDTree will use the `:cd` command to change the current working +directory. If this setting is turned on, and the `:tcd` command is available, it +will be used instead. + +------------------------------------------------------------------------------ + *NERDTreeChDirMode* +Values: 0, 1, 2, or 3. +Default: 0. + +Use this setting to tell the script when (if at all) to change the current +working directory (CWD) for vim. + +If it is set to 0 then the CWD is never changed by the NERDTree. + +If set to 1 then the CWD is changed when the NERDTree is first loaded to the +directory it is initialized in. For example, if you start the NERDTree with > + :NERDTree /home/marty/foobar +< +then the CWD will be changed to /home/marty/foobar and will not be changed +again unless you init another NERDTree with a similar command. + +If the setting is set to 2 then it behaves the same as if set to 1 except that +the CWD is changed whenever the tree root is changed. For example, if the CWD +is /home/marty/foobar and you make the node for /home/marty/foobar/baz the new +root then the CWD will become /home/marty/foobar/baz. + +If the set to 3, then it behaves the same as if set to 2, and the CWD is +changed whenever changing tabs to whatever the tree root is on that tab. + +------------------------------------------------------------------------------ + *NERDTreeHighlightCursorline* +Values: 0 or 1. +Default: 1. + +If set to 1, the current cursor line in the NERDTree buffer will be +highlighted. This is done using the `'cursorline'` Vim option. + +------------------------------------------------------------------------------ + *NERDTreeHijackNetrw* +Values: 0 or 1. +Default: 1. + +If set to 1, doing a > + :edit +< +will open up a window level NERDTree instead of a netrw in the target window. + +Window level trees behaves slightly different from a regular trees in the +following respects: + 1. 'o' will open the selected file in the same window as the tree, + replacing it. + 2. you can have one tree per window - instead of per tab. + +------------------------------------------------------------------------------ + *NERDTreeIgnore* +Values: a list of regular expressions. +Default: ['\~$']. + +This setting is used to specify which files the NERDTree should ignore. It +must be a list of regular expressions. When the NERDTree is rendered, any +files/directories that match any of the regex's in NERDTreeIgnore won't be +displayed. + +For example if you put the following line in your vimrc: > + let NERDTreeIgnore=['\.vim$', '\~$'] +< +then all files ending in .vim or ~ will be ignored. + +There are 3 magic flags that can be appended to the end of each regular +expression to specify that the regex should match only filenames, only lowest +level directories, or a full path. These flags are "[[dir]]", "[[file]]", and +"[[path]]". Example: > + let NERDTreeIgnore=['\.d$[[dir]]', '\.o$[[file]]', 'tmp/cache$[[path]]'] +< +This will cause all directories ending in ".d" to be ignored, all files ending +in ".o" to be ignored, and the "cache" subdirectory of any "tmp" directory to +be ignored. All other "cache" directories will be displayed. + +When using the "[[path]]" tag on Windows, make sure you use escaped +backslashes for the separators in the regex, eg. 'Temp\\cache$[[path]]' + +Note: to tell the NERDTree not to ignore any files you must use the following +line: > + let NERDTreeIgnore=[] +< +The file filters can be turned on and off dynamically with the |NERDTree-f| +mapping. + +------------------------------------------------------------------------------ + *NERDTreeRespectWildIgnore* +Values: 0 or 1. +Default: 0. + +If set to 1, the `'wildignore'` setting is respected. + +------------------------------------------------------------------------------ + *NERDTreeBookmarksFile* +Values: a path +Default: $HOME/.NERDTreeBookmarks + +This is where bookmarks are saved. See |NERDTreeBookmarkCommands|. + +------------------------------------------------------------------------------ + *NERDTreeBookmarksSort* +Values: 0, 1, or 2 +Default: 1 + +This setting controls the method by which the list of user bookmarks is +sorted. When sorted, bookmarks will render in alphabetical order by name. + +If set to 0, the bookmarks list is not sorted. +If set to 1, the bookmarks list is sorted in a case-insensitive manner. +If set to 2, the bookmarks list is sorted in a case-sensitive manner. + +------------------------------------------------------------------------------ + *NERDTreeMarkBookmarks* +Values: 0 or 1 +Default: 1 + +If set to 1, Bookmarks will be specially marked whenever the NERDTree is +rendered. Users of the |NERDTreeMinimalUI| setting may prefer to disable +this setting for even less visual clutter. + +------------------------------------------------------------------------------ + *NERDTreeMouseMode* +Values: 1, 2 or 3. +Default: 1. + +If set to 1 then a double click on a node is required to open it. +If set to 2 then a single click will open directory nodes, while a double +click will still be required for file nodes. +If set to 3 then a single click will open any node. + +Note: a double click anywhere on a line that a tree node is on will +activate it, but all single-click activations must be done on name of the node +itself. For example, if you have the following node: > + | | |-application.rb +< +then (to single click activate it) you must click somewhere in +'application.rb'. + +------------------------------------------------------------------------------ + *NERDTreeQuitOnOpen* +Values: 0,1,2 or 3. +Default: 0 + +This setting governs whether the NERDTree window or the bookmarks table closes +after opening a file with the |NERDTree-o|, |NERDTree-i|, |NERDTree-t| and +|NERDTree-T| mappings. + + Value | NERDTree Window Behavior + -------+------------------------------------------------------- + 0 | No change + 1 | Closes after opening a file + 2 | Closes the bookmark table after opening a bookmark + 3(1+2) | Same as both 1 and 2 + +------------------------------------------------------------------------------ + *NERDTreeShowBookmarks* +Values: 0 or 1. +Default: 0. + +If this setting is set to 1 then the bookmarks table will be displayed. + +This setting can be toggled dynamically, per tree, with the |NERDTree-B| +mapping. + +------------------------------------------------------------------------------ + *NERDTreeShowFiles* +Values: 0 or 1. +Default: 1. + +If this setting is set to 1 then files are displayed in the NERDTree. If it +is set to 0 then only directories are displayed. + +This setting can be toggled dynamically, per tree, with the |NERDTree-F| +mapping and is useful for drastically shrinking the tree when you are +navigating to a different part of the tree. + +------------------------------------------------------------------------------ + *NERDTreeShowHidden* +Values: 0 or 1. +Default: 0. + +This setting tells vim whether to display hidden files by default. This +setting can be dynamically toggled, per tree, with the |NERDTree-I| mapping. +Use one of the follow lines for this setting: > + let NERDTreeShowHidden=0 + let NERDTreeShowHidden=1 +< +------------------------------------------------------------------------------ + *NERDTreeShowLineNumbers* +Values: 0 or 1. +Default: 0. + +This setting tells vim whether to display line numbers for the NERDTree +window. Use one of the follow lines for this setting: > + let NERDTreeShowLineNumbers=0 + let NERDTreeShowLineNumbers=1 +< +------------------------------------------------------------------------------ + *NERDTreeSortOrder* +Values: a list of regular expressions. +Default: ['\/$', '*', '\.swp$', '\.bak$', '\~$'] + +This setting is a list of regular expressions which are used to group or sort +the nodes under their parent. + +For example, if the setting is: > + ['\.vim$', '\.c$', '\.h$', '*', 'foobar'] +< +then all .vim files will be grouped at the top, followed by all .c files then +all .h files. All files containing the string 'foobar' will be placed at the +end. The star is a special flag: it tells the script that every node that +doesn't match any of the other regexps should be placed here. + +If no star is present in NERDTreeSortOrder, then one is automatically +appended to the end of the list. + +The regex '\/$' should be used to match directory nodes. + +Files can also be sorted by 1) the modification timestamp, 2) the size, or 3) +the extension. Directories are always sorted by name. To accomplish this, the +following special flags are used: + [[timestamp]] [[-timestamp]] [[size]] [[-size]] [[extension]] +The hyphen specifies a descending sort; extensions are sorted in ascending +order only. If placed at the beginning of the list, files are sorted according +to these flags first, and then grouped by the remaining items in the list. If +the flags are in any other position of the list, this special sorting is done +secondarily. See examples 4, 5, and 6 below. + +After this sorting is done, the files in each group are sorted alphabetically. + +Examples: > + (1) ['*', '\/$'] + (2) [] + (3) ['\/$', '\.rb$', '\.php$', '*', '\.swp$', '\.bak$', '\~$'] + (4) ['[[-size]]'] + (5) ['\/$', '*', '[[timestamp]]'] + (6) ['foo','\/$','[[extension]]'] +< +1. Directories will appear last, everything else will appear above. +2. Everything will simply appear in alphabetical order. +3. Directories will appear first, then ruby and php. Swap files, bak files + and vim backup files will appear last with everything else preceding them. +4. Everything is sorted by size, largest to smallest, with directories + considered to have size 0 bytes. +5. Directories will appear first alphabetically, followed by files, sorted by + timestamp, oldest first. +6. Files and directories matching 'foo' first, followed by other directories, + then all other files. Each section of files is sorted by file extension. + +------------------------------------------------------------------------------ + *NERDTreeStatusline* +Values: Any valid `'statusline'` setting. +Default: %{exists('b:NERDTree')?b:NERDTree.root.path.str():''} + +Defines the value for the `'statusline'` setting in NERDTree windows. + +Note: The setting is actually applied using |:let-&|, not |:set|, so +escaping spaces is not necessary. + +Setting this to -1 will deactivate it so that your global `'statusline'` +setting is used. + +------------------------------------------------------------------------------ + *NERDTreeWinPos* +Values: "left" or "right" +Default: "left". + +This setting is used to determine where NERDTree window is placed on the +screen. + +This setting makes it possible to use two different explorer plugins +simultaneously. For example, you could have the taglist plugin on the left of +the window and the NERDTree on the right. + +------------------------------------------------------------------------------ + *NERDTreeWinSize* +Values: a positive integer. +Default: 31. + +This setting is used to change the size of the NERDTree when it is loaded. + +------------------------------------------------------------------------------ + *NERDTreeMinimalUI* +Values: 0 or 1 +Default: 0 + +This setting disables the 'Bookmarks' label 'Press ? for help' text. Use one +of the following lines for this setting: > + let NERDTreeMinimalUI=0 + let NERDTreeMinimalUI=1 +< +------------------------------------------------------------------------------ + *NERDTreeMinimalMenu* +Values: 0 or 1 +Default: 0 + +This setting makes NERDTree use a smaller, more compact menu for adding, +copying, deleting nodes. This menu fits on a single line so Vim doesn't need to +scroll down to present it. This setting is recommended for users already +familiar with the menu items. It will look similar to this: + + Menu: [ (a)dd ,m,d,r,o,q,c,l] (Use j/k/enter or shortcut): + +An action can be selected with its shortcut key or with the NERDTreeMenuUp and +NERDTreeMenuDown keys, then pressing enter. + +Use one of the following lines for this setting: > + let NERDTreeMinimalMenu=0 + let NERDTreeMinimalMenu=1 +< +------------------------------------------------------------------------------ + *NERDTreeCascadeSingleChildDir* +Values: 0 or 1 +Default: 1. + +When displaying directory nodes, this setting tells NERDTree to collapse +directories that have only one child. Use one of the following lines for this +setting: > + let NERDTreeCascadeSingleChildDir=0 + let NERDTreeCascadeSingleChildDir=1 +< +------------------------------------------------------------------------------ + *NERDTreeCascadeOpenSingleChildDir* +Values: 0 or 1 +Default: 1. + +When opening directory nodes, this setting tells NERDTree to recursively open +directories that have only one child which is also a directory. NERDTree will +stop when it finds a directory that contains anything but another single +directory. This setting also causes the |NERDTree-x| mapping to close +directories in the same manner. This setting may be useful for Java projects. +Use one of the following lines for this setting: > + let NERDTreeCascadeOpenSingleChildDir=0 + let NERDTreeCascadeOpenSingleChildDir=1 +< +------------------------------------------------------------------------------ + *NERDTreeAutoDeleteBuffer* +Values: 0 or 1 +Default: 0. + +When using a context menu to delete or rename a file you may also want to +delete the buffer which is no more valid. If the setting is not set you will +see a confirmation if you really want to delete an old buffer. If you always +press 'y' then it's worth it to set this setting to 1. Use one of the +following lines for this setting: > + let NERDTreeAutoDeleteBuffer=0 + let NERDTreeAutoDeleteBuffer=1 +< +------------------------------------------------------------------------------ + *NERDTreeCreatePrefix* +Values: Any valid command prefix. +Default: "silent". + +Internally, NERDTree uses the |:edit| command to create a buffer in which to +display its tree view. You can augment this behavior by specifying a prefix +string such as "keepalt" or similar. For example, to have NERDTree create its +tree window using `silent keepalt keepjumps edit`: > + let NERDTreeCreatePrefix='silent keepalt keepjumps' +< +------------------------------------------------------------------------------ + *NERDTreeDirArrowCollapsible* *NERDTreeDirArrowExpandable* +Values: Any single character. +Defaults: Windows: ~ and + Others: ▾ and ▸ + +These characters indicate whether a directory is collapsible or expandable. +Example: > + let NERDTreeDirArrowExpandable=">" + let NERDTreeDirArrowCollapsible="v" +< +They can be set to "\u00a0" to replace the arrows with a non-breaking space. +If you do this you may need to change the node delimiter. See +|NERDTreeNodeDelimiter|. You cannot use the same character for both the arrows +and the delimiter. + +Alternatively, they can be set to '' (an empty string). This removes the +arrows and the single space that follows them, shifting the entire tree two +character positions to the left. + +------------------------------------------------------------------------------ + *NERDTreeNodeDelimiter* +Values: Any single character. +Default: varies (see below) + +This character is used to separate the file or directory name from the rest of +the characters in the line of text. It allows filenames to contain special +characters that are otherwise used in the NERDTree, such as square brackets, +braces, trailing asterisk, and leading space. For more details, see the +responsible pull request: https://github.com/preservim/nerdtree/pull/868. + +The default value of this variable depends on the features compiled into your +vim and the values of |NERDTreeDirArrowCollapsible| and +|NERDTreeDirArrowExpandable|. + * If your vim is compiled with the +conceal feature, it is the "\x07" + (BEL) character, and it is hidden by setting 'conceallevel' to 2. If you + use autocommands, make sure none of them change that setting in the + NERD_Tree_* buffers. + * If your vim does NOT have the +conceal feature and you're using "\u00a0" + (non-breaking space) to hide the directory arrows, "\u00b7" (middle dot) + is used as the default delimiter. + * If neither condition above applies, NERDTree uses "\u00a0" (non-breaking + space) as the default delimiter. + +In the 2nd and 3rd cases, NERDTree will use the Ignore highlight group to +"hide" the delimiter. It should appear as an empty space. + +Other plugins can interfere with these defaults, so if you need to change the +delimiter, be sure to choose a character that won't appear in your filenames +or any of the flags set by your installed NERDTree plugins. The suggestions +below are but a few of the many possibilities. Remember to use double quotes +when specifying by hex or Unicode. > + let NERDTreeNodeDelimiter="\x07" "bell + let NERDTreeNodeDelimiter="\u00b7" "middle dot + let NERDTreeNodeDelimiter="\u00a0" "non-breaking space + let NERDTreeNodeDelimiter="😀" "smiley face +< +------------------------------------------------------------------------------ + *NERDTreeCustomOpenArgs* +Values: A nested dictionary, as described below +Default: {'file': {'reuse': 'all', 'where': 'p'}, 'dir': {}} + +This dictionary contains two keys, 'file' and 'dir', whose values each are +another dictionary. The inner dictionary is a set of parameters used by +|NERDTree-| to open a file or directory. Setting these parameters allows you +to customize the way the node is opened. The default value matches what +|NERDTree-o| does. To change that behavior, use these keys and +values in the inner dictionaries: + +'where': specifies whether the node should be opened in a new split ("h" or + "v"), in a new tab ("t") or, in the last window ("p"). +'reuse': if file is already shown in a window, jump there; takes values + "all", "currenttab", or empty +'keepopen': boolean (0 or 1); if true, the tree window will not be closed +'stay': boolean (0 or 1); if true, remain in tree window after opening + +For example: +To open files and directories (creating a new NERDTree) in a new tab, > + {'file':{'where': 't'}, 'dir':{'where':'t'}} +< +To open a file always in the current tab, and expand directories in place, > + {'file': {'reuse':'currenttab', 'where':'p', 'keepopen':1, 'stay':1}} +< +============================================================================== +4. The NERDTree API *NERDTreeAPI* + +The NERDTree script allows you to add custom key mappings and menu items via +a set of API calls. Any scripts that use this API should be placed in +~/.vim/nerdtree_plugin/ (*nix) or ~/vimfiles/nerdtree_plugin (windows). + +The script exposes some prototype objects that can be used to manipulate the +tree and/or get information from it: > + g:NERDTreePath + g:NERDTreeDirNode + g:NERDTreeFileNode + g:NERDTreeBookmark +< +See the code/comments in NERD_tree.vim to find how to use these objects. The +following code conventions are used: + * class members start with a capital letter + * instance members start with a lower case letter + * private members start with an underscore + +See this blog post for more details: + http://got-ravings.blogspot.com/2008/09/vim-pr0n-prototype-based-objects.html + +A number of API functions take a callback argument to call. The callback can +be either a string with the name of a function to call, or a |Funcref| object +which will be called directly. + +------------------------------------------------------------------------------ +4.1. Key map API *NERDTreeKeymapAPI* + +NERDTreeAddKeyMap({options}) *NERDTreeAddKeyMap()* + Adds a new keymapping for all NERDTree buffers. + {options} must be a dictionary, and must contain the following keys: + "key" - the trigger key for the new mapping + "callback" - the function the new mapping will be bound to + "quickhelpText" - the text that will appear in the quickhelp (see + |NERDTree-?|) + "override" - if 1 then this new mapping will override whatever previous + mapping was defined for the key/scope combo. Useful for overriding the + default mappings. + + Additionally, a "scope" argument may be supplied. This constrains the + mapping so that it is only activated if the cursor is on a certain object. + That object is then passed into the handling method. Possible values are: + + "FileNode" .... a file node + "DirNode" ..... a directory node + "Node" ........ a file node OR a directory node + "Bookmark" .... a bookmark + "all" ......... global scope; handler receives no arguments (default) + + Example: > + call NERDTreeAddKeyMap({ + \ 'key': 'foo', + \ 'callback': 'NERDTreeEchoPathHandler', + \ 'quickhelpText': 'echo full path of current node', + \ 'scope': 'DirNode' }) + + function! NERDTreeEchoPathHandler(dirnode) + echo a:dirnode.path.str() + endfunction +< + This code should sit in a file like ~/.vim/nerdtree_plugin/mymapping.vim. + It adds a (redundant) mapping on 'foo' which changes vim's CWD to that of + the current directory node. Note this mapping will only fire when the + cursor is on a directory node. + +------------------------------------------------------------------------------ +4.2. Menu API *NERDTreeMenuAPI* + +NERDTreeAddSubmenu({options}) *NERDTreeAddSubmenu()* + Creates and returns a new submenu. + + {options} must be a dictionary and must contain the following keys: + "text" - the text of the submenu that the user will see + "shortcut" - a shortcut key for the submenu (need not be unique) + + The following keys are optional: + "isActiveCallback" - a function that will be called to determine whether + this submenu item will be displayed or not. The callback function must + return 0 or 1. + "parent" - the parent submenu of the new submenu (returned from a previous + invocation of NERDTreeAddSubmenu()). If this key is left out then the new + submenu will sit under the top level menu. + + See below for an example. + +NERDTreeAddMenuItem({options}) *NERDTreeAddMenuItem()* + Adds a new menu item to the NERDTree menu (see |NERDTreeMenu|). + + {options} must be a dictionary and must contain the + following keys: + "text" - the text of the menu item which the user will see + "shortcut" - a shortcut key for the menu item (need not be unique) + "callback" - the function that will be called when the user activates the + menu item. + + The following keys are optional: + "isActiveCallback" - a function that will be called to determine whether + this menu item will be displayed or not. The callback function must return + 0 or 1. + "parent" - if the menu item belongs under a submenu then this key must be + specified. This value for this key will be the object that + was returned when the submenu was created with |NERDTreeAddSubmenu()|. + + See below for an example. + +NERDTreeAddMenuSeparator([{options}]) *NERDTreeAddMenuSeparator()* + Adds a menu separator (a row of dashes). + + {options} is an optional dictionary that may contain the following keys: + "isActiveCallback" - see description in |NERDTreeAddMenuItem()|. + +Below is an example of the menu API in action. > + call NERDTreeAddMenuSeparator() + + call NERDTreeAddMenuItem({ + \ 'text': 'a (t)op level menu item', + \ 'shortcut': 't', + \ 'callback': 'SomeFunction' }) + + let submenu = NERDTreeAddSubmenu({ + \ 'text': 'a (s)ub menu', + \ 'shortcut': 's' }) + + call NERDTreeAddMenuItem({ + \ 'text': '(n)ested item 1', + \ 'shortcut': 'n', + \ 'callback': 'SomeFunction', + \ 'parent': submenu }) + + call NERDTreeAddMenuItem({ + \ 'text': '(n)ested item 2', + \ 'shortcut': 'n', + \ 'callback': 'SomeFunction', + \ 'parent': submenu }) +< +This will create the following menu: > + -------------------- + a (t)op level menu item + a (s)ub menu +< +Where selecting "a (s)ub menu" will lead to a second menu: > + (n)ested item 1 + (n)ested item 2 +< +When any of the 3 concrete menu items are selected the function "SomeFunction" +will be called. + +------------------------------------------------------------------------------ +4.3 NERDTreeAddPathFilter(callback) *NERDTreeAddPathFilter()* + +Path filters are essentially a more powerful version of |NERDTreeIgnore|. +If the simple regex matching in |NERDTreeIgnore| is not enough then use +|NERDTreeAddPathFilter()| to add a callback function that paths will be +checked against when the decision to ignore them is made. Example > + + call NERDTreeAddPathFilter('MyFilter') + + function! MyFilter(params) + "params is a dict containing keys: 'nerdtree' and 'path' which are + "g:NERDTree and g:NERDTreePath objects + + "return 1 to ignore params['path'] or 0 otherwise + endfunction +< +------------------------------------------------------------------------------ +4.4 Path Listener API *NERDTreePathListenerAPI* + +Use this API if you want to run a callback for events on Path objects. E.G > + + call g:NERDTreePathNotifier.AddListener("init", "MyListener") + + ".... + + function! MyListener(event) + "This function will be called whenever a Path object is created. + + "a:event is an object that contains a bunch of relevant info - + "including the affected path. See lib/nerdtree/event.vim for details. + endfunction +< +Current events supported: + init ~ + refresh ~ + refreshFlags ~ + +------------------------------------------------------------------------------ +NERDTreeRender() *NERDTreeRender()* + Re-renders the NERDTree buffer. Useful if you change the state of the + tree and you want to it to be reflected in the UI. + +============================================================================== +5. About *NERDTreeAbout* + +The author of the NERDTree is a terrible terrible monster called Martyzilla +who gobbles up small children with milk and sugar for breakfast. + +He can be reached at martin.grenfell at gmail dot com. He would love to hear +from you, so feel free to send him suggestions and/or comments about this +plugin. Don't be shy --- the worst he can do is slaughter you and stuff you +in the fridge for later ;) + +Martyzilla recruited two other unwitting accomplices to become his minions in +his quest to conquer the Vim plugin world. While he may still love to receive +your emails, the best way to send suggestions, bug reports, and questions is +to submit an issue at http://github.com/preservim/nerdtree/issues. + +The latest stable and development versions are on Github. + Stable: http://github.com/preservim/nerdtree (master branch) + Development: http://github.com/preservim/nerdtree/branches + +Title Credit: + * http://ascii.co.uk/art/tree + + * Patrick Gillespie's Text ASCII Art Generator + http://patorjk.com/software/taag + http://patorjk.com/software/taag/#p=display&f=Rozzo&t=the%20NERD%20Tree + +============================================================================== +6. License *NERDTreeLicense* + +The NERDTree is released under the wtfpl. +See http://sam.zoy.org/wtfpl/COPYING. + +------------------------------------------------------------------------------ + vim:tw=78:ts=8:ft=help:noet:nospell diff --git a/home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/bookmark.vim b/home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/bookmark.vim new file mode 100644 index 0000000..37be451 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/bookmark.vim @@ -0,0 +1,365 @@ +" ============================================================================ +" CLASS: Bookmark +" +" The Bookmark class serves two purposes: +" (1) It is the top-level prototype for new, concrete Bookmark objects. +" (2) It provides an interface for client code to query and manipulate the +" global list of Bookmark objects within the current Vim session. +" ============================================================================ + + +let s:Bookmark = {} +let g:NERDTreeBookmark = s:Bookmark + +" FUNCTION: Bookmark.activate(nerdtree) {{{1 +function! s:Bookmark.activate(nerdtree, ...) + call self.open(a:nerdtree, a:0 ? a:1 : {}) +endfunction + +" FUNCTION: Bookmark.AddBookmark(name, path) {{{1 +" Class method to add a new bookmark to the list, if a previous bookmark exists +" with the same name, just update the path for that bookmark +function! s:Bookmark.AddBookmark(name, path) + for i in s:Bookmark.Bookmarks() + if i.name ==# a:name + let i.path = a:path + return + endif + endfor + call add(s:Bookmark.Bookmarks(), s:Bookmark.New(a:name, a:path)) +endfunction + +" FUNCTION: Bookmark.Bookmarks() {{{1 +" Class method to get all bookmarks. Lazily initializes the bookmarks global +" variable +function! s:Bookmark.Bookmarks() + if !exists('g:NERDTreeBookmarks') + let g:NERDTreeBookmarks = [] + endif + return g:NERDTreeBookmarks +endfunction + +" FUNCTION: Bookmark.BookmarkExistsFor(name) {{{1 +" class method that returns 1 if a bookmark with the given name is found, 0 +" otherwise +function! s:Bookmark.BookmarkExistsFor(name) + try + call s:Bookmark.BookmarkFor(a:name) + return 1 + catch /^NERDTree.BookmarkNotFoundError/ + return 0 + endtry +endfunction + +" FUNCTION: Bookmark.BookmarkFor(name) {{{1 +" Class method that returns the Bookmark object having the specified name. +" Throws NERDTree.BookmarkNotFoundError if no Bookmark is found. +function! s:Bookmark.BookmarkFor(name) + let l:result = {} + for l:bookmark in s:Bookmark.Bookmarks() + if l:bookmark.name ==# a:name + let l:result = l:bookmark + break + endif + endfor + if empty(l:result) + throw 'NERDTree.BookmarkNotFoundError: "' . a:name . '" not found' + endif + return l:result +endfunction + +" FUNCTION: Bookmark.BookmarkNames() {{{1 +" Class method to return an array of all bookmark names +function! s:Bookmark.BookmarkNames() + let names = [] + for i in s:Bookmark.Bookmarks() + call add(names, i.name) + endfor + return names +endfunction + +" FUNCTION: Bookmark.CacheBookmarks(silent) {{{1 +" Class method to read all bookmarks from the bookmarks file initialize +" bookmark objects for each one. +" +" Args: +" silent - dont echo an error msg if invalid bookmarks are found +function! s:Bookmark.CacheBookmarks(silent) + if filereadable(g:NERDTreeBookmarksFile) + let g:NERDTreeBookmarks = [] + let g:NERDTreeInvalidBookmarks = [] + let bookmarkStrings = readfile(g:NERDTreeBookmarksFile) + let invalidBookmarksFound = 0 + for i in bookmarkStrings + + "ignore blank lines + if i !=# '' + + let name = substitute(i, '^\(.\{-}\) .*$', '\1', '') + let path = substitute(i, '^.\{-} \(.*\)$', '\1', '') + let path = fnamemodify(path, ':p') + + try + let bookmark = s:Bookmark.New(name, g:NERDTreePath.New(path)) + call add(g:NERDTreeBookmarks, bookmark) + catch /^NERDTree.InvalidArgumentsError/ + call add(g:NERDTreeInvalidBookmarks, i) + let invalidBookmarksFound += 1 + endtry + endif + endfor + if invalidBookmarksFound + call s:Bookmark.Write() + if !a:silent + call nerdtree#echo(invalidBookmarksFound . ' invalid bookmarks were read. See :help NERDTreeInvalidBookmarks for info.') + endif + endif + endif +endfunction + +" FUNCTION: Bookmark.CompareBookmarksByName(firstBookmark, secondBookmark) {{{1 +" Class method that indicates the relative position of two bookmarks when +" placed in alphabetical order by name. Case-sensitivity is determined by an +" option. Supports the s:Bookmark.SortBookmarksList() method. +function! s:Bookmark.CompareBookmarksByName(firstBookmark, secondBookmark) + let l:result = 0 + if g:NERDTreeBookmarksSort ==# 1 + if a:firstBookmark.name ? a:secondBookmark.name + let l:result = 1 + endif + elseif g:NERDTreeBookmarksSort ==# 2 + if a:firstBookmark.name <# a:secondBookmark.name + let l:result = -1 + elseif a:firstBookmark.name ># a:secondBookmark.name + let l:result = 1 + endif + endif + return l:result +endfunction + +" FUNCTION: Bookmark.ClearAll() {{{1 +" Class method to delete all bookmarks. +function! s:Bookmark.ClearAll() + for i in s:Bookmark.Bookmarks() + call i.delete() + endfor + call s:Bookmark.Write() +endfunction + +" FUNCTION: Bookmark.delete() {{{1 +" Delete this bookmark. If the node for this bookmark is under the current +" root, then recache bookmarks for its Path object +function! s:Bookmark.delete() + call remove(s:Bookmark.Bookmarks(), index(s:Bookmark.Bookmarks(), self)) + call s:Bookmark.Write() +endfunction + +" FUNCTION: s:Edit() {{{1 +" opens the NERDTreeBookmarks file for manual editing +function! s:Bookmark.Edit() + call nerdtree#exec('wincmd w', 1) + call nerdtree#exec('edit '.g:NERDTreeBookmarksFile, 1) +endfunction + +" FUNCTION: Bookmark.getNode(nerdtree, searchFromAbsoluteRoot) {{{1 +" Returns the tree node object associated with this Bookmark. +" Throws NERDTree.BookmarkedNodeNotFoundError if the node is not found. +" +" Args: +" searchFromAbsoluteRoot: boolean flag, search from the highest cached node +" if true and from the current tree root if false +function! s:Bookmark.getNode(nerdtree, searchFromAbsoluteRoot) + if a:searchFromAbsoluteRoot + let l:searchRoot = a:nerdtree.root.AbsoluteTreeRoot() + else + let l:searchRoot = a:nerdtree.root + endif + let l:targetNode = l:searchRoot.findNode(self.path) + if empty(l:targetNode) + throw 'NERDTree.BookmarkedNodeNotFoundError: node for bookmark "' . self.name . '" not found' + endif + return l:targetNode +endfunction + +" FUNCTION: Bookmark.GetNodeForName(name, searchFromAbsoluteRoot, nerdtree) {{{1 +" Class method that returns the tree node object for the Bookmark with the +" given name. Throws NERDTree.BookmarkNotFoundError if a Bookmark with the +" name does not exist. Throws NERDTree.BookmarkedNodeNotFoundError if a +" tree node for the named Bookmark could not be found. +function! s:Bookmark.GetNodeForName(name, searchFromAbsoluteRoot, nerdtree) + let l:bookmark = s:Bookmark.BookmarkFor(a:name) + return l:bookmark.getNode(a:nerdtree, a:searchFromAbsoluteRoot) +endfunction + +" FUNCTION: Bookmark.GetSelected() {{{1 +" returns the Bookmark the cursor is over, or {} +function! s:Bookmark.GetSelected() + let line = getline('.') + let name = substitute(line, '^>\(.\{-}\) .\+$', '\1', '') + if name !=# line + try + return s:Bookmark.BookmarkFor(name) + catch /^NERDTree.BookmarkNotFoundError/ + return {} + endtry + endif + return {} +endfunction + +" FUNCTION: Bookmark.InvalidBookmarks() {{{1 +" Class method to get all invalid bookmark strings read from the bookmarks +" file +function! s:Bookmark.InvalidBookmarks() + if !exists('g:NERDTreeInvalidBookmarks') + let g:NERDTreeInvalidBookmarks = [] + endif + return g:NERDTreeInvalidBookmarks +endfunction + +" FUNCTION: Bookmark.mustExist() {{{1 +function! s:Bookmark.mustExist() + if !self.path.exists() + call s:Bookmark.CacheBookmarks(1) + throw 'NERDTree.BookmarkPointsToInvalidLocationError: the bookmark "'. + \ self.name .'" points to a non existing location: "'. self.path.str() + endif +endfunction + +" FUNCTION: Bookmark.New(name, path) {{{1 +" Create a new bookmark object with the given name and path object +function! s:Bookmark.New(name, path) + if a:name =~# ' ' + throw 'NERDTree.IllegalBookmarkNameError: illegal name:' . a:name + endif + + let newBookmark = copy(self) + let newBookmark.name = a:name + let newBookmark.path = a:path + return newBookmark +endfunction + +" FUNCTION: Bookmark.open(nerdtree, [options]) {{{1 +"Args: +" +"nerdtree: the tree to load open the bookmark in +" +"A dictionary containing the following keys (all optional): +" 'where': Specifies whether the node should be opened in new split/tab or in +" the previous window. Can be either 'v' (vertical split), 'h' +" (horizontal split), 't' (new tab) or 'p' (previous window). +" 'reuse': if a window is displaying the file then jump the cursor there +" 'keepopen': dont close the tree window +" 'stay': open the file, but keep the cursor in the tree win +" +function! s:Bookmark.open(nerdtree, ...) + let opts = a:0 ? a:1 : {} + + if nerdtree#closeBookmarksOnOpen() + call a:nerdtree.ui.toggleShowBookmarks() + endif + + if self.path.isDirectory && !has_key(opts, 'where') + call self.toRoot(a:nerdtree) + else + let opener = g:NERDTreeOpener.New(self.path, opts) + call opener.open(self) + endif +endfunction + +" FUNCTION: Bookmark.openInNewTab(options) {{{1 +" Create a new bookmark object with the given name and path object +function! s:Bookmark.openInNewTab(options) + call nerdtree#deprecated('Bookmark.openInNewTab', 'is deprecated, use open() instead') + call self.open(a:options) +endfunction + +" FUNCTION: Bookmark.setPath(path) {{{1 +" makes this bookmark point to the given path +function! s:Bookmark.setPath(path) + let self.path = a:path +endfunction + +" FUNCTION: Bookmark.SortBookmarksList() {{{1 +" Class method that sorts the global list of bookmarks alphabetically by name. +" Note that case-sensitivity is determined by a user option. +function! s:Bookmark.SortBookmarksList() + call sort(s:Bookmark.Bookmarks(), s:Bookmark.CompareBookmarksByName, s:Bookmark) +endfunction + +" FUNCTION: Bookmark.str() {{{1 +" Get the string that should be rendered in the view for this bookmark +function! s:Bookmark.str() + let pathStrMaxLen = winwidth(g:NERDTree.GetWinNum()) - 4 - strdisplaywidth(self.name) + if &number + let pathStrMaxLen = pathStrMaxLen - &numberwidth + endif + + let pathStr = self.path.str({'format': 'UI'}) + if strdisplaywidth(pathStr) > pathStrMaxLen + while strdisplaywidth(pathStr) > pathStrMaxLen && strchars(pathStr) > 0 + let pathStr = substitute(pathStr, '^.', '', '') + endwhile + let pathStr = '<' . pathStr + endif + return '>' . self.name . ' ' . pathStr +endfunction + +" FUNCTION: Bookmark.toRoot(nerdtree) {{{1 +" Set the root of the given NERDTree to the node for this Bookmark. If a node +" for this Bookmark does not exist, a new one is initialized. +function! s:Bookmark.toRoot(nerdtree) + if self.validate() + try + let l:targetNode = self.getNode(a:nerdtree, 1) + call l:targetNode.closeChildren() + catch /^NERDTree.BookmarkedNodeNotFoundError/ + let l:targetNode = g:NERDTreeFileNode.New(s:Bookmark.BookmarkFor(self.name).path, a:nerdtree) + endtry + call a:nerdtree.changeRoot(l:targetNode) + endif +endfunction + +" FUNCTION: Bookmark.ToRoot(name, nerdtree) {{{1 +" Class method that makes the Bookmark with the given name the root of +" specified NERDTree. +function! s:Bookmark.ToRoot(name, nerdtree) + let l:bookmark = s:Bookmark.BookmarkFor(a:name) + call l:bookmark.toRoot(a:nerdtree) +endfunction + +" FUNCTION: Bookmark.validate() {{{1 +function! s:Bookmark.validate() + if self.path.exists() + return 1 + else + call s:Bookmark.CacheBookmarks(1) + call nerdtree#echo(self.name . 'now points to an invalid location. See :help NERDTreeInvalidBookmarks for info.') + return 0 + endif +endfunction + +" FUNCTION: Bookmark.Write() {{{1 +" Class method to write all bookmarks to the bookmarks file +function! s:Bookmark.Write() + let bookmarkStrings = [] + for i in s:Bookmark.Bookmarks() + call add(bookmarkStrings, i.name . ' ' . fnamemodify(i.path.str(), ':~')) + endfor + + "add a blank line before the invalid ones + call add(bookmarkStrings, '') + + for j in s:Bookmark.InvalidBookmarks() + call add(bookmarkStrings, j) + endfor + + try + call writefile(bookmarkStrings, g:NERDTreeBookmarksFile) + catch + call nerdtree#echoError('Failed to write bookmarks file. Make sure g:NERDTreeBookmarksFile points to a valid location.') + endtry +endfunction + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/creator.vim b/home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/creator.vim new file mode 100644 index 0000000..b9d45dc --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/creator.vim @@ -0,0 +1,402 @@ +" ============================================================================ +" CLASS: Creator +" +" This class is responsible for creating NERDTree instances. The new NERDTree +" may be a tab tree, a window tree, or a mirrored tree. In the process of +" creating a NERDTree, it sets up all of the window and buffer options and key +" mappings etc. +" ============================================================================ + + +let s:Creator = {} +let g:NERDTreeCreator = s:Creator + +" FUNCTION: s:Creator._bindMappings() {{{1 +function! s:Creator._bindMappings() + call g:NERDTreeKeyMap.BindAll() + + command! -buffer -nargs=? Bookmark :call nerdtree#ui_glue#bookmarkNode('') + command! -buffer -complete=customlist,nerdtree#completeBookmarks -nargs=1 RevealBookmark :call nerdtree#ui_glue#revealBookmark('') + command! -buffer -complete=customlist,nerdtree#completeBookmarks -nargs=1 OpenBookmark call nerdtree#ui_glue#openBookmark('') + command! -buffer -complete=customlist,nerdtree#completeBookmarks -nargs=* ClearBookmarks call nerdtree#ui_glue#clearBookmarks('') + command! -buffer -complete=customlist,nerdtree#completeBookmarks -nargs=+ BookmarkToRoot call g:NERDTreeBookmark.ToRoot('', b:NERDTree) + command! -buffer -nargs=0 ClearAllBookmarks call g:NERDTreeBookmark.ClearAll() call b:NERDTree.render() + command! -buffer -nargs=0 ReadBookmarks call g:NERDTreeBookmark.CacheBookmarks(0) call b:NERDTree.render() + command! -buffer -nargs=0 WriteBookmarks call g:NERDTreeBookmark.Write() + command! -buffer -nargs=0 EditBookmarks call g:NERDTreeBookmark.Edit() +endfunction + +" FUNCTION: s:Creator._broadcastInitEvent() {{{1 +function! s:Creator._broadcastInitEvent() + if exists('#User#NERDTreeInit') + doautocmd User NERDTreeInit + endif +endfunction + +" FUNCTION: s:Creator.BufNamePrefix() {{{1 +function! s:Creator.BufNamePrefix() + return 'NERD_tree_' +endfunction + +" FUNCTION: s:Creator.CreateTabTree(a:name) {{{1 +function! s:Creator.CreateTabTree(name) + let creator = s:Creator.New() + call creator.createTabTree(a:name) +endfunction + +" FUNCTION: s:Creator.createTabTree(a:name) {{{1 +" name: the name of a bookmark or a directory +function! s:Creator.createTabTree(name) + let l:path = self._pathForString(a:name) + + " Abort if an exception was thrown (i.e., if the bookmark or directory + " does not exist). + if empty(l:path) + return + endif + + " Obey the user's preferences for changing the working directory. + if g:NERDTreeChDirMode != 0 + call l:path.changeToDir() + endif + + if g:NERDTree.ExistsForTab() + call g:NERDTree.Close() + call self._removeTreeBufForTab() + endif + + call self._createTreeWin() + call self._createNERDTree(l:path, 'tab') + call b:NERDTree.render() + call b:NERDTree.root.putCursorHere(0, 0) + + call self._broadcastInitEvent() +endfunction + +" FUNCTION: s:Creator.CreateWindowTree(dir) {{{1 +function! s:Creator.CreateWindowTree(dir) + let creator = s:Creator.New() + call creator.createWindowTree(a:dir) +endfunction + +" FUNCTION: s:Creator.createWindowTree(dir) {{{1 +function! s:Creator.createWindowTree(dir) + try + let path = g:NERDTreePath.New(a:dir) + catch /^NERDTree.InvalidArgumentsError/ + call nerdtree#echo('Invalid directory name:' . a:dir) + return + endtry + + "we want the directory buffer to disappear when we do the :edit below + setlocal bufhidden=wipe + + let previousBuf = expand('#') + + "we need a unique name for each window tree buffer to ensure they are + "all independent + exec g:NERDTreeCreatePrefix . ' edit ' . self._nextBufferName() + + call self._createNERDTree(path, 'window') + let b:NERDTree._previousBuf = bufnr(previousBuf) + call self._setCommonBufOptions() + + call b:NERDTree.render() + + call self._broadcastInitEvent() +endfunction + +" FUNCTION: s:Creator._createNERDTree(path) {{{1 +function! s:Creator._createNERDTree(path, type) + let b:NERDTree = g:NERDTree.New(a:path, a:type) + + " TODO: This assignment is kept for compatibility reasons. Many other + " plugins use b:NERDTreeRoot instead of b:NERDTree.root. Remove this + " assignment in the future. + let b:NERDTreeRoot = b:NERDTree.root + + call b:NERDTree.root.open() +endfunction + +" FUNCTION: s:Creator.CreateMirror() {{{1 +function! s:Creator.CreateMirror() + let creator = s:Creator.New() + call creator.createMirror() +endfunction + +" FUNCTION: s:Creator.createMirror() {{{1 +function! s:Creator.createMirror() + "get the names off all the nerd tree buffers + let treeBufNames = [] + for i in range(1, tabpagenr('$')) + let nextName = self._tabpagevar(i, 'NERDTreeBufName') + if nextName != -1 && (!exists('t:NERDTreeBufName') || nextName != t:NERDTreeBufName) + call add(treeBufNames, nextName) + endif + endfor + let treeBufNames = self._uniq(treeBufNames) + + "map the option names (that the user will be prompted with) to the nerd + "tree buffer names + let options = {} + let i = 0 + while i < len(treeBufNames) + let bufName = treeBufNames[i] + let treeRoot = getbufvar(bufName, 'NERDTree').root + let options[i+1 . '. ' . treeRoot.path.str() . ' (buf name: ' . bufName . ')'] = bufName + let i = i + 1 + endwhile + + "work out which tree to mirror, if there is more than 1 then ask the user + let bufferName = '' + if len(keys(options)) > 1 + let choices = ['Choose a tree to mirror'] + let choices = extend(choices, sort(keys(options))) + let choice = inputlist(choices) + if choice < 1 || choice > len(options) || choice ==# '' + return + endif + + let bufferName = options[sort(keys(options))[choice-1]] + elseif len(keys(options)) ==# 1 + let bufferName = values(options)[0] + else + call nerdtree#echo('No trees to mirror') + return + endif + + if g:NERDTree.ExistsForTab() && g:NERDTree.IsOpen() + call g:NERDTree.Close() + endif + + let t:NERDTreeBufName = bufferName + call self._createTreeWin() + exec 'buffer ' . bufferName + call b:NERDTree.ui.restoreScreenState() + if !&hidden + call b:NERDTree.render() + endif +endfunction + +" FUNCTION: s:Creator._createTreeWin() {{{1 +" Initialize the NERDTree window. Open the window, size it properly, set all +" local options, etc. +function! s:Creator._createTreeWin() + let l:splitLocation = g:NERDTreeWinPos ==# 'left' ? 'topleft ' : 'botright ' + let l:splitSize = g:NERDTreeWinSize + + if !g:NERDTree.ExistsForTab() + let t:NERDTreeBufName = self._nextBufferName() + silent! execute l:splitLocation . 'vertical ' . l:splitSize . ' new' + silent! execute 'edit ' . t:NERDTreeBufName + silent! execute 'vertical resize '. l:splitSize + else + silent! execute l:splitLocation . 'vertical ' . l:splitSize . ' split' + silent! execute 'buffer ' . t:NERDTreeBufName + endif + + setlocal winfixwidth + + call self._setCommonBufOptions() + + if has('patch-7.4.1925') + clearjumps + endif + +endfunction + +" FUNCTION: s:Creator._isBufHidden(nr) {{{1 +function! s:Creator._isBufHidden(nr) + redir => bufs + silent ls! + redir END + + return bufs =~ a:nr . '..h' +endfunction + +" FUNCTION: s:Creator.New() {{{1 +function! s:Creator.New() + let newCreator = copy(self) + return newCreator +endfunction + +" FUNCTION: s:Creator._nextBufferName() {{{1 +" returns the buffer name for the next nerd tree +function! s:Creator._nextBufferName() + let name = s:Creator.BufNamePrefix() . self._nextBufferNumber() + return name +endfunction + +" FUNCTION: s:Creator._nextBufferNumber() {{{1 +" the number to add to the nerd tree buffer name to make the buf name unique +function! s:Creator._nextBufferNumber() + if !exists('s:Creator._NextBufNum') + let s:Creator._NextBufNum = 1 + else + let s:Creator._NextBufNum += 1 + endif + + return s:Creator._NextBufNum +endfunction + +" FUNCTION: s:Creator._pathForString(str) {{{1 +" find a bookmark or adirectory for the given string +function! s:Creator._pathForString(str) + let path = {} + if g:NERDTreeBookmark.BookmarkExistsFor(a:str) + let path = g:NERDTreeBookmark.BookmarkFor(a:str).path + else + let dir = a:str ==# '' ? getcwd() : a:str + + "hack to get an absolute path if a relative path is given + if dir =~# '^\.' + let dir = getcwd() . nerdtree#slash() . dir + endif + + "hack to prevent removing slash if dir is the root of the file system. + if dir !=# '/' + let dir = g:NERDTreePath.Resolve(dir) + endif + + try + let path = g:NERDTreePath.New(dir) + catch /^NERDTree.InvalidArgumentsError/ + call nerdtree#echo('No bookmark or directory found for: ' . a:str) + return {} + endtry + endif + if !path.isDirectory + let path = path.getParent() + endif + + return path +endfunction + +" Function: s:Creator._removeTreeBufForTab() {{{1 +function! s:Creator._removeTreeBufForTab() + let buf = bufnr(t:NERDTreeBufName) + + "if &hidden is not set then it will already be gone + if buf != -1 + + "nerdtree buf may be mirrored/displayed elsewhere + if self._isBufHidden(buf) + exec 'bwipeout ' . buf + endif + + endif + + unlet t:NERDTreeBufName +endfunction + +" FUNCTION: s:Creator._setCommonBufOptions() {{{1 +function! s:Creator._setCommonBufOptions() + + " Options for a non-file/control buffer. + setlocal bufhidden=hide + setlocal buftype=nofile + setlocal noswapfile + + " Options for controlling buffer/window appearance. + setlocal foldcolumn=0 + setlocal foldmethod=manual + setlocal nobuflisted + setlocal nofoldenable + setlocal nolist + setlocal nospell + setlocal nowrap + + if g:NERDTreeShowLineNumbers + setlocal number + else + setlocal nonumber + if v:version >= 703 + setlocal norelativenumber + endif + endif + + iabc + + if g:NERDTreeHighlightCursorline + setlocal cursorline + endif + + call self._setupStatusline() + call self._bindMappings() + + setlocal filetype=nerdtree +endfunction + +" FUNCTION: s:Creator._setupStatusline() {{{1 +function! s:Creator._setupStatusline() + if g:NERDTreeStatusline != -1 + let &l:statusline = g:NERDTreeStatusline + endif +endfunction + +" FUNCTION: s:Creator._tabpagevar(tabnr, var) {{{1 +function! s:Creator._tabpagevar(tabnr, var) + let currentTab = tabpagenr() + let old_ei = &eventignore + set eventignore=all + + try + exec 'tabnext ' . a:tabnr + let v = -1 + if exists('t:' . a:var) + exec 'let v = t:' . a:var + endif + exec 'tabnext ' . currentTab + + finally + let &eventignore = old_ei + endtry + + return v +endfunction + +" FUNCTION: s:Creator.ToggleTabTree(dir) {{{1 +function! s:Creator.ToggleTabTree(dir) + let creator = s:Creator.New() + call creator.toggleTabTree(a:dir) +endfunction + +" FUNCTION: s:Creator.toggleTabTree(dir) {{{1 +" Toggles the NERD tree. I.e if the NERD tree is open, it is closed. If it is +" closed, it is restored or initialized. If dir is not empty, it will be set +" as the new root. +" +" Args: +" dir: the full path for the root node (is used if the NERD tree is being +" initialized, or to change the root to a new dir.) +function! s:Creator.toggleTabTree(dir) + if g:NERDTree.ExistsForTab() + if !g:NERDTree.IsOpen() + call self._createTreeWin() + if !empty(a:dir) && a:dir !=# b:NERDTree.root.path.str() + call self.createTabTree(a:dir) + elseif !&hidden + call b:NERDTree.render() + endif + call b:NERDTree.ui.restoreScreenState() + else + call g:NERDTree.Close() + endif + else + call self.createTabTree(a:dir) + endif +endfunction + +" Function: s:Creator._uniq(list) {{{1 +" returns a:list without duplicates +function! s:Creator._uniq(list) + let uniqlist = [] + for elem in a:list + if index(uniqlist, elem) ==# -1 + let uniqlist += [elem] + endif + endfor + return uniqlist +endfunction + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/event.vim b/home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/event.vim new file mode 100644 index 0000000..964e8ff --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/event.vim @@ -0,0 +1,13 @@ +"CLASS: Event +"============================================================ +let s:Event = {} +let g:NERDTreeEvent = s:Event + +function! s:Event.New(nerdtree, subject, action, params) abort + let newObj = copy(self) + let newObj.nerdtree = a:nerdtree + let newObj.subject = a:subject + let newObj.action = a:action + let newObj.params = a:params + return newObj +endfunction diff --git a/home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/flag_set.vim b/home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/flag_set.vim new file mode 100644 index 0000000..7552867 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/flag_set.vim @@ -0,0 +1,58 @@ +"CLASS: FlagSet +"============================================================ +let s:FlagSet = {} +let g:NERDTreeFlagSet = s:FlagSet + +"FUNCTION: FlagSet.addFlag(scope, flag) {{{1 +function! s:FlagSet.addFlag(scope, flag) + let flags = self._flagsForScope(a:scope) + if index(flags, a:flag) == -1 + call add(flags, a:flag) + end +endfunction + +"FUNCTION: FlagSet.clearFlags(scope) {{{1 +function! s:FlagSet.clearFlags(scope) + let self._flags[a:scope] = [] +endfunction + +"FUNCTION: FlagSet._flagsForScope(scope) {{{1 +function! s:FlagSet._flagsForScope(scope) + if !has_key(self._flags, a:scope) + let self._flags[a:scope] = [] + endif + return self._flags[a:scope] +endfunction + +"FUNCTION: FlagSet.New() {{{1 +function! s:FlagSet.New() + let newObj = copy(self) + let newObj._flags = {} + return newObj +endfunction + +"FUNCTION: FlagSet.removeFlag(scope, flag) {{{1 +function! s:FlagSet.removeFlag(scope, flag) + let flags = self._flagsForScope(a:scope) + + let i = index(flags, a:flag) + if i >= 0 + call remove(flags, i) + endif +endfunction + +"FUNCTION: FlagSet.renderToString() {{{1 +function! s:FlagSet.renderToString() + let flagstring = '' + for i in values(self._flags) + let flagstring .= join(i) + endfor + + if len(flagstring) == 0 + return '' + endif + + return '[' . flagstring . ']' +endfunction + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/key_map.vim b/home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/key_map.vim new file mode 100644 index 0000000..ed79167 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/key_map.vim @@ -0,0 +1,164 @@ +"CLASS: KeyMap +"============================================================ +let s:KeyMap = {} +let g:NERDTreeKeyMap = s:KeyMap +let s:keyMaps = {} + +"FUNCTION: KeyMap.All() {{{1 +function! s:KeyMap.All() + let sortedKeyMaps = values(s:keyMaps) + call sort(sortedKeyMaps, s:KeyMap.Compare, s:KeyMap) + + return sortedKeyMaps +endfunction + +"FUNCTION: KeyMap.Compare(keyMap1, keyMap2) {{{1 +function! s:KeyMap.Compare(keyMap1, keyMap2) + + if a:keyMap1.key >? a:keyMap2.key + return 1 + endif + + if a:keyMap1.key ' notation, we + " must replace each of the '<' characters with '' to ensure the string + " is not translated into its corresponding keycode during the later part + " of the map command below + " :he <> + let specialNotationRegex = '\m<\([[:alnum:]_-]\+>\)' + if self.key =~# specialNotationRegex + let keymapInvokeString = substitute(self.key, specialNotationRegex, '\1', 'g') + else + let keymapInvokeString = self.key + endif + let keymapInvokeString = escape(keymapInvokeString, '\"') + + let premap = self.key ==# '' ? ' ' : ' ' + + exec 'nnoremap '. self.key . premap . ':call nerdtree#ui_glue#invokeKeyMap("'. keymapInvokeString .'")' +endfunction + +"FUNCTION: KeyMap.Remove(key, scope) {{{1 +function! s:KeyMap.Remove(key, scope) + return remove(s:keyMaps, a:key . a:scope) +endfunction + +"FUNCTION: KeyMap.invoke() {{{1 +"Call the KeyMaps callback function +function! s:KeyMap.invoke(...) + let l:Callback = type(self.callback) ==# type(function('tr')) ? self.callback : function(self.callback) + if a:0 + call l:Callback(a:1) + else + call l:Callback() + endif +endfunction + +"FUNCTION: KeyMap.Invoke() {{{1 +"Find a keymapping for a:key and the current scope invoke it. +" +"Scope is determined as follows: +" * if the cursor is on a dir node then DirNode +" * if the cursor is on a file node then FileNode +" * if the cursor is on a bookmark then Bookmark +" +"If a keymap has the scope of 'all' then it will be called if no other keymap +"is found for a:key and the scope. +function! s:KeyMap.Invoke(key) + + "required because clicking the command window below another window still + "invokes the mapping - but changes the window cursor + "is in first + " + "TODO: remove this check when the vim bug is fixed + if !g:NERDTree.ExistsForBuf() + return {} + endif + + let node = g:NERDTreeFileNode.GetSelected() + if !empty(node) + + "try file node + if !node.path.isDirectory + let km = s:KeyMap.FindFor(a:key, 'FileNode') + if !empty(km) + return km.invoke(node) + endif + endif + + "try dir node + if node.path.isDirectory + let km = s:KeyMap.FindFor(a:key, 'DirNode') + if !empty(km) + return km.invoke(node) + endif + endif + + "try generic node + let km = s:KeyMap.FindFor(a:key, 'Node') + if !empty(km) + return km.invoke(node) + endif + + endif + + "try bookmark + let bm = g:NERDTreeBookmark.GetSelected() + if !empty(bm) + let km = s:KeyMap.FindFor(a:key, 'Bookmark') + if !empty(km) + return km.invoke(bm) + endif + endif + + "try all + let km = s:KeyMap.FindFor(a:key, 'all') + if !empty(km) + return km.invoke() + endif +endfunction + +"FUNCTION: KeyMap.Create(options) {{{1 +function! s:KeyMap.Create(options) + let opts = extend({'scope': 'all', 'quickhelpText': ''}, copy(a:options)) + + "dont override other mappings unless the 'override' option is given + if get(opts, 'override', 0) ==# 0 && !empty(s:KeyMap.FindFor(opts['key'], opts['scope'])) + return + end + + let newKeyMap = copy(self) + let newKeyMap.key = opts['key'] + let newKeyMap.quickhelpText = opts['quickhelpText'] + let newKeyMap.callback = opts['callback'] + let newKeyMap.scope = opts['scope'] + + call s:KeyMap.Add(newKeyMap) +endfunction + +"FUNCTION: KeyMap.Add(keymap) {{{1 +function! s:KeyMap.Add(keymap) + let s:keyMaps[a:keymap.key . a:keymap.scope] = a:keymap +endfunction + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/menu_controller.vim b/home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/menu_controller.vim new file mode 100644 index 0000000..952c67b --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/menu_controller.vim @@ -0,0 +1,211 @@ +"CLASS: MenuController +"============================================================ +let s:MenuController = {} +let g:NERDTreeMenuController = s:MenuController + +"FUNCTION: MenuController.New(menuItems) {{{1 +"create a new menu controller that operates on the given menu items +function! s:MenuController.New(menuItems) + let newMenuController = copy(self) + if a:menuItems[0].isSeparator() + let newMenuController.menuItems = a:menuItems[1:-1] + else + let newMenuController.menuItems = a:menuItems + endif + return newMenuController +endfunction + +" FUNCTION: s:MenuController.isMinimal() {{{1 +function! s:MenuController.isMinimal() + return g:NERDTreeMinimalMenu +endfunction + +" FUNCTION: MenuController.showMenu() {{{1 +" Enter the main loop of the NERDTree menu, prompting the user to select +" a menu item. +function! s:MenuController.showMenu() + call self._saveOptions() + + try + let self.selection = 0 + let l:done = 0 + + while !l:done + if has('nvim') + mode + else + redraw! + endif + call self._echoPrompt() + + let l:key = nr2char(getchar()) + let l:done = self._handleKeypress(l:key) + endwhile + finally + call self._restoreOptions() + + " Redraw when Ctrl-C or Esc is received. + if !l:done || self.selection ==# -1 + redraw! + endif + endtry + + if self.selection !=# -1 + let l:m = self._current() + call l:m.execute() + endif +endfunction + +"FUNCTION: MenuController._echoPrompt() {{{1 +function! s:MenuController._echoPrompt() + let navHelp = 'Use ' . g:NERDTreeMenuDown . '/' . g:NERDTreeMenuUp . '/enter' + + if self.isMinimal() + let selection = self.menuItems[self.selection].text + let keyword = matchstr(selection, '[^ ]*([^ ]*') + + let shortcuts = map(copy(self.menuItems), "v:val['shortcut']") + let shortcuts[self.selection] = ' ' . keyword . ' ' + + echo 'Menu: [' . join(shortcuts, ',') . '] (' . navHelp . ' or shortcut): ' + else + echo 'NERDTree Menu. ' . navHelp . ', or the shortcuts indicated' + echo '=========================================================' + + for i in range(0, len(self.menuItems)-1) + if self.selection ==# i + echo '> ' . self.menuItems[i].text + else + echo ' ' . self.menuItems[i].text + endif + endfor + endif +endfunction + +"FUNCTION: MenuController._current(key) {{{1 +"get the MenuItem that is currently selected +function! s:MenuController._current() + return self.menuItems[self.selection] +endfunction + +"FUNCTION: MenuController._handleKeypress(key) {{{1 +"change the selection (if appropriate) and return 1 if the user has made +"their choice, 0 otherwise +function! s:MenuController._handleKeypress(key) + if a:key ==# g:NERDTreeMenuDown + call self._cursorDown() + elseif a:key ==# g:NERDTreeMenuUp + call self._cursorUp() + elseif a:key ==# nr2char(27) "escape + let self.selection = -1 + return 1 + elseif a:key ==# "\r" || a:key ==# "\n" "enter and ctrl-j + return 1 + else + let index = self._nextIndexFor(a:key) + if index !=# -1 + let self.selection = index + if len(self._allIndexesFor(a:key)) ==# 1 + return 1 + endif + endif + endif + + return 0 +endfunction + +"FUNCTION: MenuController._allIndexesFor(shortcut) {{{1 +"get indexes to all menu items with the given shortcut +function! s:MenuController._allIndexesFor(shortcut) + let toReturn = [] + + for i in range(0, len(self.menuItems)-1) + if self.menuItems[i].shortcut ==# a:shortcut + call add(toReturn, i) + endif + endfor + + return toReturn +endfunction + +"FUNCTION: MenuController._nextIndexFor(shortcut) {{{1 +"get the index to the next menu item with the given shortcut, starts from the +"current cursor location and wraps around to the top again if need be +function! s:MenuController._nextIndexFor(shortcut) + for i in range(self.selection+1, len(self.menuItems)-1) + if self.menuItems[i].shortcut ==# a:shortcut + return i + endif + endfor + + for i in range(0, self.selection) + if self.menuItems[i].shortcut ==# a:shortcut + return i + endif + endfor + + return -1 +endfunction + +"FUNCTION: MenuController._setCmdheight() {{{1 +"sets &cmdheight to whatever is needed to display the menu +function! s:MenuController._setCmdheight() + if self.isMinimal() + let &cmdheight = 1 + else + let &cmdheight = len(self.menuItems) + 3 + endif +endfunction + +"FUNCTION: MenuController._saveOptions() {{{1 +"set any vim options that are required to make the menu work (saving their old +"values) +function! s:MenuController._saveOptions() + let self._oldLazyredraw = &lazyredraw + let self._oldCmdheight = &cmdheight + set nolazyredraw + call self._setCmdheight() +endfunction + +"FUNCTION: MenuController._restoreOptions() {{{1 +"restore the options we saved in _saveOptions() +function! s:MenuController._restoreOptions() + let &cmdheight = self._oldCmdheight + let &lazyredraw = self._oldLazyredraw +endfunction + +"FUNCTION: MenuController._cursorDown() {{{1 +"move the cursor to the next menu item, skipping separators +function! s:MenuController._cursorDown() + let done = 0 + while !done + if self.selection < len(self.menuItems)-1 + let self.selection += 1 + else + let self.selection = 0 + endif + + if !self._current().isSeparator() + let done = 1 + endif + endwhile +endfunction + +"FUNCTION: MenuController._cursorUp() {{{1 +"move the cursor to the previous menu item, skipping separators +function! s:MenuController._cursorUp() + let done = 0 + while !done + if self.selection > 0 + let self.selection -= 1 + else + let self.selection = len(self.menuItems)-1 + endif + + if !self._current().isSeparator() + let done = 1 + endif + endwhile +endfunction + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/menu_item.vim b/home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/menu_item.vim new file mode 100644 index 0000000..7f25917 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/menu_item.vim @@ -0,0 +1,118 @@ +"CLASS: MenuItem +"============================================================ +let s:MenuItem = {} +let g:NERDTreeMenuItem = s:MenuItem + +"FUNCTION: MenuItem.All() {{{1 +"get all top level menu items +function! s:MenuItem.All() + if !exists('s:menuItems') + let s:menuItems = [] + endif + return s:menuItems +endfunction + +"FUNCTION: MenuItem.AllEnabled() {{{1 +"get all top level menu items that are currently enabled +function! s:MenuItem.AllEnabled() + let toReturn = [] + for i in s:MenuItem.All() + if i.enabled() + call add(toReturn, i) + endif + endfor + return toReturn +endfunction + +"FUNCTION: MenuItem.Create(options) {{{1 +"make a new menu item and add it to the global list +function! s:MenuItem.Create(options) + let newMenuItem = copy(self) + + let newMenuItem.text = a:options['text'] + let newMenuItem.shortcut = a:options['shortcut'] + let newMenuItem.children = [] + + let newMenuItem.isActiveCallback = -1 + if has_key(a:options, 'isActiveCallback') + let newMenuItem.isActiveCallback = a:options['isActiveCallback'] + endif + + let newMenuItem.callback = -1 + if has_key(a:options, 'callback') + let newMenuItem.callback = a:options['callback'] + endif + + if has_key(a:options, 'parent') + call add(a:options['parent'].children, newMenuItem) + else + call add(s:MenuItem.All(), newMenuItem) + endif + + return newMenuItem +endfunction + +"FUNCTION: MenuItem.CreateSeparator(options) {{{1 +"make a new separator menu item and add it to the global list +function! s:MenuItem.CreateSeparator(options) + let standard_options = { 'text': '--------------------', + \ 'shortcut': -1, + \ 'callback': -1 } + let options = extend(a:options, standard_options, 'force') + + return s:MenuItem.Create(options) +endfunction + +"FUNCTION: MenuItem.CreateSubmenu(options) {{{1 +"make a new submenu and add it to global list +function! s:MenuItem.CreateSubmenu(options) + let standard_options = { 'callback': -1 } + let options = extend(a:options, standard_options, 'force') + + return s:MenuItem.Create(options) +endfunction + +"FUNCTION: MenuItem.enabled() {{{1 +"return 1 if this menu item should be displayed +" +"delegates off to the isActiveCallback, and defaults to 1 if no callback was +"specified +function! s:MenuItem.enabled() + if self.isActiveCallback != -1 + return type(self.isActiveCallback) == type(function('tr')) ? self.isActiveCallback() : {self.isActiveCallback}() + endif + return 1 +endfunction + +"FUNCTION: MenuItem.execute() {{{1 +"perform the action behind this menu item, if this menuitem has children then +"display a new menu for them, otherwise deletegate off to the menuitem's +"callback +function! s:MenuItem.execute() + if len(self.children) + let mc = g:NERDTreeMenuController.New(self.children) + call mc.showMenu() + else + if self.callback != -1 + if type(self.callback) == type(function('tr')) + call self.callback() + else + call {self.callback}() + endif + endif + endif +endfunction + +"FUNCTION: MenuItem.isSeparator() {{{1 +"return 1 if this menuitem is a separator +function! s:MenuItem.isSeparator() + return self.callback == -1 && self.children == [] +endfunction + +"FUNCTION: MenuItem.isSubmenu() {{{1 +"return 1 if this menuitem is a submenu +function! s:MenuItem.isSubmenu() + return self.callback == -1 && !empty(self.children) +endfunction + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/nerdtree.vim b/home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/nerdtree.vim new file mode 100644 index 0000000..61a11a9 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/nerdtree.vim @@ -0,0 +1,209 @@ +"CLASS: NERDTree +"============================================================ +let s:NERDTree = {} +let g:NERDTree = s:NERDTree + +"FUNCTION: s:NERDTree.AddPathFilter() {{{1 +function! s:NERDTree.AddPathFilter(callback) + call add(s:NERDTree.PathFilters(), a:callback) +endfunction + +"FUNCTION: s:NERDTree.changeRoot(node) {{{1 +function! s:NERDTree.changeRoot(node) + if a:node.path.isDirectory + let self.root = a:node + else + call a:node.cacheParent() + let self.root = a:node.parent + endif + + call self.root.open() + + "change dir to the dir of the new root if instructed to + if g:NERDTreeChDirMode >= 2 + call self.root.path.changeToDir() + endif + + call self.render() + call self.root.putCursorHere(0, 0) + + if exists('#User#NERDTreeNewRoot') + doautocmd User NERDTreeNewRoot + endif +endfunction + +"FUNCTION: s:NERDTree.Close() {{{1 +"Closes the tab tree window for this tab +function! s:NERDTree.Close() + if !s:NERDTree.IsOpen() + return + endif + + if winnr('$') !=# 1 + " Use the window ID to identify the currently active window or fall + " back on the buffer ID if win_getid/win_gotoid are not available, in + " which case we'll focus an arbitrary window showing the buffer. + let l:useWinId = exists('*win_getid') && exists('*win_gotoid') + + if winnr() ==# s:NERDTree.GetWinNum() + call nerdtree#exec('wincmd p', 1) + let l:activeBufOrWin = l:useWinId ? win_getid() : bufnr('') + call nerdtree#exec('wincmd p', 1) + else + let l:activeBufOrWin = l:useWinId ? win_getid() : bufnr('') + endif + + call nerdtree#exec(s:NERDTree.GetWinNum() . ' wincmd w', 1) + call nerdtree#exec('close', 0) + if l:useWinId + call nerdtree#exec('call win_gotoid(' . l:activeBufOrWin . ')', 0) + else + call nerdtree#exec(bufwinnr(l:activeBufOrWin) . ' wincmd w', 0) + endif + else + close + endif +endfunction + +"FUNCTION: s:NERDTree.CursorToBookmarkTable(){{{1 +"Places the cursor at the top of the bookmarks table +function! s:NERDTree.CursorToBookmarkTable() + if !b:NERDTree.ui.getShowBookmarks() + throw 'NERDTree.IllegalOperationError: cant find bookmark table, bookmarks arent active' + endif + + if g:NERDTreeMinimalUI + return cursor(1, 2) + endif + + let rootNodeLine = b:NERDTree.ui.getRootLineNum() + + let line = 1 + while getline(line) !~# '^>-\+Bookmarks-\+$' + let line = line + 1 + if line >= rootNodeLine + throw 'NERDTree.BookmarkTableNotFoundError: didnt find the bookmarks table' + endif + endwhile + call cursor(line, 2) +endfunction + +"FUNCTION: s:NERDTree.CursorToTreeWin(){{{1 +"Places the cursor in the nerd tree window +function! s:NERDTree.CursorToTreeWin(...) + call g:NERDTree.MustBeOpen() + call nerdtree#exec(g:NERDTree.GetWinNum() . 'wincmd w', a:0 >0 ? a:1 : 1) +endfunction + +" Function: s:NERDTree.ExistsForBuffer() {{{1 +" Returns 1 if a nerd tree root exists in the current buffer +function! s:NERDTree.ExistsForBuf() + return exists('b:NERDTree') +endfunction + +" Function: s:NERDTree.ExistsForTab() {{{1 +" Returns 1 if a nerd tree root exists in the current tab +function! s:NERDTree.ExistsForTab() + if !exists('t:NERDTreeBufName') + return + end + + "check b:NERDTree is still there and hasn't been e.g. :bdeleted + return !empty(getbufvar(bufnr(t:NERDTreeBufName), 'NERDTree')) +endfunction + +function! s:NERDTree.ForCurrentBuf() + if s:NERDTree.ExistsForBuf() + return b:NERDTree + else + return {} + endif +endfunction + +"FUNCTION: s:NERDTree.ForCurrentTab() {{{1 +function! s:NERDTree.ForCurrentTab() + if !s:NERDTree.ExistsForTab() + return + endif + + let bufnr = bufnr(t:NERDTreeBufName) + return getbufvar(bufnr, 'NERDTree') +endfunction + +"FUNCTION: s:NERDTree.getRoot() {{{1 +function! s:NERDTree.getRoot() + return self.root +endfunction + +"FUNCTION: s:NERDTree.GetWinNum() {{{1 +"gets the nerd tree window number for this tab +function! s:NERDTree.GetWinNum() + if exists('t:NERDTreeBufName') + return bufwinnr(t:NERDTreeBufName) + endif + + " If WindowTree, there is no t:NERDTreeBufName variable. Search all windows. + for w in range(1,winnr('$')) + if bufname(winbufnr(w)) =~# '^' . g:NERDTreeCreator.BufNamePrefix() . '\d\+$' + return w + endif + endfor + + return -1 +endfunction + +"FUNCTION: s:NERDTree.IsOpen() {{{1 +function! s:NERDTree.IsOpen() + return s:NERDTree.GetWinNum() !=# -1 +endfunction + +"FUNCTION: s:NERDTree.isTabTree() {{{1 +function! s:NERDTree.isTabTree() + return self._type ==# 'tab' +endfunction + +"FUNCTION: s:NERDTree.isWinTree() {{{1 +function! s:NERDTree.isWinTree() + return self._type ==# 'window' +endfunction + +"FUNCTION: s:NERDTree.MustBeOpen() {{{1 +function! s:NERDTree.MustBeOpen() + if !s:NERDTree.IsOpen() + throw 'NERDTree.TreeNotOpen' + endif +endfunction + +"FUNCTION: s:NERDTree.New() {{{1 +function! s:NERDTree.New(path, type) + let newObj = copy(self) + let newObj.ui = g:NERDTreeUI.New(newObj) + let newObj.root = g:NERDTreeDirNode.New(a:path, newObj) + let newObj._type = a:type + return newObj +endfunction + +"FUNCTION: s:NERDTree.PathFilters() {{{1 +function! s:NERDTree.PathFilters() + if !exists('s:NERDTree._PathFilters') + let s:NERDTree._PathFilters = [] + endif + return s:NERDTree._PathFilters +endfunction + +"FUNCTION: s:NERDTree.previousBuf() {{{1 +function! s:NERDTree.previousBuf() + return self._previousBuf +endfunction + +function! s:NERDTree.setPreviousBuf(bnum) + let self._previousBuf = a:bnum +endfunction + +"FUNCTION: s:NERDTree.render() {{{1 +"A convenience function - since this is called often +function! s:NERDTree.render() + call self.ui.render() +endfunction + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/notifier.vim b/home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/notifier.vim new file mode 100644 index 0000000..ffa2853 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/notifier.vim @@ -0,0 +1,35 @@ +"CLASS: Notifier +"============================================================ +let s:Notifier = {} + +function! s:Notifier.AddListener(event, funcname) + let listeners = s:Notifier.GetListenersForEvent(a:event) + if listeners == [] + let listenersMap = s:Notifier.GetListenersMap() + let listenersMap[a:event] = listeners + endif + call add(listeners, a:funcname) +endfunction + +function! s:Notifier.NotifyListeners(event, path, nerdtree, params) + let event = g:NERDTreeEvent.New(a:nerdtree, a:path, a:event, a:params) + + for Listener in s:Notifier.GetListenersForEvent(a:event) + let l:Callback = type(Listener) == type(function('tr')) ? Listener : function(Listener) + call l:Callback(event) + endfor +endfunction + +function! s:Notifier.GetListenersMap() + if !exists('s:refreshListenersMap') + let s:refreshListenersMap = {} + endif + return s:refreshListenersMap +endfunction + +function! s:Notifier.GetListenersForEvent(name) + let listenersMap = s:Notifier.GetListenersMap() + return get(listenersMap, a:name, []) +endfunction + +let g:NERDTreePathNotifier = deepcopy(s:Notifier) diff --git a/home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/opener.vim b/home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/opener.vim new file mode 100644 index 0000000..27993ac --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/opener.vim @@ -0,0 +1,326 @@ +" ============================================================================ +" CLASS: Opener +" +" The Opener class defines an API for 'opening' operations. +" ============================================================================ + + +let s:Opener = {} +let g:NERDTreeOpener = s:Opener + +" FUNCTION: s:Opener._bufInWindows(bnum) {{{1 +" [[STOLEN FROM VTREEEXPLORER.VIM]] +" Determine the number of windows open to this buffer number. +" Care of Yegappan Lakshman. Thanks! +" +" Args: +" bnum: the subject buffers buffer number +function! s:Opener._bufInWindows(bnum) + let cnt = 0 + let winnum = 1 + while 1 + let bufnum = winbufnr(winnum) + if bufnum < 0 + break + endif + if bufnum ==# a:bnum + let cnt = cnt + 1 + endif + let winnum = winnum + 1 + endwhile + + return cnt +endfunction + +" FUNCTION: Opener._checkToCloseTree(newtab) {{{1 +" Check the class options to see if the tree should be closed now. +" +" Args: +" a:newtab - boolean. If set, only close the tree now if we are opening the +" target in a new tab. This is needed because we have to close tree before we +" leave the tab +function! s:Opener._checkToCloseTree(newtab) + if self._keepopen + return + endif + + if (a:newtab && self._where ==# 't') || !a:newtab + call g:NERDTree.Close() + endif +endfunction + +" FUNCTION: s:Opener._firstUsableWindow() {{{1 +" find the window number of the first normal window +function! s:Opener._firstUsableWindow() + let i = 1 + while i <= winnr('$') + let bnum = winbufnr(i) + if bnum !=# -1 && getbufvar(bnum, '&buftype') ==# '' + \ && !getwinvar(i, '&previewwindow') + \ && (!getbufvar(bnum, '&modified') || &hidden) + return i + endif + + let i += 1 + endwhile + return -1 +endfunction + +" FUNCTION: Opener._gotoTargetWin() {{{1 +function! s:Opener._gotoTargetWin() + if b:NERDTree.isWinTree() + if self._where ==# 'v' + call self._newVSplit() + elseif self._where ==# 'h' + call self._newSplit() + elseif self._where ==# 't' + tabnew + endif + else + call self._checkToCloseTree(1) + + if self._where ==# 'v' + call self._newVSplit() + elseif self._where ==# 'h' + call self._newSplit() + elseif self._where ==# 't' + tabnew + elseif self._where ==# 'p' + call self._previousWindow() + endif + + call self._checkToCloseTree(0) + endif +endfunction + +" FUNCTION: s:Opener._isWindowUsable(winnumber) {{{1 +" Returns 0 if opening a file from the tree in the given window requires it to +" be split, 1 otherwise +" +" Args: +" winnumber: the number of the window in question +function! s:Opener._isWindowUsable(winnumber) + "gotta split if theres only one window (i.e. the NERD tree) + if winnr('$') ==# 1 + return 0 + endif + + let oldwinnr = winnr() + call nerdtree#exec(a:winnumber . 'wincmd p', 1) + let specialWindow = getbufvar('%', '&buftype') !=# '' || getwinvar('%', '&previewwindow') + let modified = &modified + call nerdtree#exec(oldwinnr . 'wincmd p', 1) + + "if its a special window e.g. quickfix or another explorer plugin then we + "have to split + if specialWindow + return 0 + endif + + if &hidden + return 1 + endif + + return !modified || self._bufInWindows(winbufnr(a:winnumber)) >= 2 +endfunction + +" FUNCTION: Opener.New(path, opts) {{{1 +" Instantiate a new NERDTreeOpener object. +" Args: +" a:path: the path object that is to be opened +" a:opts: a dictionary containing the following optional keys... +" 'where': specifies whether the node should be opened in new split, in +" a new tab or, in the last window; takes values 'v', 'h', or 't' +" 'reuse': if file is already shown in a window, jump there; takes values +" 'all', 'currenttab', or empty +" 'keepopen': boolean (0 or 1); if true, the tree window will not be closed +" 'stay': boolean (0 or 1); if true, remain in tree window after opening +function! s:Opener.New(path, opts) + let l:newOpener = copy(self) + + let l:newOpener._keepopen = nerdtree#has_opt(a:opts, 'keepopen') + let l:newOpener._nerdtree = b:NERDTree + let l:newOpener._path = a:path + let l:newOpener._reuse = has_key(a:opts, 'reuse') ? a:opts['reuse'] : '' + let l:newOpener._stay = nerdtree#has_opt(a:opts, 'stay') + let l:newOpener._where = has_key(a:opts, 'where') ? a:opts['where'] : '' + + call l:newOpener._saveCursorPos() + + return l:newOpener +endfunction + +" FUNCTION: Opener._newSplit() {{{1 +function! s:Opener._newSplit() + let onlyOneWin = (winnr('$') ==# 1) + let savesplitright = &splitright + if onlyOneWin + let &splitright = (g:NERDTreeWinPos ==# 'left') + endif + " If only one window (ie. NERDTree), split vertically instead. + let splitMode = onlyOneWin ? 'vertical' : '' + + " Open the new window + try + call nerdtree#exec('wincmd p', 1) + call nerdtree#exec(splitMode . ' split',1) + catch /^Vim\%((\a\+)\)\=:E37/ + call g:NERDTree.CursorToTreeWin() + throw 'NERDTree.FileAlreadyOpenAndModifiedError: '. self._path.str() .' is already open and modified.' + catch /^Vim\%((\a\+)\)\=:/ + "do nothing + endtry + + "resize the tree window if no other window was open before + if onlyOneWin + call nerdtree#exec('wincmd p', 1) + call nerdtree#exec('silent '. splitMode .' resize '. g:NERDTreeWinSize, 1) + call nerdtree#exec('wincmd p', 0) + endif + + let &splitright=savesplitright +endfunction + +" FUNCTION: Opener._newVSplit() {{{1 +function! s:Opener._newVSplit() + let l:winwidth = winwidth('.') + + let onlyOneWin = (winnr('$') ==# 1) + let savesplitright = &splitright + if onlyOneWin + let &splitright = (g:NERDTreeWinPos ==# 'left') + let l:winwidth = g:NERDTreeWinSize + endif + + call nerdtree#exec('wincmd p', 1) + call nerdtree#exec('vsplit', 1) + + let l:currentWindowNumber = winnr() + + " Restore the NERDTree to its original width. + call g:NERDTree.CursorToTreeWin() + execute 'silent vertical resize ' . l:winwidth + + call nerdtree#exec(l:currentWindowNumber . 'wincmd w', 0) + let &splitright=savesplitright +endfunction + +" FUNCTION: Opener.open(target) {{{1 +function! s:Opener.open(target) + if self._path.isDirectory + call self._openDirectory(a:target) + return + endif + + call self._openFile() +endfunction + +" FUNCTION: Opener._openFile() {{{1 +function! s:Opener._openFile() + if !self._stay && self._keepopen && get(b:, 'NERDTreeZoomed', 0) + call b:NERDTree.ui.toggleZoom() + endif + + if self._reuseWindow() + return + endif + + call self._gotoTargetWin() + + if self._stay + silent call self._path.edit() + call self._restoreCursorPos() + return + endif + + call self._path.edit() +endfunction + +" FUNCTION: Opener._openDirectory(node) {{{1 +function! s:Opener._openDirectory(node) + call self._gotoTargetWin() + + if self._nerdtree.isWinTree() + call g:NERDTreeCreator.CreateWindowTree(a:node.path.str()) + else + if empty(self._where) + call b:NERDTree.changeRoot(a:node) + elseif self._where ==# 't' + call g:NERDTreeCreator.CreateTabTree(a:node.path.str()) + else + call g:NERDTreeCreator.CreateWindowTree(a:node.path.str()) + endif + endif + + if self._stay + call self._restoreCursorPos() + endif +endfunction + +" FUNCTION: Opener._previousWindow() {{{1 +function! s:Opener._previousWindow() + if !self._isWindowUsable(winnr('#')) && self._firstUsableWindow() ==# -1 + call self._newSplit() + else + try + if !self._isWindowUsable(winnr('#')) + call nerdtree#exec(self._firstUsableWindow() . 'wincmd w', 1) + else + call nerdtree#exec('wincmd p', 1) + endif + catch /^Vim\%((\a\+)\)\=:E37/ + call g:NERDTree.CursorToTreeWin() + throw 'NERDTree.FileAlreadyOpenAndModifiedError: '. self._path.str() .' is already open and modified.' + catch /^Vim\%((\a\+)\)\=:/ + echo v:exception + endtry + endif +endfunction + +" FUNCTION: Opener._restoreCursorPos() {{{1 +function! s:Opener._restoreCursorPos() + call nerdtree#exec(self._tabnr . 'tabnext', 1) + call nerdtree#exec(bufwinnr(self._bufnr) . 'wincmd w', 1) +endfunction + +" FUNCTION: Opener._reuseWindow() {{{1 +" put the cursor in the first window we find for this file +" +" return 1 if we were successful +function! s:Opener._reuseWindow() + if empty(self._reuse) + return 0 + endif + + "check the current tab for the window + let winnr = bufwinnr('^' . self._path.str() . '$') + if winnr !=# -1 + call nerdtree#exec(winnr . 'wincmd w', 0) + call self._checkToCloseTree(0) + return 1 + endif + + if self._reuse ==# 'currenttab' + return 0 + endif + + "check other tabs + let tabnr = self._path.tabnr() + if tabnr + call self._checkToCloseTree(1) + call nerdtree#exec(tabnr . 'tabnext', 1) + let winnr = bufwinnr('^' . self._path.str() . '$') + call nerdtree#exec(winnr . 'wincmd w', 0) + return 1 + endif + + return 0 +endfunction + +" FUNCTION: Opener._saveCursorPos() {{{1 +function! s:Opener._saveCursorPos() + let self._bufnr = bufnr('') + let self._tabnr = tabpagenr() +endfunction + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/path.vim b/home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/path.vim new file mode 100644 index 0000000..997abf3 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/path.vim @@ -0,0 +1,852 @@ +" ============================================================================ +" CLASS: Path +" +" The Path class provides an abstracted representation of a file system +" pathname. Various operations on pathnames are provided and a number of +" representations of a given path name can be accessed here. +" ============================================================================ + + +let s:Path = {} +let g:NERDTreePath = s:Path + +" FUNCTION: Path.AbsolutePathFor(pathStr) {{{1 +function! s:Path.AbsolutePathFor(pathStr) + let l:prependWorkingDir = 0 + + if nerdtree#runningWindows() + let l:prependWorkingDir = a:pathStr !~# '^.:\(\\\|\/\)\?' && a:pathStr !~# '^\(\\\\\|\/\/\)' + else + let l:prependWorkingDir = a:pathStr !~# '^/' + endif + + let l:result = a:pathStr + + if l:prependWorkingDir + let l:result = getcwd() + + if l:result[-1:] == nerdtree#slash() + let l:result = l:result . a:pathStr + else + let l:result = l:result . nerdtree#slash() . a:pathStr + endif + endif + + return l:result +endfunction + +" FUNCTION: Path.bookmarkNames() {{{1 +function! s:Path.bookmarkNames() + if !exists('self._bookmarkNames') + call self.cacheDisplayString() + endif + return self._bookmarkNames +endfunction + +" FUNCTION: Path.cacheDisplayString() {{{1 +function! s:Path.cacheDisplayString() abort + let self.cachedDisplayString = g:NERDTreeNodeDelimiter . self.getLastPathComponent(1) + + if self.isExecutable + let self.cachedDisplayString = self.addDelimiter(self.cachedDisplayString) . '*' + endif + + let self._bookmarkNames = [] + for i in g:NERDTreeBookmark.Bookmarks() + if i.path.equals(self) + call add(self._bookmarkNames, i.name) + endif + endfor + if !empty(self._bookmarkNames) && g:NERDTreeMarkBookmarks ==# 1 + let self.cachedDisplayString = self.addDelimiter(self.cachedDisplayString) . ' {' . join(self._bookmarkNames) . '}' + endif + + if self.isSymLink + let self.cachedDisplayString = self.addDelimiter(self.cachedDisplayString) . ' -> ' . self.symLinkDest + endif + + if self.isReadOnly + let self.cachedDisplayString = self.addDelimiter(self.cachedDisplayString) . ' ['.g:NERDTreeGlyphReadOnly.']' + endif +endfunction + +" FUNCTION: Path.addDelimiter() {{{1 +function! s:Path.addDelimiter(line) + if a:line =~# '\(.*' . g:NERDTreeNodeDelimiter . '\)\{2}' + return a:line + else + return a:line . g:NERDTreeNodeDelimiter + endif +endfunction + +" FUNCTION: Path.changeToDir() {{{1 +function! s:Path.changeToDir() + let dir = self.str({'format': 'Cd'}) + if self.isDirectory ==# 0 + let dir = self.getParent().str({'format': 'Cd'}) + endif + + try + if g:NERDTreeUseTCD && exists(':tcd') ==# 2 + execute 'tcd ' . dir + call nerdtree#echo("Tab's CWD is now: " . getcwd()) + else + execute 'cd ' . dir + call nerdtree#echo('CWD is now: ' . getcwd()) + endif + catch + throw 'NERDTree.PathChangeError: cannot change CWD to ' . dir + endtry +endfunction + +" FUNCTION: Path.Create(fullpath) {{{1 +" +" Factory method. +" +" Creates a path object with the given path. The path is also created on the +" filesystem. If the path already exists, a NERDTree.Path.Exists exception is +" thrown. If any other errors occur, a NERDTree.Path exception is thrown. +" +" Args: +" fullpath: the full filesystem path to the file/dir to create +function! s:Path.Create(fullpath) + "bail if the a:fullpath already exists + if isdirectory(a:fullpath) || filereadable(a:fullpath) + throw "NERDTree.CreatePathError: Directory Exists: '" . a:fullpath . "'" + endif + + try + + "if it ends with a slash, assume its a dir create it + if a:fullpath =~# '\(\\\|\/\)$' + "whack the trailing slash off the end if it exists + let fullpath = substitute(a:fullpath, '\(\\\|\/\)$', '', '') + + call mkdir(fullpath, 'p') + + "assume its a file and create + else + call s:Path.createParentDirectories(a:fullpath) + call writefile([], a:fullpath) + endif + catch + throw "NERDTree.CreatePathError: Could not create path: '" . a:fullpath . "'" + endtry + + return s:Path.New(a:fullpath) +endfunction + +" FUNCTION: Path.copy(dest) {{{1 +" +" Copies the file/dir represented by this Path to the given location +" +" Args: +" dest: the location to copy this dir/file to +function! s:Path.copy(dest) + if !s:Path.CopyingSupported() + throw 'NERDTree.CopyingNotSupportedError: Copying is not supported on this OS' + endif + + call s:Path.createParentDirectories(a:dest) + + if exists('g:NERDTreeCopyCmd') + let cmd_prefix = g:NERDTreeCopyCmd + else + let cmd_prefix = (self.isDirectory ? g:NERDTreeCopyDirCmd : g:NERDTreeCopyFileCmd) + endif + + let cmd = cmd_prefix . ' ' . shellescape(self.str()) . ' ' . shellescape(a:dest) + let success = system(cmd) + if v:shell_error !=# 0 + throw "NERDTree.CopyError: Could not copy '". self.str() ."' to: '" . a:dest . "'" + endif +endfunction + +" FUNCTION: Path.CopyingSupported() {{{1 +" +" returns 1 if copying is supported for this OS +function! s:Path.CopyingSupported() + return exists('g:NERDTreeCopyCmd') || (exists('g:NERDTreeCopyDirCmd') && exists('g:NERDTreeCopyFileCmd')) +endfunction + +" FUNCTION: Path.copyingWillOverwrite(dest) {{{1 +" +" returns 1 if copy this path to the given location will cause files to +" overwritten +" +" Args: +" dest: the location this path will be copied to +function! s:Path.copyingWillOverwrite(dest) + if filereadable(a:dest) + return 1 + endif + + if isdirectory(a:dest) + let path = s:Path.JoinPathStrings(a:dest, self.getLastPathComponent(0)) + if filereadable(path) + return 1 + endif + endif +endfunction + +" FUNCTION: Path.createParentDirectories(path) {{{1 +" +" create parent directories for this path if needed +" without throwing any errors if those directories already exist +" +" Args: +" path: full path of the node whose parent directories may need to be created +function! s:Path.createParentDirectories(path) + let dir_path = fnamemodify(a:path, ':h') + if !isdirectory(dir_path) + call mkdir(dir_path, 'p') + endif +endfunction + +" FUNCTION: Path.delete() {{{1 +" +" Deletes the file or directory represented by this path. +" +" Throws NERDTree.Path.Deletion exceptions +function! s:Path.delete() + if self.isDirectory + + let cmd = g:NERDTreeRemoveDirCmd . self.str({'escape': 1}) + let success = system(cmd) + + if v:shell_error !=# 0 + throw "NERDTree.PathDeletionError: Could not delete directory: '" . self.str() . "'" + endif + else + if exists('g:NERDTreeRemoveFileCmd') + let cmd = g:NERDTreeRemoveFileCmd . self.str({'escape': 1}) + let success = system(cmd) + else + let success = delete(self.str()) + endif + + if success !=# 0 + throw "NERDTree.PathDeletionError: Could not delete file: '" . self.str() . "'" + endif + endif + + "delete all bookmarks for this path + for i in self.bookmarkNames() + let bookmark = g:NERDTreeBookmark.BookmarkFor(i) + call bookmark.delete() + endfor +endfunction + +" FUNCTION: Path.displayString() {{{1 +" +" Returns a string that specifies how the path should be represented as a +" string +function! s:Path.displayString() + if self.cachedDisplayString ==# '' + call self.cacheDisplayString() + endif + + return self.cachedDisplayString +endfunction + +" FUNCTION: Path.edit() {{{1 +function! s:Path.edit() + let l:bufname = self.str({'format': 'Edit'}) + if bufname('%') !=# l:bufname + exec 'edit ' . l:bufname + endif +endfunction + +" FUNCTION: Path.extractDriveLetter(fullpath) {{{1 +" +" If running windows, cache the drive letter for this path +function! s:Path.extractDriveLetter(fullpath) + if nerdtree#runningWindows() + if a:fullpath =~# '^\(\\\\\|\/\/\)' + "For network shares, the 'drive' consists of the first two parts of the path, i.e. \\boxname\share + let self.drive = substitute(a:fullpath, '^\(\(\\\\\|\/\/\)[^\\\/]*\(\\\|\/\)[^\\\/]*\).*', '\1', '') + let self.drive = substitute(self.drive, '/', '\', 'g') + else + let self.drive = substitute(a:fullpath, '\(^[a-zA-Z]:\).*', '\1', '') + endif + else + let self.drive = '' + endif + +endfunction + +" FUNCTION: Path.exists() {{{1 +" return 1 if this path points to a location that is readable or is a directory +function! s:Path.exists() + let p = self.str() + return filereadable(p) || isdirectory(p) +endfunction + +" FUNCTION: Path._escChars() {{{1 +function! s:Path._escChars() + if nerdtree#runningWindows() + return " `\|\"#%&,?()\*^<>$" + endif + + return " \\`\|\"#%&,?()\*^<>[]{}$" +endfunction + +" FUNCTION: Path.getDir() {{{1 +" +" Returns this path if it is a directory, else this paths parent. +" +" Return: +" a Path object +function! s:Path.getDir() + if self.isDirectory + return self + else + return self.getParent() + endif +endfunction + +" FUNCTION: Path.getParent() {{{1 +" +" Returns a new path object for this paths parent +" +" Return: +" a new Path object +function! s:Path.getParent() + if nerdtree#runningWindows() + let path = self.drive . '\' . join(self.pathSegments[0:-2], '\') + else + let path = '/'. join(self.pathSegments[0:-2], '/') + endif + + return s:Path.New(path) +endfunction + +" FUNCTION: Path.getLastPathComponent(dirSlash) {{{1 +" +" Gets the last part of this path. +" +" Args: +" dirSlash: if 1 then a trailing slash will be added to the returned value for +" directory nodes. +function! s:Path.getLastPathComponent(dirSlash) + if empty(self.pathSegments) + return '' + endif + let toReturn = self.pathSegments[-1] + if a:dirSlash && self.isDirectory + let toReturn = toReturn . '/' + endif + return toReturn +endfunction + +" FUNCTION: Path.getSortOrderIndex() {{{1 +" returns the index of the pattern in g:NERDTreeSortOrder that this path matches +function! s:Path.getSortOrderIndex() + let i = 0 + while i < len(g:NERDTreeSortOrder) + if g:NERDTreeSortOrder[i] !~? '\[\[-\?\(timestamp\|size\|extension\)\]\]' && + \ self.getLastPathComponent(1) =~# g:NERDTreeSortOrder[i] + return i + endif + let i = i + 1 + endwhile + + return index(g:NERDTreeSortOrder, '*') +endfunction + +" FUNCTION: Path._splitChunks(path) {{{1 +" returns a list of path chunks +function! s:Path._splitChunks(path) + let chunks = split(a:path, '\(\D\+\|\d\+\)\zs') + let i = 0 + while i < len(chunks) + "convert number literals to numbers + if match(chunks[i], '^\d\+$') ==# 0 + let chunks[i] = str2nr(chunks[i]) + endif + let i = i + 1 + endwhile + return chunks +endfunction + +" FUNCTION: Path.getSortKey() {{{1 +" returns a key used in compare function for sorting +function! s:Path.getSortKey() + if !exists('self._sortKey') || g:NERDTreeSortOrder !=# g:NERDTreeOldSortOrder + " Look for file metadata tags: [[timestamp]], [[extension]], [[size]] + let metadata = [] + for tag in g:NERDTreeSortOrder + if tag =~? '\[\[-\?timestamp\]\]' + let metadata += [self.isDirectory ? 0 : getftime(self.str()) * (tag =~# '-' ? -1 : 1)] + elseif tag =~? '\[\[-\?size\]\]' + let metadata += [self.isDirectory ? 0 : getfsize(self.str()) * (tag =~# '-' ? -1 : 1)] + elseif tag =~? '\[\[extension\]\]' + let extension = matchstr(self.getLastPathComponent(0), '[^.]\+\.\zs[^.]\+$') + let metadata += [self.isDirectory ? '' : (extension ==# '' ? nr2char(str2nr('0x10ffff',16)) : extension)] + endif + endfor + + if g:NERDTreeSortOrder[0] =~# '\[\[.*\]\]' + " Apply tags' sorting first if specified first. + let self._sortKey = metadata + [self.getSortOrderIndex()] + else + " Otherwise, do regex grouping first. + let self._sortKey = [self.getSortOrderIndex()] + metadata + endif + + let path = self.getLastPathComponent(0) + if !g:NERDTreeSortHiddenFirst + let path = substitute(path, '^[._]', '', '') + endif + if !g:NERDTreeCaseSensitiveSort + let path = tolower(path) + endif + + call extend(self._sortKey, (g:NERDTreeNaturalSort ? self._splitChunks(path) : [path])) + endif + return self._sortKey +endfunction + +" FUNCTION: Path.isHiddenUnder(path) {{{1 +function! s:Path.isHiddenUnder(path) + + if !self.isUnder(a:path) + return 0 + endif + + let l:startIndex = len(a:path.pathSegments) + let l:segments = self.pathSegments[l:startIndex : ] + + for l:segment in l:segments + + if l:segment =~# '^\.' + return 1 + endif + endfor + + return 0 +endfunction + +" FUNCTION: Path.isUnixHiddenFile() {{{1 +" check for unix hidden files +function! s:Path.isUnixHiddenFile() + return self.getLastPathComponent(0) =~# '^\.' +endfunction + +" FUNCTION: Path.isUnixHiddenPath() {{{1 +" check for unix path with hidden components +function! s:Path.isUnixHiddenPath() + if self.getLastPathComponent(0) =~# '^\.' + return 1 + else + for segment in self.pathSegments + if segment =~# '^\.' + return 1 + endif + endfor + return 0 + endif +endfunction + +" FUNCTION: Path.ignore(nerdtree) {{{1 +" returns true if this path should be ignored +function! s:Path.ignore(nerdtree) + "filter out the user specified paths to ignore + if a:nerdtree.ui.isIgnoreFilterEnabled() + for i in g:NERDTreeIgnore + if self._ignorePatternMatches(i) + return 1 + endif + endfor + + for l:Callback in g:NERDTree.PathFilters() + let l:Callback = type(l:Callback) ==# type(function('tr')) ? l:Callback : function(l:Callback) + if l:Callback({'path': self, 'nerdtree': a:nerdtree}) + return 1 + endif + endfor + endif + + "dont show hidden files unless instructed to + if !a:nerdtree.ui.getShowHidden() && self.isUnixHiddenFile() + return 1 + endif + + if a:nerdtree.ui.getShowFiles() ==# 0 && self.isDirectory ==# 0 + return 1 + endif + + return 0 +endfunction + +" FUNCTION: Path._ignorePatternMatches(pattern) {{{1 +" returns true if this path matches the given ignore pattern +function! s:Path._ignorePatternMatches(pattern) + let pat = a:pattern + if strpart(pat,len(pat)-8) ==# '[[path]]' + let pat = strpart(pat,0, len(pat)-8) + return self.str() =~# pat + elseif strpart(pat,len(pat)-7) ==# '[[dir]]' + if !self.isDirectory + return 0 + endif + let pat = strpart(pat,0, len(pat)-7) + elseif strpart(pat,len(pat)-8) ==# '[[file]]' + if self.isDirectory + return 0 + endif + let pat = strpart(pat,0, len(pat)-8) + endif + + return self.getLastPathComponent(0) =~# pat +endfunction + +" FUNCTION: Path.isAncestor(path) {{{1 +" return 1 if this path is somewhere above the given path in the filesystem. +" +" a:path should be a dir +function! s:Path.isAncestor(child) + return a:child.isUnder(self) +endfunction + +" FUNCTION: Path.isUnder(path) {{{1 +" return 1 if this path is somewhere under the given path in the filesystem. +function! s:Path.isUnder(parent) + if a:parent.isDirectory ==# 0 + return 0 + endif + if nerdtree#runningWindows() && a:parent.drive !=# self.drive + return 0 + endif + let l:this_count = len(self.pathSegments) + if l:this_count ==# 0 + return 0 + endif + let l:that_count = len(a:parent.pathSegments) + if l:that_count ==# 0 + return 1 + endif + if l:that_count >= l:this_count + return 0 + endif + for i in range(0, l:that_count-1) + if self.pathSegments[i] !=# a:parent.pathSegments[i] + return 0 + endif + endfor + return 1 +endfunction + +" FUNCTION: Path.JoinPathStrings(...) {{{1 +function! s:Path.JoinPathStrings(...) + let components = [] + for i in a:000 + let components = extend(components, split(i, '/')) + endfor + return '/' . join(components, '/') +endfunction + +" FUNCTION: Path.equals() {{{1 +" +" Determines whether 2 path objects are "equal". +" They are equal if the paths they represent are the same +" +" Args: +" path: the other path obj to compare this with +function! s:Path.equals(path) + if nerdtree#runningWindows() + return self.str() ==? a:path.str() + else + return self.str() ==# a:path.str() + endif +endfunction + +" FUNCTION: Path.New(pathStr) {{{1 +function! s:Path.New(pathStr) + let l:newPath = copy(self) + + call l:newPath.readInfoFromDisk(s:Path.AbsolutePathFor(a:pathStr)) + + let l:newPath.cachedDisplayString = '' + let l:newPath.flagSet = g:NERDTreeFlagSet.New() + + return l:newPath +endfunction + +" FUNCTION: Path.Resolve() {{{1 +" Invoke the vim resolve() function and return the result +" This is necessary because in some versions of vim resolve() removes trailing +" slashes while in other versions it doesn't. This always removes the trailing +" slash +function! s:Path.Resolve(path) + let tmp = resolve(a:path) + return tmp =~# '.\+/$' ? substitute(tmp, '/$', '', '') : tmp +endfunction + +" FUNCTION: Path.readInfoFromDisk(fullpath) {{{1 +" +" +" Throws NERDTree.Path.InvalidArguments exception. +function! s:Path.readInfoFromDisk(fullpath) + call self.extractDriveLetter(a:fullpath) + + let fullpath = s:Path.WinToUnixPath(a:fullpath) + + if getftype(fullpath) ==# 'fifo' + throw 'NERDTree.InvalidFiletypeError: Cant handle FIFO files: ' . a:fullpath + endif + + let self.pathSegments = filter(split(fullpath, '/'), '!empty(v:val)') + + let self.isReadOnly = 0 + if isdirectory(a:fullpath) + let self.isDirectory = 1 + elseif filereadable(a:fullpath) + let self.isDirectory = 0 + let self.isReadOnly = filewritable(a:fullpath) ==# 0 + else + throw 'NERDTree.InvalidArgumentsError: Invalid path = ' . a:fullpath + endif + + let self.isExecutable = 0 + if !self.isDirectory + let self.isExecutable = getfperm(a:fullpath) =~# 'x' + endif + + "grab the last part of the path (minus the trailing slash) + let lastPathComponent = self.getLastPathComponent(0) + + "get the path to the new node with the parent dir fully resolved + let hardPath = s:Path.Resolve(self.strTrunk()) . '/' . lastPathComponent + + "if the last part of the path is a symlink then flag it as such + let self.isSymLink = (s:Path.Resolve(hardPath) !=# hardPath) + if self.isSymLink + let self.symLinkDest = s:Path.Resolve(fullpath) + + "if the link is a dir then slap a / on the end of its dest + if isdirectory(self.symLinkDest) + + "we always wanna treat MS windows shortcuts as files for + "simplicity + if hardPath !~# '\.lnk$' + + let self.symLinkDest = self.symLinkDest . '/' + endif + endif + endif +endfunction + +" FUNCTION: Path.refresh(nerdtree) {{{1 +function! s:Path.refresh(nerdtree) + call self.readInfoFromDisk(self.str()) + call g:NERDTreePathNotifier.NotifyListeners('refresh', self, a:nerdtree, {}) + call self.cacheDisplayString() +endfunction + +" FUNCTION: Path.refreshFlags(nerdtree) {{{1 +function! s:Path.refreshFlags(nerdtree) + call g:NERDTreePathNotifier.NotifyListeners('refreshFlags', self, a:nerdtree, {}) + call self.cacheDisplayString() +endfunction + +" FUNCTION: Path.rename() {{{1 +" +" Renames this node on the filesystem +function! s:Path.rename(newPath) + if a:newPath ==# '' + throw 'NERDTree.InvalidArgumentsError: Invalid newPath for renaming = '. a:newPath + endif + + call s:Path.createParentDirectories(a:newPath) + + let success = rename(self.str(), a:newPath) + if success !=# 0 + throw "NERDTree.PathRenameError: Could not rename: '" . self.str() . "'" . 'to:' . a:newPath + endif + call self.readInfoFromDisk(a:newPath) + + for i in self.bookmarkNames() + let b = g:NERDTreeBookmark.BookmarkFor(i) + call b.setPath(copy(self)) + endfor + call g:NERDTreeBookmark.Write() +endfunction + +" FUNCTION: Path.str() {{{1 +" Return a string representation of this Path object. +" +" Args: +" This function takes a single dictionary (optional) with keys and values that +" specify how the returned pathname should be formatted. +" +" The dictionary may have the following keys: +" 'format' +" 'escape' +" 'truncateTo' +" +" The 'format' key may have a value of: +" 'Cd' - a string to be used with ":cd" and similar commands +" 'Edit' - a string to be used with ":edit" and similar commands +" 'UI' - a string to be displayed in the NERDTree user interface +" +" The 'escape' key, if specified, will cause the output to be escaped with +" Vim's internal "shellescape()" function. +" +" The 'truncateTo' key shortens the length of the path to that given by the +" value associated with 'truncateTo'. A '<' is prepended. +function! s:Path.str(...) + let options = a:0 ? a:1 : {} + let toReturn = '' + + if has_key(options, 'format') + let format = options['format'] + if has_key(self, '_strFor' . format) + exec 'let toReturn = self._strFor' . format . '()' + else + throw 'NERDTree.UnknownFormatError: unknown format "'. format .'"' + endif + else + let toReturn = self._str() + endif + + if nerdtree#has_opt(options, 'escape') + let toReturn = shellescape(toReturn) + endif + + if has_key(options, 'truncateTo') + let limit = options['truncateTo'] + if strdisplaywidth(toReturn) > limit-1 + while strdisplaywidth(toReturn) > limit-1 && strchars(toReturn) > 0 + let toReturn = substitute(toReturn, '^.', '', '') + endwhile + if len(split(toReturn, '/')) > 1 + let toReturn = ' 0) ? a:1 : {} + + call self.toggleOpen(l:options) + + " Note that we only re-render the NERDTree for this node if we did NOT + " create a new node and render it in a new window or tab. In the latter + " case, rendering the NERDTree for this node could overwrite the text of + " the new NERDTree! + if !has_key(l:options, 'where') || empty(l:options['where']) + call self.getNerdtree().render() + call self.putCursorHere(0, 0) + endif +endfunction + +" FUNCTION: TreeDirNode.addChild(treenode, inOrder) {{{1 +" Adds the given treenode to the list of children for this node +" +" Args: +" -treenode: the node to add +" -inOrder: 1 if the new node should be inserted in sorted order +function! s:TreeDirNode.addChild(treenode, inOrder) + call add(self.children, a:treenode) + let a:treenode.parent = self + + if a:inOrder + call self.sortChildren() + endif +endfunction + +" FUNCTION: TreeDirNode.close() {{{1 +" Mark this TreeDirNode as closed. +function! s:TreeDirNode.close() + + " Close all directories in this directory node's cascade. This is + " necessary to ensure consistency when cascades are rendered. + for l:dirNode in self.getCascade() + let l:dirNode.isOpen = 0 + endfor +endfunction + +" FUNCTION: TreeDirNode.closeChildren() {{{1 +" Recursively close any directory nodes that are descendants of this node. +function! s:TreeDirNode.closeChildren() + for l:child in self.children + if l:child.path.isDirectory + call l:child.close() + call l:child.closeChildren() + endif + endfor +endfunction + +" FUNCTION: TreeDirNode.createChild(path, inOrder) {{{1 +" Instantiates a new child node for this node with the given path. The new +" nodes parent is set to this node. +" +" Args: +" path: a Path object that this node will represent/contain +" inOrder: 1 if the new node should be inserted in sorted order +" +" Returns: +" the newly created node +function! s:TreeDirNode.createChild(path, inOrder) + let newTreeNode = g:NERDTreeFileNode.New(a:path, self.getNerdtree()) + call self.addChild(newTreeNode, a:inOrder) + return newTreeNode +endfunction + +" FUNCTION: TreeDirNode.displayString() {{{1 +" Assemble and return a string that can represent this TreeDirNode object in +" the NERDTree window. +function! s:TreeDirNode.displayString() + let l:result = '' + + " Build a label that identifies this TreeDirNode. + let l:label = '' + let l:cascade = self.getCascade() + for l:dirNode in l:cascade + let l:next = l:dirNode.path.displayString() + let l:label .= l:label ==# '' ? l:next : substitute(l:next,'^.','','') + endfor + + " Select the appropriate open/closed status indicator symbol. + let l:symbol = (l:cascade[-1].isOpen ? g:NERDTreeDirArrowCollapsible : g:NERDTreeDirArrowExpandable ) + let l:symbol .= (g:NERDTreeDirArrowExpandable ==# '' ? '' : ' ') + let l:flags = l:cascade[-1].path.flagSet.renderToString() + + return l:symbol . l:flags . l:label +endfunction + +" FUNCTION: TreeDirNode.findNode(path) {{{1 +" Will find one of the children (recursively) that has the given path +" +" Args: +" path: a path object +unlet s:TreeDirNode.findNode +function! s:TreeDirNode.findNode(path) + if a:path.equals(self.path) + return self + endif + if stridx(a:path.str(), self.path.str(), 0) ==# -1 + return {} + endif + + if self.path.isDirectory + for i in self.children + let retVal = i.findNode(a:path) + if retVal !=# {} + return retVal + endif + endfor + endif + return {} +endfunction + +" FUNCTION: TreeDirNode.getCascade() {{{1 +" Return an array of dir nodes (starting from self) that can be cascade opened. +function! s:TreeDirNode.getCascade() + if !self.isCascadable() + return [self] + endif + + let vc = self.getVisibleChildren() + let visChild = vc[0] + + return [self] + visChild.getCascade() +endfunction + +" FUNCTION: TreeDirNode.getCascadeRoot() {{{1 +" Return the first directory node in the cascade in which this directory node +" is rendered. +function! s:TreeDirNode.getCascadeRoot() + + " Don't search above the current NERDTree root node. + if self.isRoot() + return self + endif + + let l:cascadeRoot = self + let l:parent = self.parent + + while !empty(l:parent) && !l:parent.isRoot() + + if index(l:parent.getCascade(), self) ==# -1 + break + endif + + let l:cascadeRoot = l:parent + let l:parent = l:parent.parent + endwhile + + return l:cascadeRoot +endfunction + +" FUNCTION: TreeDirNode.getChildCount() {{{1 +" Returns the number of children this node has +function! s:TreeDirNode.getChildCount() + return len(self.children) +endfunction + +" FUNCTION: TreeDirNode.getChild(path) {{{1 +" Returns child node of this node that has the given path or {} if no such node +" exists. +" +" This function doesnt not recurse into child dir nodes +" +" Args: +" path: a path object +function! s:TreeDirNode.getChild(path) + if stridx(a:path.str(), self.path.str(), 0) ==# -1 + return {} + endif + + let index = self.getChildIndex(a:path) + if index ==# -1 + return {} + else + return self.children[index] + endif + +endfunction + +" FUNCTION: TreeDirNode.getChildByIndex(indx, visible) {{{1 +" returns the child at the given index +" +" Args: +" indx: the index to get the child from +" visible: 1 if only the visible children array should be used, 0 if all the +" children should be searched. +function! s:TreeDirNode.getChildByIndex(indx, visible) + let array_to_search = a:visible? self.getVisibleChildren() : self.children + if a:indx > len(array_to_search) + throw 'NERDTree.InvalidArgumentsError: Index is out of bounds.' + endif + return array_to_search[a:indx] +endfunction + +" FUNCTION: TreeDirNode.getChildIndex(path) {{{1 +" Returns the index of the child node of this node that has the given path or +" -1 if no such node exists. +" +" This function doesnt not recurse into child dir nodes +" +" Args: +" path: a path object +function! s:TreeDirNode.getChildIndex(path) + if stridx(a:path.str(), self.path.str(), 0) ==# -1 + return -1 + endif + + "do a binary search for the child + let a = 0 + let z = self.getChildCount() + while a < z + let mid = (a+z)/2 + let diff = nerdtree#compareNodePaths(a:path, self.children[mid].path) + + if diff ==# -1 + let z = mid + elseif diff ==# 1 + let a = mid+1 + else + return mid + endif + endwhile + return -1 +endfunction + +" FUNCTION: TreeDirNode.getDirChildren() {{{1 +" Return a list of all child nodes from 'self.children' that are of type +" TreeDirNode. This function supports http://github.com/scrooloose/nerdtree-project-plugin.git. +function! s:TreeDirNode.getDirChildren() + return filter(copy(self.children), 'v:val.path.isDirectory ==# 1') +endfunction + +" FUNCTION: TreeDirNode._glob(pattern, all) {{{1 +" Return a list of strings naming the descendants of the directory in this +" TreeDirNode object that match the specified glob pattern. +" +" Args: +" pattern: (string) the glob pattern to apply +" all: (0 or 1) if 1, include '.' and '..' if they match 'pattern'; if 0, +" always exclude them +" +" Note: If the pathnames in the result list are below the working directory, +" they are returned as pathnames relative to that directory. This is because +" this function, internally, attempts to obey 'wildignore' rules that use +" relative paths. +function! s:TreeDirNode._glob(pattern, all) + + " Construct a path specification such that globpath() will return + " relative pathnames, if possible. + if self.path.str() ==# getcwd() + let l:pathSpec = ',' + else + let l:pathSpec = escape(fnamemodify(self.path.str({'format': 'Glob'}), ':.'), ',') + + " On Windows, the drive letter may be removed by "fnamemodify()". + if nerdtree#runningWindows() && l:pathSpec[0] == nerdtree#slash() + let l:pathSpec = self.path.drive . l:pathSpec + endif + endif + + let l:globList = [] + + " See ':h version7.txt' and ':h version8.txt' for details on the + " development of the glob() and globpath() functions. + if v:version > 704 || (v:version ==# 704 && has('patch654')) + let l:globList = globpath(l:pathSpec, a:pattern, !g:NERDTreeRespectWildIgnore, 1, 0) + elseif v:version ==# 704 && has('patch279') + let l:globList = globpath(l:pathSpec, a:pattern, !g:NERDTreeRespectWildIgnore, 1) + elseif v:version > 702 || (v:version ==# 702 && has('patch051')) + let l:globString = globpath(l:pathSpec, a:pattern, !g:NERDTreeRespectWildIgnore) + let l:globList = split(l:globString, "\n") + else + let l:globString = globpath(l:pathSpec, a:pattern) + let l:globList = split(l:globString, "\n") + endif + + " If a:all is false, filter '.' and '..' from the output. + if !a:all + let l:toRemove = [] + + for l:file in l:globList + let l:tail = fnamemodify(l:file, ':t') + + " If l:file has a trailing slash, then its :tail will be ''. Use + " :h to drop the slash and the empty string after it; then use :t + " to get the directory name. + if l:tail ==# '' + let l:tail = fnamemodify(l:file, ':h:t') + endif + + if l:tail ==# '.' || l:tail ==# '..' + call add(l:toRemove, l:file) + if len(l:toRemove) ==# 2 + break + endif + endif + endfor + + for l:file in l:toRemove + call remove(l:globList, index(l:globList, l:file)) + endfor + endif + + return l:globList +endfunction + +" FUNCTION: TreeDirNode.GetSelected() {{{1 +" Returns the current node if it is a dir node, or else returns the current +" nodes parent +unlet s:TreeDirNode.GetSelected +function! s:TreeDirNode.GetSelected() + let currentDir = g:NERDTreeFileNode.GetSelected() + if currentDir !=# {} && !currentDir.isRoot() + if currentDir.path.isDirectory ==# 0 + let currentDir = currentDir.parent + endif + endif + return currentDir +endfunction + +" FUNCTION: TreeDirNode.getVisibleChildCount() {{{1 +" Returns the number of visible children this node has +function! s:TreeDirNode.getVisibleChildCount() + return len(self.getVisibleChildren()) +endfunction + +" FUNCTION: TreeDirNode.getVisibleChildren() {{{1 +" Returns a list of children to display for this node, in the correct order +" +" Return: +" an array of treenodes +function! s:TreeDirNode.getVisibleChildren() + let toReturn = [] + for i in self.children + if i.path.ignore(self.getNerdtree()) ==# 0 + call add(toReturn, i) + endif + endfor + return toReturn +endfunction + +" FUNCTION: TreeDirNode.hasVisibleChildren() {{{1 +" returns 1 if this node has any childre, 0 otherwise.. +function! s:TreeDirNode.hasVisibleChildren() + return self.getVisibleChildCount() !=# 0 +endfunction + +" FUNCTION: TreeDirNode.isCascadable() {{{1 +" true if this dir has only one visible child that is also a dir +" false if this dir is bookmarked or symlinked. Why? Two reasons: +" 1. If cascaded, we don't know which dir is bookmarked or is a symlink. +" 2. If the parent is a symlink or is bookmarked, you end up with unparsable +" text, and NERDTree cannot get the path of any child node. +" Also, return false if this directory is the tree root, which should never be +" part of a cascade. +function! s:TreeDirNode.isCascadable() + if g:NERDTreeCascadeSingleChildDir ==# 0 + return 0 + endif + + if self.isRoot() + return 0 + endif + + if self.path.isSymLink + return 0 + endif + + for i in g:NERDTreeBookmark.Bookmarks() + if i.path.equals(self.path) + return 0 + endif + endfor + + let c = self.getVisibleChildren() + return len(c) ==# 1 && c[0].path.isDirectory +endfunction + +" FUNCTION: TreeDirNode._initChildren() {{{1 +" Removes all childen from this node and re-reads them +" +" Args: +" silent: 1 if the function should not echo any 'please wait' messages for +" large directories +" +" Return: the number of child nodes read +function! s:TreeDirNode._initChildren(silent) + "remove all the current child nodes + let self.children = [] + + let files = self._glob('*', 1) + self._glob('.*', 0) + + if !a:silent && len(files) > g:NERDTreeNotificationThreshold + call nerdtree#echo('Please wait, caching a large dir ...') + endif + + let invalidFilesFound = 0 + for i in files + try + let path = g:NERDTreePath.New(i) + call self.createChild(path, 0) + call g:NERDTreePathNotifier.NotifyListeners('init', path, self.getNerdtree(), {}) + catch /^NERDTree.\(InvalidArguments\|InvalidFiletype\)Error/ + let invalidFilesFound += 1 + endtry + endfor + + let g:NERDTreeOldSortOrder = g:NERDTreeSortOrder + call self.sortChildren() + + call nerdtree#echo('') + + if invalidFilesFound + call nerdtree#echoWarning(invalidFilesFound . ' file(s) could not be loaded into the NERD tree') + endif + return self.getChildCount() +endfunction + +" FUNCTION: TreeDirNode.New(path, nerdtree) {{{1 +" Return a new TreeDirNode object with the given path and parent. +" +" Args: +" path: dir that the node represents +" nerdtree: the tree the node belongs to +function! s:TreeDirNode.New(path, nerdtree) + if a:path.isDirectory !=# 1 + throw 'NERDTree.InvalidArgumentsError: A TreeDirNode object must be instantiated with a directory Path object.' + endif + + let newTreeNode = copy(self) + let newTreeNode.path = a:path + + let newTreeNode.isOpen = 0 + let newTreeNode.children = [] + + let newTreeNode.parent = {} + let newTreeNode._nerdtree = a:nerdtree + + return newTreeNode +endfunction + +" FUNCTION: TreeDirNode.open([options]) {{{1 +" Open this directory node in the current tree or elsewhere if special options +" are provided. Return 0 if options were processed. Otherwise, return the +" number of new cached nodes. +function! s:TreeDirNode.open(...) + let l:options = a:0 ? a:1 : {} + + " If special options were specified, process them and return. + if has_key(l:options, 'where') && !empty(l:options['where']) + let l:opener = g:NERDTreeOpener.New(self.path, l:options) + call l:opener.open(self) + return 0 + endif + + " Open any ancestors of this node that render within the same cascade. + let l:parent = self.parent + while !empty(l:parent) && !l:parent.isRoot() + if index(l:parent.getCascade(), self) >= 0 + let l:parent.isOpen = 1 + let l:parent = l:parent.parent + else + break + endif + endwhile + + let self.isOpen = 1 + + let l:numChildrenCached = 0 + if empty(self.children) + let l:numChildrenCached = self._initChildren(0) + endif + + return l:numChildrenCached +endfunction + +" FUNCTION: TreeDirNode.openAlong([opts]) {{{1 +" recursive open the dir if it has only one directory child. +" +" return the level of opened directories. +function! s:TreeDirNode.openAlong(...) + let opts = a:0 ? a:1 : {} + let level = 0 + + let node = self + while node.path.isDirectory + call node.open(opts) + let level += 1 + if node.getVisibleChildCount() ==# 1 + let node = node.getChildByIndex(0, 1) + else + break + endif + endwhile + return level +endfunction + +" FUNCTION: TreeDirNode.openExplorer() {{{1 +" Open an explorer window for this node in the previous window. The explorer +" can be a NERDTree window or a netrw window. +function! s:TreeDirNode.openExplorer() + execute 'wincmd p' + execute 'edit '.self.path.str({'format':'Edit'}) +endfunction + +" FUNCTION: TreeDirNode.openInNewTab(options) {{{1 +unlet s:TreeDirNode.openInNewTab +function! s:TreeDirNode.openInNewTab(options) + call nerdtree#deprecated('TreeDirNode.openInNewTab', 'is deprecated, use open() instead') + call self.open({'where': 't'}) +endfunction + +" FUNCTION: TreeDirNode._openInNewTab() {{{1 +function! s:TreeDirNode._openInNewTab() + tabnew + call g:NERDTreeCreator.CreateTabTree(self.path.str()) +endfunction + +" FUNCTION: TreeDirNode.openRecursively() {{{1 +" Open this directory node and any descendant directory nodes whose pathnames +" are not ignored. +function! s:TreeDirNode.openRecursively() + silent call self.open() + + for l:child in self.children + if l:child.path.isDirectory && !l:child.path.ignore(l:child.getNerdtree()) + call l:child.openRecursively() + endif + endfor +endfunction + +" FUNCTION: TreeDirNode.refresh() {{{1 +function! s:TreeDirNode.refresh() + call self.path.refresh(self.getNerdtree()) + + "if this node was ever opened, refresh its children + if self.isOpen || !empty(self.children) + let files = self._glob('*', 1) + self._glob('.*', 0) + let newChildNodes = [] + let invalidFilesFound = 0 + for i in files + try + "create a new path and see if it exists in this nodes children + let path = g:NERDTreePath.New(i) + let newNode = self.getChild(path) + if newNode !=# {} + call newNode.refresh() + call add(newChildNodes, newNode) + + "the node doesnt exist so create it + else + let newNode = g:NERDTreeFileNode.New(path, self.getNerdtree()) + let newNode.parent = self + call add(newChildNodes, newNode) + endif + catch /^NERDTree.\(InvalidArguments\|InvalidFiletype\)Error/ + let invalidFilesFound = 1 + endtry + endfor + + "swap this nodes children out for the children we just read/refreshed + let self.children = newChildNodes + call self.sortChildren() + + if invalidFilesFound + call nerdtree#echoWarning('some files could not be loaded into the NERD tree') + endif + endif +endfunction + +" FUNCTION: TreeDirNode.refreshFlags() {{{1 +unlet s:TreeDirNode.refreshFlags +function! s:TreeDirNode.refreshFlags() + call self.path.refreshFlags(self.getNerdtree()) + for i in self.children + call i.refreshFlags() + endfor +endfunction + +" FUNCTION: TreeDirNode.refreshDirFlags() {{{1 +function! s:TreeDirNode.refreshDirFlags() + call self.path.refreshFlags(self.getNerdtree()) +endfunction + +" FUNCTION: TreeDirNode.reveal(path) {{{1 +" reveal the given path, i.e. cache and open all treenodes needed to display it +" in the UI +" Returns the revealed node +function! s:TreeDirNode.reveal(path, ...) + let opts = a:0 ? a:1 : {} + + if !a:path.isUnder(self.path) + throw 'NERDTree.InvalidArgumentsError: ' . a:path.str() . ' should be under ' . self.path.str() + endif + + call self.open() + + if self.path.equals(a:path.getParent()) + let n = self.findNode(a:path) + " We may be looking for a newly-saved file that isn't in the tree yet. + if n ==# {} + call self.refresh() + let n = self.findNode(a:path) + endif + if has_key(opts, 'open') + call n.open() + endif + return n + endif + + let p = a:path + while !p.getParent().equals(self.path) + let p = p.getParent() + endwhile + + let n = self.findNode(p) + return n.reveal(a:path, opts) +endfunction + +" FUNCTION: TreeDirNode.removeChild(treenode) {{{1 +" Remove the given treenode from self.children. +" Throws NERDTree.ChildNotFoundError if the node is not found. +" +" Args: +" treenode: the node object to remove +function! s:TreeDirNode.removeChild(treenode) + for i in range(0, self.getChildCount()-1) + if self.children[i].equals(a:treenode) + call remove(self.children, i) + return + endif + endfor + + throw 'NERDTree.ChildNotFoundError: child node was not found' +endfunction + +" FUNCTION: TreeDirNode.sortChildren() {{{1 +" Sort self.children by alphabetical order and directory priority. +function! s:TreeDirNode.sortChildren() + if count(g:NERDTreeSortOrder, '*') < 1 + call add(g:NERDTreeSortOrder, '*') + endif + let CompareFunc = function('nerdtree#compareNodes') + call sort(self.children, CompareFunc) + let g:NERDTreeOldSortOrder = g:NERDTreeSortOrder +endfunction + +" FUNCTION: TreeDirNode.toggleOpen([options]) {{{1 +" Opens this directory if it is closed and vice versa +function! s:TreeDirNode.toggleOpen(...) + let opts = a:0 ? a:1 : {} + if self.isOpen ==# 1 + call self.close() + else + if g:NERDTreeCascadeOpenSingleChildDir ==# 0 + call self.open(opts) + else + call self.openAlong(opts) + endif + endif +endfunction + +" FUNCTION: TreeDirNode.transplantChild(newNode) {{{1 +" Replaces the child of this with the given node (where the child node's full +" path matches a:newNode's fullpath). The search for the matching node is +" non-recursive +" +" Arg: +" newNode: the node to graft into the tree +function! s:TreeDirNode.transplantChild(newNode) + for i in range(0, self.getChildCount()-1) + if self.children[i].equals(a:newNode) + let self.children[i] = a:newNode + let a:newNode.parent = self + break + endif + endfor +endfunction + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/tree_file_node.vim b/home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/tree_file_node.vim new file mode 100644 index 0000000..957b98a --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/tree_file_node.vim @@ -0,0 +1,349 @@ +" ============================================================================ +" CLASS: TreeFileNode +" +" This class is the parent of the TreeDirNode class and is the 'Component' +" part of the composite design pattern between the NERDTree node classes. +" ============================================================================ + + +let s:TreeFileNode = {} +let g:NERDTreeFileNode = s:TreeFileNode + +" FUNCTION: TreeFileNode.activate(...) {{{1 +function! s:TreeFileNode.activate(...) + call self.open(a:0 ? a:1 : {}) +endfunction + +" FUNCTION: TreeFileNode.bookmark(name) {{{1 +" bookmark this node with a:name +function! s:TreeFileNode.bookmark(name) + + " if a bookmark exists with the same name and the node is cached then save + " it so we can update its display string + let oldMarkedNode = {} + try + let oldMarkedNode = g:NERDTreeBookmark.GetNodeForName(a:name, 1, self.getNerdtree()) + catch /^NERDTree.BookmarkNotFoundError/ + catch /^NERDTree.BookmarkedNodeNotFoundError/ + endtry + + call g:NERDTreeBookmark.AddBookmark(a:name, self.path) + call self.path.cacheDisplayString() + call g:NERDTreeBookmark.Write() + + if !empty(oldMarkedNode) + call oldMarkedNode.path.cacheDisplayString() + endif +endfunction + +" FUNCTION: TreeFileNode.cacheParent() {{{1 +" initializes self.parent if it isnt already +function! s:TreeFileNode.cacheParent() + if empty(self.parent) + let parentPath = self.path.getParent() + if parentPath.equals(self.path) + throw 'NERDTree.CannotCacheParentError: already at root' + endif + let self.parent = s:TreeFileNode.New(parentPath, self.getNerdtree()) + endif +endfunction + +" FUNCTION: TreeFileNode.clearBookmarks() {{{1 +function! s:TreeFileNode.clearBookmarks() + for i in g:NERDTreeBookmark.Bookmarks() + if i.path.equals(self.path) + call i.delete() + end + endfor + call self.path.cacheDisplayString() +endfunction + +" FUNCTION: TreeFileNode.copy(dest) {{{1 +function! s:TreeFileNode.copy(dest) + call self.path.copy(a:dest) + let newPath = g:NERDTreePath.New(a:dest) + let parent = self.getNerdtree().root.findNode(newPath.getParent()) + if !empty(parent) + call parent.refresh() + return parent.findNode(newPath) + else + return {} + endif +endfunction + +" FUNCTION: TreeFileNode.delete {{{1 +" Removes this node from the tree and calls the Delete method for its path obj +function! s:TreeFileNode.delete() + call self.path.delete() + call self.parent.removeChild(self) +endfunction + +" FUNCTION: TreeFileNode.displayString() {{{1 +" +" Returns a string that specifies how the node should be represented as a +" string +" +" Return: +" a string that can be used in the view to represent this node +function! s:TreeFileNode.displayString() + return self.path.flagSet.renderToString() . self.path.displayString() +endfunction + +" FUNCTION: TreeFileNode.equals(treenode) {{{1 +" +" Compares this treenode to the input treenode and returns 1 if they are the +" same node. +" +" Use this method instead of == because sometimes when the treenodes contain +" many children, vim seg faults when doing == +" +" Args: +" treenode: the other treenode to compare to +function! s:TreeFileNode.equals(treenode) + return self.path.str() ==# a:treenode.path.str() +endfunction + +" FUNCTION: TreeFileNode.findNode(path) {{{1 +" Returns self if this node.path.Equals the given path. +" Returns {} if not equal. +" +" Args: +" path: the path object to compare against +function! s:TreeFileNode.findNode(path) + if a:path.equals(self.path) + return self + endif + return {} +endfunction + +" FUNCTION: TreeFileNode.findSibling(direction) {{{1 +" Find the next or previous sibling of this node. +" +" Args: +" direction: 0 for previous, 1 for next +" +" Return: +" The next/previous TreeFileNode object or an empty dictionary if not found. +function! s:TreeFileNode.findSibling(direction) + + " There can be no siblings if there is no parent. + if empty(self.parent) + return {} + endif + + let l:nodeIndex = self.parent.getChildIndex(self.path) + + if l:nodeIndex == -1 + return {} + endif + + " Get the next index to begin the search. + let l:nodeIndex += a:direction ? 1 : -1 + + while 0 <= l:nodeIndex && l:nodeIndex < self.parent.getChildCount() + + " Return the next node if it is not ignored. + if !self.parent.children[l:nodeIndex].path.ignore(self.getNerdtree()) + return self.parent.children[l:nodeIndex] + endif + + let l:nodeIndex += a:direction ? 1 : -1 + endwhile + + return {} +endfunction + +" FUNCTION: TreeFileNode.getNerdtree(){{{1 +function! s:TreeFileNode.getNerdtree() + return self._nerdtree +endfunction + +" FUNCTION: TreeFileNode.GetRootForTab(){{{1 +" get the root node for this tab +function! s:TreeFileNode.GetRootForTab() + if g:NERDTree.ExistsForTab() + return getbufvar(t:NERDTreeBufName, 'NERDTree').root + end + return {} +endfunction + +" FUNCTION: TreeFileNode.GetSelected() {{{1 +" If the cursor is currently positioned on a tree node, return the node. +" Otherwise, return the empty dictionary. +function! s:TreeFileNode.GetSelected() + + try + let l:path = b:NERDTree.ui.getPath(line('.')) + + if empty(l:path) + return {} + endif + + return b:NERDTree.root.findNode(l:path) + catch + return {} + endtry +endfunction + +" FUNCTION: TreeFileNode.isVisible() {{{1 +" returns 1 if this node should be visible according to the tree filters and +" hidden file filters (and their on/off status) +function! s:TreeFileNode.isVisible() + return !self.path.ignore(self.getNerdtree()) +endfunction + +" FUNCTION: TreeFileNode.isRoot() {{{1 +function! s:TreeFileNode.isRoot() + if !g:NERDTree.ExistsForBuf() + throw 'NERDTree.NoTreeError: No tree exists for the current buffer' + endif + + return self.equals(self.getNerdtree().root) +endfunction + +" FUNCTION: TreeFileNode.New(path, nerdtree) {{{1 +" Returns a new TreeNode object with the given path and parent +" +" Args: +" path: file/dir that the node represents +" nerdtree: the tree the node belongs to +function! s:TreeFileNode.New(path, nerdtree) + if a:path.isDirectory + return g:NERDTreeDirNode.New(a:path, a:nerdtree) + else + let newTreeNode = copy(self) + let newTreeNode.path = a:path + let newTreeNode.parent = {} + let newTreeNode._nerdtree = a:nerdtree + return newTreeNode + endif +endfunction + +" FUNCTION: TreeFileNode.open() {{{1 +function! s:TreeFileNode.open(...) + let opts = a:0 ? a:1 : {} + let opener = g:NERDTreeOpener.New(self.path, opts) + call opener.open(self) +endfunction + +" FUNCTION: TreeFileNode.openSplit() {{{1 +" Open this node in a new window +function! s:TreeFileNode.openSplit() + call nerdtree#deprecated('TreeFileNode.openSplit', 'is deprecated, use .open() instead.') + call self.open({'where': 'h'}) +endfunction + +" FUNCTION: TreeFileNode.openVSplit() {{{1 +" Open this node in a new vertical window +function! s:TreeFileNode.openVSplit() + call nerdtree#deprecated('TreeFileNode.openVSplit', 'is deprecated, use .open() instead.') + call self.open({'where': 'v'}) +endfunction + +" FUNCTION: TreeFileNode.openInNewTab(options) {{{1 +function! s:TreeFileNode.openInNewTab(options) + call nerdtree#deprecated('TreeFileNode.openinNewTab', 'is deprecated, use .open() instead.') + call self.open(extend({'where': 't'}, a:options)) +endfunction + +" FUNCTION: TreeFileNode.openExplorer() +function! s:TreeFileNode.openExplorer() + execute 'wincmd p' + execute 'edit '.self.path.getParent().str({'format':'Edit'}) +endfunction + +" FUNCTION: TreeFileNode.putCursorHere(isJump, recurseUpward){{{1 +" Places the cursor on the line number this node is rendered on +" +" Args: +" isJump: 1 if this cursor movement should be counted as a jump by vim +" recurseUpward: try to put the cursor on the parent if the this node isnt +" visible +function! s:TreeFileNode.putCursorHere(isJump, recurseUpward) + let ln = self.getNerdtree().ui.getLineNum(self) + if ln != -1 + if a:isJump + mark ' + endif + call cursor(ln, col('.')) + else + if a:recurseUpward + let node = self + while node != {} && self.getNerdtree().ui.getLineNum(node) ==# -1 + let node = node.parent + call node.open() + endwhile + call self._nerdtree.render() + call node.putCursorHere(a:isJump, 0) + endif + endif +endfunction + +" FUNCTION: TreeFileNode.refresh() {{{1 +function! s:TreeFileNode.refresh() + call self.path.refresh(self.getNerdtree()) +endfunction + +" FUNCTION: TreeFileNode.refreshFlags() {{{1 +function! s:TreeFileNode.refreshFlags() + call self.path.refreshFlags(self.getNerdtree()) +endfunction + +" FUNCTION: TreeFileNode.rename() {{{1 +" Calls the rename method for this nodes path obj +function! s:TreeFileNode.rename(newName) + let newName = substitute(a:newName, '\(\\\|\/\)$', '', '') + call self.path.rename(newName) + call self.parent.removeChild(self) + + let parentPath = self.path.getParent() + let newParent = self.getNerdtree().root.findNode(parentPath) + + if newParent != {} + call newParent.createChild(self.path, 1) + call newParent.refresh() + endif +endfunction + +" FUNCTION: TreeFileNode.renderToString {{{1 +" returns a string representation for this tree to be rendered in the view +function! s:TreeFileNode.renderToString() + return self._renderToString(0, 0) +endfunction + +" Args: +" depth: the current depth in the tree for this call +" drawText: 1 if we should actually draw the line for this node (if 0 then the +" child nodes are rendered only) +" for each depth in the tree +function! s:TreeFileNode._renderToString(depth, drawText) + let output = '' + if a:drawText ==# 1 + + let treeParts = repeat(' ', a:depth - 1) + let treeParts .= (self.path.isDirectory || g:NERDTreeDirArrowExpandable ==# '' ? '' : ' ') + + let line = treeParts . self.displayString() + let output = output . line . "\n" + endif + + " if the node is an open dir, draw its children + if self.path.isDirectory ==# 1 && self.isOpen ==# 1 + + let childNodesToDraw = self.getVisibleChildren() + + if self.isCascadable() && a:depth > 0 + + let output = output . childNodesToDraw[0]._renderToString(a:depth, 0) + + elseif len(childNodesToDraw) > 0 + for i in childNodesToDraw + let output = output . i._renderToString(a:depth + 1, 1) + endfor + endif + endif + + return output +endfunction + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/ui.vim b/home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/ui.vim new file mode 100644 index 0000000..a481ba4 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree/lib/nerdtree/ui.vim @@ -0,0 +1,532 @@ +" ============================================================================ +" CLASS: UI +" ============================================================================ + + +let s:UI = {} +let g:NERDTreeUI = s:UI + +" FUNCTION: s:UI.centerView() {{{1 +" centers the nerd tree window around the cursor (provided the nerd tree +" options permit) +function! s:UI.centerView() + if g:NERDTreeAutoCenter + let current_line = winline() + let lines_to_top = current_line + let lines_to_bottom = winheight(g:NERDTree.GetWinNum()) - current_line + if lines_to_top < g:NERDTreeAutoCenterThreshold || lines_to_bottom < g:NERDTreeAutoCenterThreshold + normal! zz + endif + endif +endfunction + +" FUNCTION: s:UI._dumpHelp {{{1 +" prints out the quick help +function! s:UI._dumpHelp() + if self.getShowHelp() + let help = "\" NERDTree (" . nerdtree#version() . ") quickhelp~\n" + let help .= "\" ============================\n" + let help .= "\" File node mappings~\n" + let help .= '" '. (g:NERDTreeMouseMode ==# 3 ? 'single' : 'double') ."-click,\n" + if self.nerdtree.isTabTree() + let help .= '" '. g:NERDTreeMapActivateNode .": open in prev window\n" + else + let help .= '" '. g:NERDTreeMapActivateNode .": open in current window\n" + endif + if self.nerdtree.isTabTree() + let help .= '" '. g:NERDTreeMapPreview .": preview\n" + endif + let help .= '" '. g:NERDTreeMapOpenInTab.": open in new tab\n" + let help .= '" '. g:NERDTreeMapOpenInTabSilent .": open in new tab silently\n" + let help .= "\" middle-click,\n" + let help .= '" '. g:NERDTreeMapOpenSplit .": open split\n" + let help .= '" '. g:NERDTreeMapPreviewSplit .": preview split\n" + let help .= '" '. g:NERDTreeMapOpenVSplit .": open vsplit\n" + let help .= '" '. g:NERDTreeMapPreviewVSplit .": preview vsplit\n" + let help .= '" '. g:NERDTreeMapCustomOpen .": custom open\n" + + let help .= "\"\n\" ----------------------------\n" + let help .= "\" Directory node mappings~\n" + let help .= '" '. (g:NERDTreeMouseMode ==# 1 ? 'double' : 'single') ."-click,\n" + let help .= '" '. g:NERDTreeMapActivateNode .": open & close node\n" + let help .= '" '. g:NERDTreeMapOpenRecursively .": recursively open node\n" + let help .= '" '. g:NERDTreeMapOpenInTab.": open in new tab\n" + let help .= '" '. g:NERDTreeMapOpenInTabSilent .": open in new tab silently\n" + let help .= '" '. g:NERDTreeMapCustomOpen .": custom open\n" + let help .= '" '. g:NERDTreeMapCloseDir .": close parent of node\n" + let help .= '" '. g:NERDTreeMapCloseChildren .": close all child nodes of\n" + let help .= "\" current node recursively\n" + let help .= "\" middle-click,\n" + let help .= '" '. g:NERDTreeMapOpenExpl.": explore selected dir\n" + + let help .= "\"\n\" ----------------------------\n" + let help .= "\" Bookmark table mappings~\n" + let help .= "\" double-click,\n" + let help .= '" '. g:NERDTreeMapActivateNode .": open bookmark\n" + let help .= '" '. g:NERDTreeMapPreview .": preview file\n" + let help .= '" '. g:NERDTreeMapPreview .": find dir in tree\n" + let help .= '" '. g:NERDTreeMapOpenInTab.": open in new tab\n" + let help .= '" '. g:NERDTreeMapOpenInTabSilent .": open in new tab silently\n" + let help .= '" '. g:NERDTreeMapOpenSplit .": open split\n" + let help .= '" '. g:NERDTreeMapPreviewSplit .": preview split\n" + let help .= '" '. g:NERDTreeMapOpenVSplit .": open vsplit\n" + let help .= '" '. g:NERDTreeMapPreviewVSplit .": preview vsplit\n" + let help .= '" '. g:NERDTreeMapCustomOpen .": custom open\n" + let help .= '" '. g:NERDTreeMapDeleteBookmark .": delete bookmark\n" + + let help .= "\"\n\" ----------------------------\n" + let help .= "\" Tree navigation mappings~\n" + let help .= '" '. g:NERDTreeMapJumpRoot .": go to root\n" + let help .= '" '. g:NERDTreeMapJumpParent .": go to parent\n" + let help .= '" '. g:NERDTreeMapJumpFirstChild .": go to first child\n" + let help .= '" '. g:NERDTreeMapJumpLastChild .": go to last child\n" + let help .= '" '. g:NERDTreeMapJumpNextSibling .": go to next sibling\n" + let help .= '" '. g:NERDTreeMapJumpPrevSibling .": go to prev sibling\n" + + let help .= "\"\n\" ----------------------------\n" + let help .= "\" Filesystem mappings~\n" + let help .= '" '. g:NERDTreeMapChangeRoot .": change tree root to the\n" + let help .= "\" selected dir\n" + let help .= '" '. g:NERDTreeMapUpdir .": move tree root up a dir\n" + let help .= '" '. g:NERDTreeMapUpdirKeepOpen .": move tree root up a dir\n" + let help .= "\" but leave old root open\n" + let help .= '" '. g:NERDTreeMapRefresh .": refresh cursor dir\n" + let help .= '" '. g:NERDTreeMapRefreshRoot .": refresh current root\n" + let help .= '" '. g:NERDTreeMapMenu .": Show menu\n" + let help .= '" '. g:NERDTreeMapChdir .":change the CWD to the\n" + let help .= "\" selected dir\n" + let help .= '" '. g:NERDTreeMapCWD .":change tree root to CWD\n" + + let help .= "\"\n\" ----------------------------\n" + let help .= "\" Tree filtering mappings~\n" + let help .= '" '. g:NERDTreeMapToggleHidden .': hidden files (' . (self.getShowHidden() ? 'on' : 'off') . ")\n" + let help .= '" '. g:NERDTreeMapToggleFilters .': file filters (' . (self.isIgnoreFilterEnabled() ? 'on' : 'off') . ")\n" + let help .= '" '. g:NERDTreeMapToggleFiles .': files (' . (self.getShowFiles() ? 'on' : 'off') . ")\n" + let help .= '" '. g:NERDTreeMapToggleBookmarks .': bookmarks (' . (self.getShowBookmarks() ? 'on' : 'off') . ")\n" + + " add quickhelp entries for each custom key map + let help .= "\"\n\" ----------------------------\n" + let help .= "\" Custom mappings~\n" + for i in g:NERDTreeKeyMap.All() + if !empty(i.quickhelpText) + let help .= '" '. i.key .': '. i.quickhelpText ."\n" + endif + endfor + + let help .= "\"\n\" ----------------------------\n" + let help .= "\" Other mappings~\n" + let help .= '" '. g:NERDTreeMapQuit .": Close the NERDTree window\n" + let help .= '" '. g:NERDTreeMapToggleZoom .": Zoom (maximize-minimize)\n" + let help .= "\" the NERDTree window\n" + let help .= '" '. g:NERDTreeMapHelp .": toggle help\n" + let help .= "\"\n\" ----------------------------\n" + let help .= "\" Bookmark commands~\n" + let help .= "\" :Bookmark []\n" + let help .= "\" :BookmarkToRoot \n" + let help .= "\" :RevealBookmark \n" + let help .= "\" :OpenBookmark \n" + let help .= "\" :ClearBookmarks []\n" + let help .= "\" :ClearAllBookmarks\n" + let help .= "\" :ReadBookmarks\n" + let help .= "\" :WriteBookmarks\n" + let help .= "\" :EditBookmarks\n" + silent! put =help + elseif !self.isMinimal() + let help ='" Press '. g:NERDTreeMapHelp ." for help\n" + silent! put =help + endif +endfunction + + +" FUNCTION: s:UI.new(nerdtree) {{{1 +function! s:UI.New(nerdtree) + let newObj = copy(self) + let newObj.nerdtree = a:nerdtree + let newObj._showHelp = 0 + let newObj._ignoreEnabled = 1 + let newObj._showFiles = g:NERDTreeShowFiles + let newObj._showHidden = g:NERDTreeShowHidden + let newObj._showBookmarks = g:NERDTreeShowBookmarks + + return newObj +endfunction + +" FUNCTION: s:UI.getPath(ln) {{{1 +" Return the Path object for the node that is rendered on the given line +" number. If the 'up a dir' line is selected, return the Path object for +" the parent of the root. Return the empty dictionary if the given line +" does not reference a tree node. +function! s:UI.getPath(ln) + let line = getline(a:ln) + + let rootLine = self.getRootLineNum() + + if a:ln ==# rootLine + return self.nerdtree.root.path + endif + + if line ==# s:UI.UpDirLine() + return self.nerdtree.root.path.getParent() + endif + + if a:ln < rootLine + return {} + endif + + let indent = self._indentLevelFor(line) + + " remove the tree parts and the leading space + let curFile = self._stripMarkup(line) + + let dir = '' + let lnum = a:ln + while lnum > 0 + let lnum = lnum - 1 + let curLine = getline(lnum) + let curLineStripped = self._stripMarkup(curLine) + + " have we reached the top of the tree? + if lnum ==# rootLine + let dir = self.nerdtree.root.path.str({'format': 'UI'}) . dir + break + endif + if curLineStripped =~# '/$' + let lpindent = self._indentLevelFor(curLine) + if lpindent < indent + let indent = indent - 1 + + let dir = substitute (curLineStripped,'^\\', '', '') . dir + continue + endif + endif + endwhile + let curFile = self.nerdtree.root.path.drive . dir . curFile + let toReturn = g:NERDTreePath.New(curFile) + return toReturn +endfunction + +" FUNCTION: s:UI.getLineNum(node) {{{1 +" Return the line number where the given node is rendered. Return -1 if the +" given node is not visible. +function! s:UI.getLineNum(node) + + if a:node.isRoot() + return self.getRootLineNum() + endif + + let l:pathComponents = [substitute(self.nerdtree.root.path.str({'format': 'UI'}), '/\s*$', '', '')] + let l:currentPathComponent = 1 + + let l:fullPath = a:node.path.str({'format': 'UI'}) + + for l:lineNumber in range(self.getRootLineNum() + 1, line('$')) + let l:currentLine = getline(l:lineNumber) + let l:indentLevel = self._indentLevelFor(l:currentLine) + + if l:indentLevel !=# l:currentPathComponent + continue + endif + + let l:currentLine = self._stripMarkup(l:currentLine) + let l:currentPath = join(l:pathComponents, '/') . '/' . l:currentLine + + " Directories: If the current path 'starts with' the full path, then + " either the paths are equal or the line is a cascade containing the + " full path. + if l:fullPath[-1:] ==# '/' && stridx(l:currentPath, l:fullPath) ==# 0 + return l:lineNumber + endif + + " Files: The paths must exactly match. + if l:fullPath ==# l:currentPath + return l:lineNumber + endif + + " Otherwise: If the full path starts with the current path and the + " current path is a directory, we add a new path component. + if stridx(l:fullPath, l:currentPath) ==# 0 && l:currentPath[-1:] ==# '/' + let l:currentLine = substitute(l:currentLine, '/\s*$', '', '') + call add(l:pathComponents, l:currentLine) + let l:currentPathComponent += 1 + endif + endfor + + return -1 +endfunction + +" FUNCTION: s:UI.getRootLineNum(){{{1 +" gets the line number of the root node +function! s:UI.getRootLineNum() + let rootLine = 1 + while rootLine <= line('$') && getline(rootLine) !~# '^\(/\|<\)' + let rootLine = rootLine + 1 + endwhile + return rootLine +endfunction + +" FUNCTION: s:UI.getShowBookmarks() {{{1 +function! s:UI.getShowBookmarks() + return self._showBookmarks +endfunction + +" FUNCTION: s:UI.getShowFiles() {{{1 +function! s:UI.getShowFiles() + return self._showFiles +endfunction + +" FUNCTION: s:UI.getShowHelp() {{{1 +function! s:UI.getShowHelp() + return self._showHelp +endfunction + +" FUNCTION: s:UI.getShowHidden() {{{1 +function! s:UI.getShowHidden() + return self._showHidden +endfunction + +" FUNCTION: s:UI._indentLevelFor(line) {{{1 +function! s:UI._indentLevelFor(line) + " Replace multi-character DirArrows with a single space so the + " indentation calculation doesn't get messed up. + if g:NERDTreeDirArrowExpandable ==# '' + let l:line = ' '.a:line + else + let l:line = substitute(substitute(a:line, '\V'.g:NERDTreeDirArrowExpandable, ' ', ''), '\V'.g:NERDTreeDirArrowCollapsible, ' ', '') + endif + let leadChars = match(l:line, '\M\[^ ]') + return leadChars / s:UI.IndentWid() +endfunction + +" FUNCTION: s:UI.IndentWid() {{{1 +function! s:UI.IndentWid() + return 2 +endfunction + +" FUNCTION: s:UI.isIgnoreFilterEnabled() {{{1 +function! s:UI.isIgnoreFilterEnabled() + return self._ignoreEnabled ==# 1 +endfunction + +" FUNCTION: s:UI.isMinimal() {{{1 +function! s:UI.isMinimal() + return g:NERDTreeMinimalUI +endfunction + +" FUNCTION: s:UI.MarkupReg() {{{1 +function! s:UI.MarkupReg() + return '^ *['.g:NERDTreeDirArrowExpandable.g:NERDTreeDirArrowCollapsible.']\? ' +endfunction + +" FUNCTION: s:UI._renderBookmarks {{{1 +function! s:UI._renderBookmarks() + + if !self.isMinimal() + call setline(line('.')+1, '>----------Bookmarks----------') + call cursor(line('.')+1, col('.')) + endif + + if g:NERDTreeBookmarksSort ==# 1 || g:NERDTreeBookmarksSort ==# 2 + call g:NERDTreeBookmark.SortBookmarksList() + endif + + for i in g:NERDTreeBookmark.Bookmarks() + call setline(line('.')+1, i.str()) + call cursor(line('.')+1, col('.')) + endfor + + call setline(line('.')+1, '') + call cursor(line('.')+1, col('.')) +endfunction + +" FUNCTION: s:UI.restoreScreenState() {{{1 +" +" Sets the screen state back to what it was when nerdtree#saveScreenState was last +" called. +" +" Assumes the cursor is in the NERDTree window +function! s:UI.restoreScreenState() + if !has_key(self, '_screenState') + return + endif + call nerdtree#exec('silent vertical resize ' . self._screenState['oldWindowSize'], 1) + + let old_scrolloff=&scrolloff + let &scrolloff=0 + call cursor(self._screenState['oldTopLine'], 0) + normal! zt + call setpos('.', self._screenState['oldPos']) + let &scrolloff=old_scrolloff +endfunction + +" FUNCTION: s:UI.saveScreenState() {{{1 +" Saves the current cursor position in the current buffer and the window +" scroll position +function! s:UI.saveScreenState() + let win = winnr() + let self._screenState = {} + try + call g:NERDTree.CursorToTreeWin() + let self._screenState['oldPos'] = getpos('.') + let self._screenState['oldTopLine'] = line('w0') + let self._screenState['oldWindowSize'] = winnr('$')==1 ? g:NERDTreeWinSize : winwidth('') + call nerdtree#exec(win . 'wincmd w', 1) + catch + endtry +endfunction + +" FUNCTION: s:UI.setShowHidden(val) {{{1 +function! s:UI.setShowHidden(val) + let self._showHidden = a:val +endfunction + +" FUNCTION: s:UI._stripMarkup(line){{{1 +" find the filename in the given line, and return it. +" +" Args: +" line: the subject line +function! s:UI._stripMarkup(line) + let l:line = substitute(a:line, '^.\{-}' . g:NERDTreeNodeDelimiter, '', '') + return substitute(l:line, g:NERDTreeNodeDelimiter.'.*$', '', '') +endfunction + +" FUNCTION: s:UI.render() {{{1 +function! s:UI.render() + setlocal noreadonly modifiable + + " remember the top line of the buffer and the current line so we can + " restore the view exactly how it was + let curLine = line('.') + let curCol = col('.') + let topLine = line('w0') + + " delete all lines in the buffer (being careful not to clobber a register) + silent 1,$delete _ + + call self._dumpHelp() + + " delete the blank line before the help and add one after it + if !self.isMinimal() + call setline(line('.')+1, '') + call cursor(line('.')+1, col('.')) + endif + + if self.getShowBookmarks() + call self._renderBookmarks() + endif + + " add the 'up a dir' line + if !self.isMinimal() + call setline(line('.')+1, s:UI.UpDirLine()) + call cursor(line('.')+1, col('.')) + endif + + " draw the header line + let header = self.nerdtree.root.path.str({'format': 'UI', 'truncateTo': winwidth(0)}) + call setline(line('.')+1, header) + call cursor(line('.')+1, col('.')) + + " draw the tree + silent put =self.nerdtree.root.renderToString() + + " delete the blank line at the top of the buffer + silent 1,1delete _ + + " restore the view + let old_scrolloff=&scrolloff + let &scrolloff=0 + call cursor(topLine, 1) + normal! zt + call cursor(curLine, curCol) + let &scrolloff = old_scrolloff + + setlocal readonly nomodifiable +endfunction + + +" FUNCTION: UI.renderViewSavingPosition {{{1 +" Renders the tree and ensures the cursor stays on the current node or the +" current nodes parent if it is no longer available upon re-rendering +function! s:UI.renderViewSavingPosition() + let currentNode = g:NERDTreeFileNode.GetSelected() + + " go up the tree till we find a node that will be visible or till we run + " out of nodes + while currentNode !=# {} && !currentNode.isVisible() && !currentNode.isRoot() + let currentNode = currentNode.parent + endwhile + + call self.render() + + if currentNode !=# {} + call currentNode.putCursorHere(0, 0) + endif +endfunction + +" FUNCTION: s:UI.toggleHelp() {{{1 +function! s:UI.toggleHelp() + let self._showHelp = !self._showHelp +endfunction + +" FUNCTION: s:UI.toggleIgnoreFilter() {{{1 +" toggles the use of the NERDTreeIgnore option +function! s:UI.toggleIgnoreFilter() + let self._ignoreEnabled = !self._ignoreEnabled + call self.renderViewSavingPosition() + call self.centerView() +endfunction + +" FUNCTION: s:UI.toggleShowBookmarks() {{{1 +" Toggle the visibility of the Bookmark table. +function! s:UI.toggleShowBookmarks() + let self._showBookmarks = !self._showBookmarks + + if self.getShowBookmarks() + call self.nerdtree.render() + call g:NERDTree.CursorToBookmarkTable() + else + + if empty(g:NERDTreeFileNode.GetSelected()) + call b:NERDTree.root.putCursorHere(0, 0) + normal! 0 + endif + + call self.renderViewSavingPosition() + endif + + call self.centerView() +endfunction + +" FUNCTION: s:UI.toggleShowFiles() {{{1 +" toggles the display of hidden files +function! s:UI.toggleShowFiles() + let self._showFiles = !self._showFiles + call self.renderViewSavingPosition() + call self.centerView() +endfunction + +" FUNCTION: s:UI.toggleShowHidden() {{{1 +" toggles the display of hidden files +function! s:UI.toggleShowHidden() + let self._showHidden = !self._showHidden + call self.renderViewSavingPosition() + call self.centerView() +endfunction + +" FUNCTION: s:UI.toggleZoom() {{{1 +" zoom (maximize/minimize) the NERDTree window +function! s:UI.toggleZoom() + if exists('b:NERDTreeZoomed') && b:NERDTreeZoomed + call nerdtree#exec('silent vertical resize '. g:NERDTreeWinSize, 1) + let b:NERDTreeZoomed = 0 + else + call nerdtree#exec('vertical resize '. get(g:, 'NERDTreeWinSizeMax', ''), 1) + let b:NERDTreeZoomed = 1 + endif +endfunction + +" FUNCTION: s:UI.UpDirLine() {{{1 +function! s:UI.UpDirLine() + return '.. (up a dir)' +endfunction + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/home-rc/dot-files/.vim/bundle/nerdtree/nerdtree_plugin/exec_menuitem.vim b/home-rc/dot-files/.vim/bundle/nerdtree/nerdtree_plugin/exec_menuitem.vim new file mode 100644 index 0000000..fb6c486 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree/nerdtree_plugin/exec_menuitem.vim @@ -0,0 +1,40 @@ +" ============================================================================ +" File: exec_menuitem.vim +" Description: plugin for NERD Tree that provides an execute file menu item +" Maintainer: Martin Grenfell +" License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +" +" ============================================================================ +if exists('g:loaded_nerdtree_exec_menuitem') + finish +endif +let g:loaded_nerdtree_exec_menuitem = 1 + +call NERDTreeAddMenuItem({ + \ 'text': '(!)Execute file', + \ 'shortcut': '!', + \ 'callback': 'NERDTreeExecFile', + \ 'isActiveCallback': 'NERDTreeExecFileActive' }) + +function! NERDTreeExecFileActive() + let node = g:NERDTreeFileNode.GetSelected() + return !node.path.isDirectory && node.path.isExecutable +endfunction + +function! NERDTreeExecFile() + let treenode = g:NERDTreeFileNode.GetSelected() + echo "==========================================================\n" + echo "Complete the command to execute (add arguments etc):\n" + let cmd = treenode.path.str({'escape': 1}) + let cmd = input(':!', cmd . ' ') + + if cmd !=# '' + exec ':!' . cmd + else + echo 'Aborted' + endif +endfunction diff --git a/home-rc/dot-files/.vim/bundle/nerdtree/nerdtree_plugin/fs_menu.vim b/home-rc/dot-files/.vim/bundle/nerdtree/nerdtree_plugin/fs_menu.vim new file mode 100644 index 0000000..05bee60 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree/nerdtree_plugin/fs_menu.vim @@ -0,0 +1,484 @@ +" ============================================================================ +" File: fs_menu.vim +" Description: plugin for the NERD Tree that provides a file system menu +" Maintainer: Martin Grenfell +" License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +" +" ============================================================================ +if exists('g:loaded_nerdtree_fs_menu') + finish +endif +let g:loaded_nerdtree_fs_menu = 1 + +"Automatically delete the buffer after deleting or renaming a file +if !exists('g:NERDTreeAutoDeleteBuffer') + let g:NERDTreeAutoDeleteBuffer = 0 +endif + +call NERDTreeAddMenuItem({'text': '(a)dd a childnode', 'shortcut': 'a', 'callback': 'NERDTreeAddNode'}) +call NERDTreeAddMenuItem({'text': '(m)ove the current node', 'shortcut': 'm', 'callback': 'NERDTreeMoveNode'}) +call NERDTreeAddMenuItem({'text': '(d)elete the current node', 'shortcut': 'd', 'callback': 'NERDTreeDeleteNode'}) + +if has('gui_mac') || has('gui_macvim') || has('mac') + call NERDTreeAddMenuItem({'text': '(r)eveal in Finder the current node', 'shortcut': 'r', 'callback': 'NERDTreeRevealInFinder'}) + call NERDTreeAddMenuItem({'text': '(o)pen the current node with system editor', 'shortcut': 'o', 'callback': 'NERDTreeExecuteFile'}) + call NERDTreeAddMenuItem({'text': '(q)uicklook the current node', 'shortcut': 'q', 'callback': 'NERDTreeQuickLook'}) +endif + +if executable('xdg-open') + call NERDTreeAddMenuItem({'text': '(r)eveal the current node in file manager', 'shortcut': 'r', 'callback': 'NERDTreeRevealFileLinux'}) + call NERDTreeAddMenuItem({'text': '(o)pen the current node with system editor', 'shortcut': 'o', 'callback': 'NERDTreeExecuteFileLinux'}) +endif + +if nerdtree#runningWindows() + call NERDTreeAddMenuItem({'text': '(o)pen the current node with system editor', 'shortcut': 'o', 'callback': 'NERDTreeExecuteFileWindows'}) +endif + +if g:NERDTreePath.CopyingSupported() + call NERDTreeAddMenuItem({'text': '(c)opy the current node', 'shortcut': 'c', 'callback': 'NERDTreeCopyNode'}) +endif +call NERDTreeAddMenuItem({'text': (has('clipboard')?'copy (p)ath to clipboard':'print (p)ath to screen'), 'shortcut': 'p', 'callback': 'NERDTreeCopyPath'}) + +if has('unix') || has('osx') + call NERDTreeAddMenuItem({'text': '(l)ist the current node', 'shortcut': 'l', 'callback': 'NERDTreeListNode'}) +else + call NERDTreeAddMenuItem({'text': '(l)ist the current node', 'shortcut': 'l', 'callback': 'NERDTreeListNodeWin32'}) +endif + +if exists('*system') + call NERDTreeAddMenuItem({'text': 'Run (s)ystem command in this directory', 'shortcut':'s', 'callback': 'NERDTreeSystemCommand'}) +endif + +"FUNCTION: s:inputPrompt(action){{{1 +"returns the string that should be prompted to the user for the given action +" +"Args: +"action: the action that is being performed, e.g. 'delete' +function! s:inputPrompt(action) + if a:action ==# 'add' + let title = 'Add a childnode' + let info = "Enter the dir/file name to be created. Dirs end with a '/'" + let minimal = 'Add node:' + + elseif a:action ==# 'copy' + let title = 'Copy the current node' + let info = 'Enter the new path to copy the node to:' + let minimal = 'Copy to:' + + elseif a:action ==# 'delete' + let title = 'Delete the current node' + let info = 'Are you sure you wish to delete the node:' + let minimal = 'Delete?' + + elseif a:action ==# 'deleteNonEmpty' + let title = 'Delete the current node' + let info = "STOP! Directory is not empty! To delete, type 'yes'" + let minimal = 'Delete directory?' + + elseif a:action ==# 'move' + let title = 'Rename the current node' + let info = 'Enter the new path for the node:' + let minimal = 'Move to:' + endif + + if g:NERDTreeMenuController.isMinimal() + redraw! " Clear the menu + return minimal . ' ' + else + let divider = '==========================================================' + return title . "\n" . divider . "\n" . info . "\n" + end +endfunction + +"FUNCTION: s:promptToDelBuffer(bufnum, msg){{{1 +"prints out the given msg and, if the user responds by pushing 'y' then the +"buffer with the given bufnum is deleted +" +"Args: +"bufnum: the buffer that may be deleted +"msg: a message that will be echoed to the user asking them if they wish to +" del the buffer +function! s:promptToDelBuffer(bufnum, msg) + echo a:msg + if g:NERDTreeAutoDeleteBuffer || nr2char(getchar()) ==# 'y' + " 1. ensure that all windows which display the just deleted filename + " now display an empty buffer (so a layout is preserved). + " Is not it better to close single tabs with this file only ? + let s:originalTabNumber = tabpagenr() + let s:originalWindowNumber = winnr() + " Go to the next buffer in buffer list if at least one extra buffer is listed + " Otherwise open a new empty buffer + if v:version >= 800 + let l:listedBufferCount = len(getbufinfo({'buflisted':1})) + elseif v:version >= 702 + let l:listedBufferCount = len(filter(range(1, bufnr('$')), 'buflisted(v:val)')) + else + " Ignore buffer count in this case to make sure we keep the old + " behavior + let l:listedBufferCount = 0 + endif + if l:listedBufferCount > 1 + call nerdtree#exec('tabdo windo if winbufnr(0) ==# ' . a:bufnum . " | exec ':bnext! ' | endif", 1) + else + call nerdtree#exec('tabdo windo if winbufnr(0) ==# ' . a:bufnum . " | exec ':enew! ' | endif", 1) + endif + call nerdtree#exec('tabnext ' . s:originalTabNumber, 1) + call nerdtree#exec(s:originalWindowNumber . 'wincmd w', 1) + " 3. We don't need a previous buffer anymore + call nerdtree#exec('bwipeout! ' . a:bufnum, 0) + endif +endfunction + +"FUNCTION: s:renameBuffer(bufNum, newNodeName, isDirectory){{{1 +"The buffer with the given bufNum is replaced with a new one +" +"Args: +"bufNum: the buffer that may be deleted +"newNodeName: the name given to the renamed node +"isDirectory: determines how to do the create the new filenames +function! s:renameBuffer(bufNum, newNodeName, isDirectory) + if a:isDirectory + let quotedFileName = fnameescape(a:newNodeName . '/' . fnamemodify(bufname(a:bufNum),':t')) + let editStr = g:NERDTreePath.New(a:newNodeName . '/' . fnamemodify(bufname(a:bufNum),':t')).str({'format': 'Edit'}) + else + let quotedFileName = fnameescape(a:newNodeName) + let editStr = g:NERDTreePath.New(a:newNodeName).str({'format': 'Edit'}) + endif + " 1. ensure that a new buffer is loaded + call nerdtree#exec('badd ' . quotedFileName, 0) + " 2. ensure that all windows which display the just deleted filename + " display a buffer for a new filename. + let s:originalTabNumber = tabpagenr() + let s:originalWindowNumber = winnr() + call nerdtree#exec('tabdo windo if winbufnr(0) ==# ' . a:bufNum . " | exec ':e! " . editStr . "' | endif", 0) + call nerdtree#exec('tabnext ' . s:originalTabNumber, 1) + call nerdtree#exec(s:originalWindowNumber . 'wincmd w', 1) + " 3. We don't need a previous buffer anymore + try + call nerdtree#exec('confirm bwipeout ' . a:bufNum, 0) + catch + " This happens when answering Cancel if confirmation is needed. Do nothing. + endtry +endfunction + +"FUNCTION: NERDTreeAddNode(){{{1 +function! NERDTreeAddNode() + let curDirNode = g:NERDTreeDirNode.GetSelected() + let prompt = s:inputPrompt('add') + let newNodeName = substitute(input(prompt, curDirNode.path.str() . nerdtree#slash(), 'file'), '\(^\s*\|\s*$\)', '', 'g') + + if newNodeName ==# '' + call nerdtree#echo('Node Creation Aborted.') + return + endif + + try + let newPath = g:NERDTreePath.Create(newNodeName) + let parentNode = b:NERDTree.root.findNode(newPath.getParent()) + + let newTreeNode = g:NERDTreeFileNode.New(newPath, b:NERDTree) + " Emptying g:NERDTreeOldSortOrder forces the sort to + " recalculate the cached sortKey so nodes sort correctly. + let g:NERDTreeOldSortOrder = [] + if empty(parentNode) + call b:NERDTree.root.refresh() + call b:NERDTree.render() + elseif parentNode.isOpen || !empty(parentNode.children) + call parentNode.addChild(newTreeNode, 1) + call NERDTreeRender() + call newTreeNode.putCursorHere(1, 0) + endif + + redraw! + catch /^NERDTree/ + call nerdtree#echoWarning('Node Not Created.') + endtry +endfunction + +"FUNCTION: NERDTreeMoveNode(){{{1 +function! NERDTreeMoveNode() + let curNode = g:NERDTreeFileNode.GetSelected() + let prompt = s:inputPrompt('move') + let newNodePath = input(prompt, curNode.path.str(), 'file') + while filereadable(newNodePath) + call nerdtree#echoWarning('This destination already exists. Try again.') + let newNodePath = substitute(input(prompt, curNode.path.str(), 'file'), '\(^\s*\|\s*$\)', '', 'g') + endwhile + + + if newNodePath ==# '' + call nerdtree#echo('Node Renaming Aborted.') + return + endif + + try + if curNode.path.isDirectory + let l:curPath = escape(curNode.path.str(),'\') . (nerdtree#runningWindows()?'\\':'/') . '.*' + let l:openBuffers = filter(range(1,bufnr('$')),'bufexists(v:val) && fnamemodify(bufname(v:val),":p") =~# "'.escape(l:curPath,'\').'"') + else + let l:openBuffers = filter(range(1,bufnr('$')),'bufexists(v:val) && fnamemodify(bufname(v:val),":p") ==# curNode.path.str()') + endif + + call curNode.rename(newNodePath) + " Emptying g:NERDTreeOldSortOrder forces the sort to + " recalculate the cached sortKey so nodes sort correctly. + let g:NERDTreeOldSortOrder = [] + call b:NERDTree.root.refresh() + call NERDTreeRender() + + " If the file node is open, or files under the directory node are + " open, ask the user if they want to replace the file(s) with the + " renamed files. + if !empty(l:openBuffers) + if curNode.path.isDirectory + echo "\nDirectory renamed.\n\nFiles with the old directory name are open in buffers " . join(l:openBuffers, ', ') . '. Replace these buffers with the new files? (yN)' + else + echo "\nFile renamed.\n\nThe old file is open in buffer " . l:openBuffers[0] . '. Replace this buffer with the new file? (yN)' + endif + if g:NERDTreeAutoDeleteBuffer || nr2char(getchar()) ==# 'y' + for bufNum in l:openBuffers + call s:renameBuffer(bufNum, newNodePath, curNode.path.isDirectory) + endfor + endif + endif + + call curNode.putCursorHere(1, 0) + + redraw! + catch /^NERDTree/ + call nerdtree#echoWarning('Node Not Renamed.') + endtry +endfunction + +" FUNCTION: NERDTreeDeleteNode() {{{1 +function! NERDTreeDeleteNode() + let currentNode = g:NERDTreeFileNode.GetSelected() + let confirmed = 0 + + if currentNode.path.isDirectory && ((currentNode.isOpen && currentNode.getChildCount() > 0) || + \ (len(currentNode._glob('*', 1)) > 0)) + let prompt = s:inputPrompt('deleteNonEmpty') . currentNode.path.str() . ': ' + let choice = input(prompt) + let confirmed = choice ==# 'yes' + else + let prompt = s:inputPrompt('delete') . currentNode.path.str() . ' (yN): ' + echo prompt + let choice = nr2char(getchar()) + let confirmed = choice ==# 'y' + endif + + if confirmed + try + call currentNode.delete() + call NERDTreeRender() + + "if the node is open in a buffer, ask the user if they want to + "close that buffer + let bufnum = bufnr('^'.currentNode.path.str().'$') + if buflisted(bufnum) + let prompt = "\nNode deleted.\n\nThe file is open in buffer ". bufnum . (bufwinnr(bufnum) ==# -1 ? ' (hidden)' : '') .'. Delete this buffer? (yN)' + call s:promptToDelBuffer(bufnum, prompt) + endif + + redraw! + catch /^NERDTree/ + call nerdtree#echoWarning('Could not remove node') + endtry + else + call nerdtree#echo('delete aborted') + endif +endfunction + +" FUNCTION: NERDTreeListNode() {{{1 +function! NERDTreeListNode() + let treenode = g:NERDTreeFileNode.GetSelected() + if !empty(treenode) + let s:uname = system('uname') + let stat_cmd = 'stat -c "%s" ' + + if s:uname =~? 'Darwin' + let stat_cmd = 'stat -f "%z" ' + endif + + let cmd = 'size=$(' . stat_cmd . shellescape(treenode.path.str()) . ') && ' . + \ 'size_with_commas=$(echo $size | sed -e :a -e "s/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta") && ' . + \ 'ls -ld ' . shellescape(treenode.path.str()) . ' | sed -e "s/ $size / $size_with_commas /"' + + let metadata = split(system(cmd),'\n') + call nerdtree#echo(metadata[0]) + else + call nerdtree#echo('No information available') + endif +endfunction + +" FUNCTION: NERDTreeListNodeWin32() {{{1 +function! NERDTreeListNodeWin32() + let l:node = g:NERDTreeFileNode.GetSelected() + + if !empty(l:node) + let l:path = l:node.path.str() + call nerdtree#echo(printf('%s:%s MOD:%s BYTES:%d PERMISSIONS:%s', + \ toupper(getftype(l:path)), + \ fnamemodify(l:path, ':t'), + \ strftime('%c', getftime(l:path)), + \ getfsize(l:path), + \ getfperm(l:path))) + return + endif + + call nerdtree#echo('node not recognized') +endfunction + +" FUNCTION: NERDTreeCopyNode() {{{1 +function! NERDTreeCopyNode() + let currentNode = g:NERDTreeFileNode.GetSelected() + let prompt = s:inputPrompt('copy') + let newNodePath = substitute(input(prompt, currentNode.path.str(), 'file'), '\(^\s*\|\s*$\)', '', 'g') + + if newNodePath !=# '' + "strip trailing slash + let newNodePath = substitute(newNodePath, '\/$', '', '') + + let confirmed = 1 + if currentNode.path.copyingWillOverwrite(newNodePath) + call nerdtree#echo('Warning: copying may overwrite files! Continue? (yN)') + let choice = nr2char(getchar()) + let confirmed = choice ==# 'y' + endif + + if confirmed + try + let newNode = currentNode.copy(newNodePath) + " Emptying g:NERDTreeOldSortOrder forces the sort to + " recalculate the cached sortKey so nodes sort correctly. + let g:NERDTreeOldSortOrder = [] + if empty(newNode) + call b:NERDTree.root.refresh() + call b:NERDTree.render() + else + call NERDTreeRender() + call newNode.putCursorHere(0, 0) + endif + catch /^NERDTree/ + call nerdtree#echoWarning('Could not copy node') + endtry + endif + else + call nerdtree#echo('Copy aborted.') + endif + redraw! +endfunction + +" FUNCTION: NERDTreeCopyPath() {{{1 +function! NERDTreeCopyPath() + let l:nodePath = g:NERDTreeFileNode.GetSelected().path.str() + if has('clipboard') + if &clipboard ==# 'unnamedplus' + let @+ = l:nodePath + else + let @* = l:nodePath + endif + call nerdtree#echo('The path [' . l:nodePath . '] was copied to your clipboard.') + else + call nerdtree#echo('The full path is: ' . l:nodePath) + endif +endfunction + +" FUNCTION: NERDTreeQuickLook() {{{1 +function! NERDTreeQuickLook() + let l:node = g:NERDTreeFileNode.GetSelected() + + if empty(l:node) + return + endif + + call system('qlmanage -p 2>/dev/null ' . shellescape(l:node.path.str())) +endfunction + +" FUNCTION: NERDTreeRevealInFinder() {{{1 +function! NERDTreeRevealInFinder() + let l:node = g:NERDTreeFileNode.GetSelected() + + if empty(l:node) + return + endif + + call system('open -R ' . shellescape(l:node.path.str())) +endfunction + +" FUNCTION: NERDTreeExecuteFile() {{{1 +function! NERDTreeExecuteFile() + let l:node = g:NERDTreeFileNode.GetSelected() + + if empty(l:node) + return + endif + + call system('open ' . shellescape(l:node.path.str())) +endfunction + +" FUNCTION: NERDTreeRevealFileLinux() {{{1 +function! NERDTreeRevealFileLinux() + let l:node = g:NERDTreeFileNode.GetSelected() + + if empty(l:node) + return + endif + + " Handle the edge case of "/", which has no parent. + if l:node.path.str() ==# '/' + call system('xdg-open /') + return + endif + + if empty(l:node.parent) + return + endif + + call system('xdg-open ' . shellescape(l:node.parent.path.str())) +endfunction + +" FUNCTION: NERDTreeExecuteFileLinux() {{{1 +function! NERDTreeExecuteFileLinux() + let l:node = g:NERDTreeFileNode.GetSelected() + + if empty(l:node) + return + endif + + call system('xdg-open ' . shellescape(l:node.path.str())) +endfunction + +" FUNCTION: NERDTreeExecuteFileWindows() {{{1 +function! NERDTreeExecuteFileWindows() + let l:node = g:NERDTreeFileNode.GetSelected() + + if empty(l:node) + return + endif + + call system('cmd.exe /c start "" ' . shellescape(l:node.path.str())) +endfunction + +" FUNCTION: NERDTreeSystemCommand() {{{1 +function! NERDTreeSystemCommand() + let l:node = g:NERDTreeFileNode.GetSelected() + + if empty(l:node) + return + endif + + let l:cwd = getcwd() + let l:directory = l:node.path.isDirectory ? l:node.path.str() : l:node.parent.path.str() + execute 'cd '.l:directory + + let l:nl = nr2char(10) + echo l:nl . system(input(l:directory . (nerdtree#runningWindows() ? '> ' : ' $ '))) + execute 'cd '.l:cwd +endfunction + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/home-rc/dot-files/.vim/bundle/nerdtree/nerdtree_plugin/vcs.vim b/home-rc/dot-files/.vim/bundle/nerdtree/nerdtree_plugin/vcs.vim new file mode 100644 index 0000000..d20e35e --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree/nerdtree_plugin/vcs.vim @@ -0,0 +1,47 @@ +" ============================================================================ +" File: vcs.vim +" Description: NERDTree plugin that provides a command to open on the root of +" a version control system repository. +" Maintainer: Phil Runninger +" License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +" +" ============================================================================ +command! -n=? -complete=dir -bar NERDTreeVCS :call CreateTabTreeVCS('') +command! -n=? -complete=dir -bar NERDTreeToggleVCS :call ToggleTabTreeVCS('') + +" FUNCTION: s:CreateTabTreeVCS(a:name) {{{1 +function! s:CreateTabTreeVCS(name) + let l:path = g:NERDTreeCreator._pathForString(a:name) + let l:path = s:FindParentVCSRoot(l:path) + call g:NERDTreeCreator.createTabTree(empty(l:path) ? '' : l:path._str()) +endfunction + +" FUNCTION: s:ToggleTabTreeVCS(a:name) {{{1 +" Behaves the same as ToggleTabTree except roots directory at VCS root +function! s:ToggleTabTreeVCS(name) + let l:path = g:NERDTreeCreator._pathForString(a:name) + let l:path = s:FindParentVCSRoot(l:path) + call g:NERDTreeCreator.toggleTabTree(empty(l:path) ? '' : l:path._str()) +endfunction + +" FUNCTION: s:FindParentVCSRoot(a:path) {{{1 +" Finds the root version control system folder of the given path. If a:path is +" not part of a repository, return the original path. +function! s:FindParentVCSRoot(path) + let l:path = a:path + while !empty(l:path) && + \ l:path._str() !~# '^\(\a:[\\\/]\|\/\)$' && + \ !isdirectory(l:path._str() . '/.git') && + \ !isdirectory(l:path._str() . '/.svn') && + \ !isdirectory(l:path._str() . '/.hg') && + \ !isdirectory(l:path._str() . '/.bzr') && + \ !isdirectory(l:path._str() . '/_darcs') + let l:path = l:path.getParent() + endwhile + return (empty(l:path) || l:path._str() =~# '^\(\a:[\\\/]\|\/\)$') ? a:path : l:path +endfunction + diff --git a/home-rc/dot-files/.vim/bundle/nerdtree/plugin/NERD_tree.vim b/home-rc/dot-files/.vim/bundle/nerdtree/plugin/NERD_tree.vim new file mode 100644 index 0000000..ef60cca --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree/plugin/NERD_tree.vim @@ -0,0 +1,234 @@ +" ============================================================================ +" File: NERD_tree.vim +" Maintainer: Martin Grenfell +" License: This program is free software. It comes without any warranty, +" to the extent permitted by applicable law. You can redistribute +" it and/or modify it under the terms of the Do What The Fuck You +" Want To Public License, Version 2, as published by Sam Hocevar. +" See http://sam.zoy.org/wtfpl/COPYING for more details. +" +" ============================================================================ +" +" SECTION: Script init stuff {{{1 +"============================================================ +scriptencoding utf-8 + +if exists('loaded_nerd_tree') + finish +endif +if v:version < 703 + echoerr "NERDTree: this plugin requires vim >= 7.3. DOWNLOAD IT! You'll thank me later!" + finish +endif +let loaded_nerd_tree = 1 + +"for line continuation - i.e dont want C in &cpoptions +let s:old_cpo = &cpoptions +set cpoptions&vim + +"SECTION: Initialize variable calls and other random constants {{{2 +let g:NERDTreeAutoCenter = get(g:, 'NERDTreeAutoCenter', 1) +let g:NERDTreeAutoCenterThreshold = get(g:, 'NERDTreeAutoCenterThreshold', 3) +let g:NERDTreeCaseSensitiveSort = get(g:, 'NERDTreeCaseSensitiveSort', 0) +let g:NERDTreeNaturalSort = get(g:, 'NERDTreeNaturalSort', 0) +let g:NERDTreeSortHiddenFirst = get(g:, 'NERDTreeSortHiddenFirst', 1) +let g:NERDTreeUseTCD = get(g:, 'NERDTreeUseTCD', 0) +let g:NERDTreeChDirMode = get(g:, 'NERDTreeChDirMode', 0) +let g:NERDTreeCreatePrefix = get(g:, 'NERDTreeCreatePrefix', 'silent') +let g:NERDTreeMinimalUI = get(g:, 'NERDTreeMinimalUI', 0) +let g:NERDTreeMinimalMenu = get(g:, 'NERDTreeMinimalMenu', 0) +let g:NERDTreeIgnore = get(g:, 'NERDTreeIgnore', ['\~$']) +let g:NERDTreeBookmarksFile = get(g:, 'NERDTreeBookmarksFile', expand('$HOME') . '/.NERDTreeBookmarks') +let g:NERDTreeBookmarksSort = get(g:, 'NERDTreeBookmarksSort', 1) +let g:NERDTreeHighlightCursorline = get(g:, 'NERDTreeHighlightCursorline', 1) +let g:NERDTreeHijackNetrw = get(g:, 'NERDTreeHijackNetrw', 1) +let g:NERDTreeMarkBookmarks = get(g:, 'NERDTreeMarkBookmarks', 1) +let g:NERDTreeMouseMode = get(g:, 'NERDTreeMouseMode', 1) +let g:NERDTreeNotificationThreshold = get(g:, 'NERDTreeNotificationThreshold', 100) +let g:NERDTreeQuitOnOpen = get(g:, 'NERDTreeQuitOnOpen', 0) +let g:NERDTreeRespectWildIgnore = get(g:, 'NERDTreeRespectWildIgnore', 0) +let g:NERDTreeShowBookmarks = get(g:, 'NERDTreeShowBookmarks', 0) +let g:NERDTreeShowFiles = get(g:, 'NERDTreeShowFiles', 1) +let g:NERDTreeShowHidden = get(g:, 'NERDTreeShowHidden', 0) +let g:NERDTreeShowLineNumbers = get(g:, 'NERDTreeShowLineNumbers', 0) +let g:NERDTreeSortDirs = get(g:, 'NERDTreeSortDirs', 1) + +if !nerdtree#runningWindows() && !nerdtree#runningCygwin() + let g:NERDTreeDirArrowExpandable = get(g:, 'NERDTreeDirArrowExpandable', '▸') + let g:NERDTreeDirArrowCollapsible = get(g:, 'NERDTreeDirArrowCollapsible', '▾') +else + let g:NERDTreeDirArrowExpandable = get(g:, 'NERDTreeDirArrowExpandable', '+') + let g:NERDTreeDirArrowCollapsible = get(g:, 'NERDTreeDirArrowCollapsible', '~') +endif + +let g:NERDTreeCascadeOpenSingleChildDir = get(g:, 'NERDTreeCascadeOpenSingleChildDir', 1) +let g:NERDTreeCascadeSingleChildDir = get(g:, 'NERDTreeCascadeSingleChildDir', 1) + +let g:NERDTreeSortOrder = get(g:, 'NERDTreeSortOrder', ['\/$', '*', '\.swp$', '\.bak$', '\~$']) +let g:NERDTreeOldSortOrder = [] + +let g:NERDTreeGlyphReadOnly = get(g:, 'NERDTreeGlyphReadOnly', 'RO') + +if has('conceal') + let g:NERDTreeNodeDelimiter = get(g:, 'NERDTreeNodeDelimiter', "\x07") +elseif (g:NERDTreeDirArrowExpandable ==# "\u00a0" || g:NERDTreeDirArrowCollapsible ==# "\u00a0") + let g:NERDTreeNodeDelimiter = get(g:, 'NERDTreeNodeDelimiter', "\u00b7") +else + let g:NERDTreeNodeDelimiter = get(g:, 'NERDTreeNodeDelimiter', "\u00a0") +endif + +"the exists() crap here is a hack to stop vim spazzing out when +"loading a session that was created with an open nerd tree. It spazzes +"because it doesnt store b:NERDTree(its a b: var, and its a hash) +let g:NERDTreeStatusline = get(g:, 'NERDTreeStatusline', "%{exists('b:NERDTree')?b:NERDTree.root.path.str():''}") + +let g:NERDTreeWinPos = get(g:, 'NERDTreeWinPos', 'left') +let g:NERDTreeWinSize = get(g:, 'NERDTreeWinSize', 31) + +"init the shell commands that will be used to copy nodes, and remove dir trees +"Note: the space after the command is important +if nerdtree#runningWindows() + let g:NERDTreeRemoveDirCmd = get(g:, 'NERDTreeRemoveDirCmd', 'rmdir /s /q ') + let g:NERDTreeCopyDirCmd = get(g:, 'NERDTreeCopyDirCmd', 'xcopy /s /e /i /y /q ') + let g:NERDTreeCopyFileCmd = get(g:, 'NERDTreeCopyFileCmd', 'copy /y ') +else + let g:NERDTreeRemoveDirCmd = get(g:, 'NERDTreeRemoveDirCmd', 'rm -rf ') + let g:NERDTreeCopyCmd = get(g:, 'NERDTreeCopyCmd', 'cp -r ') +endif + +"SECTION: Init variable calls for key mappings {{{2 +let g:NERDTreeMapCustomOpen = get(g:, 'NERDTreeMapCustomOpen', '') +let g:NERDTreeMapActivateNode = get(g:, 'NERDTreeMapActivateNode', 'o') +let g:NERDTreeMapChangeRoot = get(g:, 'NERDTreeMapChangeRoot', 'C') +let g:NERDTreeMapChdir = get(g:, 'NERDTreeMapChdir', 'cd') +let g:NERDTreeMapCloseChildren = get(g:, 'NERDTreeMapCloseChildren', 'X') +let g:NERDTreeMapCloseDir = get(g:, 'NERDTreeMapCloseDir', 'x') +let g:NERDTreeMapDeleteBookmark = get(g:, 'NERDTreeMapDeleteBookmark', 'D') +let g:NERDTreeMapMenu = get(g:, 'NERDTreeMapMenu', 'm') +let g:NERDTreeMapHelp = get(g:, 'NERDTreeMapHelp', '?') +let g:NERDTreeMapJumpFirstChild = get(g:, 'NERDTreeMapJumpFirstChild', 'K') +let g:NERDTreeMapJumpLastChild = get(g:, 'NERDTreeMapJumpLastChild', 'J') +let g:NERDTreeMapJumpNextSibling = get(g:, 'NERDTreeMapJumpNextSibling', '') +let g:NERDTreeMapJumpParent = get(g:, 'NERDTreeMapJumpParent', 'p') +let g:NERDTreeMapJumpPrevSibling = get(g:, 'NERDTreeMapJumpPrevSibling', '') +let g:NERDTreeMapJumpRoot = get(g:, 'NERDTreeMapJumpRoot', 'P') +let g:NERDTreeMapOpenExpl = get(g:, 'NERDTreeMapOpenExpl', 'e') +let g:NERDTreeMapOpenInTab = get(g:, 'NERDTreeMapOpenInTab', 't') +let g:NERDTreeMapOpenInTabSilent = get(g:, 'NERDTreeMapOpenInTabSilent', 'T') +let g:NERDTreeMapOpenRecursively = get(g:, 'NERDTreeMapOpenRecursively', 'O') +let g:NERDTreeMapOpenSplit = get(g:, 'NERDTreeMapOpenSplit', 'i') +let g:NERDTreeMapOpenVSplit = get(g:, 'NERDTreeMapOpenVSplit', 's') +let g:NERDTreeMapPreview = get(g:, 'NERDTreeMapPreview', 'g'.NERDTreeMapActivateNode) +let g:NERDTreeMapPreviewSplit = get(g:, 'NERDTreeMapPreviewSplit', 'g'.NERDTreeMapOpenSplit) +let g:NERDTreeMapPreviewVSplit = get(g:, 'NERDTreeMapPreviewVSplit', 'g'.NERDTreeMapOpenVSplit) +let g:NERDTreeMapQuit = get(g:, 'NERDTreeMapQuit', 'q') +let g:NERDTreeMapRefresh = get(g:, 'NERDTreeMapRefresh', 'r') +let g:NERDTreeMapRefreshRoot = get(g:, 'NERDTreeMapRefreshRoot', 'R') +let g:NERDTreeMapToggleBookmarks = get(g:, 'NERDTreeMapToggleBookmarks', 'B') +let g:NERDTreeMapToggleFiles = get(g:, 'NERDTreeMapToggleFiles', 'F') +let g:NERDTreeMapToggleFilters = get(g:, 'NERDTreeMapToggleFilters', 'f') +let g:NERDTreeMapToggleHidden = get(g:, 'NERDTreeMapToggleHidden', 'I') +let g:NERDTreeMapToggleZoom = get(g:, 'NERDTreeMapToggleZoom', 'A') +let g:NERDTreeMapUpdir = get(g:, 'NERDTreeMapUpdir', 'u') +let g:NERDTreeMapUpdirKeepOpen = get(g:, 'NERDTreeMapUpdirKeepOpen', 'U') +let g:NERDTreeMapCWD = get(g:, 'NERDTreeMapCWD', 'CD') +let g:NERDTreeMenuDown = get(g:, 'NERDTreeMenuDown', 'j') +let g:NERDTreeMenuUp = get(g:, 'NERDTreeMenuUp', 'k') + +"SECTION: Load class files{{{2 +call nerdtree#loadClassFiles() + +" SECTION: Commands {{{1 +"============================================================ +call nerdtree#ui_glue#setupCommands() + +" SECTION: Auto commands {{{1 +"============================================================ +augroup NERDTree + "Save the cursor position whenever we close the nerd tree + exec 'autocmd BufLeave,WinLeave '. g:NERDTreeCreator.BufNamePrefix() .'* if g:NERDTree.IsOpen() | call b:NERDTree.ui.saveScreenState() | endif' + + "disallow insert mode in the NERDTree + exec 'autocmd BufEnter,WinEnter '. g:NERDTreeCreator.BufNamePrefix() .'* stopinsert' +augroup END + +if g:NERDTreeHijackNetrw + augroup NERDTreeHijackNetrw + autocmd VimEnter * silent! autocmd! FileExplorer + au BufEnter,VimEnter * call nerdtree#checkForBrowse(expand('')) + augroup END +endif + +if g:NERDTreeChDirMode ==# 3 + augroup NERDTreeChDirOnTabSwitch + autocmd TabEnter * if g:NERDTree.ExistsForTab()|call g:NERDTree.ForCurrentTab().getRoot().path.changeToDir()|endif + augroup END +endif + +" SECTION: Public API {{{1 +"============================================================ +function! NERDTreeAddMenuItem(options) + call g:NERDTreeMenuItem.Create(a:options) +endfunction + +function! NERDTreeAddMenuSeparator(...) + let opts = a:0 ? a:1 : {} + call g:NERDTreeMenuItem.CreateSeparator(opts) +endfunction + +function! NERDTreeAddSubmenu(options) + return g:NERDTreeMenuItem.Create(a:options) +endfunction + +function! NERDTreeAddKeyMap(options) + call g:NERDTreeKeyMap.Create(a:options) +endfunction + +function! NERDTreeRender() + call nerdtree#renderView() +endfunction + +function! NERDTreeFocus() + if g:NERDTree.IsOpen() + call g:NERDTree.CursorToTreeWin(0) + else + call g:NERDTreeCreator.ToggleTabTree('') + endif +endfunction + +function! NERDTreeCWD() + + if empty(getcwd()) + call nerdtree#echoWarning('current directory does not exist') + return + endif + + try + let l:cwdPath = g:NERDTreePath.New(getcwd()) + catch /^NERDTree.InvalidArgumentsError/ + call nerdtree#echoWarning('current directory does not exist') + return + endtry + + call NERDTreeFocus() + + if b:NERDTree.root.path.equals(l:cwdPath) + return + endif + + let l:newRoot = g:NERDTreeFileNode.New(l:cwdPath, b:NERDTree) + call b:NERDTree.changeRoot(l:newRoot) + normal! ^ +endfunction + +function! NERDTreeAddPathFilter(callback) + call g:NERDTree.AddPathFilter(a:callback) +endfunction + +" SECTION: Post Source Actions {{{1 +call nerdtree#postSourceActions() + +"reset &cpoptions back to users setting +let &cpoptions = s:old_cpo + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/home-rc/dot-files/.vim/bundle/nerdtree/screenshot.png b/home-rc/dot-files/.vim/bundle/nerdtree/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..c410c5dbb648c394dc74b90393939aa0ea252bb2 GIT binary patch literal 87896 zcmZ6xby$;c_&%(3cc%!WQxPPmbVy5%93UtS5)wnCOFE<`N{C3e#H70$2^kyFjeRVOE5A-Q+&9=WE5is8L`c;D~c!xbXJ zxp(h=%Ge4Q_KW*IhU!Z9D#zG%u@`tw&vl;PyH}G$in7DUUK4w2nETwjN74Q7b-&-^ zo5Q_(cg312&tC>uAE4Jf*wi!sChotgx#eral@xcjeZbgeUD2OTWI*L+mR`J0M5EEv zNAp~BMP*t?ggjitq9nq+&@DbkVmp$ccESFachV%2{qF3lB;Ng%6UGmO6|27qBKj;3 zA`|8pT+oEvpKpV7<*8HnPSuS~YT^b36*=+J__*~{UKzjIG)iFxUZR2fchPp=!V9{9 z=v}?r%fmDPvs$WAz~%s7Eo!qY3j3+_Dc>EnW)8r#57Qlr(p!xyO(qiyB=Ptmd@01H zAU`G^lYCp?_Dw!AT5lYh4N8A-xv0vC3nDWIPk-=nXV1+jj#&Q4d_#X?JS+{Xt&Mpg zVOC2=p*|2YF0~`zD&ua`b*K3FF`6KO7O8%t<3~cMA|L7S?1YX&LC&9KoTDpr%eN`m ze=7Q+I{I#|OJzU79H44O5?z222)-jH@9M1KU+8Kl@33&SJHE;;urt(Go z(299$jE7&)^}O5g>A6E`wU}|tL;1+?sAA8Z#aJU}Xdn=(=xoZ|$az{Sj`6Mm+BM?p zuB+RH9_p=km5l^kO(Ea@H13)k?>iC&NL-C=C4!T6U=R-!m zJPCYgCmbV@L6z1`MOf7S4r2Mxk(s?Z-MB6CW5K{<@MCpe_&v_paX{xD#lL4^LyYo+ zt9lq42{tv~@4+!pZ8B8Ad0Ei4oHcu9Y9t)#Q9|kLU2Z%ekggo3e&OoEK>*g$6G3T9 zC(``e{H@Xn>y{R%IQsj`_v4fS%E@bZ+8(ce+3P(gGp7e75FIdutAEvq)BuSskyc}2 ztL#bQf=OPi`}bZxQdti}2cM5ai-^KVe^_bdu02K2Em4cf(s20mw?L(24#*iAmjezZ zzDnWzI2-tdU2l52Qp-!~hv2VyR$k>+vqDShN-y^S@}U>SX0265qkNfC#h#eO>FCvE z0^!K;5-b9>rEa`Q%&VN0F?4;PZ^9dlj4-*_-91skKXfMO%#`1Mw+T_BwA!t53$@em zlw_jNF){@}vAC(vGvb(Y6B2HIpPGfvdr5t%#)h>2Ks_g*GB`}%pVMO$z;vep`d-YN;H&S}4uym77tGH{fgc_IC&PRMn ze-eAuE~%D#HHZi|Z97)$1=jHQv#St?L>ggiEX7L2O<9)eMva(AKeY={kz#S!ZS)T= zc1OAm`FnUVrPU$bq^N+wuvZL?KIS#+`2WKSkPvmk4K-8OxAU0~)DH3zJC@8ytS%PZ zLrHw9c)eTWgXlyXt&=y>vjbk5Dk&!`==K{TyXKQFgX;LqNC-#ARy6iuWxuSrK2YD{ zgZQ;~cf?cEQF)!*OsL8f=;LaD#^{R=ObF?ZKjwmEjcz~$dT$hg$qHpDat?W%T4Q-X zhRnmbViMEnj*F=Sv<7;Q@&BcFnS7*SoBm%OmB4TIJw|3rG9p(#eY%rTExOMnJ&iH| z@-?U}oBb)4AQJ4R@P(3W1&*V07I>dVo`U*5Vj{X2vwE8tiWIRsx!Q1pqrLta%NIK~ zoa+K?l7Lcu=TL^$8v|@~{-csfqZpgLF2sX~ko4{;Bjit3X}u3NS+j{Utt|b6aolbz zZ+$xZI_qqIeZ<|eGmaT_Ow+;VF=X>@WwQQ9wnIh>Rh&%1=3j}-Bbi^edVygu}AQbP1*dr_tdC)G}TE!A+pBMU^eN)Of;6S z1b~snNfUwPuQqiHE5O^$Es#!-W4e3Bz-8Gb&Z0p2G%w%o;xu^;RKdEJSh?u^9McD3 zyBWOFGvthyyfH2 z0f#c`O_ao@qV}lx39A6JBsTRa_5KH*|DqE}!W<=ia7)Yl>Kuih3%h_G+zxs`;JSO$ zdOfR6dYF&RA`Xm*+qF9mg5fpKIx*AsHQfOP8`~Yz|CI82SmB)y%!Sv~gaI({U3g`` zU9$$^`N-YEGnXeugsaIk3W9&_zJ+JYEVB+a!$dvU>~LbeY&aJ1YJK{2uvj!o$ozUD zX_wT`=WLtH5qbw?^4?B5XD@)QmxP`9Q;4W`d+v&hD+cm3X?GDqQ{Dx@MKU1p_vQX$fmy+8Z9G>NDJ-dI~LH zkRebNc^qk5e{USEK8;xze@(IdwDcPF_XhuM+gQVa4|_>zvQ{uvi}d8#)m93kf0_`g z$BCNUC$#H%kZT*0o7f|m$*JQAsu73^z!a4bbJw;&8YGcAh1x+0ExThO=P7B7ZcJXj zdYw1jo^@3hQ6H_iU`Ftyta$%gsQ9)tFwJrN1Vzp=#~GEoiE6*gFkyNt?qcc_6ScOi z@Ch@zD4K8N#QVyfphC8eXQ^a;=Nz9&zjo(6GBVa{AUCk!%7W=Eg(*u*VV%1?RpsF0 zHRTiKve4d-ysa(!gU7S*)w75ud27jghKo4n>csn z%fRK%bt_71dGSmjWZGd(8a+BX z{-t7lYK^y?ciC!ci;^PA1MPZnXC166SmIY6!Fn~FedX>_E%B8JyOL(jF&kkJI*={n z4*jU)>x4Y;i0{s9>BjXYJZZj3G3`P5G-q&Q$7^fajt1Ux_#adD01nCZX}?R(cUnU> zN1qn`oX>9Yw-a1xLopqY`n$#;{A_zUF-|-ThD~zuTKVZ+j+7nE23i`W85yRtLNjht zgT~t>4M(H9PNkiP#-SR2J|&7hh%no$n{ZRO8#(!UraM;F?xn3{Nk1lRm0_b7(92>9 zswk47eV~!i2;u9=2qo>(L7U7} zVkymMN|G%TI+46A{LAq7+$r?~Y~?i7KfCqshPCM{0Pb$jo;`Bg-tMRD zs&1_=wmg_>Z$ey|ylJwyy+f`;gM8`-pg=dC`y0EA?G2x*H;2}~?wZ;LLq1{@;LCy49csIxMZw_UAz=IX`4M54)WZ4=?zjzfas8}`5Q~J_aoStj zKFqIo)ywPZIxA#4@#4Uf#pTZ8U3v2GpB>){e&%hg}_xf#`>48= zR|!+R^3Z`~LBV008&sM4x6tsC8x(!fmuSMmr=d=IqZhq4g(nz0N zcY#*E__Y|>M63DxmxE9ak7I(0P*?4mSfxnUC957$@zwZKq^K?jj)`MSP9t2)RD!>- z=c)Z`t;R~-c!iIMBa_m)me`uvDt@D;rxGbFs&%NV z_;0k`#@mzn)V}?1_fEIQK@=5Tq<4N5?`1ZA zsa7YwZKZ@o8#}^pSD9X8;qTXs@kAd2&rHfM#*ZB@i5?$pACE}GmZk;Go`xQ|FV@(p z=nRFz-YezC{ygLvInGg7uoWQux18G!-O{}Q=7qP2kA8{jus4k6SMOfso|d}tMohTk z$P9n9#6alfMpd;0{P|DA% z@zx~Hzi$|QITGQhd<82jYvpTP@5T;Ez89udyC=wB1;d_BT~6)Nt>v3fI%>b z2WI1%Ff-yHkaCf0^aqvE2o2zPh1;oZMfW7)ci*oPxGmFK2-3;0JB|DKi?*g=L8+Gf z1Vt=|)Q;Zr?P_>qIOH$zMKk3mKpVt`qsNTTwXJ)P8ByNUtbK>tZ?xN(Jk=6V$+48W zX?)*;qB=8ybDRW;z|iB+Eg@oW1MOtv9*?wTv=PZNH(x*imEdKQ8ondFdyygrHTa1Y zZwB@}4Hg=Az=ga>ch5EIS%W$;?q6~}w3^htn@GkvpUcD9K0YWMf{Huj{^RuxXei{J z4xiXZ;I!}JD`fN%9(o#MH>N+KTlS>9qI0ZbCH4L6Jfm-t`nXMB(f40fx-T1m(_yJ^ zPbKCdn(_^9h8otvl7a;>35s*ioa?Hrh_LE!^bX^#Cl|zhbxS+?lyNTAFWZn8{1x`F zb{2#W=gq|}8Kkd`D3p&h;2~ws!I{U{`f*`Xp|ub*fe0p>Cmxo#+4iW{9D`O|UTn4V zkF6zUTu)(g9d7?y@HjNRalz<%D06P2oTKxtYFp^i>9%YY(w!1=;xZ+axC^bqPd!Y@ zgYluiJvM`1gJdc$u11l++e6kWc7IS5I7LK#JSJVd?k0aM3e6V4qv9_7&G}^gO1lG% zCyV1AB>}VRnQb=C6hGi)lJXXtUO=avN9I2b<@?J(3BBxoLu%*@Uely=PV|a`A0@-9 z_uLx;9B79>F_CVkbqFuevEzX_)#d&88u1pXd2c;`qj@`nNf)bA*fQy0c{IgUZh4V}wFmWTJ^;+J(jhol!}rGl_k#Fuo{#r>|hPWL=YfjDO$ISi&y&E`E+?X9hV&W{K0cq;Kg=Oll^8DV09D|tK+HM?5~^U)u@kj zNw`IxD(hu}y0dKqg?q~$}q$;Yuq@A%IA4jB3{ zLQ=&9C-nCB+R^W(<8De|&-atGwdSo3D4UG8N`hX&-WvhnVkt%FO&YIfEYV`T2Jxv0 zGwcq1eD|*@0|6wbKcnlqY@t%RAqtJ8nc}g)K{yAkn_W_&BHqD|*Vf+#YI^!fXd1JK zfA$uoyNXN>dNKa1dKkA7Bp?v58{J4sD%vNyB3E>fGp_YHv0Wl7)P-+LWk`=LP5y68 z1^8=~+xhe4e6H0S4Z-xE-MrRAu%O?$#iJqe1W{HTo-2LjR+;>yX7Hgbny^#>2_g#| z#}EzkYkk&WB)w8pvL8S{I?~HNu~V(cmN2jTz2lo^uT)_skeau%)%Wv7-eQ10UgN;u zo7qTW(P)TFAXyW^m%&^cE(ap!2Ae|X6N^pm`SYue+`TPK`>?FgbYI?*d+fRn&JsA( z4s3bUyaNg^u5N)mKk5P7?tdyS$JQv5PCl;%18EFt=WvN%r+%l&P6VtHlx_3|ezx6@ zlT)t2TlK6me$Q{{cxRX^H1O2c&r9xBy^0fcbfKJ7Y9-%D02NDe9_Sr7RUaG6^mD1M zF$OEj%73)d9yz0p?un5Y7%dSbS0$IXL`cD%nTnsqgmcDlrPQWZ;1I;nGw`-0vGYDp zUaKc{`D;GhlhA{#N4y@LqKj%s*BPK1pST!I#9W12FNJV%*3=|m9K@cH^Au@*FX-Vn z>_5xQb(jQ2nen;CU5+bBNKtXMe)0o&UUfH7J1p1{V}G}l@oVGApO^P@Jn(7nuPUP+ zTcJ!BP)K%msnF1>n((Tb{H`e(f|!IO@1<8?qFgMYcz`DjbnQVj60bNWbON5KG-lN3 zUg@Mv)?d-G5k`6G$l2FpGXsaplWQ%GA=1>C+{x47>f}7iI*b7Qc>hijy?+6 zLR`%A7LoA5zGv?3#Vk7&={oc7X~T9lH`6jo=byvQm^jQnBso*e;SN?$`x4V-ls~3+ zXgagFBG7)o>?fQ4OvK|=4*P;>Bgd*jMvv`vPZ>O1+&&3Oc67zZkEUkIYgwmu^KGeHyPvj6_y(9>NYX!FLB8!u^t`m@r_+8jW&C zB5+xzf_9pn zWF9y(nZjX^dEnMh^8rmE8v4lcM3an5=L_IuU;P%=_LtCHNzYPvEmV0;^A9BWHnoz& zp8(bS5zPZmaP58M&&WvyU|C=}yCY^M_!br+IrvQ>wr0UV@Mvusk+Pakw_!r$QYEIv zLtsC(g>_&&G$1R7qTq?iue+iVvkm3aZhXJq?sw&ID7&BYt^fVmhnuiL$G>*m6~Q?z z@Zsfai#Ewx?OImmEt=-}XUEoW*9Alek0Joc$-KKi@!sggOvvqaKEec{_TC3=S;PUV z-=vdJ^@s4Ymp}Y?{6J;pJ>P17&&!sI8=rb5C+~t^OG;&w$=S&2m^hKJL7kP9F4ht`TuESmam>pw#oMeJAR zgg`dG_#pOP0uKx!0x>BnKiTkN6V@sgjBi62mew9Bn?IcO-`47T3utAV!&Oh*#{iir zmNK3Jr&OAio48h6xOEZ@YrKE#JA*e0>>E&T{Q52$XXafXP?2f0r_&JgoBp2=)ya zYLRNC2v5fS6r_Kjl_0gSB%EMq#Uc~@)sL?ysAa~` z6UO*^4vm_Ahujd*mEgT6Lf>6_nEHjFKw&e{nn)|gai+UL-)9A5C5DjSh{LglEJc^dw>v7l!B z6%n)K|AC9XeA%c?%1}t~(osQSKhw;`*%QqDa!w7&iNwjb_KqDJZPX9_16T`>x0G|4 z3}8&qTPwkV(!TA{kUgZ^z_#iORAvOqUrFQsn+IGvhD~@&{{7Asjja4{Y;)gnt1NQR z_X*>zG*SSHY_PF9b;D!!GsD3u90g!P(f3|JUox({+}U}r;SCRgO9UDIf2+d&lK`Y> zkJAy2{S*DBqvj*?A<61Coe^|U)7ZO>)BSiCY&+N5zZ~3OOx4uUY8OS8KVb*-sI*$K z%(2LyyAPzsW2b&=p)T4rhaHa$d)p~BfnSdA2s|LLr>dxIMPykneRZcYI6j7_kaQ=4 z?-_0iG`c@}O%01hc4-v-`pC=DN9Xp(A;r*)a=EuT6&8D1G9xI}x3;0(V4k|7+)CrT z_ALEj;6lxo)9dycn?qGMV)-D8C)Kr~pII&~ zIFd-m|p| z?RXDd5OvZ^wmTm&@&A<_3ILVA7Yv@0Q+URM!W*6 z8GnSd34`1vWxWcZ=MBYOtmxt0%}3}~E6MF*{F?G-LF?;{=+GmP+N^=BUr*&wz4|9T zY6-&jSoWsrVH$Zv89GQJb!r*pG!=A}1h1N470M5d?}O&wxR!|Xs>*xc#!@8#6xkcQ zXte{D0v2j}q))Joi{r~bPy=GWgrv)@v;@Kb1Al)#$73GvaVt0ouVMbbe#?o>5TLu_B5i z0i=EcRJP|0Zcj-N@2&`wyOUCaFkhzZd)$3$TK4evz{gy-y9zNI|Ccnu#43lJu#OY? zdkfhO6+a@?>lSF3`b+sSB#DPgt!@HZ1E1H^n3QsgtccrcFCse;g>ycr1y|VwSg0Q7F~%3-OVz*g)0XGTK^xT=+E^O<#o>ee#_9=(R1AUXAt@6XEp_ zSpw)Xd-ymo0Eb;*=G$A9)92rtNo5Fv@^DNdv%{bEYjkpCC`1wEp`SA}rhfdtf>4VW zS7O&(NVp!N%(Kc(_}#;I08OGG+|b#Axl-bB@WjSkBW+Xr!MVxLXd##`!B+2IfTX|ku zjo2urus1=`iE?}zQU0V4lq?n4S8+JqSHib=ygtJhnA%SK1Z!KEk7&$-S?vbfTgJR3 zeVvc<`bQ54#rb$0stL8OKqDfJ3GtYfBZ-lf-QB&jxfj1z{59CPjdA=F3Wiy^Wa{zY zP0J@ytU~cE*ouy`?(BKTvgM0>TO)P_`Hs@A#9K-q316kAvOVO+Eii~*j&W`kQaxWP z680Dt;PKaKdj@0I-0XPaboWixeq+NVB4bzDea(n77KZi%t3$&Gf>Y-T(|*3>rMAbd zbPYbGXAE~Ft0lG)I%winG*bu;$jxw^ zvkwabi80tS(M?iiy)WV2VQJ*h0O%3oS)%bI@2RIrdTFN0bYxQ)K_(}RB?4k?tTJ}d zV0XJ3@4r%)nTd&o_!gr=^qR;9b$MuntF1IJmYmVFCVP2!t8WT9qh%z7aEAhSUp@-0 zJs#lG+q(1Uc}B*?bBdj}tb(Fmpe+}t0boTLZyvg$H8z=3;-L(bCUY7bNh^{HlX*y- z2Z%|^)&t6QJx%J*477Pq@P zVj17^u|qFqJD)|R%ZnX~x*fHai+tgw2=I13_`RNlL)l1&H#9NKE{o8z$%~($CA-1Y zqTDfSA+9s-4`)2oPd?3z-OM5}^`ZZzzRT8m_EQaOvxnA(otYo-ID3ZO9q2(d^<@sU zfoht9i-CR;yNX%2u4H7b@_&A+-lzQ@$0|}4duyudFLI{%9{I^ijOW+w~ z#*f_xP<_<@Ya%+i^}S0}h=pJ@ZGytODG{^MWy5N~{j)zL$Ds{2CU#Bhex-}wpKx}o z-oeJ{;@5_TT=&hGygJ0aIk;LARnYpbA8n?K(=}fhqAyG>9@Gf;wzR*0`RuHv9{Be` z@A%eoi><$E%grY^V@nIf7du+c>h3r%^@&(0vr@P$E1>&9cDUn?C8aG&JS+o_&Iz zC5>TPiXcQt=&VAS4;{B|l>f$uCGrH*4x(AjpLrAu2o~nI$aOyzhgs&vZjE|a>|EG7X6JPIir*_f369qMwZHQ@QV_juUFVzoNq z^ZP|OBdA7&6|^CAQFVOq?OrAWP$??rloMJ*|BX(ZDSr_ks7TB#dbxF@LuP;lU$?Fa zN-;+^d$Dt%H@!!X9d)XbDIUeyUYRnt_SXYfzFf&zkl3-;W9p7DK>NtdY&y#qzYl%4 z4jA!BEgFF(Tj{#7|xc|_rq3kqu3f4C>u4Z=Vnm# zZ)r8%#?H7Qn&nHbjzf&ZM&g#ih9;)-Vq!0lG@{oUDQQfuvVx(a*2AbCvP{Iix8=Bq z0m5th<5lRv{g-IVlrw-1Ndg^>Ku{x+i$EKZUd;0jqSW|3yibokb?VfBA7b${j~)HB z)ZJI2V@5_#qBi>vr;%~wqYI(X(|2l&)+ti+4c`U;qQ$zdZs55b8s$oeq}yceW^lEN zpqF0(v-Eh<8X3D?@`NM2CHBiVa&RSh*Z%xo&qT;|Ko;d`|0*@5)1#&8BX#VS&ysQ_ z8Z;ptD?m8T7qyKS5+?oyV8pO7>gfXB;?}|KQrioUb_9-fiIc~a<20b582Rq^wZ=1q zOS1Qc5UcBlaCX)&F6LLLrj^9R8kEl3dS?N=!32n;SA-4U^cr=3}tVFyU zet$V(NpU*`9i#r@jtF`P7@~s_>cQTJ!TCT2EY#fcW|x%WCLNufN(KK4M%!oQlK#zgmiARv*+R(g(zZe03` zjeHB=Vt35ov=|tnOx6fy-ay=Y^|?V&|2st5WMLzWjGR5rru+%OSKel?i0$Y0C-a2g zESc5_2Z7gsSKIMW4VzpOv4{hy|Ds@qB6^(=j1aoC^YDBcdx<5-uAu{B51L1KJmESq z>)Qq`MasGlyyp$SLxdp?F*_$4b&KmfOGXwbBIbwxJt3+Cxz)FtxZcA0O^$KV6}iTV zc_;en*E)<2%;aZ^1&>}W`zV?{2Ct!!;MDV;}ZBE!>#>{iV6%;*)S`_uhF%=(CXhjK!E zbpPGSd6xRP6%4EMwSmX}l%eSJbJ$t8`cj`YNR7TuZzPQJT z(InL)GyLUHhA#}l98PLmjOe4N?v64XO)vlUWNHL3gwx5GYn8ROwb&d$SF&bdsGG@9 z#XvLde~t;da)tjQZnWyyp;zw%1MI4vNb^}6Lq)YpLWCI#ZZg=P(asq!;vSQA(toFR ze|a_xs7S~JHt6|I7v*GKMk5`iz>3_7#A;CkoN?{8T?R4q#KQ#33+DR`y|Mm^nLn4W zN5|)+83C^j^EJ&g{^XM_2&%E&5Xm4jmX2Q&SCUu7Z}xSOi1nvN(nE@F!uUoh~ph# z%OO_=Btz}1V;mNC^--HR-kpqXPjiOdKkFiHQ2~aR5ycZx6ulm9XZCbtmT<#+FFpTI z!8abcU-WWsR@WD+DrNHb(b$m0=@_DJa)8XTZ_vnPa%F8g0TBp$%6{{CG$)rFC1*R; z6q6>RHNXj2GMVn^>TP8_?F@w37=KqZ6o#<5ejsDqJmUAC^RYPh@BWNP0h4`;nfUv;`>Ljex1RA+ckOq&o1Lm@B*ZKY^T8jPPf43?k;9J`Ut0|F^irm5;it{Ru z*M2tnv!#+Y#CDgr>>MiU+FmWI5E)Pdnr8e%%$dL8&2nb{Mo@r^i_ogqWP9fdr?uGz zv21x7RMStD_#GUjq~S;Zf9-@YBtlZH6&}6BZV_~|&Qs9W$z89+)C5kOp>K$eSOA^L zoyeEeBSn57*Tsb^`!d3EGOS3-_p`>Em$IsCG*J;R$F=0+K_O)PefFtVjAFhm&Bolr z-pXxB#PnTXl7!RHIRP+Xu?efgT(XM*%v)NJXE}_74{v7t;wn({w#*drL96%L`g$_9+9Jz&1DQT3(3#BE^YP+Mt`_?gIJ135Y)kl$8&p z<`517WxdMNTds2yI>>*w3>IJj+5tk&AFA&E)+Z`1x;BfZgQ-tjoKzcwC!9%9C&v)c z;UZ+@F`l*nM9{wm*+TeIk0X?;iAR8^HvQHBMR9TKl?srkHMY-7YO<2|rUeTYHrtqM zIV_WUSL@?O6V0L3qC?RqK@|+e9@+mDF|v$6)WAXJs-dr{IpWM7ud(#6a+aVt5^D4M znrl$2=4&dKG262P~B13l5oF&(%UPD6Ox7==8^701B%h`E#;CR;H>REUk^f)X< z2m-K=iwap>UcQn~8gx6LlXj5Y(MJ`1xf{v&*~+R(`&hvK$h?aVT&?mv17LU=B6^saru8zEk`$RUNyvts(p&W`p_IT)mVX~!pzSWxL3{5d&ZzGSEXZD8B z0>x{INPC%DI<7-{;-u}-DY0leqSK+d{I_VP#e-G*&Ml4l{r{JC0*32zu}sMKS8LB! z_1p?txE(DKFneTLyB3Fzkj|zqQAPxPDA8Lg>V|nb}8amTRwAdmaW zMhr$eKV)4%0G{Y<>4BY^3QlPAi`*~u$V0)KQ?x!>jcE=|^qLH7YFNJ3B75(17bwh? z+>95zxeWx_do|Fpd*gr{>7V2=i76sLdxbHT(o-d&di+;L>}q4h?Aw@P%mbY!GZfZX2ozOM4%dUa{XZ0= z8+)IPgpATWyT=c!1@V;CtYx?H$S&VopjeK_yz}-{6HqI zWS7tGa?#xW>0?Bk(!P9XK*@t`?3dl{{-HMQx<_cX#G)!}aS{du>$6VkaB=orWq}bO zGxK_*AL-tQ#%tZ|QR(&DRUJHt7z4s)e7z>MfoD4>JNONxbn@nX_o=b&;14Y)^Z|sB zppf4PHdgmrX=`F{Df(#sGB))eTV}M+-bx*k$L?1YsR+te!B!N2ypcnz<6si)bxCx!Aa>k~J=I@$q1^ zl*4s25I$Bb{is0vBZF;iziQ%{8!Aqh_c)3~9fZNww`J6ndUP;xo(PEcr5smL97XT= z6MqurHVv7#jFt==jZwv>^5$9=v5SLnzAxK-O-Cp=SKDjxa2>X%o+1f2Z{ne!q5Cs? z8TD=?iXOrcuy%@%<19JBIt*}^Pc=pGzfiMRiCgQ6Qw;2^O+U#^OSV#p{t2B~D`MIB zI<@@?Y`+ts&+UEiCz)2}Lb)@(moi-av*^{~Td7W5aBcB=jtPD-Jd0fQ`M|UFB)$K) zl>d)@mgrytWo_%^1wVSY$ZWMk#5(4^FS^~xStnUr;M@CWDRVY}72 z6LA8+(`HqYz00V?ox~})`T*7BdjIxEO>@f4I8H8Q!u@|@%Gg`=lK3$97dx*hYO{ZP zefmr@cRZHaqu%1`c;(HgwTX-Om@1OVykk}NixjwPE@786ci*(#?Nj!1)L)Bb?RnTw zoh2HEImx@PW&--3{BAx7AIM+i?z5zc4l7bGdI`ou>7>g3?BZsKzk~It1UW^eIqTIR ziG@ms1Ld2+mnoSw+_k~}rvs&xZN!`{V~E|0iInHg@hk61AQp%dFm%i&G zseQL{UG?s1^1tqmia z`5~34bTYv(F8ZEiQc}ejb#(Qc1$^_~?%a+UCZ9b%tm%WpmG~izPT@ba5OugO-h&6d zB3hd}Z(G>@#ImJtB_b0@{(w$XDlx*I&q$^!k)Os?20zop zu^K)n$we4+ZG1|#WBh!tR^>Z}0VcknBE$eB)5v~jTehkAlZz#g#|%XT^g;$>G~=W-5olildIl?qbLUP;5X**vrMkihB6^!d0_x0bA zZ>gt)d6b@gJ^DHIsN8X|-lj%X=!@ILxp8YPZ=>5WO|_!Zt>2h1B!~fne8Df`5kW@u zpSt;AOODc0{B+gjRk8F)o<0=QK4}Y_52$Er5<#bWs@>YH&EOLRj)^;PNi6H5<%`<%0P}|g_azqMigf@{mLI_Jxp)$u27MLU z9x}%m17XOAT)R4vBl1>;7SoGDQW9%n$mQd`JywfLTheMo>q8(xA6bu0Bp@fPJ*B z%ut^u1jJzd&eK=HvI~&#VEXxUUiu9L^C4eDnK$;S0Vgk`Pmj%?RuCND_~y71DWHaLK9e?AS)shFH?=))-W_j!S#v88&S5jjXyuk zAI0>O1`0bG30o9$g0sZ?ji)^%N03s$S!^-o2C=l4X;H_dX+4 zH~ESqnvIj;SD0c(D(=@wHfJ!68hVKZ7Q<_un)weG&qb(Z7Ubj02An6<&~N$ih>s@o zI2pM7;)o;FH$pnoPMM>iLS4mnu)V{Y<8yEQ?%6qUI;A78_^DDZp1m|9;N4QY5#mf)mu+HI?G$K(TAg5F{P2UG zvt6TiWPXCpQ#m1tOeTg8+@n@(pp;-hc=c>+4TE8K<4JI?5FG> z#q;n;au;@XsO)QtpT|L2ug?Ik7c~)N*e2DP$ulk6qe7Wizn94A;yJmx@&6N2M?}!+ zxgFLYU|V@7na7J8#%^tkf9&rDxgP6vU)F3rGed<_v zdi6l|tp!vP4=`bLD-*ZRQ-Nk21478Wn-&8CbJT$NWF=DJ-9c$}2AnU74w#{$yv&k? zLwDR++eA2z)5ic?7)|O;BBQpNM_bwy7Ewv5>Y|C5W&dlt>=YwgK8@z~Gr+JIH@xbm zkr+D1{~u`&44EXClnq+^r|oezjbtE^Tx~~S0pKi_`5M+zqTO5JH~tjkc#TJ8lt=qT zkyj5pFgFm89(Mwnu4E%$$uzWBpEe{P)*bIpWU8JVFLyu7zXY__*&uI(*ykOx&cg@G zIB#0AF8$Ocrl+3BT)_o(%=s zizSqi+qE*N`jkU7FP-{6%%Ip2~4woR-b5nHaz8 z_MH2QP43+1a_q79VF&#WbdyQ1Kz1$#x%{rvj8a=mzS>XN4CAVe@iwt%FaI6w=oMtF zv~E4|f6zxDLch;gWb3Tyd97idI$QnZ8~kQAwY~MF@ok(&!K9Hp`9S~8ZQk!MtwNhG zZgBo#g8++?#7QeecYKGHQYA7!dm5VG*dLC9pJtZzy?mUUm1Z@yAwkD6{x)ClH=%s% zdM>jL);D#i+00!XjHArLEBN$$YeBB$5DLPda z%`Q|8?}T4T(4(e+R)PMi9v8H}yTQ)Cz3?Vv`7EKVdM%io1cZ+J8bBr!y)2QnO?CR5 zjLnnm@@YI2r)4pSVc=b#{j=cPagC*JPUzvcGY2r^#8IM>LL(G+7yqBg{5Mt7h=X2w zd-}GSxL89bT*~*w^}>5@espA_|uqpRCoc!|?E^8)Jlo;+jyI;NAx z0AzQ42!ui3fsB_@(~@5a2tXbvx_kACy}MT@6c26uIR|grA!K=xofqV|Pck5B@)}HynXmx@+)fqp; zP@AmmFCe4Gxvk9bG9~Y3#q3i?oXrnB6ZjC1#lHRS%|l;~=I7W0GZuUzjVyA^-Z%&c zk5n;8g?POvK|SP4_~v)AxWoVnu+ziXme%zkE=>#eSEi{hcDbRK0mfhz8UGSwuO06Y zG?+lD>4|6fRXs?qgq{_2KiKtzb)X>Pe@k|ze0VemrP&8?|Di^%j;eRaNMsjo2F7H4 zZ?jKpgTLD2@2qLmOJ%HnVe211zpyeh&hD?&(%zMvW}Ou2`WC{BvgEFD@`w7QQh)z0 zy%4U19M9rPBKI6m3_wu&*LLB+Wl3wF0m`HI^ zNuFJ(b71izyoJ|opi<8Ub+p#{#OLTRgVG}w9Us)>-pVit3_gYp?+u-^0&mr=@;?={ zgkldZ&AdEOry|@=Ya(Qa^G#L<816y9^%VID5*2eyN0Q&zetwW($kh1evB&uF_4KDd zUlG}Y6G(MX)AyPHnlg)M-d^V0E)&GamhI({fI>mLKB_<=B;fpH*GbQVQ11A_dK4%w z>8VCDwwq7mbL^D&dm?VHt&&F-m`-lEu(K>4Q zhCtQiMP#;@Fkq!GT(AgyHX62 z8a}?f#dbw+U(Ld;-ho7~?}}~3^%skkBfgB|3(#1+TAhB#Vn4IkiyZ+)0Oi}!`&Zt8 zlYbM6CJC-Q$faE3JpAhXvbS52z9W?QFy5x^<>qol-W;gZl5f(l6RI`OW?1#ml9GnD zYJBn$s@8cW>AR1f(RC7!U;{MFb@0rUXPlLXd8e7Lbw{l?G`E zsS%_@x?`l9LApn}a~NWVnf-3Of9IU%`Ml@Ze-58v_FikRYhBkju0Ct( z5G{2B6GbW8ZJZ?!_-#$DQ7(b*fFs6>zkIqp7kWC$e}>S|pN9sS0!5;2=))SshFMfofLnhmm(Z($H2sMTvd`T81w zb~dZ08t|kirdGK+^t%-Pn(av(`^%SbKC&2F9u{l+TrtSRQN3I=GMj|7lH1i5d<0%c zf|IynwR@|($K_vBDxM9hvPeq_oH)!@KG2>LDV|JfzxWlUE!u_3!6VKOFG8m-F%_*7f#wqDA@NK!Zc(gZ6m`T((fllu&UAYiu+zUULL(5um zIIZUhlr;U(ow?VwRQz>m;)qoMTea|yrPE5ALD~_r$v1VRCRWVxr-_4V|19VbogiTg zc(2@mg&eIers2CX1WlS)T`&a3yB14UBt=Hc?lM={en#_etGH0k?DpN0&K#L6k-D)G zI{`gqh0ncU#v8n&C_&bD%DX+Sc<<&q7nuEUy3$6}4ri|HE|`X)2+8#1i6DB(Zn_f^ zl3Jsg$<_KXeactw+)p51oxt#g&{KZI;7;pyM6qn_LoG|ZLHgsEP?9&$5QoJof^Q~e zDPBeBpR+tz04UrVMZBS$+IkI0Y}Jc^a|UDB3L3!l6>pG|()bCxfV9mu>k>B2r#0?d zTJ%%Nsc30N*U-5He&aVUOrEm$6*&x!u1AKBtxKtl!6<_XMqX_B2A&G*E@7v43);7ON67 zq;Ax-OmnDDL=DYY!BxH-c|Jd^gfkxmL{t6RLU}AagHH#us7G3#V84sryL68N>Qc{D zr~wp3RXMB@8!z;8KwOuj->RztndH_rc8Tf=gfmH1{cB^@rfY{^Al2(ymEnaLIc9v@ zxnl9S<-l3gk=l;zM$$tDjq6JlA$;Y_UAE5b34vw0Om9YMiEo^Lf_&>RbNHhu(Z=;Q ze_sAiMV-6evAOFnK~@qU`Giu`I-Q$F={Exj5A7-21=q{olE^&V2oFFvk%B5y6AH8Vps6QeCbD90ic0Ru>p%pd{*dE|LRN4v^!3d+6i4&U3xs2MVRph zC$Uu1o4^jf)R+Yv;!R!&xb9_dT*j2#`R+3czUww&Et@7j%%^TA{(9=L{cknTsA8JL z|K6Ie&MH1khBH2``Q8FU(1syGVDmQ_qxP)G}yoxN2v$0%JHcs5)WPL(G29{*Vm^arUoiIJF5d`<5Cy#heC}ASz<@vz$5rN;F$d<%+0VDmBTs3Vd zjBHY}IBGdHq9*nY?Jl7zGJ_X*h=Dg>QXp9>{rX-(Ju+7xZa$riiW=zh`^gn{Rw?5Y zyHsN{f~1}z2k*%{!gv#w2`l5vtG?@Y*Go`Tru_lE*Fe{Iu`iRMQOYUP6>BCVFm^B& zUp3l5sgiBntI^fHy6+(+dL!vt70Jyy``ADLeA zA@&(DTb2-h6f8*~n}`+iCzrX#s(B1Hm!ty!Sd2(}VfVk0dZ^bq#Ap>Rp8wgP_Y=1i^6WpZf==uO@gW#w@U)v_iGcMRoaX=4s$fX(|!U{2b;oBd3|Bx z`k{-sc=h8RkbJpU5zihFo%5X_?BC6@b+M1IHm#%Px+oy)I5B`l4K*fZOndPYpgc)$ zU=c1YNkc~Bp&ox$TPY@SxV;gCD?zF}C_X*)@H0RsFD$i6w6bM16Vj3lB)3(;U-A8+ zh#!G97e9X+aRpDxIxnoEky%RX`>{$ZhlSU=C%AqfJUfRlx1NKR0Anb2|IAuw^x{=! zyLu6}UrKL6*aDs?SmVPjUe_!YS3Nqsmmk<|oQ6eBb#x@BUF1ve12-Y7mP1r|d&_HH zzmi5XVdK(%12c|Awr1`dd`>aRqoW9H8tP&rSGZVQR#?vD#1TZ52ge+2`1;>vL)Q%0 z1=atZrbpm3UG5EjceL-RyKr{Y!r+p^aBmxYS3#Pp_q&@#ByH zzug3L&J(P5_MBRJ1Zz3{7EDn9aVP+3JdBZmK=9`X!utLx;=BZ~RoCRtJ5*)~;BCE6A1oiTLbvRyilXU?*4&_a~3;kfLml#+)qDwHVrxXh* zeRqJQzZoNP4(9cHX^hYhyY;*R^Ji9H5GM`6&S$~7HCAU^xwa~`&L~E=&jVVYEj`(P zHhV}^$dz`*&D@u9X?PuS4go#4{6U{SWfTtmAXFuYavvc*l!6Hzuflgo_rxoZ(AT#r z#A_vs)7myuCy~`YC;JQIP%)asCITJ@+{K+Z5f0ZExD4Q8SvSkoc9%_#>&|OjdT73FlWu&P7-H{ESIOgFKr{J(Z9b=54AGL zFN0P|10dI`==pVioz@~k%e#e=QB;G~v72>BQfQPmfl}b^n-STy`v$oVuABb&bp7!c z{CEd`WKyZ`Ki-9X=17)z$FKyY-_WW($VVg{li?`>g00sWWgCUd-!l70SAMuir-x(o zT;4(+P55(9A>awe7?goORpiXN8WST)C4d9fS2bPiy}1X7hMzr1Bi-N=$F)Nc@vbCv zF%FuVnyx?mH!Y!b$<4C(_=jy-TLFl& z#1b!_g|maJ^93!_<6YAp=&BBMNfpQZ*<@F>{zc=N?DiLV$mC~Y5Hsx6Iqf*ZY0YiH z+bx1eF=kLdStZC+H6cyELn2gY_d%-sY0bw)_JglIH#gVe!^%K2IfX3LqgA&6R=XiL z#_O`@SjCY$*VK>)+e!&9Ke{`V+`&bp0WAWOy}xnF94hbJcVN0Npqj$mR(}FF{Lq&h z=r<|J=Sa;@-Z9a?xfcoT`Y8_nX2lWu%sQz}X>HT>Mt;^$0_Lhm6kV%tD!4o25Te(= zI$0lq1*Q_!ril=kmElRjXrn}g508U{9#k4ps$~MG_4BbDbAU0dSwj~n;uH6n&7a;;slS^{VtKH5oLzC* z{LiCrm-X<&Z^UF<3AvjOuQ0xYFY>zhXvnr(5dg{;U=~&forcP}fgovXKqCZdd2yIu zpuNrTwcUU*;r&5KyU&L`kmFUe&@YZ^r+beX$47`AkPvE&otQ(bYa1IfI>q+vhZ7$A znt_7z&rvqW_7|IyRdpgu17wi8Ql0cQ+hE^_u5-~u@sm!m3hljanHsomWCo)(CG_++ zI#H04f6@@~r3tKAs`6;OrCsbQ6T&8_TV080oZS4g z>QzdhgZd921|>F`PD&cJM{6ho*M1}7M=boZ*=3OOHJ=Sb3ykP+n2stB&Zv;pP^RWx zkxQWf*Avb#k^7}dI+@z^X))I3ov0rQ@pBOdudK1H1;-5V;q0=dG^5*&V|BD6VNtUu zQ9(X*9PfD!H5!C}PCKF184?-p)5B9Te<;~WIi&9@8QLoao)`D79*+&IDWqdV?`NLs zwFu*)jN%x}RMcCKTuNmYpWq}Q<=Ak!T~bkdw%*;*76 z7O(PM8#gI+m6n_tCW)2&MzHd#4`KU}Lm(mLd9al9)x3&amiPh99l8F7xMp+C%jxev zetKD2QK?2nbM~d(yQcW3%>!Xm2kmZ=2|V9SHgm8n>oa2Mf;;>2w+4^hBvNueDuux1 zs)%~cq{`@1a=9qqcXwExkv=73t10;@UD7wg`Oqh!Uuc&{OYhGElTcYM?J3PfH)=KF zjY}v%Sk4#E?j7?I@gy@ZB;=V*Q8@{la0Ws6>er}?Jx{ev4qKD5J?BI)Bs?#sZZP;ss*{@aDZ+WveL>eDaI1zr`nV8NV8`gbKv41>RWqrWw z^v5L>d$N3yM-W7cukT&2X!_DC0aanfOEly;5$J3^J_VmDEUI!g7A2P#^WC;%Jc{^A zqubLG&NUzXtzi@Fcd*;PnNkpqnD2=7&8}44!uRb>kI=t^*~27v5#FwE&Ucy%q)T3Y zu&?t~h?T715L&2s3iSF6TX5kU1?5`&pd!uOK*1iWbEZ-RDc*JG&^gSi*_wVs*{1*& z?1o8OlWxH6HN(8gXeUAkOt|oa4*K5bbx6(h1TsFUap2M37sFRW1;4&V&@b%Owe!ZKksZ`ut5*Rw%rlPdDYjzBdzkP7wJ!+Zys!R79H(GzlG@Mr~q-9prt} zH<}b|#o*1~JyM6pAv5xK&DgDHt(NES$JEwM`mS)Prl6yw=_(-y+DuW)96?N>;r-xa zMVIb-#SdH9W#hu`OZ!dKEBesQ3KkxIqKe8mLIQ=$leUIkn2-lQx7T9jZWM#*T?xB_w*ubTg!XN)# zW5^#*65=Rj?^+U1Bfi{sJKEdd=;ee*<(M4kNIhQ*bn^G@FbMv6j+ZdSrPuz7%Qaco z+Pw)mVQ6HIrAuVO#=CReDvj23n{&r_Ig>F*P3>-hy?xgB%ocG#YBL#oz)>KWVugCM zt)bS^^y3+c^qVI=VW@|dFy%)!@f!APnhMN#G*gPyLh+Y87#sr413HcUDn@VJ$BG^w z3ZDRHM}50MIM~RsQg#fFPXW75r6B3g!`QGh9`(l`lpIhudf}*d^COk!>PF63&I$kU zlnE0;oWu1dNJP zDiSS~%~-D`*g7x| zX_bJ2nWzjHMB4(9q!AY5)zStitbOK~IAUX!$4*;*%V8KO2=fejpQT`sz6R#dh=2)2pYvNeW&A zd%o^F%*>PC*sE~mv9;bQDqok`7^;cMTCjZfqqjMxv-N5 zyKEOe@5zIq&oupIy}>+|_1&jJ#p%qmNA=u6+HD_qn4D~O@@f>y+eB!p3aShxT;D#> zW=?Scs9}ZQs`)bJRL`nZiEUzKq<|x#J8Aj~XPjbSwFz#%E&sl?KfqF5N$V&RmZ3g& zi>)Dik6!V{-y%IezJrmUmkBL6!#N@FQs=<%XdqNKUESN8)9bVKYSXbRJ-_h-S;Q#-o?)zO$F|u1H&<06mZp;1Vq->cjrLwWsn&;7qdn&8O~=v(wY4VEppo#^IuuIQ`E*XnNlcFaB{ z1L91Iy;Yu8ziWa)UlOxPJln%S8yEbUy^cNQ90kSf4QSt{@H#`OCFUKoxG4korxL#1 zw$Yw$d~Lf4wnNf$a`0Ci5rFyq)2_b4CpxH-PgvOup*lNU>glM9)4I_llV$4Q?cga9 zSxB8Mok2bt*Oe^vlYE`V9^au=+qvjwUIOtpa`Pq=YbU?uP)n%GM-LPqQi-s&DM3-d zg5%1&IHtfqOE;Hy?YzT46l{8E9pk#1Vv>KY`CtU&6au;e0W+{pdrjl)T#Q|wdR-_ z8!O>pH(^337Cvn+(|5tIfG=w4M0(Twwww7*ft^7qmNRC*Y=U#%uDjj}$_ce%wz$4wC%qeaBkYPVHNP)@R<|>`D@%5_2s4%}&ce zFGP}~gz*aofEU`F%&N(KpoShb(MhWwD1c`DUV$#)D|~FJOUS)_r?>7mz2W}p;OZ;8 zW;tf$J%tH9M|uLhkd|uHZ%@%@vD>=a4UA|1x$S?m&;JcYEhX$sc`&#gIbBzm?puZJ zv4gsl*sV3=F+e^4ExjBun_QPW3XpOZ;M`|vZH9L@6)HX2(a9uC`EaA!z~COxtnhJ2 zz9HTZO#38f#t}{fl8V&;u4Y6aoCNRfcmC_gQl^7|^xeWS#rahbw{0Va!$joh|5oUi z{#NM!Z`h(i`~tR^shjYecCzu3)2Z;Ba3To`Xjn%kqDe|F6*GI$VQ)j7T@^#3U~4tm zzQxN*L6v}(1fEpjdfG0$A6ysX$0z%cxxR&TzD{fPWlPst<`nlX%_0u|R?KCnv23;Y)SP7=dUf zQkwmVkL)F|PX(?H_&`sW1+=LgMu4!}6Opayn+8@69v6^F<;VqO;vf7!kV(fSu+>hQ zZVP#Eh;_WOPoh2N&QDp(k^+K*Vpy&J7>k!(a1ha zVL<_NQrT^L=_GqDgQrwmBL{}%9&XJM{)s;+1;k84Po5=LKYAv;iiuRVPmf)0IpjhB zTD{^36Yp23o*vEjY5|+*tMkt!j|8e6sP0tk?H3{1CGU>#v3{FjJ91Uj@1Z%fv;mR- z?kPtc{W{H)7aL9ld z^6-{523i?_JGnX~le_yr<_ELGxba#pzVm(czY?j1)%RV5z4gAn*y*XmG1|?GG&VSI zrHTqMUdex6$3dNx?Z((AR9p2XdLawTGV*^7fcE1(zqQ2g#Z%Z8NP6CUkK)ABQWbwegKgVbW>#3Y- zVju}57pdCn!+RlD-HYA3QHz6B&^`55FOQhJ@0i1=P!Ae_5A$;c>UMa%?G#3tc#8e# zH4rX(YpnPejZlw2Nbe+S4;4=mI#w;pcHS=f?zFhXs*g3x3v>uIbnWC+i-4?S8cLWq z{XJEBDnWtq#?hXE#5Xxd#~)wODaJFrU{)sI))-%t7TZ*{TB#cG0=Tko@<95+P4Phnip z;W|y#_$z!cdrj8o2+k#D@*k6#7_JYa-sh5rjm;15%Er)6dQu`k;u=nl+ z;%Eg({hcd5cK^my&F0;V{;7BH{80?`)K5VJz+N^x1=Shi}S>tU8)-kSdQnFxyNxoj+-^ zI_A-ynj5DlVUzfEOA>e=_W;ZSH_Ov18w`f-iIJo=Q7>cK65L_q%m6+@k{f$M6Oft21VtXw+%#I zboTQ6?eRawRp`A_zhL1yLLDr+u)p}w8WdVY7#|@Kq@k`7lOCRz8~Z{_0`J05)iZgc zP_{+@RDVit>$gl!e3FW7Lc0oFpRWrD(ZJw^UTnf0uN>}s2?L!S&1Ww%Nun-OmrLe@b8IrMCR&L}I*2Etfk}Ns@ zSz*$@GwDH~`0U`D2mAgU805zant%lQ*zhrY?(oc6f-n_c`g?F?x=?WbF=H1S4PFc9 zuV){UPYRo7rpb zPld6buzGV2S6X2c(V;fQ4lT|4iN`Rno$F^1p~|jz=gI1YjNCo}VVwaD;ou(eg>Zpb zPNp<1;i|8SzS9ReGCg26@Y5bs(6!WtpGQc>-ScVmYd1BjhnFY5JTsaGFlqE)lI=Te z$GT*^ z)Ka2OK(^a`T?1GI&mUROs%rd1@Hv(WJ2v5e-}Iq6TkgZWn~>PL?S5hs(Pl~0D&CcQ z0s^mt2)vm|K|eFfO(6%|f5VI5qxBhrN-$n2k&Ww>xL2>l7Dg^P2H${1-W+ zc%;KrpYECDoOQp?aAn$w0`Zg-Sne{UKr>wys~&})+|~JY3==q@@ZJ1D&VHOPx|p0@ zysK4G%wis!gmhf@H&Fz1bY|B%gVizxe2|mJ0!e6@te;>)7Ceg*sMa^h*_$tzMugah z2$7wb^khd624CVS@fFgUJazq6Jm%)0j&URh*Bk!QnI*HpXa6Ua!H(c-NJ{l!Gcj8O zku+c*0}p0s{^8>7i}|$#^cN zsij^R4rg*cgQ+poHS;BaeaYKc1IPrL*5M+O&N7xgO-ej6)x9}j-5yC^@sBCNu~Iy= zy1w(o=W>5bTGMgg{LEjxHYbA6aRPgLcF(1D-~?7&mIw*7`6|C=87hW~SK9;TJ;?w0 z&Oanc;@LD&hVOHrfqN&?Em>_ejhr}?pAYX~s~Mdx6ZSu)fkS!iH`F_IoYUj{+i7S4 zvllKAhTjwb?ovIt?R)AN6>XN=g+=*SlDrT>YW%7eJP=wi}b8sA=-HP z%y~CU982U_^tC@?h&I#9If$qd7GtG~5C3r0Dhx}tq@a6EFty>H2)EhqE^N4C3z0h$ zaNVM|-E)dw^13&fi24@0V7WXV$&!mHJCOB()*PYy1m|q$>ItMpon9)uVsLXUdfD!w z-(4rL>3r535Jm2{xv(Ff-@dZvtdk(|#gO$e9?ta5#Fsij*nV7^K|Hzo)v59V)^Zne z!w8_}Gp?NVn5+olTPVp?nk+)LO>4b2pYm3S> z*1-(aEHP-{+f=AX>Z)BSg*2qwyN+*p{tOi5DYeRH)Pz(T?z@~Oz)Mp;a^qdUETo|# zI^sktNzW%+1>3z@RP7iO#y?$!Lx}IKVJl!;i$4fnHCzFMUDFfBs@H}=?F0R3G34QD zwxWfyKA6$FPmcleZQAsR=hKhhdJ|1d;xo4WCp0&s?3o^kKrDw8+t#tI<(=*Fe)B9~aB3 zntNu`TM+$b-lG0h?3D{~7roRb*i6GMTNY?Fq@0?S8|)6jT925Q-zSO9t)fvYHZC*T z3$8QqVZ_rM^xg2uxX`1R{y`((y!{K(x?ciGtp7_4W`TE_)Jr?=>@F>J2fJs3rwq&) zrr0>qJT|PHfPxhL6|xA=rN9!zu%92p^Vj$OurBycXt9VaMl~FSETul(g4la7t!ZR7 z5i;ERk*7D>%Cae*T^`{Dzbpor{gI z?eQU4f6R6=X&IAoyrJXh6rCvHuRXX0ru?)s4&C;37WcrNNY)N3`@YnsgUGSAh7LVt zIPB3RGOu~mGu0E}XTI7Gb^_jdx_#{VF5q$s(sn<_=ZWTLChG{K-_iNX4@Y_ibkq6> z!PP2hsnVIl1lM7j?lKgty9(s^{9sZ`UdrZYy2txa|f3+MXAC;$Wslz7p;z*XZi zP67qes1_9-HqqU*GuYi#zT$9%j5u2?b63n`=bvDxj75+obq_XIP2G93o3@7_Go zh!&R-Y57NAZy-A&B}`r{bedyQ!p2-enFjg8QOiqz?Lu#~+t>VI!Lh1aF;;2%P{Qq- z`Zr%aBj&==T!H1tE*pPQhv^sF%m+CpYZWuTZn!#^_9fochhbb^bWyoU2#oXJLQT~l z75JmKQ;p=#y-jK0_JeTqaXu9TrZXXRMm&21`~^GF;ArHlf<=MYd&ULKuS7tfC&=>r z7o8*c8ZT#ZD(!OO+%uci7Se63fOmQvdFFL`r#r(YD#C%>~bsqFL0dOIj`Z=Mlk?T`v{J$}rDhNOrbt zaJRW9>!H4px|ivYbjDnrmv-#nfnTJ8V35aN$g|t%GRa@s^%;c?8)(AI@(-nwMXoKn zTky|kQUCIMrFM^+#fwYKj#haqPp*NeNHppr4ZTroo~D=r>c5?*+vKHT`dflPR+@w41>Keb{)->^;4`PYfZehMI2s9 zzish-qTwY;?(xvOAzF9d+c~_$U*ebHckKz@| zy1|tyvW3N9W9-Uv1W(4McZfY&l6si_0_-R_a(W%@9XFe`NFHfV6mxl9#(z7=g4Htk zFUjZRc@eaO(yFmFjh~33bo)KW8RD=#ORpq7eGZREBS(U_XEI!amn9CA$ z!Tm%K$U_S9!@(WR=`Z7hQoGP9QIh^Aj|>EvvaB>h207`oay8U~s?_VwndTysKXDNc z$+Y=`0t!6*rg!igay@r^35Ec4Kn8ClDpOX58YNnK+tBR42`Bf)ZyywR_R36)MmE5~ zhdCAi*&s$zM>y_5 zgv4&K7zJI?9)Iw=^6r=mH}3t?r{z+~2aZo$4eip5)EMy%RN{@n8bcheLb9Xx=cjg* z0QWBzb|v+Kr(nyM$okIg(iL1l6jwy&1S3RjSG1?%-j2u#PSBDlOex6vghclwZX#}9Fh{?m!sGg}2+ThY;uFYyu|&Lh6* zn#9C!gaV&mKYm+)Q7?0CMuF|$iydFbr`UVmaX&h@I;kf`x8gi(KJ?LCccXFLVxB_g zJo%X{?%N`4uK~2@W)6f~6mWGOGc3Dv^yX%~D~#|E_fG8*WGL{_X96y<@!-%USI?8dogt5o(PQ>;2k>)n-!1H1qcORqVaH zP+@jqbz#qBL01_lyUvDz2TRV3^CuDKi_YTTN>*e38I$L{HJUxG$r$(G-NE!TZTn)w z8%0r_m%Y1(!~W@sD$P#-}!r|Hwq5xY`})yPj)w2 zINKRnk!%irc3DTWmzkneQ=p0qxJv0)UF?-pi4S}zrmRteeual+1P5t$Hs4Pmu>1-u z8r#iBd!hr*nN%KOfxmx9`E^?fht-E9^9fSg=7*u}Pz-kn664-t+4n z5%E5DR@exWfU|)foDD7_r{>>jcZJu z!PT~x0pT8gUS*Vew2rf|r0|1dNkI@ig3hZL0}JIYi3;P?PN5O*RyhatB+9FSBwQ z^V5^@(Cj2V|Ln=mlBoT}Ui!D*XTuk<{`Rz@+uE_FtvN{`UUxs<5dZp~Sz~0H(LFH^ zORRNN%WfY_g%peOXSsM&-)TSSC?bOb=809&lVv3AA618+AC#a*7&Ic+-^dx^z4t_p zIDQxWxvCl_eOAf#eiUJS0waTi4f`V)Xpa0tJ|PdcZIpGg&%zPB6{-u9=~7KQ&3Pkr zzAIrLZ$ln(lx996gc@>^c*&8jB(+11gyA*dYqB0yGJ zj}lThgx3KW`L^ml`MBU>?>pxnW<(dyB`&klZ-r$Q6vL(jlYAd^r7}gK(k81AkWJKn zuejmVk3%f3fY8Qy|~(pNk^f7-7-xK z$N10-r;){foJRlo+Rl*^D%fwN*>_Y4q>g?s>nI&cAZ+bO44O;Zz)T=T7ROJwlSiKMi3U z#-ynGp-H5_6z#^Ts=K`!W+RGusm#atK29jo=TNzOKYs)oLI1sQ$OydUA2;v+5D2+e zO%Kf|ClKM$+;5|ltCWE-Z1CIP4@+Q@;B=(XepwKrHjo-6WQpJ4oYEhH z&IPJagQyGW8`uaZ$ef$jB>r;2k8}!*VRb3~HFc?k5)|Z#n#RDv2k)>U5yU{jVf@1V zf6Wo`zf&s@Dgk@%$qj(AU+d3w3f;hXQDJQmtQK_28`9RhQC1OdE5KxzmZVbc&e;0XdO+}qx?b71SpZjO z{@=!_8{UYfGEdFjw%&|57ttW-6Xs$d>+HfueA362Wx4JBU7I<?p|4vx2D~byLX(-SH0-UMl1V&8qI7OMhoQuR?54*4smq)48G=EzoAr&PDs^) zdImhtc(6;$C{Ve`C0^i->Cz~5n6B%g+>4TC;DE0e$zWz3m`5trn1wr6wWn)tqrcP%0^TalS&AKDf0q-XapQ&^y}iOX@QL?1r^PwXA_s1D?3qdz0c)cLIU zni*Vj!#;smMig7!N|1N$?2PK%4Q%3uY~9ZAhq2VQG?Sxybv21iKuXFNT50keLZXTx z-G0)mNY>xQ`!6&pTBk+c&a$nWc=WadvnBTs{qhE2C`}e;W2>k}0 zG!5EcFoocHuW#RihrHa1pr1#g!kXsS$EEjM6DPu`U(ecr>r9V=O1pM6hM?+Y1l_^*7hK+n zHX}K6rK;{yQX3|Dg?jccLO;Ye8eTg%v(5v))f-&~dmcdK)BtXmNj}idLF202r3fx~ z-;5>#IeX}vJ^jtCi*PLS4@gD-bu;v>Z=l{?!prSzfTQG234%6%YaG45dGHeYLVJA^ z{BU#xAvggbRqv)+U|U<|3nx3Vpc)o;;;4N3w%YA4`zvi+izsu4Ip}{;PxB9$&}tyJ zPN-k+uLKW+N^rJM9>WwWn%%M7x`T&4fM*7T-l>TP?Lx$0fwH+_(ueU;6gU-UqI!US zQ;3NvQy@iFES+7y9_6qdT}$dyA~E+U~c@ow4Y6tC+05H zS0=kGiNf7_3G}m|z}E-V!byl2=mKv9VD+BuGx>W-xKs!TJhxUU7)p4H1%=a z=AY96^pbgaL3VY?a0j=Ao<4@kda_Xep+o4Cum~R=v=_*K17O)I$A@%X z(cXscFEDp{4yq@UGbQj1_&nRYKYoUe&~}iV z^O{IcqXruH+Z6f01#uW;2i$Avk_V4xO@~DJ_FuSGR79~JHZZ>{Ck`*Uy%QpD$*F>m zFq2=a{FXCK01bswKzxEURmFzW3by-`(sIkIoI zY|lQVtVM_)c+KFRewmGAb;ImU+T#cJ!2h>7@(P#OC@>Fv%}g7;@P97w{x=(%fD-&8f$fwFTp|)7o2cJyOJovEf1?gBXg;{|H41s* zkb20C*=v}fSTT=ekv{UlnzCuOvMr^aYM-w8tN5)SSV}i@OF|bsCOCldB`5mmwJ2lg z>5tZ&$c!0Z<-B|tX-AC7ucN@g&;)p}l$EP;aL@ry+P)T5eDuIsjp}m`XIFed%Dg&f zYlP6s&3B!(BI4|(rPsH{V^YzZ*jN3JUt{XF557JUZ0jK=xg+%$?=6`&hgG;ydd_7Z zn;jA{k<#N2QDyd#ypz2OOzL`Mq!S|en9w>#v+v6vEVaJquiZG(7H|?b z`Xmds{NSzelTc{5R<(UpAzd6UdUn71`oRK&`6}I1!L8l53aLK!Pen>#{J|gsu%wik z!c>uBHNhxzWow#$V^$tW zMJ94K_RHh@e5hw6e29!5q7o-0bF0Mgq{mcnb$77Mpq)=L=ix&Z|6QH|t#;m<2CH#d z#na%8ClHv$LkIUnb)K(f^IbOgPmX&qo_TGyC4&;IGN`zLkMc2JLwrga_u&WoEO)UW@Y~7+&_&8R z3PdJZCn?^_nC6tBb$l#9Vzgy4#6WY)OLgFQrRwJ0ku<`}p}?}u$US)loW;%3(bSP?gEz^a_qnF6&jz{bt;m-U(#Gd~){~phaeIh?U z_uwk#JXwY7<(T3SG*y|iciEMV$d(5!mvUt%omLZee!ofI?p}TPr7KG3)bQ4YakME4 z_xBz(SiJxulJ=27%A-4`Pbdp8$kY4Pn|ae}7L+941aXIi*R-@`1RYYN^H8~vU})^* zxkI{$gA19)Osr&@Yxf9tvXU0J$qz>R@ldg}^NiI~c-gQ8obXVFey+Ec;T}c7J>|w6 zYKd{b_FK=t#}sglLsjj{4sx2~7Yc)Dgg%fhTxS1@+;g_MNffO-*G`rtF2tm#Z&WdRP1Gk1Vf)=(OX>N zg?U5jaYouK&j;2E^XrQ!&?y@U@2pmuz@AJmo=r5?dE^zsT;t}S%ba{H@&bP|n*S4F zqunpldJh(#$RDamjAqK`b= zfI{3&p)(uH(c;lyAMFkG#GYIfP}Pd?8N~ZOERlERn~}ha0_)Bt@-0+) z;6>^_aDnozLq7j^!u09CKjnhJFLYa4WQM@dV1+8|Or)quYaZu)4Rq*=(ybv`4&6I1 zqLI#qB+R*&4O*FJOkr+?1ii8}FyDqwtyjdZv8m<68c?f%Bo#A%8D@VDR8-K7V&aeZq(hSTkI7hWub zA4;lt3Bj64Th)Yh6JeJ&Ji9B80Q|CKk7)+{|1b}03A>&kSwpAce3t8_KYZ@XL81)$aMk-col8d+R!4%q z1q>V*5TW%BtN29?ajbR1@Pe>!LVogI4_n}nko!O^y|zJ;!=Y)9vxn1a< zkUKb5B0X>P3C$ZmD%#_n20B#N1Hlfs|iLb>@v~#%7r8G2P5K6rC#cTSPaGriSvz zv)^4=s@vJc8h)n_M}H&!5yc=v@66t7ik zvdS`89($YTxdrxH%m`*rD6cb9i?o2-D)3ru+XG zd(W_@*6!VRxe!rNQBgq<5J6Z9h@f;xlp-J{N>y5<2+~!gmn@YcB3+8K(5ry-PDH6v zf^b)E1h4FYI^o@EreREh9YUt@VM|3Gn*zmPP!2NJ(xIu$Auv`S66?GJ{QAXHK%X3F z-%OWjZ+9{k~px!-1KQ4znIEC z5JbOD@K>&$elQ(1nSIrJXH$hk=^$u0UL4pK0sJV>BaDReq)yZVXv*#W5oE2- zdBl)6ef!@a}ixJzq8@cb}mYvEgp|n@_!Sb0s?bNtn+K*@$Ffze6wnh>i$rFI&JSQOv7>Q zO?K1lu}Tj24}mZ?Qvm7?yRbk#e1e&@jdio$%mx{i!0pg95(28LPbFY?4&oMCHLI>} zyZto+NumXvVa6(w4-;(gSXDLCk-{-F8Z zKC@2F8KEM7z0jRIrDu9p0{3NL#O}I=&hiqPp`AtDP6zL$K6+U3NJ6F^vgt<_Pe*CN zUq>_DMvTO?6@?R~x6TzDVdyeRIcr3$jKeUL3xD*h)bXDpwQ3rwvZFCgr#Iv_|9(Rp z^zVlcF#W%E{{Of7Hv-vbUcyyHG>lWlh5fg913o4r9+ZY!(ADg?MJwWvEIqOb~k_7x}ygY^^07l$=(VRr#`tI@X#{Et<8@g zmZSZSWY1u{ne*mnpwY4KUqk3Ld>roFd&0f@P{1~&g)c{f=PRYR&P@BUY}LMuLr;(( zs;Ze(6Z$$(zk3u~;%lvK&gr�OkEM>-if5oLqld#XMc7@CEE>NzgY860qx#tdl$~ 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
  • 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 F{67l|-0c7W literal 0 HcmV?d00001 diff --git a/home-rc/dot-files/.vim/bundle/nerdtree/syntax/nerdtree.vim b/home-rc/dot-files/.vim/bundle/nerdtree/syntax/nerdtree.vim new file mode 100644 index 0000000..c4197ee --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/nerdtree/syntax/nerdtree.vim @@ -0,0 +1,97 @@ +let s:tree_up_dir_line = '.. (up a dir)' +syn match NERDTreeIgnore #\~# +exec 'syn match NERDTreeIgnore #\['.g:NERDTreeGlyphReadOnly.'\]#' + +"highlighting for the .. (up dir) line at the top of the tree +execute "syn match NERDTreeUp #\\V". s:tree_up_dir_line .'#' + +"quickhelp syntax elements +syn match NERDTreeHelpKey #" \{1,2\}[^ ]*:#ms=s+2,me=e-1 +syn match NERDTreeHelpKey #" \{1,2\}[^ ]*,#ms=s+2,me=e-1 +syn match NERDTreeHelpTitle #" .*\~$#ms=s+2,me=e-1 +syn match NERDTreeToggleOn #(on)#ms=s+1,he=e-1 +syn match NERDTreeToggleOff #(off)#ms=e-3,me=e-1 +syn match NERDTreeHelpCommand #" :.\{-}\>#hs=s+3 +syn match NERDTreeHelp #^".*# contains=NERDTreeHelpKey,NERDTreeHelpTitle,NERDTreeIgnore,NERDTreeToggleOff,NERDTreeToggleOn,NERDTreeHelpCommand + +"highlighting for sym links +syn match NERDTreeLinkTarget #->.*# containedin=NERDTreeDir,NERDTreeFile +syn match NERDTreeLinkFile #.* ->#me=e-3 containedin=NERDTreeFile +syn match NERDTreeLinkDir #.*/ ->#me=e-3 containedin=NERDTreeDir + +"highlighting to conceal the delimiter around the file/dir name +if has('conceal') + exec 'syn match NERDTreeNodeDelimiters #\%d' . char2nr(g:NERDTreeNodeDelimiter) . '# conceal containedin=ALL' + setlocal conceallevel=2 concealcursor=nvic +else + exec 'syn match NERDTreeNodeDelimiters #\%d' . char2nr(g:NERDTreeNodeDelimiter) . '# containedin=ALL' + hi! link NERDTreeNodeDelimiters Ignore +endif + +"highlighing for directory nodes and file nodes +syn match NERDTreeDirSlash #/# containedin=NERDTreeDir + +if g:NERDTreeDirArrowExpandable !=# '' + exec 'syn match NERDTreeClosable #' . escape(g:NERDTreeDirArrowCollapsible, '~') . '\ze .*/# containedin=NERDTreeDir,NERDTreeFile' + exec 'syn match NERDTreeOpenable #' . escape(g:NERDTreeDirArrowExpandable, '~') . '\ze .*/# containedin=NERDTreeDir,NERDTreeFile' + let s:dirArrows = escape(g:NERDTreeDirArrowCollapsible, '~]\-').escape(g:NERDTreeDirArrowExpandable, '~]\-') + exec 'syn match NERDTreeDir #[^'.s:dirArrows.' ].*/#' + exec 'syn match NERDTreeExecFile #^.*'.g:NERDTreeNodeDelimiter.'\*\($\| \)# contains=NERDTreeRO,NERDTreeBookmarkName' + exec 'syn match NERDTreeFile #^[^"\.'.s:dirArrows.'] *[^'.s:dirArrows.']*# contains=NERDTreeLink,NERDTreeRO,NERDTreeBookmarkName,NERDTreeExecFile' +else + exec 'syn match NERDTreeDir #[^'.g:NERDTreeNodeDelimiter.']\{-}/\ze\($\|'.g:NERDTreeNodeDelimiter.'\)#' + exec 'syn match NERDTreeExecFile #[^'.g:NERDTreeNodeDelimiter.']\{-}'.g:NERDTreeNodeDelimiter.'\*\($\| \)# contains=NERDTreeRO,NERDTreeBookmarkName' + exec 'syn match NERDTreeFile #^.*'.g:NERDTreeNodeDelimiter.'.*[^\/]\($\|'.g:NERDTreeNodeDelimiter.'.*\)# contains=NERDTreeLink,NERDTreeRO,NERDTreeBookmarkName,NERDTreeExecFile' +endif + +"highlighting for readonly files +exec 'syn match NERDTreeRO #.*'.g:NERDTreeNodeDelimiter.'\zs.*\ze'.g:NERDTreeNodeDelimiter.'.*\['.g:NERDTreeGlyphReadOnly.'\]# contains=NERDTreeIgnore,NERDTreeBookmarkName,NERDTreeFile' + +exec 'syn match NERDTreeFlags #\[[^\]]*\]\ze'.g:NERDTreeNodeDelimiter.'# containedin=NERDTreeFile,NERDTreeExecFile,NERDTreeLinkFile,NERDTreeRO,NERDTreeDir' + +syn match NERDTreeCWD #^[# +syn match NERDTreeBookmarksHeader #^>-\+Bookmarks-\+$# contains=NERDTreeBookmarksLeader +syn match NERDTreeBookmarkName #^>.\{-} #he=e-1 contains=NERDTreeBookmarksLeader +syn match NERDTreeBookmark #^>.*$# contains=NERDTreeBookmarksLeader,NERDTreeBookmarkName,NERDTreeBookmarksHeader + +hi def link NERDTreePart Special +hi def link NERDTreePartFile Type +hi def link NERDTreeExecFile Title +hi def link NERDTreeDirSlash Identifier + +hi def link NERDTreeBookmarksHeader statement +hi def link NERDTreeBookmarksLeader ignore +hi def link NERDTreeBookmarkName Identifier +hi def link NERDTreeBookmark normal + +hi def link NERDTreeHelp String +hi def link NERDTreeHelpKey Identifier +hi def link NERDTreeHelpCommand Identifier +hi def link NERDTreeHelpTitle Macro +hi def link NERDTreeToggleOn Question +hi def link NERDTreeToggleOff WarningMsg + +hi def link NERDTreeLinkTarget Type +hi def link NERDTreeLinkFile Macro +hi def link NERDTreeLinkDir Macro + +hi def link NERDTreeDir Directory +hi def link NERDTreeUp Directory +hi def link NERDTreeFile Normal +hi def link NERDTreeCWD Statement +hi def link NERDTreeOpenable Directory +hi def link NERDTreeClosable Directory +hi def link NERDTreeIgnore ignore +hi def link NERDTreeRO WarningMsg +hi def link NERDTreeBookmark Statement +hi def link NERDTreeFlags Number + +hi def link NERDTreeCurrentNode Search + +hi NERDTreeFile ctermbg=NONE guibg=NONE diff --git a/home-rc/dot-files/.vim/bundle/undotree/.gitignore b/home-rc/dot-files/.vim/bundle/undotree/.gitignore new file mode 100644 index 0000000..926ccaa --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/undotree/.gitignore @@ -0,0 +1 @@ +doc/tags diff --git a/home-rc/dot-files/.vim/bundle/undotree/README.md b/home-rc/dot-files/.vim/bundle/undotree/README.md new file mode 100644 index 0000000..52fd674 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/undotree/README.md @@ -0,0 +1,110 @@ +### [Project on Vim.org](http://www.vim.org/scripts/script.php?script_id=4177) + +[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/mbbill/undotree?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) + +### Screenshot + +![](doc/_static/undotree.png) + +### Table of Contents + + + +- [Description](#description) +- [Download and Install](#download-and-install) +- [Usage](#usage) + - [Configuration](#configuration) + - [Debug](#debug) +- [License](#license) +- [Author](#author) + + + +### Description + +The plug-in visualizes undo history and makes it easier to browse and switch between different undo branches. You might wonder what is undo "branches"? It's a vim feature that allows you to go back to a state when it is overwritten by the latest edit. For most editors, if you make a change A, followed by B, then go back to A and make another change C, normally you won't be able to go back to B because undo history is linear. That's not the case for Vim because it internally keeps all the edit history as a tree structure, and this plug-in exposes the tree to you so that you not only can switch back and forth but also can switch between branches. + + +Some people have questions about file contents being changed when switching between undo history states. Don't worry, *undotree* will **NEVER** save your data or write to disk. All it does is to change the current buffer a little bit, just like those auto-completion plug-ins do. It just adds or removes something in the buffer temporarily, and if you don't like you can always go back to the last state easily. Let's say, you made some change but didn't save it, then you use *undotree* and go back to an arbitrary version, your unsaved change doesn't get lost - it stores in the latest undo history node. Clicking that node on *undotree* will bring you back instantly. Play with undo/redo on other editors is always dangerous because when you step back and accidentally typed something, boom! You lose your edits. But don't worry, that won't happen in Vim. Then you might ask what if I make some changes without saving and switch back to an old version and then **exit**? Well, imagine what would happen if you don't have *undotree*? You lose your latest edits and the file on disk is your last saved version. This behavior **remains the same** with *undotree*. So, if you saved, you won't lose anything. + + +We all know that usually undo/redo is only for the current edit session. It's stored in memory and once the process exits, the undo history is lost. Although *undotree* makes switching between history states easier, it doesn't do more than that. Sometimes it would be much safer or more convenient to keep the undo history across edit sessions. In this case, you might need to enable a Vim feature called *persistent undo*. Let me explain how persistent undo works: instead of keeping undo history in *RAM*, persistent undo keeps undo history in a file. Let's say you make a change A, followed by B, then go back to A and make another change C, then you *save* the file. Now Vim save the file with content state C, and in the meantime it saves **the entire** undo history to a file including state A, B and C. Next time when you open the file, Vim will also restore undo history. So you can still go back to B. The history file is incremental, and every change will be recorded permanently, kind of like Git. You might think that's too much, well, *undotree* does provide a way to clean them up. If you need to enable *persistent undo*, type ```:h persistent-undo``` or follow the instructions below. + + +Undotree is written in **pure Vim script** and doesn't rely on any third-party tools. It's lightweight, simple, and fast. It only does what it supposed to do, and it only runs when you need it. + + +### Download and Install + +Using Vim's built-in package manager: + +```sh +mkdir -p ~/.vim/pack/mbbill/start +cd ~/.vim/pack/mbbill/start +git clone https://github.com/mbbill/undotree.git +vim -u NONE -c "helptags undotree/doc" -c q +``` + +Use whatever plug-in manager to pull the master branch. I've included 2 examples of the most used: + +- *Vundle:* `Plugin 'mbbill/undotree'` +- *Vim-Plug:* `Plug 'mbbill/undotree'` + +And install them with the following: + +- *Vundle:* `:PluginInstall` +- *Vim-Plug:* `:PlugInstall` + +### Usage + + 1. Use `:UndotreeToggle` to toggle the undo-tree panel. You may want to map this command to whatever hotkey by adding the following line to your vimrc, take `F5` for example. + +```vim +nnoremap :UndotreeToggle +``` + + 1. Markers + * Every change has a sequence number and it is displayed before timestamps. + * The current state is marked as `> number <`. + * The next state which will be restored by `:redo` or `` is marked as `{ number }`. + * The `[ number ]` marks the most recent change. + * The undo history is sorted by timestamps. + * Saved changes are marked as `s` and the big `S` indicates the most recent saved change. + 2. Press `?` in undotree window for quick help. + 3. Persistent undo + * Usually, I would like to store the undo files in a separate place like below. + +```vim +if has("persistent_undo") + let target_path = expand('~/.undodir') + + " create the directory and any parent directories + " if the location does not exist. + if !isdirectory(target_path) + call mkdir(target_path, "p", 0700) + endif + + let &undodir=target_path + set undofile +endif +``` + +#### Configuration + +[Here](https://github.com/mbbill/undotree/blob/master/plugin/undotree.vim#L15) is a list of options. + +#### Debug + + 1. Create a file under $HOME with the name `undotree_debug.log` + * `$touch ~/undotree_debug.log` + 2. Run vim, and the log will automatically be appended to the file, and you may watch it using `tail`: + * `$tail -F ~/undotree_debug.log` + 3. If you want to disable debug, just delete that file. + +### License + +**BSD** + +### Author + +Ming Bai <mbbill AT gmail DOT COM> diff --git a/home-rc/dot-files/.vim/bundle/undotree/autoload/undotree.vim b/home-rc/dot-files/.vim/bundle/undotree/autoload/undotree.vim new file mode 100644 index 0000000..ddef256 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/undotree/autoload/undotree.vim @@ -0,0 +1,1428 @@ +"================================================= +" File: autoload/undotree.vim +" Description: Manage your undo history in a graph. +" Author: David Knoble +" License: BSD + +" Avoid installing twice. +if exists('g:autoloaded_undotree') + finish +endif +let g:autoloaded_undotree = 0 + +" At least version 7.3 with 005 patch is needed for undo branches. +" Refer to https://github.com/mbbill/undotree/issues/4 for details. +" Thanks kien +if v:version < 703 + finish +endif +if (v:version == 703 && !has("patch005")) + finish +endif +let g:loaded_undotree = 1 " Signal plugin availability with a value of 1. + +" Short time indicators +if g:undotree_ShortIndicators == 1 + let s:timeSecond = '1 s' + let s:timeSeconds = ' s' + + let s:timeMinute = '1 m' + let s:timeMinutes = ' m' + + let s:timeHour = '1 h' + let s:timeHours = ' h' + + let s:timeDay = '1 d' + let s:timeDays = ' d' + + let s:timeOriginal = 'Orig' +else + let s:timeSecond = '1 second ago' + let s:timeSeconds = ' seconds ago' + + let s:timeMinute = '1 minute ago' + let s:timeMinutes = ' minutes ago' + + let s:timeHour = '1 hour ago' + let s:timeHours = ' hours ago' + + let s:timeDay = '1 day ago' + let s:timeDays = ' days ago' + + let s:timeOriginal = 'Original' +endif + +"================================================= +" Help text +let s:helpmore = ['" ===== Marks ===== ', + \'" >num< : The current state', + \'" {num} : The next redo state', + \'" [num] : The latest state', + \'" s : Saved states', + \'" S : The last saved state', + \'" ===== Hotkeys ====='] +if !g:undotree_HelpLine + let s:helpless = [] +else + let s:helpless = ['" Press ? for help.'] +endif + +"Custom key mappings: add this function to your vimrc. +"You can define whatever mapping as you like, this is a hook function which +"will be called after undotree window initialized. +" +"function g:Undotree_CustomMap() +" map J +" map K +"endfunction + +" Keymap +let s:keymap = [] +" action, key, help. +let s:keymap += [['Help','?','Toggle quick help']] +let s:keymap += [['Close','q','Close undotree panel']] +let s:keymap += [['FocusTarget','','Set Focus back to the editor']] +let s:keymap += [['ClearHistory','C','Clear undo history (with confirmation)']] +let s:keymap += [['TimestampToggle','T','Toggle relative timestamp']] +let s:keymap += [['DiffToggle','D','Toggle the diff panel']] +let s:keymap += [['NextState','K','Move to the next undo state']] +let s:keymap += [['PreviousState','J','Move to the previous undo state']] +let s:keymap += [['NextSavedState','>','Move to the next saved state']] +let s:keymap += [['PreviousSavedState','<','Move to the previous saved state']] +let s:keymap += [['Redo','','Redo']] +let s:keymap += [['Undo','u','Undo']] +let s:keymap += [['Enter','<2-LeftMouse>','Move to the current state']] +let s:keymap += [['Enter','','Move to the current state']] + +" 'Diff' sign definitions. There are two 'delete' signs; a 'normal' one and one +" that is used if the very end of the buffer has been deleted (in which case the +" deleted text is actually bejond the end of the current buffer version and therefore +" it is not possible to place a sign on the exact line - because it doesn't exist. +" Instead, a 'special' delete sign is placed on the (existing) last line of the +" buffer) +exe 'sign define UndotreeAdd text=++ texthl='.undotree_HighlightSyntaxAdd +exe 'sign define UndotreeChg text=~~ texthl='.undotree_HighlightSyntaxChange +exe 'sign define UndotreeDel text=-- texthl='.undotree_HighlightSyntaxDel +exe 'sign define UndotreeDelEnd text=-v texthl='.undotree_HighlightSyntaxDel + +" Id to use for all signs. This is an arbirary number that is hoped to be unique +" within the instance of vim. There is no way of guaranteeing it IS unique, which +" is a shame because it needs to be! +" +" Note that all signs are placed with the same Id - as long as we keep a count of +" how many we have placed (so we can remove them all again), this is ok +let s:signId = 2123654789 + +"================================================= +function! s:new(obj) abort + let newobj = deepcopy(a:obj) + call newobj.Init() + return newobj +endfunction + +" Get formatted time +function! s:gettime(time) abort + if a:time == 0 + return s:timeOriginal + endif + if !g:undotree_RelativeTimestamp + let today = substitute(strftime("%c",localtime())," .*$",'','g') + if today == substitute(strftime("%c",a:time)," .*$",'','g') + return strftime("%H:%M:%S",a:time) + else + return strftime("%H:%M:%S %b%d %Y",a:time) + endif + else + let sec = localtime() - a:time + if sec < 0 + let sec = 0 + endif + if sec < 60 + if sec == 1 + return s:timeSecond + else + return sec.s:timeSeconds + endif + endif + if sec < 3600 + if (sec/60) == 1 + return s:timeMinute + else + return (sec/60).s:timeMinutes + endif + endif + if sec < 86400 "3600*24 + if (sec/3600) == 1 + return s:timeHour + else + return (sec/3600).s:timeHours + endif + endif + if (sec/86400) == 1 + return s:timeDay + else + return (sec/86400).s:timeDays + endif + endif +endfunction + +function! s:exec(cmd) abort + call s:log("s:exec() ".a:cmd) + silent exe a:cmd +endfunction + +" Don't trigger any events(like BufEnter which could cause redundant refresh) +function! s:exec_silent(cmd) abort + call s:log("s:exec_silent() ".a:cmd) + let ei_bak= &eventignore + set eventignore=BufEnter,BufLeave,BufWinLeave,InsertLeave,CursorMoved,BufWritePost + silent exe a:cmd + let &eventignore = ei_bak +endfunction + +" Return a unique id each time. +let s:cntr = 0 +function! s:getUniqueID() abort + let s:cntr = s:cntr + 1 + return s:cntr +endfunction + +" Set to 1 to enable debug log +let s:debug = 0 +let s:debugfile = $HOME.'/undotree_debug.log' +" If debug file exists, enable debug output. +if filewritable(s:debugfile) + let s:debug = 1 + exec 'redir >> '. s:debugfile + silent echo "=======================================\n" + redir END +endif + +function! s:log(msg) abort + if s:debug + exec 'redir >> ' . s:debugfile + silent echon strftime('%H:%M:%S') . ': ' . string(a:msg) . "\n" + redir END + endif +endfunction + +"================================================= +"Base class for panels. +let s:panel = {} + +function! s:panel.Init() abort + let self.bufname = "invalid" +endfunction + +function! s:panel.SetFocus() abort + let winnr = bufwinnr(self.bufname) + " already focused. + if winnr == winnr() + return + endif + if winnr == -1 + echoerr "Fatal: window does not exist!" + return + endif + call s:log("SetFocus() winnr:".winnr." bufname:".self.bufname) + " wincmd would cause cursor outside window. + call s:exec_silent("norm! ".winnr."\\") +endfunction + +function! s:panel.IsVisible() abort + if bufwinnr(self.bufname) != -1 + return 1 + else + return 0 + endif +endfunction + +function! s:panel.Hide() abort + call s:log(self.bufname." Hide()") + if !self.IsVisible() + return + endif + call self.SetFocus() + call s:exec("quit") +endfunction + +"================================================= +" undotree panel class. +" extended from panel. +" + +" {rawtree} +" | +" | ConvertInput() {seq2index}--> [seq1:index1] +" v [seq2:index2] ---+ +" {tree} ... | +" | [asciimeta] | +" | Render() | | +" v v | +" [asciitree] --> [" * | SEQ DDMMYY "] <==> [node1{seq,time,..}] | +" [" |/ "] [node2{seq,time,..}] <---+ +" ... ... + +let s:undotree = s:new(s:panel) + +function! s:undotree.Init() abort + let self.bufname = "undotree_".s:getUniqueID() + " Increase to make it unique. + let self.width = g:undotree_SplitWidth + let self.opendiff = g:undotree_DiffAutoOpen + let self.targetid = -1 + let self.targetBufnr = -1 + let self.rawtree = {} "data passed from undotree() + let self.tree = {} "data converted to internal format. + let self.seq_last = -1 + let self.save_last = -1 + let self.save_last_bak = -1 + + " seqs + let self.seq_cur = -1 + let self.seq_curhead = -1 + let self.seq_newhead = -1 + let self.seq_saved = {} "{saved value -> seq} pair + + "backup, for mark + let self.seq_cur_bak = -1 + let self.seq_curhead_bak = -1 + let self.seq_newhead_bak = -1 + + let self.asciitree = [] "output data. + let self.asciimeta = [] "meta data behind ascii tree. + let self.seq2index = {} "table used to convert seq to index. + let self.showHelp = 0 +endfunction + +function! s:undotree.BindKey() abort + if v:version > 703 || (v:version == 703 && has("patch1261")) + let map_options = ' ' + else + let map_options = '' + endif + let map_options = map_options.' ' + for i in s:keymap + silent exec 'nmap '.map_options.i[1].' Undotree'.i[0] + silent exec 'nnoremap '.map_options.'Undotree'.i[0] + \ .' :call undotreeAction("'.i[0].'")' + endfor + if exists('*g:Undotree_CustomMap') + call g:Undotree_CustomMap() + endif +endfunction + +function! s:undotree.BindAu() abort + " Auto exit if it's the last window + augroup Undotree_Main + au! + au BufEnter call s:exitIfLast() + au BufEnter,BufLeave if exists('t:undotree') | + \let t:undotree.width = winwidth(winnr()) | endif + au BufWinLeave if exists('t:diffpanel') | + \call t:diffpanel.Hide() | endif + augroup end +endfunction + +function! s:undotree.Action(action) abort + call s:log("undotree.Action() ".a:action) + if !self.IsVisible() || !exists('b:isUndotreeBuffer') + echoerr "Fatal: window does not exist." + return + endif + if !has_key(self,'Action'.a:action) + echoerr "Fatal: Action does not exist!" + return + endif + silent exec 'call self.Action'.a:action.'()' +endfunction + +" Helper function, do action in target window, and then update itself. +function! s:undotree.ActionInTarget(cmd) abort + if !self.SetTargetFocus() + return + endif + " Target should be a normal buffer. + if (&bt == '' || &bt == 'acwrite') && (&modifiable == 1) && (mode() == 'n') + call s:exec(a:cmd) + call self.Update() + endif + " Update not always set current focus. + call self.SetFocus() +endfunction + +function! s:undotree.ActionHelp() abort + let self.showHelp = !self.showHelp + call self.Draw() + call self.MarkSeqs() +endfunction + +function! s:undotree.ActionFocusTarget() abort + call self.SetTargetFocus() +endfunction + +function! s:undotree.ActionEnter() abort + let index = self.Screen2Index(line('.')) + if index < 0 + return + endif + let seq = self.asciimeta[index].seq + if seq == -1 + return + endif + if seq == 0 + call self.ActionInTarget('norm 9999u') + return + endif + call self.ActionInTarget('u '.self.asciimeta[index].seq) +endfunction + +function! s:undotree.ActionUndo() abort + call self.ActionInTarget('undo') +endfunction + +function! s:undotree.ActionRedo() abort + call self.ActionInTarget("redo") +endfunction + +function! s:undotree.ActionPreviousState() abort + call self.ActionInTarget('earlier') +endfunction + +function! s:undotree.ActionNextState() abort + call self.ActionInTarget('later') +endfunction + +function! s:undotree.ActionPreviousSavedState() abort + call self.ActionInTarget('earlier 1f') +endfunction + +function! s:undotree.ActionNextSavedState() abort + call self.ActionInTarget('later 1f') +endfunction + +function! s:undotree.ActionDiffToggle() abort + let self.opendiff = !self.opendiff + call t:diffpanel.Toggle() + call self.UpdateDiff() +endfunction + +function! s:undotree.ActionTimestampToggle() abort + if !self.SetTargetFocus() + return + endif + let g:undotree_RelativeTimestamp = !g:undotree_RelativeTimestamp + let self.targetBufnr = -1 "force update + call self.Update() + " Update not always set current focus. + call self.SetFocus() +endfunction + +function! s:undotree.ActionClearHistory() abort + if input("Clear ALL undo history? Type \"YES\" to continue: ") != "YES" + return + endif + if !self.SetTargetFocus() + return + endif + let ul_bak = &undolevels + let mod_bak = &modified + let &undolevels = -1 + call s:exec("norm! a \\") + let &undolevels = ul_bak + let &modified = mod_bak + unlet ul_bak mod_bak + let self.targetBufnr = -1 "force update + call self.Update() +endfunction + +function! s:undotree.ActionClose() abort + call self.Toggle() +endfunction + +function! s:undotree.UpdateDiff() abort + call s:log("undotree.UpdateDiff()") + if !t:diffpanel.IsVisible() + return + endif + call t:diffpanel.Update(self.seq_cur,self.targetBufnr,self.targetid) +endfunction + +" May fail due to target window closed. +function! s:undotree.SetTargetFocus() abort + for winnr in range(1, winnr('$')) "winnr starts from 1 + if getwinvar(winnr,'undotree_id') == self.targetid + if winnr() != winnr + call s:exec("norm! ".winnr."\\") + return 1 + endif + endif + endfor + return 0 +endfunction + +function! s:undotree.Toggle() abort + "Global auto commands to keep undotree up to date. + let auEvents = "BufEnter,InsertLeave,CursorMoved,BufWritePost" + + call s:log(self.bufname." Toggle()") + if self.IsVisible() + call self.Hide() + call t:diffpanel.Hide() + call self.SetTargetFocus() + augroup Undotree + autocmd! + augroup END + else + call self.Show() + if !g:undotree_SetFocusWhenToggle + call self.SetTargetFocus() + endif + augroup Undotree + au! + exec "au! ".auEvents." * call undotree#UndotreeUpdate()" + augroup END + endif +endfunction + +function! s:undotree.GetStatusLine() abort + if self.seq_cur != -1 + let seq_cur = self.seq_cur + else + let seq_cur = 'None' + endif + if self.seq_curhead != -1 + let seq_curhead = self.seq_curhead + else + let seq_curhead = 'None' + endif + return 'current: '.seq_cur.' redo: '.seq_curhead +endfunction + +function! s:undotree.Show() abort + call s:log("undotree.Show()") + if self.IsVisible() + return + endif + + let self.targetid = w:undotree_id + + " Create undotree window. + if exists("g:undotree_CustomUndotreeCmd") + let cmd = g:undotree_CustomUndotreeCmd . ' ' . + \self.bufname + elseif g:undotree_WindowLayout == 1 || g:undotree_WindowLayout == 2 + let cmd = "topleft vertical" . + \self.width . ' new ' . self.bufname + else + let cmd = "botright vertical" . + \self.width . ' new ' . self.bufname + endif + call s:exec("silent keepalt ".cmd) + call self.SetFocus() + + " We need a way to tell if the buffer is belong to undotree, + " bufname() is not always reliable. + let b:isUndotreeBuffer = 1 + + setlocal winfixwidth + setlocal noswapfile + setlocal buftype=nowrite + setlocal bufhidden=delete + setlocal nowrap + setlocal foldcolumn=0 + setlocal nobuflisted + setlocal nospell + setlocal nonumber + setlocal norelativenumber + if g:undotree_CursorLine + setlocal cursorline + else + setlocal nocursorline + endif + setlocal nomodifiable + setlocal statusline=%!t:undotree.GetStatusLine() + setfiletype undotree + + call self.BindKey() + call self.BindAu() + + let ei_bak= &eventignore + set eventignore=all + + call self.SetTargetFocus() + let self.targetBufnr = -1 "force update + call self.Update() + + let &eventignore = ei_bak + + if self.opendiff + call t:diffpanel.Show() + call self.UpdateDiff() + endif +endfunction + +" called outside undotree window +function! s:undotree.Update() abort + if !self.IsVisible() + return + endif + " do nothing if we're in the undotree or diff panel + if exists('b:isUndotreeBuffer') + return + endif + if (&bt != '' && &bt != 'acwrite') || (&modifiable == 0) || (mode() != 'n') + if &bt == 'quickfix' || &bt == 'nofile' + "Do nothing for quickfix and q: + call s:log("undotree.Update() ignore quickfix") + return + endif + if self.targetBufnr == bufnr('%') && self.targetid == w:undotree_id + call s:log("undotree.Update() invalid buffer NOupdate") + return + endif + let emptybuf = 1 "This is not a valid buffer, could be help or something. + call s:log("undotree.Update() invalid buffer update") + else + let emptybuf = 0 + "update undotree,set focus + if self.targetBufnr == bufnr('%') + let self.targetid = w:undotree_id + let newrawtree = undotree() + if self.rawtree == newrawtree + return + endif + + " same buffer, but seq changed. + if newrawtree.seq_last == self.seq_last + call s:log("undotree.Update() update seqs") + let self.rawtree = newrawtree + call self.ConvertInput(0) "only update seqs. + if (self.seq_cur == self.seq_cur_bak) && + \(self.seq_curhead == self.seq_curhead_bak)&& + \(self.seq_newhead == self.seq_newhead_bak)&& + \(self.save_last == self.save_last_bak) + return + endif + call self.SetFocus() + call self.MarkSeqs() + call self.UpdateDiff() + return + endif + endif + endif + call s:log("undotree.Update() update whole tree") + + let self.targetBufnr = bufnr('%') + let self.targetid = w:undotree_id + if emptybuf " Show an empty undo tree instead of do nothing. + let self.rawtree = {'seq_last':0,'entries':[],'time_cur':0,'save_last':0,'synced':1,'save_cur':0,'seq_cur':0} + else + let self.rawtree = undotree() + endif + let self.seq_last = self.rawtree.seq_last + let self.seq_cur = -1 + let self.seq_curhead = -1 + let self.seq_newhead = -1 + call self.ConvertInput(1) "update all. + call self.Render() + call self.SetFocus() + call self.Draw() + call self.MarkSeqs() + call self.UpdateDiff() +endfunction + +function! s:undotree.AppendHelp() abort + if self.showHelp + call append(0,'') "empty line + for i in s:keymap + call append(0,'" '.i[1].' : '.i[2]) + endfor + call append(0,s:helpmore) + else + if g:undotree_HelpLine + call append(0,'') + endif + call append(0,s:helpless) + endif +endfunction + +function! s:undotree.Index2Screen(index) abort + " index starts from zero + let index_padding = 1 + let empty_line = 1 + let lineNr = a:index + index_padding + empty_line + " calculate line number according to the help text. + " index starts from zero and lineNr starts from 1 + if self.showHelp + let lineNr += len(s:keymap) + len(s:helpmore) + else + let lineNr += len(s:helpless) + if !g:undotree_HelpLine + let lineNr -= empty_line + endif + endif + return lineNr +endfunction + +" <0 if index is invalid. e.g. current line is in help text. +function! s:undotree.Screen2Index(line) abort + let index_padding = 1 + let empty_line = 1 + let index = a:line - index_padding - empty_line + + if self.showHelp + let index -= len(s:keymap) + len(s:helpmore) + else + let index -= len(s:helpless) + if !g:undotree_HelpLine + let index += empty_line + endif + endif + return index +endfunction + +" Current window must be undotree. +function! s:undotree.Draw() abort + " remember the current cursor position. + let savedview = winsaveview() + + setlocal modifiable + " Delete text into blackhole register. + call s:exec('1,$ d _') + call append(0,self.asciitree) + + call self.AppendHelp() + + "remove the last empty line + call s:exec('$d _') + + " restore previous cursor position. + call winrestview(savedview) + + setlocal nomodifiable +endfunction + +function! s:undotree.MarkSeqs() abort + call s:log("bak(cur,curhead,newhead): ". + \self.seq_cur_bak.' '. + \self.seq_curhead_bak.' '. + \self.seq_newhead_bak) + call s:log("(cur,curhead,newhead): ". + \self.seq_cur.' '. + \self.seq_curhead.' '. + \self.seq_newhead) + setlocal modifiable + " reset bak seq lines. + if self.seq_cur_bak != -1 + let index = self.seq2index[self.seq_cur_bak] + call setline(self.Index2Screen(index),self.asciitree[index]) + endif + if self.seq_curhead_bak != -1 + let index = self.seq2index[self.seq_curhead_bak] + call setline(self.Index2Screen(index),self.asciitree[index]) + endif + if self.seq_newhead_bak != -1 + let index = self.seq2index[self.seq_newhead_bak] + call setline(self.Index2Screen(index),self.asciitree[index]) + endif + " mark save seqs + for i in keys(self.seq_saved) + let index = self.seq2index[self.seq_saved[i]] + let lineNr = self.Index2Screen(index) + call setline(lineNr,substitute(self.asciitree[index], + \' \d\+ \zs \ze','s','')) + endfor + let max_saved_num = max(keys(self.seq_saved)) + if max_saved_num > 0 + let lineNr = self.Index2Screen(self.seq2index[self.seq_saved[max_saved_num]]) + call setline(lineNr,substitute(getline(lineNr),'s','S','')) + endif + " mark new seqs. + if self.seq_cur != -1 + let index = self.seq2index[self.seq_cur] + let lineNr = self.Index2Screen(index) + call setline(lineNr,substitute(getline(lineNr), + \'\zs \(\d\+\) \ze [sS ] ','>\1<','')) + " move cursor to that line. + call s:exec("normal! " . lineNr . "G") + endif + if self.seq_curhead != -1 + let index = self.seq2index[self.seq_curhead] + let lineNr = self.Index2Screen(index) + call setline(lineNr,substitute(getline(lineNr), + \'\zs \(\d\+\) \ze [sS ] ','{\1}','')) + endif + if self.seq_newhead != -1 + let index = self.seq2index[self.seq_newhead] + let lineNr = self.Index2Screen(index) + call setline(lineNr,substitute(getline(lineNr), + \'\zs \(\d\+\) \ze [sS ] ','[\1]','')) + endif + setlocal nomodifiable +endfunction + +" tree node class +let s:node = {} + +function! s:node.Init() abort + let self.seq = -1 + let self.p = [] + let self.time = -1 +endfunction + +function! s:undotree._parseNode(in,out) abort + " type(in) == type([]) && type(out) == type({}) + if empty(a:in) "empty + return + endif + let curnode = a:out + for i in a:in + if has_key(i,'alt') + call self._parseNode(i.alt,curnode) + endif + let newnode = s:new(s:node) + let newnode.seq = i.seq + let newnode.time = i.time + if has_key(i,'newhead') + let self.seq_newhead = i.seq + endif + if has_key(i,'curhead') + let self.seq_curhead = i.seq + let self.seq_cur = curnode.seq + endif + if has_key(i,'save') + let self.seq_saved[i.save] = i.seq + endif + call extend(curnode.p,[newnode]) + let curnode = newnode + endfor +endfunction + +"Sample: +"let s:test={'seq_last': 4, 'entries': [{'seq': 3, 'alt': [{'seq': 1, 'time': 1345131443}, {'seq': 2, 'time': 1345131445}], 'time': 1345131490}, {'seq': 4, 'time': 1345131492, 'newhead': 1}], 'time_cur': 1345131493, 'save_last': 0, 'synced': 0, 'save_cur': 0, 'seq_cur': 4} + +" updatetree: 0: no update, just assign seqs; 1: update and assign seqs. +function! s:undotree.ConvertInput(updatetree) abort + "reset seqs + let self.seq_cur_bak = self.seq_cur + let self.seq_curhead_bak = self.seq_curhead + let self.seq_newhead_bak = self.seq_newhead + let self.save_last_bak = self.save_last + + let self.seq_cur = -1 + let self.seq_curhead = -1 + let self.seq_newhead = -1 + let self.seq_saved = {} + + "Generate root node + let root = s:new(s:node) + let root.seq = 0 + let root.time = 0 + + call self._parseNode(self.rawtree.entries,root) + + let self.save_last = self.rawtree.save_last + " Note: Normally, the current node should be the one that seq_cur points to, + " but in fact it's not. May be bug, bug anyway I found a workaround: + " first try to find the parent node of 'curhead', if not found, then use + " seq_cur. + if self.seq_cur == -1 + let self.seq_cur = self.rawtree.seq_cur + endif + " undo history is cleared + if empty(self.rawtree.entries) + let self.seq_cur = 0 + endif + if a:updatetree + let self.tree = root + endif +endfunction + +"================================================= +" Ascii undo tree generator +" +" Example: +" 6 8 7 +" |/ | +" 2 4 +" \ | +" 1 3 5 +" \ | / +" 0 + +" Tree sieve, p:fork, x:none +" +" x 8 +" 8x | 7 +" 87 \ \ +" x87 6 | | +" 687 |/ / +" p7x | | 5 +" p75 | 4 | +" p45 | 3 | +" p35 | |/ +" pp 2 | +" 2p 1 | +" 1p |/ +" p 0 +" 0 +" +" Data sample: +"let example = {'seq':0,'p':[{'seq':1,'p':[{'seq':2,'p':[{'seq':6,'p':[]},{'seq':8,'p':[]}]}]},{'seq':3,'p':[{'seq':4,'p':[{'seq':7,'p':[]}]}]},{'seq':5,'p':[]}]} +" +" Convert self.tree -> self.asciitree +function! s:undotree.Render() abort + " We gonna modify self.tree so we'd better make a copy first. + " Cannot make a copy because variable nested too deep, gosh.. okay, + " fine.. + " let tree = deepcopy(self.tree) + let tree = self.tree + let slots = [tree] + let out = [] + let outmeta = [] + let seq2index = {} + let TYPE_E = type({}) + let TYPE_P = type([]) + let TYPE_X = type('x') + while slots != [] + "find next node + let foundx = 0 " 1 if x element is found. + let index = 0 " Next element to be print. + + " Find x element first. + for i in range(len(slots)) + if type(slots[i]) == TYPE_X + let foundx = 1 + let index = i + break + endif + endfor + + " Then, find the element with minimun seq. + let minseq = 99999999 + let minnode = {} + if foundx == 0 + "assume undo level isn't more than this... of course + for i in range(len(slots)) + if type(slots[i]) == TYPE_E + if slots[i].seq < minseq + let minseq = slots[i].seq + let index = i + let minnode = slots[i] + continue + endif + endif + if type(slots[i]) == TYPE_P + for j in slots[i] + if j.seq < minseq + let minseq = j.seq + let index = i + let minnode = j + continue + endif + endfor + endif + endfor + endif + + " output. + let onespace = " " + let newline = onespace + let newmeta = {} + let node = slots[index] + if type(node) == TYPE_X + let newmeta = s:new(s:node) "invalid node. + if index+1 != len(slots) " not the last one, append '\' + for i in range(len(slots)) + if i < index + let newline = newline.g:undotree_TreeVertShape.' ' + endif + if i > index + let newline = newline.' '.g:undotree_TreeReturnShape + endif + endfor + endif + call remove(slots,index) + endif + if type(node) == TYPE_E + let newmeta = node + let seq2index[node.seq]=len(out) + for i in range(len(slots)) + if index == i + let newline = newline.g:undotree_TreeNodeShape.' ' + else + let newline = newline.g:undotree_TreeVertShape.' ' + endif + endfor + let newline = newline.' '.(node.seq).' '. + \'('.s:gettime(node.time).')' + " update the printed slot to its child. + if empty(node.p) + let slots[index] = 'x' + endif + if len(node.p) == 1 "only one child. + let slots[index] = node.p[0] + endif + if len(node.p) > 1 "insert p node + let slots[index] = node.p + endif + let node.p = [] "cut reference. + endif + if type(node) == TYPE_P + let newmeta = s:new(s:node) "invalid node. + for k in range(len(slots)) + if k < index + let newline = newline.g:undotree_TreeVertShape." " + endif + if k == index + let newline = newline.g:undotree_TreeVertShape.g:undotree_TreeSplitShape." " + endif + if k > index + let newline = newline.g:undotree_TreeSplitShape." " + endif + endfor + call remove(slots,index) + if len(node) == 2 + if node[0].seq > node[1].seq + call insert(slots,node[1],index) + call insert(slots,node[0],index) + else + call insert(slots,node[0],index) + call insert(slots,node[1],index) + endif + endif + " split P to E+P if elements in p > 2 + if len(node) > 2 + call remove(node,index(node,minnode)) + call insert(slots,minnode,index) + call insert(slots,node,index) + endif + endif + unlet node + if newline != onespace + let newline = substitute(newline,'\s*$','','g') "remove trailing space. + call insert(out,newline,0) + call insert(outmeta,newmeta,0) + endif + endwhile + let self.asciitree = out + let self.asciimeta = outmeta + " revert index. + let totallen = len(out) + for i in keys(seq2index) + let seq2index[i] = totallen - 1 - seq2index[i] + endfor + let self.seq2index = seq2index +endfunction + +"================================================= +"diff panel +let s:diffpanel = s:new(s:panel) + +function! s:diffpanel.Update(seq,targetBufnr,targetid) abort + call s:log('diffpanel.Update(),seq:'.a:seq.' bufname:'.bufname(a:targetBufnr)) + if !self.diffexecutable + return + endif + let diffresult = [] + let self.changes.add = 0 + let self.changes.del = 0 + + if a:seq == 0 + let diffresult = [] + else + if has_key(self.cache,a:targetBufnr.'_'.a:seq) + call s:log("diff cache hit.") + let diffresult = self.cache[a:targetBufnr.'_'.a:seq] + else + " Double check the target winnr and bufnr + let targetWinnr = -1 + for winnr in range(1, winnr('$')) "winnr starts from 1 + if (getwinvar(winnr,'undotree_id') == a:targetid) + \&& winbufnr(winnr) == a:targetBufnr + let targetWinnr = winnr + endif + endfor + if targetWinnr == -1 + return + endif + + let ei_bak = &eventignore + set eventignore=all + + call s:exec_silent(targetWinnr." wincmd w") + + " remember and restore cursor and window position. + let savedview = winsaveview() + + let new = getbufline(a:targetBufnr,'^','$') + silent undo + let old = getbufline(a:targetBufnr,'^','$') + silent redo + + call winrestview(savedview) + + " diff files. + let tempfile1 = tempname() + let tempfile2 = tempname() + if writefile(old,tempfile1) == -1 + echoerr "Can not write to temp file:".tempfile1 + endif + if writefile(new,tempfile2) == -1 + echoerr "Can not write to temp file:".tempfile2 + endif + let diffresult = split(system(g:undotree_DiffCommand.' '.tempfile1.' '.tempfile2),"\n") + call s:log("diffresult: ".string(diffresult)) + if delete(tempfile1) != 0 + echoerr "Can not delete temp file:".tempfile1 + endif + if delete(tempfile2) != 0 + echoerr "Can not delete temp file:".tempfile2 + endif + let &eventignore = ei_bak + "Update cache + let self.cache[a:targetBufnr.'_'.a:seq] = diffresult + endif + endif + + call self.ParseDiff(diffresult, a:targetBufnr) + + call self.SetFocus() + + setlocal modifiable + call s:exec('1,$ d _') + + call append(0,diffresult) + call append(0,'- seq: '.a:seq.' -') + + "remove the last empty line + if getline("$") == "" + call s:exec('$d _') + endif + call s:exec('norm! gg') "move cursor to line 1. + setlocal nomodifiable + call t:undotree.SetFocus() +endfunction + +function! s:diffpanel.ParseDiff(diffresult, targetBufnr) abort + " set target focus first. + call t:undotree.SetTargetFocus() + + " If 'a:diffresult' is empty then there are no new signs to place. However, + " we need to ensure any old signs are removed. This is especially important + " if we are at the very first sequence, otherwise signs get left + if (exists("w:undotree_diffsigns")) + while w:undotree_diffsigns > 0 + exe 'sign unplace '.s:signId + let w:undotree_diffsigns -= 1 + endwhile + endif + + if empty(a:diffresult) + return + endif + + " clear previous highlighted syntax + " matchadd associates with windows. + if exists("w:undotree_diffmatches") + for i in w:undotree_diffmatches + call matchdelete(i) + endfor + endif + + let w:undotree_diffmatches = [] + let w:undotree_diffsigns = 0 + let lineNr = 0 + let l:lastLine = line('$') + for line in a:diffresult + let matchnum = matchstr(line,'^[0-9,\,]*[acd]\zs\d*\ze') + if !empty(matchnum) + let lineNr = str2nr(matchnum) + let matchwhat = matchstr(line,'^[0-9,\,]*\zs[acd]\ze\d*') + if matchwhat ==# 'd' + if g:undotree_HighlightChangedWithSign + " Normally, for a 'delete' change, the line number we have is always 1 less than the line we + " need to place the sign at, hence '+ 1' + " However, if the very end of the buffer has been deleted then this is not possible (because + " that bit of the buffer no longer exists), so we place a 'special' version of the 'delete' + " sign on what is the last available line) + exe 'sign place '.s:signId.' line='.((lineNr < l:lastLine) ? lineNr + 1 : l:lastLine).' name='.((lineNr < l:lastLine) ? 'UndotreeDel' : 'UndotreeDelEnd').' buffer='.a:targetBufnr + let w:undotree_diffsigns += 1 + endif + + let matchnum = 0 + let matchwhat = '' + endif + continue + endif + if matchstr(line,'^<.*$') != '' + let self.changes.del += 1 + endif + + let matchtext = matchstr(line,'^>\zs .*$') + if empty(matchtext) + continue + endif + + let self.changes.add += 1 + if g:undotree_HighlightChangedText + if matchtext != ' ' + let matchtext = '\%'.lineNr.'l\V'.escape(matchtext[1:],'"\') "remove beginning space. + call s:log("matchadd(".matchwhat.") -> ".matchtext) + call add(w:undotree_diffmatches,matchadd((matchwhat ==# 'a' ? g:undotree_HighlightSyntaxAdd : g:undotree_HighlightSyntaxChange),matchtext)) + endif + endif + + if g:undotree_HighlightChangedWithSign + exe 'sign place '.s:signId.' line='.lineNr.' name='.(matchwhat ==# 'a' ? 'UndotreeAdd' : 'UndotreeChg').' buffer='.a:targetBufnr + let w:undotree_diffsigns += 1 + endif + + let lineNr = lineNr+1 + endfor +endfunction + +function! s:diffpanel.GetStatusLine() abort + let max = winwidth(0) - 4 + let sum = self.changes.add + self.changes.del + if sum > max + let add = self.changes.add * max / sum + 1 + let del = self.changes.del * max / sum + 1 + else + let add = self.changes.add + let del = self.changes.del + endif + return string(sum).' '.repeat('+',add).repeat('-',del) +endfunction + +function! s:diffpanel.Init() abort + let self.bufname = "diffpanel_".s:getUniqueID() + let self.cache = {} + let self.changes = {'add':0, 'del':0} + let self.diffexecutable = executable('diff') + if !self.diffexecutable + echoerr '"diff" is not executable.' + endif +endfunction + +function! s:diffpanel.Toggle() abort + call s:log(self.bufname." Toggle()") + if self.IsVisible() + call self.Hide() + else + call self.Show() + endif +endfunction + +function! s:diffpanel.Show() abort + call s:log("diffpanel.Show()") + if self.IsVisible() + return + endif + " Create diffpanel window. + call t:undotree.SetFocus() "can not exist without undotree + " remember and restore cursor and window position. + let savedview = winsaveview() + + let ei_bak= &eventignore + set eventignore=all + + if exists("g:undotree_CustomDiffpanelCmd") + let cmd = g:undotree_CustomDiffpanelCmd.' '.self.bufname + elseif g:undotree_WindowLayout == 1 || g:undotree_WindowLayout == 3 + let cmd = 'belowright '.g:undotree_DiffpanelHeight.'new '.self.bufname + else + let cmd = 'botright '.g:undotree_DiffpanelHeight.'new '.self.bufname + endif + call s:exec_silent(cmd) + + let b:isUndotreeBuffer = 1 + + setlocal winfixwidth + setlocal winfixheight + setlocal noswapfile + setlocal buftype=nowrite + setlocal bufhidden=delete + setlocal nowrap + setlocal nobuflisted + setlocal nospell + setlocal nonumber + setlocal norelativenumber + setlocal nocursorline + setlocal nomodifiable + setlocal statusline=%!t:diffpanel.GetStatusLine() + + let &eventignore = ei_bak + + " syntax need filetype autocommand + setfiletype diff + setlocal foldcolumn=0 + setlocal nofoldenable + + call self.BindAu() + call t:undotree.SetFocus() + call winrestview(savedview) +endfunction + +function! s:diffpanel.BindAu() abort + " Auto exit if it's the last window or undotree closed. + augroup Undotree_Diff + au! + au BufEnter call s:exitIfLast() + au BufEnter if !t:undotree.IsVisible() + \|call t:diffpanel.Hide() |endif + augroup end +endfunction + +function! s:diffpanel.CleanUpHighlight() abort + call s:log("CleanUpHighlight()") + " save current position + let curwinnr = winnr() + let savedview = winsaveview() + + " clear w:undotree_diffmatches in all windows. + let winnum = winnr('$') + for i in range(1,winnum) + call s:exec_silent("norm! ".i."\\") + if exists("w:undotree_diffmatches") + for j in w:undotree_diffmatches + call matchdelete(j) + endfor + let w:undotree_diffmatches = [] + endif + if (exists("w:undotree_diffsigns")) + while w:undotree_diffsigns > 0 + exe 'sign unplace '.s:signId + let w:undotree_diffsigns -= 1 + endwhile + endif + endfor + + "restore position + call s:exec_silent("norm! ".curwinnr."\\") + call winrestview(savedview) +endfunction + +function! s:diffpanel.Hide() abort + call s:log(self.bufname." Hide()") + if !self.IsVisible() + return + endif + call self.SetFocus() + call s:exec("quit") + call self.CleanUpHighlight() +endfunction + +"================================================= +" It will set the target of undotree window to the current editing buffer. +function! s:undotreeAction(action) abort + call s:log("undotreeAction()") + if !exists('t:undotree') + echoerr "Fatal: t:undotree does not exist!" + return + endif + call t:undotree.Action(a:action) +endfunction + +function! s:exitIfLast() abort + let num = 0 + if exists('t:undotree') && t:undotree.IsVisible() + let num = num + 1 + endif + if exists('t:diffpanel') && t:diffpanel.IsVisible() + let num = num + 1 + endif + if winnr('$') == num + if exists('t:undotree') + call t:undotree.Hide() + endif + if exists('t:diffpanel') + call t:diffpanel.Hide() + endif + endif +endfunction + +"================================================= +" User command functions +"called outside undotree window +function! undotree#UndotreeUpdate() abort + if !exists('t:undotree') + return + endif + if !exists('w:undotree_id') + let w:undotree_id = 'id_'.s:getUniqueID() + call s:log("Unique window id assigned: ".w:undotree_id) + endif + " assume window layout won't change during updating. + let thiswinnr = winnr() + call t:undotree.Update() + " focus moved + if winnr() != thiswinnr + call s:exec("norm! ".thiswinnr."\\") + endif +endfunction + +function! undotree#UndotreeToggle() abort + try + call s:log(">>> UndotreeToggle()") + if !exists('w:undotree_id') + let w:undotree_id = 'id_'.s:getUniqueID() + call s:log("Unique window id assigned: ".w:undotree_id) + endif + if !exists('t:undotree') + let t:undotree = s:new(s:undotree) + let t:diffpanel = s:new(s:diffpanel) + endif + call t:undotree.Toggle() + call s:log("<<< UndotreeToggle() leave") + catch /^Vim\%((\a\+)\)\?:E11/ + echohl ErrorMsg + echom v:exception + echohl NONE + endtry +endfunction + +function! undotree#UndotreeIsVisible() abort + return (exists('t:undotree') && t:undotree.IsVisible()) +endfunction + +function! undotree#UndotreeHide() abort + if undotree#UndotreeIsVisible() + try + call undotree#UndotreeToggle() + catch /^Vim\%((\a\+)\)\?:E11/ + echohl ErrorMsg + echom v:exception + echohl NONE + endtry + endif +endfunction + +function! undotree#UndotreeShow() abort + try + if ! undotree#UndotreeIsVisible() + call undotree#UndotreeToggle() + else + call t:undotree.SetFocus() + endif + catch /^Vim\%((\a\+)\)\?:E11/ + echohl ErrorMsg + echom v:exception + echohl NONE + endtry +endfunction + +function! undotree#UndotreeFocus() abort + if undotree#UndotreeIsVisible() + try + call t:undotree.SetFocus() + catch /^Vim\%((\a\+)\)\?:E11/ + echohl ErrorMsg + echom v:exception + echohl NONE + endtry + endif +endfunction + +" vim: set et fdm=marker sts=4 sw=4: diff --git a/home-rc/dot-files/.vim/bundle/undotree/doc/_static/undotree.png b/home-rc/dot-files/.vim/bundle/undotree/doc/_static/undotree.png new file mode 100644 index 0000000000000000000000000000000000000000..f89f4110370ab88341e239a4bebbb473ec9d9be7 GIT binary patch literal 149759 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%0A$8tx6zGG8B#ZkKS+6i_JO#03S9Lw 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 Icg(f_0WT7MMgRZ+ literal 0 HcmV?d00001 diff --git a/home-rc/dot-files/.vim/bundle/undotree/doc/undotree.txt b/home-rc/dot-files/.vim/bundle/undotree/doc/undotree.txt new file mode 100644 index 0000000..29bab25 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/undotree/doc/undotree.txt @@ -0,0 +1,480 @@ +*undotree.txt* The undo history visualizer for VIM + +Author: Ming Bai +Licence: BSD +Homepage: https://github.com/mbbill/undotree/ + +============================================================================== +CONTENTS *undotree-contents* + + 1. Intro ................................ |undotree-intro| + 2. Usage ................................ |undotree-usage| + 3. Configuration ........................ |undotree-config| + 3.1 undotree_WindowLayout .......... |undotree_WindowLayout| + 3.2 undotree_CustomUndotreeCmd...... |undotree_CustomUndotreeCmd| + undotree_CustomDiffpanelCmd..... |undotree_CustomDiffpanelCmd| + 3.3 undotree_SplitWidth ............ |undotree_SplitWidth| + 3.4 undotree_DiffpanelHeight ....... |undotree_DiffpanelHeight| + 3.5 undotree_DiffAutoOpen .......... |undotree_DiffAutoOpen| + 3.6 undotree_SetFocusWhenToggle .... |undotree_SetFocusWhenToggle| + 3.7 undotree_TreeNodeShape ......... |undotree_TreeNodeShape| + undotree_TreeVertShape ......... |undotree_TreeVertShape| + undotree_TreeSplitShape ........ |undotree_TreeSplitShape| + undotree_TreeReturnShape ....... |undotree_TreeReturnShape| + 3.8 undotree_DiffCommand ........... |undotree_DiffCommand| + 3.9 undotree_RelativeTimestamp ..... |undotree_RelativeTimestamp| + 3.10 undotree_ShortIndicators ....... |undotree_ShortIndicators| + 3.11 undotree_HighlightChangedText .. |undotree_HighlightChangedText| + 3.12 undotree_HighlightSyntaxAdd .... |undotree_HighlightSyntaxAdd| + undotree_HighlightSyntaxChange . |undotree_HighlightSyntaxChange| + 3.13 Undotree_CustomMap ............. |Undotree_CustomMap| + 3.14 undotree_HelpLine .............. |undotree_HelpLine| + 3.15 undotree_CursorLine ............ |undotree_CursorLine| + 4. Bugs ................................. |undotree-bugs| + 5. Changelog ............................ |undotree-changelog| + 6. License .............................. |undotree-license| + +============================================================================== +1. Intro *undotree-intro* + +The plug-in visualizes undo history and makes it easier to browse and switch +between different undo branches. You might wonder what are undo "branches"? +It's vim feature that allows you to go back to a state when it is overwritten +by a latest edit. For most editors, if you make a change A, then B, then go +back to A and make change C, normally you won't be able to go back to B +because undo history is linear. That's not the case for Vim because it +internally keeps all the edit history like a tree structure, and this plug-in +exposes the tree to you so that you not only can switch back and forth but +also can switch between branches. + +Some people have questions about file contents being changed when switching +between undo history states. Don't worry, undotree will NEVER save your data +or write to disk. All it does is to change the current buffer little bit, just +like those auto-completion plug-ins do. It just adds or removes something in +the buffer temporarily, and if you don't like you can always go back to the +last state easily. Let's say, you made some change but didn't save, then you +use undotree and go back to an arbitrary version, your unsaved change doesn't +get lost - it stores in the latest undo history node. Clicking that node on +undotree will bring you back instantly. Play with undo/redo on other editors +is always dangerous because when you step back and accidentally typed +something, boom! You lose your edits. But don't worry, that won't happen in +Vim. Then you might ask what if I make some changes without saving and switch +back to an old version and then exit? Well, imagine what would happen if you +don't have undotree? You lose your latest edits and the file on disk is your +last saved version. This behaviour remains the same with undotree. So, if you +saved, you won't lose anything. + +We all know that usually undo/redo is only for the current edit session. It's +stored in memory and once the process exits, the undo history is lost. +Although undotree makes switching between history states easier, it doesn't do +more than that. Sometimes it would be much safer or more convenient to keep +the undo history across edit sessions. In this case you might need to enable a +Vim feature called persistent undo. Let me explain how persistent undo works: +instead of keeping undo history in RAM, persistent undo keeps undo history in +file. Let's say you make a change A, then B, then go back to A and make change +C, then you save the file. Now Vim save the file with content state C, and in +the mean time it saves the entire undo history to a file including state A, B +and C. Next time when you open the file, Vim will also restore undo history. +So you can still go back to B. The history file is incremental, and every +change will be recorded permanently, kind of like Git. You might think that's +too much, well, undotree does provide a way to clean them up. If you need to +enable persistent undo, type :h persistent-undo or follow the instructions +below. + +Undotree is written in pure Vim script and doesn't rely on any third party +tools. It's lightweight, simple and fast. It only does what it supposed to do, +and it only runs when you need it. + +============================================================================== +2. Usage *undotree-usage* + +Use :UndotreeToggle to toggle the undo-tree panel. You may want to map this +command to whatever hotkey by adding the following line to your vimrc, take F5 +for example. +> + nnoremap :UndotreeToggle +< +Markers + + * Every change has a sequence number and it is displayed before timestamps. + + * The current state is marked as > number <. + + * The next state which will be restored by :redo or is marked as + { number }. + + * The [ number ] marks the most recent change. + + * The undo history is sorted by timestamps. + + * Saved changes are marked as s and the big S indicates the most recent + saved change. + + * Press ? in undotree window for quick help. + +Persistent undo + +Usually I would like to store the undo files in a seperate place like below. +> + if has("persistent_undo") + set undodir=$HOME."/.undodir" + set undofile + endif +< +============================================================================== +3. Configuration *undotree-config* + +------------------------------------------------------------------------------ +3.1 g:undotree_WindowLayout *undotree_WindowLayout* + +Set the undotree window layout. + +Style 1 +> + +----------+------------------------+ + | | | + | | | + | undotree | | + | | | + | | | + +----------+ | + | | | + | diff | | + | | | + +----------+------------------------+ +< +Style 2 +> + +----------+------------------------+ + | | | + | | | + | undotree | | + | | | + | | | + +----------+------------------------+ + | | + | diff | + | | + +-----------------------------------+ +< +Style 3 +> + +------------------------+----------+ + | | | + | | | + | | undotree | + | | | + | | | + | +----------+ + | | | + | | diff | + | | | + +------------------------+----------+ +< +Style 4 +> + +------------------------+----------+ + | | | + | | | + | | undotree | + | | | + | | | + +------------------------+----------+ + | | + | diff | + | | + +-----------------------------------+ +< +Default: 1 + +------------------------------------------------------------------------------ +3.2 g:undotree_CustomUndotreeCmd *undotree_CustomUndotreeCmd* + g:undotree_CustomDiffpanelCmd *undotree_CustomDiffpanelCmd* + +Set up custom window layout. + +Setting |undotree_CustomUndotreeCmd| will ignore |undotree_SplitWidth|, and +setting |undotree_CustomDiffpanelCmd| will ignore |undotree_DiffpanelHeight|. + +An |undotree_CustomUndotreeCmd| will always open the undotree window relative +to the tracked window and |undotree_CustomDiffpanelCmd| will always open the +diffpanel relative to the undotree window. + +Useful when + + * absolute positioning commands (|topleft|, |botright|) don't play well + with other plugins + + * you have a preferred split window layout and would like to use + UndoTree relative to one specific window only + +Examples: + + * To recreate Style 1: +> + let g:undotree_CustomUndotreeCmd = 'topleft vertical 30 new' + let g:undotree_CustomDiffpanelCmd = 'belowright 10 new' +< + * To recreate Style 2: +> + let g:undotree_CustomUndotreeCmd = 'topleft vertical 30 new' + let g:undotree_CustomDiffpanelCmd = 'botright 10 new' +< + * A custom layout example: +> + +------------------------+----------+ + | | | + | | w | + | | i | + | | n | + | window_1 | d | + | | o | + | | w | + | | | | + | | 2 | + | | | + +------------------------+----------+ + | | + | window_3 | + | | + +-----------------------------------+ +< + Using the following setup wouldn't mess up the current layout as it + does not use absolute positioning: +> + let g:undotree_CustomUndotreeCmd = 'vertical 32 new' + let g:undotree_CustomDiffpanelCmd= 'belowright 12 new' +< + Issuing :UndotreeToggle now in window_1 would result in: +> + +--------+---------------+----------+ + | | | | + | u | | w | + | n | | i | + | d | | n | + | o | window_1 | d | + | | | o | + +--------+ | w | + | | | | | + | diff | | 2 | + | | | | + +--------+---------------+----------+ + | | + | window_3 | + | | + +-----------------------------------+ +< + Executing :UndotreeToggle again would turn off UndoTree (independently + of which window was active at the time). Moving between window1, window_2 + and window_3 would result in showing the respective window's changelog + in the undotree panel. + + CAVEAT: To avoid the Vim's default behaviour of equalizing window sizes + when closing a window, set the 'noequalalways' option. + +------------------------------------------------------------------------------ +3.3 g:undotree_SplitWidth *undotree_SplitWidth* + +Set the undotree window width. + +Default: 30 + +------------------------------------------------------------------------------ +3.4 g:undotree_DiffpanelHeight *undotree_DiffpanelHeight* + +Set the diff window height. + +Default: 10 + +------------------------------------------------------------------------------ +3.5 g:undotree_DiffAutoOpen *undotree_DiffAutoOpen* + +Set this to 1 to auto open the diff window. + +Default: 1 + +------------------------------------------------------------------------------ +3.6 g:undotree_SetFocusWhenToggle *undotree_SetFocusWhenToggle* + +If set to 1, the undotree window will get focus after being opened, otherwise +focus will stay in current window. + +Default: 0 + +------------------------------------------------------------------------------ +3.7 g:undotree_TreeNodeShape *undotree_TreeNodeShape* + g:undotree_TreeVertShape *undotree_TreeVertShape* + g:undotree_TreeSplitShape *undotree_TreeSplitShape* + g:undotree_TreeReturnShape *undotree_TreeReturnShape* + +Set the characters used to draw the tree. Although you can put any character +you want in these shape variables, the only Unicode box drawing characters +that work well are these three. Make sure your font will render them; you can +easily see if that's the case in the last column of this table. + +Variable | Default | Unicode Box Character +---------------------------+---------------+----------------------- +g:undotree_TreeNodeShape | * | +g:undotree_TreeReturnShape | \ (backslash) | ╲ (U+2572) +g:undotree_TreeVertShape | | (pipe) | │ (U+2502) +g:undotree_TreeSplitShape | / (slash) | ╱ (U+2571) + +------------------------------------------------------------------------------ +3.8 g:undotree_DiffCommand *undotree_DiffCommand* + +Set the command used to get the diff output. + +Default: "diff" + +------------------------------------------------------------------------------ +3.9 g:undotree_RelativeTimestamp *undotree_RelativeTimestamp* + +Set to 1 to use relative timestamp. + +Default: 1 + +------------------------------------------------------------------------------ +3.10 g:undotree_ShortIndicators *undotree_ShortIndicators* + +Set to 1 to get short timestamps when |undotree_RelativeTimestamp| is also +enabled: +> + Before | After + =========================== + (5 seconds ago) | (5 s) + ----------------|---------- + (1 minute ago) | (1 m) + ----------------|---------- + (2 minutes ago) | (2 m) + ----------------|---------- + (1 hour ago) | (1 h) + ----------------|---------- + (Original) | (Orig) +< +Default: 0 + +------------------------------------------------------------------------------ +3.11 g:undotree_HighlightChangedText *undotree_HighlightChangedText* + +Set to 1 to highlight the changed text. + +Default: 1 + +------------------------------------------------------------------------------ +3.12 g:undotree_HighlightSyntaxAdd *undotree_HighlightSyntaxAdd* + g:undotree_HighlightSyntaxChange *undotree_HighlightSyntaxChange* + +Set the highlight linked syntax type. +You may chose your favorite through ":hi" command. + +Default: "DiffAdd" and "DiffChange" + +------------------------------------------------------------------------------ +3.13 g:Undotree_CustomMap *Undotree_CustomMap* + +There are two ways of changing the default key mappings: +The first way is to define global mappings as the following example: +> + nmap J UndotreeNextState + nmap K UndotreePreviousState +< +A better approach is to define the callback function g:Undotree_CustomMap(). +The function will be called after the undotree windows is initialized, so the +key mappings only works on the undotree windows. +> + function g:Undotree_CustomMap() + nmap J UndotreeNextState + nmap K UndotreePreviousState + endfunc +< +List of the commands available for redefinition. +> + UndotreeHelp + UndotreeClose + UndotreeFocusTarget + UndotreeClearHistory + UndotreeTimestampToggle + UndotreeDiffToggle + UndotreeNextState + UndotreePreviousState + UndotreeNextSavedState + UndotreePreviousSavedState + UndotreeRedo + UndotreeUndo + UndotreeEnter +< + +------------------------------------------------------------------------------ +3.14 g:undotree_HelpLine *undotree_HelpLine* + +Set to 0 to hide "Press ? for help". + +Default: 1 + +------------------------------------------------------------------------------ +3.15 g:undotree_CursorLine + +Set to 0 to disable cursorline. + +Default: 1 + +============================================================================== +4. Bugs *undotree-bugs* + +Post any issue and feature request here: +https://github.com/mbbill/undotree/issues + +============================================================================== +5. Changelog *undotree-changelog* + +Further changes will not be recorded. Please go to github page for more +information. + +4.4 (2017-10-15) + - Autoload plugin functions + +4.3 (2013-02-18) + - Several fixes and enhancements. + +4.2 (2012-11-24) + - Fixed some small issue. + +4.1 (2012-09-05) + - Enhanced tree style. + - Multi-window switching support. + +4.0 (2012-08-30) + - Live updated highlight for changed text. + - Customizable key mappings. + - Fixed some minor bugs. + +3.1 (2012-08-25) + - Add saved status. + - Add relative timestamp. + - Add ability of clear undo history. + +3.0 (2012-08-24) + - Add diff panel. + - Performance improvement. + +2.2 (2012-08-21) + - Stable version. + +2.1 (2012-08-20) + - Fixed some annoying issues. + +2.0 (2012-08-19) + - Hotkey support. + - Handle undo levels. + - Auto refresh. + - And so on. + +1.0 (2012-08-18) + - Initial upload + +============================================================================== +6. License *undotree-license* + +BSD + + vim:tw=78:ts=8:ft=help:norl: diff --git a/home-rc/dot-files/.vim/bundle/undotree/plugin/undotree.vim b/home-rc/dot-files/.vim/bundle/undotree/plugin/undotree.vim new file mode 100644 index 0000000..d3a693d --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/undotree/plugin/undotree.vim @@ -0,0 +1,186 @@ +"================================================= +" File: plugin/undotree.vim +" Description: Manage your undo history in a graph. +" Author: Ming Bai +" License: BSD + +" Avoid installing twice. +if exists('g:loaded_undotree') + finish +endif +let g:loaded_undotree = 0 + +" At least version 7.3 with 005 patch is needed for undo branches. +" Refer to https://github.com/mbbill/undotree/issues/4 for details. +" Thanks kien +if v:version < 703 + command! -n=0 -bar UndotreeToggle :echoerr "undotree.vim needs Vim version >= 7.3" + finish +endif +if (v:version == 703 && !has("patch005")) + command! -n=0 -bar UndotreeToggle :echoerr "undotree.vim needs vim7.3 with patch005 applied." + finish +endif +let g:loaded_undotree = 1 " Signal plugin availability with a value of 1. + +"================================================= +"Options: + +" Window layout +" style 1 +" +----------+------------------------+ +" | | | +" | | | +" | undotree | | +" | | | +" | | | +" +----------+ | +" | | | +" | diff | | +" | | | +" +----------+------------------------+ +" Style 2 +" +----------+------------------------+ +" | | | +" | | | +" | undotree | | +" | | | +" | | | +" +----------+------------------------+ +" | | +" | diff | +" | | +" +-----------------------------------+ +" Style 3 +" +------------------------+----------+ +" | | | +" | | | +" | | undotree | +" | | | +" | | | +" | +----------+ +" | | | +" | | diff | +" | | | +" +------------------------+----------+ +" Style 4 +" +-----------------------++----------+ +" | | | +" | | | +" | | undotree | +" | | | +" | | | +" +------------------------+----------+ +" | | +" | diff | +" | | +" +-----------------------------------+ +if !exists('g:undotree_WindowLayout') + let g:undotree_WindowLayout = 1 +endif + +" e.g. using 'd' instead of 'days' to save some space. +if !exists('g:undotree_ShortIndicators') + let g:undotree_ShortIndicators = 0 +endif + +" undotree window width +if !exists('g:undotree_SplitWidth') + if g:undotree_ShortIndicators == 1 + let g:undotree_SplitWidth = 24 + else + let g:undotree_SplitWidth = 30 + endif +endif + +" diff window height +if !exists('g:undotree_DiffpanelHeight') + let g:undotree_DiffpanelHeight = 10 +endif + +" auto open diff window +if !exists('g:undotree_DiffAutoOpen') + let g:undotree_DiffAutoOpen = 1 +endif + +" if set, let undotree window get focus after being opened, otherwise +" focus will stay in current window. +if !exists('g:undotree_SetFocusWhenToggle') + let g:undotree_SetFocusWhenToggle = 0 +endif + +" tree node shape. +if !exists('g:undotree_TreeNodeShape') + let g:undotree_TreeNodeShape = '*' +endif + +" tree vertical shape. +if !exists('g:undotree_TreeVertShape') + let g:undotree_TreeVertShape = '|' +endif + +" tree split shape. +if !exists('g:undotree_TreeSplitShape') + let g:undotree_TreeSplitShape = '/' +endif + +" tree return shape. +if !exists('g:undotree_TreeReturnShape') + let g:undotree_TreeReturnShape = '\' +endif + +if !exists('g:undotree_DiffCommand') + let g:undotree_DiffCommand = "diff" +endif + +" relative timestamp +if !exists('g:undotree_RelativeTimestamp') + let g:undotree_RelativeTimestamp = 1 +endif + +" Highlight changed text +if !exists('g:undotree_HighlightChangedText') + let g:undotree_HighlightChangedText = 1 +endif + +" Highlight changed text using signs in the gutter +if !exists('g:undotree_HighlightChangedWithSign') + let g:undotree_HighlightChangedWithSign = 1 +endif + +" Highlight linked syntax type. +" You may chose your favorite through ":hi" command +if !exists('g:undotree_HighlightSyntaxAdd') + let g:undotree_HighlightSyntaxAdd = "DiffAdd" +endif +if !exists('g:undotree_HighlightSyntaxChange') + let g:undotree_HighlightSyntaxChange = "DiffChange" +endif +if !exists('g:undotree_HighlightSyntaxDel') + let g:undotree_HighlightSyntaxDel = "DiffDelete" +endif + +" Deprecates the old style configuration. +if exists('g:undotree_SplitLocation') + echo "g:undotree_SplitLocation is deprecated, + \ please use g:undotree_WindowLayout instead." +endif + +" Show help line +if !exists('g:undotree_HelpLine') + let g:undotree_HelpLine = 1 +endif + +" Show cursorline +if !exists('g:undotree_CursorLine') + let g:undotree_CursorLine = 1 +endif + +"================================================= +" User commands. +command! -n=0 -bar UndotreeToggle :call undotree#UndotreeToggle() +command! -n=0 -bar UndotreeHide :call undotree#UndotreeHide() +command! -n=0 -bar UndotreeShow :call undotree#UndotreeShow() +command! -n=0 -bar UndotreeFocus :call undotree#UndotreeFocus() + +" vim: set et fdm=marker sts=4 sw=4: diff --git a/home-rc/dot-files/.vim/bundle/undotree/syntax/undotree.vim b/home-rc/dot-files/.vim/bundle/undotree/syntax/undotree.vim new file mode 100644 index 0000000..067e5be --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/undotree/syntax/undotree.vim @@ -0,0 +1,37 @@ +"================================================= +" File: undotree.vim +" Description: undotree syntax +" Author: Ming Bai +" License: BSD + +execute "syn match UndotreeNode ' \\zs".escape(g:undotree_TreeNodeShape,'*')."\\ze '" +execute "syn match UndotreeNodeCurrent '\\zs".escape(g:undotree_TreeNodeShape,'*')."\\ze.*>\d\+<'" +syn match UndotreeTimeStamp '(.*)$' +syn match UndotreeFirstNode 'Original' +execute "syn match UndotreeBranch '[".escape(g:undotree_TreeVertShape.g:undotree_TreeSplitShape.g:undotree_TreeReturnShape,'\')."]'" +syn match UndotreeSeq ' \zs\d\+\ze ' +syn match UndotreeCurrent '>\d\+<' +syn match UndotreeNext '{\d\+}' +syn match UndotreeHead '\[\d\+]' +syn match UndotreeHelp '^".*$' contains=UndotreeHelpKey,UndotreeHelpTitle +syn match UndotreeHelpKey '^" \zs.\{-}\ze:' contained +syn match UndotreeHelpTitle '===.*===' contained +syn match UndotreeSavedSmall ' \zss\ze ' +syn match UndotreeSavedBig ' \zsS\ze ' + +hi def link UndotreeNode Question +hi def link UndotreeNodeCurrent Statement +hi def link UndotreeTimeStamp Function +hi def link UndotreeFirstNode Function +hi def link UndotreeBranch Constant +hi def link UndotreeSeq Comment +hi def link UndotreeCurrent Statement +hi def link UndotreeNext Type +hi def link UndotreeHead Identifier +hi def link UndotreeHelp Comment +hi def link UndotreeHelpKey Function +hi def link UndotreeHelpTitle Type +hi def link UndotreeSavedSmall WarningMsg +hi def link UndotreeSavedBig MatchParen + +" vim: set et fdm=marker sts=4 sw=4: diff --git a/home-rc/dot-files/.vim/bundle/vim-bufferline/.gitignore b/home-rc/dot-files/.vim/bundle/vim-bufferline/.gitignore new file mode 100644 index 0000000..926ccaa --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-bufferline/.gitignore @@ -0,0 +1 @@ +doc/tags diff --git a/home-rc/dot-files/.vim/bundle/vim-bufferline/LICENSE b/home-rc/dot-files/.vim/bundle/vim-bufferline/LICENSE new file mode 100644 index 0000000..4697735 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-bufferline/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (C) 2013 Bailey Ling + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE +OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/home-rc/dot-files/.vim/bundle/vim-bufferline/README.md b/home-rc/dot-files/.vim/bundle/vim-bufferline/README.md new file mode 100644 index 0000000..712226b --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-bufferline/README.md @@ -0,0 +1,38 @@ +# vim-bufferline + +Super simple vim plugin to show the list of buffers in the command bar. + +# screenshots + +#### in the statusline + +![img](img/bufferline-status.png) + +#### or the command bar + +![img](img/bufferline-command.png) + +# configuration + +`:help bufferline` + +# installation + +* [pathogen](https://github.com/tpope/vim-pathogen) + * `git clone https://github.com/bling/vim-bufferline ~/.vim/bundle/vim-bufferline` +* [neobundle](https://github.com/Shougo/neobundle.vim) + * `NeoBundle 'bling/vim-bufferline'` +* [vundle](https://github.com/gmarik/vundle) + * `Plugin 'bling/vim-bufferline'` +* [vam](https://github.com/MarcWeber/vim-addon-manager) + * `call vam#ActivateAddons([ 'vim-bufferline' ])` +* [vim-plug](https://github.com/junegunn/vim-plug) + * `Plug 'bling/vim-bufferline'` + +# credits + +This was inspired by the [buftabs](http://www.vim.org/scripts/script.php?script_id=1664) script. + +# license + +MIT License. Copyright (c) 2013 Bailey Ling. diff --git a/home-rc/dot-files/.vim/bundle/vim-bufferline/autoload/bufferline.vim b/home-rc/dot-files/.vim/bundle/vim-bufferline/autoload/bufferline.vim new file mode 100644 index 0000000..9be66c9 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-bufferline/autoload/bufferline.vim @@ -0,0 +1,130 @@ +" keep track of vimrc setting +let s:updatetime = &updatetime + +" keep track of scrollinf window start +let s:window_start = 0 + +function! s:generate_names() + let names = [] + let i = 1 + let last_buffer = bufnr('$') + let current_buffer = bufnr('%') + while i <= last_buffer + if bufexists(i) && buflisted(i) + let modified = ' ' + if getbufvar(i, '&mod') + let modified = g:bufferline_modified + endif + let fname = fnamemodify(bufname(i), g:bufferline_fname_mod) + if g:bufferline_pathshorten != 0 + let fname = pathshorten(fname) + endif + let fname = substitute(fname, "%", "%%", "g") + + let skip = 0 + for ex in g:bufferline_excludes + if match(fname, ex) > -1 + let skip = 1 + break + endif + endfor + + if !skip + let name = '' + if g:bufferline_show_bufnr != 0 && g:bufferline_status_info.count >= g:bufferline_show_bufnr + let name = i . ':' + endif + let name .= fname . modified + + if current_buffer == i + let name = g:bufferline_active_buffer_left . name . g:bufferline_active_buffer_right + let g:bufferline_status_info.current = name + else + let name = g:bufferline_separator . name . g:bufferline_separator + endif + + call add(names, [i, name]) + endif + endif + let i += 1 + endwhile + + if len(names) > 1 + if g:bufferline_rotate == 1 + call bufferline#algos#fixed_position#modify(names) + endif + endif + + return names +endfunction + +function! bufferline#get_echo_string() + " check for special cases like help files + let current = bufnr('%') + if !bufexists(current) || !buflisted(current) + return bufname('%') + endif + + let names = s:generate_names() + let line = '' + for val in names + let line .= val[1] + endfor + + let index = match(line, '\V'.g:bufferline_status_info.current) + let g:bufferline_status_info.count = len(names) + let g:bufferline_status_info.before = strpart(line, 0, index) + let g:bufferline_status_info.after = strpart(line, index + len(g:bufferline_status_info.current)) + return line +endfunction + +function! s:echo() + if &filetype ==# 'unite' + return + endif + + let line = bufferline#get_echo_string() + + " 12 is magical and is the threshold for when it doesn't wrap text anymore + let width = &columns - 12 + if g:bufferline_rotate == 2 + let current_buffer_start = stridx(line, g:bufferline_active_buffer_left) + let current_buffer_end = stridx(line, g:bufferline_active_buffer_right) + if current_buffer_start < s:window_start + let s:window_start = current_buffer_start + endif + if current_buffer_end > (s:window_start + width) + let s:window_start = current_buffer_end - width + 1 + endif + let line = strpart(line, s:window_start, width) + else + let line = strpart(line, 0, width) + endif + + echo line + + if &updatetime != s:updatetime + let &updatetime = s:updatetime + endif +endfunction + +function! s:cursorhold_callback() + call s:echo() + autocmd! bufferline CursorHold +endfunction + +function! s:refresh(updatetime) + let &updatetime = a:updatetime + autocmd bufferline CursorHold * call s:cursorhold_callback() +endfunction + +function! bufferline#init_echo() + augroup bufferline + au! + + " events which output a message which should be immediately overwritten + autocmd BufWinEnter,WinEnter,InsertLeave,VimResized * call s:refresh(1) + augroup END + + autocmd CursorHold * call s:echo() +endfunction diff --git a/home-rc/dot-files/.vim/bundle/vim-bufferline/autoload/bufferline/algos/fixed_position.vim b/home-rc/dot-files/.vim/bundle/vim-bufferline/autoload/bufferline/algos/fixed_position.vim new file mode 100644 index 0000000..ba33757 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-bufferline/autoload/bufferline/algos/fixed_position.vim @@ -0,0 +1,9 @@ +" pins the active buffer to a specific index in the list +function! bufferline#algos#fixed_position#modify(names) + let current = bufnr('%') + while a:names[g:bufferline_fixed_index][0] != current + let first = remove(a:names, 0) + call add(a:names, first) + endwhile +endfunction + diff --git a/home-rc/dot-files/.vim/bundle/vim-bufferline/doc/bufferline.txt b/home-rc/dot-files/.vim/bundle/vim-bufferline/doc/bufferline.txt new file mode 100644 index 0000000..f5b5dcd --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-bufferline/doc/bufferline.txt @@ -0,0 +1,119 @@ +*bufferline.txt* Simple plugin for generating buffer list names + +============================================================================== +INTRODUCTION *bufferline* + +vim-bufferline is a simple plugin that helps you keep track of all your open +buffers. It also integrates nicely with vim-airline. + +============================================================================== +CONFIGURATION *bufferline-configuration* + +There are a couple configuration values available (shown with their default +values): + +* denotes whether bufferline should automatically echo to the command bar +> + let g:bufferline_echo = 1 +< + +* the separator used on the left side of a buffer +> + let g:bufferline_active_buffer_left = '[' +< + +* the separator used on the right side of a buffer +> + let g:bufferline_active_buffer_right = ']' +< + +* the symbol to denote that a buffer is modified +> + let g:bufferline_modified = '+' +< + +* denotes whether buffer numbers should be displayed +> + let g:bufferline_show_bufnr = 1 +< + +* denotes whether the bufferline should have rotation applied +> + " default, no rotate, no scrolling + let g:bufferline_rotate = 0 + + " scrolling with fixed current buffer position + let g:bufferline_rotate = 1 + + " scrolling without fixed current buffer position + let g:bufferline_rotate = 2 +< + +* only valid when `g:bufferline_rotate` is set to 1: +> + let g:bufferline_fixed_index = 0 "always first + let g:bufferline_fixed_index = 1 "always second (default) + let g:bufferline_fixed_index = -1 "always last +< + +* denotes how to display the filename of a buffer (see |filename-modifiers| + for more details) +> + let g:bufferline_fname_mod = ':t' +< + +* denotes the highlight group for inactive buffers when used in the + |statusline| +> + let g:bufferline_inactive_highlight = 'StatusLineNC' +< + +* denotes the highlight group for the active buffer when used in the + |statusline| +> + let g:bufferline_active_highlight = 'StatusLine' +< + +* denotes whether the active highlight should be used when there is only one + buffer. +> + let g:bufferline_solo_highlight = 0 +< + +* denotes any exclude patterns. +> + let g:bufferline_excludes = [] "see source for defaults +< + +* denotes whether paths in buffer names should be |pathshorten()|-ed. +> + let g:bufferline_pathshorten = 0 +< + +============================================================================== +STATUSLINE INTEGRATION *bufferline-statusline* + +> + let g:bufferline_echo = 0 + autocmd VimEnter * + \ let &statusline='%{bufferline#refresh_status()}' + \ .bufferline#get_status_string() +< + +The function refresh_status() returns an empty string and only exists to +populate some global variables. Since it is inside an %{} block, the +variables will get updated whenever the statusline needs to be drawn. +get_status_string() creates a string which references these variables. + +============================================================================== +CONTRIBUTIONS *bufferline-contributions* + +Contributions and pull requests are welcome. + +============================================================================== +LICENSE *bufferline-license* + +MIT License. Copyright © 2013 Bailey Ling. + + + vim:tw=78:ts=8:ft=help:norl: diff --git a/home-rc/dot-files/.vim/bundle/vim-bufferline/img/bufferline-command.png b/home-rc/dot-files/.vim/bundle/vim-bufferline/img/bufferline-command.png new file mode 100644 index 0000000000000000000000000000000000000000..764ecc455150925fd5531664dadf4e5ef5beb9c6 GIT binary patch literal 1560 zcmZuxdo&Yz9RINvhUPG0gi3|9=KWYpo9E=M$0|Jt(af~1NTnLfEAN=fTcW%h^S()W z6)IdEujyWsFvJvjb=SG4d+t5w{_*{OKcDaUp7S~9d(P(*%aafK^ywe!~({cb(uEBAxV6 z&(&z971QbG{BDX@EWk8_~f;Te0F!p@m`*cP{Lv2mD7yvud8yZbk zU#f0w6il@*%*9l5qySpfNf$W7VWQw`w)(%o+YT*oXdfR3vQ-hAz!dKPfs0J&2ppt* znGOYo5e15%Q0$lfKOo}l666qe&jbKfD#;9;+03j|Rw)4b;MZlFc6-E7LBYh2MfOR> zu)x|ie;rg&{xY4S6I7HkXg+$qU0GVv&A&)8WPYK4V2;vw#9&*=F-`HNPG@MMKSlpX z>!blRwMAG)vH;Cy@HWo43pS+maJck25osOd|pK*x{qG`GG3WdmEzrSL^???e? zxwy&EFwiu7=szFaXqIVm`MAMt9bRV2^Z4^`s%M(z;}Vy$ehd9hpM@nqBmP+4a5!j# zUGwk~-OLBv*NW^&0pZZIqK`q{IXA<|Bd33p_c z=Dc~`r)*df|d*a!QoPPGufHo-p0@<_gU~(ya3ytfvgQUDHKSQBAgNjFidbYM+%L~ERfM_#qdq=f+4zlcf>o{qKgC{fj=!n=bzKMC5cGe=-nrgx8S^Q&0j~c*VN62lqGi$+^ z>maiC9#=5f2JKiil^@%$r9Uuqxg)&l`Gu(h<=1(SApUAA)(Qsnj^3~A3WRnfeQ-+~ zvYz}+No>FcXV1PN80fv$dewX7%M~S4xl9U&Xa$}wEY#VCzf}HN8x6C^w5%^A)_IvWFm(Fo zgCR>))Z~bc)Tk;e*U!BeGp3z=^Oll)%(~PywGg=HVEn5cqKPVLShPie)iM{zNaP=49rTc@>Z zcgsCn&CUIYvFqD@e^(2}Cw=ZRK~AgJ$8;T{ax|fQsXqYamPh8yACQeHe&5$W%>LV3 ziPfG?r7B+TI0mS2m7`@T{v6{k@wd*( literal 0 HcmV?d00001 diff --git a/home-rc/dot-files/.vim/bundle/vim-bufferline/img/bufferline-status.png b/home-rc/dot-files/.vim/bundle/vim-bufferline/img/bufferline-status.png new file mode 100644 index 0000000000000000000000000000000000000000..5e18823cc0370f90f3da81e96b0f704cf84a35e8 GIT binary patch literal 1467 zcmZ{kc{tPw7{`A~=CBx)Gnrh2-Nl6HnZb_5%*c>&778PB{akjO(Kac5%yK)UZ+iE$#T z14K)eSX<9nmx#bvieL0a;EZ2zc&ve=tt*^tY+!1DG&0(XE(d@^`gj|RYy5fMe2>#C z?l31xcyFm==9T_KE)-Jn;|mSiRP8BeSk;z|R^2qA=i(_9U0Cz1gfRYnWE;&uh8~8L!5$p*1TlbQpWJ`f3nG7ezpzEns*M*v= zSbOVlT&5(FmFEV422BhwbsG-+iGu-TQJ&2p0S*3A2cBe$i}_-y|GJ|J;d^8&Kr@N0 zo~%Ye{*(LmR}CVHEv$ijDO(`&@B-+EB=M>5QFq{o3+ij#NjFu~wH3zSZq}F8uQ^){ zrV%riaweBF!VjNCckYyJvxpI=PlnI<@WwVc~%S^Mt!CJ>wP0;ze)7%FNA;EMwC9XB0DRHEp@R9(7Fr7WMR9hKn%xKN( zqr1g{T0_|Q7;3SPnIgYu>FXx6h6z`yVSpTj-uCy6vlJSE;oj-RFV@_ehnqO0s>bbiP zu+O{qyi$e|k9U6dG~<>!!kl);>M`v;+wMPEy0fmZ&vGBTEYr1r{esrsNFNU~iVQI} z?rFz3WIHnv%rG+yi}Z}$kW+AwcxSTJ>z2%Q)I6$TLpd($S*`n4)b59J^zFA{%tc*H z*rwqGQ6Dqo_EYzwTL9RnFC4L5f{x0Hz|(}xhY2M*rCZ+XzfIBHQ zbES({{Gal>Kv9|%9=W}785x7*`Ra^@rJ%vS&JS~0%V|R$dghFHO-&G5R$)FJSQx5oWI{WiBHJ8Ywoy=#{5yZ(q=9xR>M`<ls#d#rROFp2n zwkX^{g@vr5&kZ!EHANXk&Nr_dYA^Mz>s%>QVmLTC3?pz>U#`5RSBL1uEw~hV``>u; z>S50jcCZXv%^|fv$7|suk*Q$0V*CkPNqSDn6OgfMjB&H<(Mt@795gy!{&kjoz+Mn? zl^543RI$N@WhEv0OWn_oX`ZE1a4?IWiDVs)?zFs1;7d5jL1$bdHO7A{nYZE*?oZaUqJaA9RI@`;d&C_&f)AI^e0;^>tuoHBDMl}TSuEZYhUVL<}smS literal 0 HcmV?d00001 diff --git a/home-rc/dot-files/.vim/bundle/vim-bufferline/plugin/bufferline.vim b/home-rc/dot-files/.vim/bundle/vim-bufferline/plugin/bufferline.vim new file mode 100644 index 0000000..24c05cc --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-bufferline/plugin/bufferline.vim @@ -0,0 +1,61 @@ +if exists('g:loaded_bufferline') + finish +endif +let g:loaded_bufferline = 1 + +function! s:check_defined(variable, default) + if !exists(a:variable) + let {a:variable} = a:default + endif +endfunction + +call s:check_defined('g:bufferline_active_buffer_left', '[') +call s:check_defined('g:bufferline_active_buffer_right', ']') +call s:check_defined('g:bufferline_separator', ' ') +call s:check_defined('g:bufferline_modified', '+') +call s:check_defined('g:bufferline_echo', 1) +call s:check_defined('g:bufferline_show_bufnr', 1) +call s:check_defined('g:bufferline_fname_mod', ':t') +call s:check_defined('g:bufferline_inactive_highlight', 'StatusLineNC') +call s:check_defined('g:bufferline_active_highlight', 'StatusLine') +call s:check_defined('g:bufferline_rotate', 0) +call s:check_defined('g:bufferline_fixed_index', 1) +call s:check_defined('g:bufferline_solo_highlight', 0) +call s:check_defined('g:bufferline_excludes', ['\[vimfiler\]']) +call s:check_defined('g:bufferline_pathshorten', 0) + +function! bufferline#generate_string() + return "bufferline#generate_string() is obsolete! Please consult README." +endfunction + +let g:bufferline_status_info = { + \ 'count': 0, + \ 'before': '', + \ 'current': '', + \ 'after': '', + \ } + +function! bufferline#refresh_status() + if g:bufferline_solo_highlight + if g:bufferline_status_info.count == 1 + exec printf('highlight! link %s %s', g:bufferline_active_highlight, g:bufferline_inactive_highlight) + else + exec printf('highlight! link %s NONE', g:bufferline_active_highlight) + endif + endif + call bufferline#get_echo_string() + return '' +endfunction +function! bufferline#get_status_string() + return + \ '%#'.g:bufferline_inactive_highlight.'#' + \.'%{g:bufferline_status_info.before}' + \.'%#'.g:bufferline_active_highlight.'#' + \.' %{g:bufferline_status_info.current} ' + \.'%#'.g:bufferline_inactive_highlight.'#' + \.'%{g:bufferline_status_info.after}' +endfunction + +if g:bufferline_echo + call bufferline#init_echo() +endif diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/.github/FUNDING.yml b/home-rc/dot-files/.vim/bundle/vim-easymotion/.github/FUNDING.yml new file mode 100644 index 0000000..9289537 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/.github/FUNDING.yml @@ -0,0 +1,12 @@ +# These are supported funding model platforms + +github: [haya14busa] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/.github/workflows/reviewdog.yml b/home-rc/dot-files/.vim/bundle/vim-easymotion/.github/workflows/reviewdog.yml new file mode 100644 index 0000000..c5f6acf --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/.github/workflows/reviewdog.yml @@ -0,0 +1,36 @@ +name: reviewdog +on: + push: + branches: + - master + pull_request: + +jobs: + vint: + name: runner / vint + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: reviewdog/action-vint@v1 + if: github.event_name == 'pull_request' + with: + github_token: ${{ secrets.github_token }} + reporter: github-pr-check + level: warning + - uses: reviewdog/action-vint@v1 + if: github.event_name != 'pull_request' + with: + github_token: ${{ secrets.github_token }} + reporter: github-check + level: warning + + languagetool: + name: runner / languagetool + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: reviewdog/action-languagetool@v1 + with: + github_token: ${{ secrets.github_token }} + reporter: github-check + level: info diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/.gitignore b/home-rc/dot-files/.vim/bundle/vim-easymotion/.gitignore new file mode 100644 index 0000000..5d0b4ff --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/.gitignore @@ -0,0 +1,4 @@ +doc/tags +tmp* +*.lock +.vim-flavor diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/.travis.yml b/home-rc/dot-files/.vim/bundle/vim-easymotion/.travis.yml new file mode 100644 index 0000000..ae7ddc6 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/.travis.yml @@ -0,0 +1,31 @@ +# This config is based on lightline.vim + +language: ruby +rvm: + - 2.0.0 +install: + - git clone https://github.com/kana/vim-vspec.git +before_script: + - bundle install + - bundle show + - (if ! test -d $HOME/vim-$VIM_VERSION/bin; then + git clone https://github.com/vim/vim $HOME/vim && + cd $HOME/vim && + git checkout v$VIM_VERSION && + ./configure --prefix=$HOME/vim-$VIM_VERSION && + make && + make install; + fi) + +cache: + directories: + - $HOME/vim-$VIM_VERSION + +env: + - VIM_VERSION=8.0.0000 + - VIM_VERSION=7.4 + +script: + - export PATH=$HOME/vim-$VIM_VERSION/bin:$PATH + - cd $TRAVIS_BUILD_DIR + - rake ci diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/Gemfile b/home-rc/dot-files/.vim/bundle/vim-easymotion/Gemfile new file mode 100644 index 0000000..8e36a7b --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/Gemfile @@ -0,0 +1,4 @@ +source 'https://rubygems.org' + +gem 'vim-flavor', '~> 2.2.2' +gem 'rake' diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/README.md b/home-rc/dot-files/.vim/bundle/vim-easymotion/README.md new file mode 100644 index 0000000..7077030 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/README.md @@ -0,0 +1,406 @@ +Vim motion on speed! +===== +[![Build Status](https://travis-ci.org/easymotion/vim-easymotion.svg?branch=master)](https://travis-ci.org/easymotion/vim-easymotion) +[![reviewdog](https://github.com/easymotion/vim-easymotion/workflows/reviewdog/badge.svg?branch=master&event=push)](https://github.com/easymotion/vim-easymotion/actions?query=workflow%3Areviewdog+event%3Apush+branch%3Amaster) + +![Animated demonstration](https://f.cloud.github.com/assets/3797062/2039359/a8e938d6-899f-11e3-8789-60025ea83656.gif) + +About the authors +===== + +| Authors | | +|------------------|-------------------------------| +| Kim Silkebækken | https://github.com/Lokaltog | +| haya14busa | https://github.com/haya14busa | + +The EasyMotion project, revived! +====== + +Starting from version 2.0 [haya14busa](https://github.com/haya14busa) will be +taking over the project from [Lokaltog](https://github.com/Lokaltog). He's +improved the default motions, implemented many useful new features, and fixed +some bugs. + +EasyMotion is now completely: + +- **Well-behaved**: It's consistent with the default motions of Vim and works + well in all modes. And it now supports repeating with the dot operator. +- **Configurable**: You can easily configure its behavior and map it to any key +- **Sophisticated**: Provide flawless, smooth and fast motions with minimal keystrokes + +Even though some default behaviors were modified and many new features were +added, I carefully considered backward compatibility. So those of you updating +from older versions can do so without worry and start benefiting immediately +from all the new features! + +Introduction +===== + +EasyMotion provides a much simpler way to use some motions in vim. It +takes the `` out of `w` or `f{char}` by +highlighting all possible choices and allowing you to press one key to +jump directly to the target. + +When one of the available motions is triggered, all visible text +preceding or following the cursor is faded, and motion targets are +highlighted. + +EasyMotion is triggered by the provided mappings. This readme only covers the +basics; please refer to +[`:help easymotion.txt`](https://github.com/easymotion/vim-easymotion/blob/master/doc/easymotion.txt#L86) +to see all the available mappings. + +Important notes +===== + +### Default bindings + +**The default leader has been changed to `` to avoid +conflicts with other plugins you may have installed.** This can easily be +changed back to pre-1.3 behavior by rebinding the leader in your vimrc: + +```vim +map (easymotion-prefix) +``` + +All motions will then be triggered with `` by default, e.g. +`s`, `gE`. + +### For users of the forked version + +SelectLines and SelectPhrase are not actually *motions*, so I've moved them into +separate plugins. + +- https://github.com/haya14busa/vim-easyoperator-line +- https://github.com/haya14busa/vim-easyoperator-phrase + +Usage example for the base features +===== + + Lorem ipsum dolor sit amet. + +Type `w`(`(easymotion-w)`) to trigger the word motion `w`. +When the motion is triggered, the text is updated (no braces are actually added, +the text is highlighted in red by default): + + Lorem {a}psum {b}olor {c}it {d}met. + +Press `c` to jump to the beginning of the word "sit": + + Lorem ipsum dolor sit amet. + +Similarly, if you're looking for an "o", you can use the `f` motion. +Type `fo`, and all "o" characters are highlighted: + + L{a}rem ipsum d{b}l{c}r sit amet. + +Press `b` to jump to the second "o": + + Lorem ipsum dolor sit amet. + +Jeffrey Way of Nettuts+ has also [written +a tutorial](https://code.tutsplus.com/tutorials/vim-essential-plugin-easymotion--net-19223) +about EasyMotion. + +New features in version 3.0 +==== + +### Overwin motions +![](https://raw.githubusercontent.com/haya14busa/i/2753bd4dd1dfdf5962dbdbffabf24244e4e14243/easymotion/overwin-motions.gif) + +EasyMotion now supports moving cursor across/over window. +Since it doesn't make sense that moving cursor to other window while Visual or +Operator-pending mode, overwin motions only provides mappings for Normal +mode. Please use `nmap` to use overwin motions. Overwin motions only +supports bi-directional motions. + +#### Example configuration + +```vim +" f{char} to move to {char} +map f (easymotion-bd-f) +nmap f (easymotion-overwin-f) + +" s{char}{char} to move to {char}{char} +nmap s (easymotion-overwin-f2) + +" Move to line +map L (easymotion-bd-jk) +nmap L (easymotion-overwin-line) + +" Move to word +map w (easymotion-bd-w) +nmap w (easymotion-overwin-w) +``` + +#### Integration with incsearch.vim +- [haya14busa/incsearch.vim](https://github.com/haya14busa/incsearch.vim) +- [haya14busa/incsearch-easymotion.vim](https://github.com/haya14busa/incsearch-easymotion.vim) + +```vim +" You can use other keymappings like instead of if you want to +" use these mappings as default search and sometimes want to move cursor with +" EasyMotion. +function! s:incsearch_config(...) abort + return incsearch#util#deepextend(deepcopy({ + \ 'modules': [incsearch#config#easymotion#module({'overwin': 1})], + \ 'keymap': { + \ "\": '(easymotion)' + \ }, + \ 'is_expr': 0 + \ }), get(a:, 1, {})) +endfunction + +noremap / incsearch#go(incsearch_config()) +noremap ? incsearch#go(incsearch_config({'command': '?'})) +noremap g/ incsearch#go(incsearch_config({'is_stay': 1})) +``` + +### Bonus fuzzy-search with EasyMotion + +![](https://raw.githubusercontent.com/haya14busa/i/eab1d12a8bd322223d551956a4fd8a21d5c4bfe9/easymotion/fuzzy-incsearch-easymotion.gif) + +- [haya14busa/incsearch.vim](https://github.com/haya14busa/incsearch.vim) +- [haya14busa/incsearch-fuzzy.vim](https://github.com/haya14busa/incsearch-fuzzy.vim) +- [haya14busa/incsearch-easymotion.vim](https://github.com/haya14busa/incsearch-easymotion.vim) + +```vim +function! s:config_easyfuzzymotion(...) abort + return extend(copy({ + \ 'converters': [incsearch#config#fuzzyword#converter()], + \ 'modules': [incsearch#config#easymotion#module({'overwin': 1})], + \ 'keymap': {"\": '(easymotion)'}, + \ 'is_expr': 0, + \ 'is_stay': 1 + \ }), get(a:, 1, {})) +endfunction + +noremap / incsearch#go(config_easyfuzzymotion()) +``` + +New features in version 2.0 +==== + +### Two key highlighting + +When EasyMotion runs out of single characters to highlight movement targets, it +immediately shows you the keys you have to press. + +In previous versions you could not see the next character you would need to +press until you entered the first one. This made movement over long distances +less fluid. Now you can see at a glance exactly which characters to select to +get to your destination. + +### Bidirectional motions + +All motions now come in bidirectional variants (e.g. `(easymotion-s)`, +`(easymotion-bd-w)` and so forth). +By default, you can already jump forward or backward with `s`. A useful +trick is to map `nmap s (easymotion-s)` to use `s` instead and save one +keystroke! + +### 2-character search motion + +You can now also perform a 2-character search, similar to [vim-seek](https://github.com/goldfeld/vim-seek)/[vim-sneak](https://github.com/justinmk/vim-sneak) with `(easymotion-s2)`. For example, you can highlight all words that start with `fu`. + +![2-key-find-motion](https://f.cloud.github.com/assets/3797062/2039612/7cafcec8-89a5-11e3-8f2c-5f26a6b83efd.gif) + +```vim +" Gif config +nmap s (easymotion-s2) +nmap t (easymotion-t2) +``` + +### n-character search motion + +You can also search for `n` characters, which can be used to replace the default search of Vim. +It supports incremental highlighting and you can use `` and `` to scroll down/up a page. If you press +``, you get the usual EasyMotion highlighting and can jump to any matching target destination with a +single keystroke. + +What sounds complicated should become clear if you look at the following examples. + +![n-key-motion-scroll](https://f.cloud.github.com/assets/3797062/2039254/4fbf7276-899e-11e3-9bf3-1e446cabc097.gif) + +![replace-search](https://f.cloud.github.com/assets/3797062/2039751/64b72bd8-89a8-11e3-80ea-2a6b578040b2.gif) + +```vim +" Gif config +map / (easymotion-sn) +omap / (easymotion-tn) + +" These `n` & `N` mappings are options. You do not have to map `n` & `N` to EasyMotion. +" Without these mappings, `n` & `N` works fine. (These mappings just provide +" different highlight method and have some other features ) +map n (easymotion-next) +map N (easymotion-prev) +``` + +### Within line motion + +Every motion also has variants that are restricted to just the current line +(e.g. `(easymotion-sl)`, `(easymotion-bd-wl)`, etc...). This can be +helpful if you find the full search distracting or slows down vim. + +### hjkl motions + +EasyMotion can be configured to avoid repetitive use of the `h` `j` `k` and +`l` keys. + +![hjkl-motion](https://f.cloud.github.com/assets/3797062/2039413/d8b32ab2-89a0-11e3-894f-3e81db084cfd.gif) + +```vim +" Gif config +map l (easymotion-lineforward) +map j (easymotion-j) +map k (easymotion-k) +map h (easymotion-linebackward) + +let g:EasyMotion_startofline = 0 " keep cursor column when JK motion +``` + +### Smartcase & Smartsign + +This setting makes EasyMotion work similarly to Vim's `smartcase` option for +global searches. + +```vim +let g:EasyMotion_smartcase = 1 +``` + +With this option set, `v` will match both `v` and `V`, but `V` will match `V` +only. Default: 0. + +```vim +let g:EasyMotion_use_smartsign_us = 1 " US layout +" or +let g:EasyMotion_use_smartsign_jp = 1 " JP layout +``` + +This applies the same concept, but for symbols and numerals. `1` will match `1` +and `!`; `!` matches `!` only. Default: 0. + + +### Migemo feature (for Japanese user) + +```vim +let g:EasyMotion_use_migemo = 1 +``` + + +Easymotion can match multibyte Japanese characters with alphabetical input. +For example, `sa` can search 'あ'. +This feature doesn't require cmigemo because Easymotion includes regex +patterns generated by cmigemo. However, installing `cmigemo` will make +2-character and n-character search motions to also support the migemo feature. +Default:0 + + +### Repeat motions + +#### Repeat the last motion + +`(easymotion-repeat)` + +#### Repeat the last find motion + +In a find motion (e.g. `(easymotion-s)`), type `` without +input characters to find the last motion again. + +#### Jump to next/previous match (even on next/previous page) + +* `(easymotion-next)` +* `(easymotion-prev)` + +#### Support for dot repeat + +This requires https://github.com/tpope/vim-repeat. + +You can use EasyMotion with operators and press `.` to repeat! +It is well-behaved and consistent with the default behavior of Vim. + +![repeat-motion](https://f.cloud.github.com/assets/3797062/2039538/0aef66aa-89a4-11e3-8242-c27a5208cfca.gif) + +```vim +" Gif config + +" Require tpope/vim-repeat to enable dot repeat support +" Jump to anywhere with only `s{char}{target}` +" `s` repeat last find motion. +nmap s (easymotion-s) +" Bidirectional & within line 't' motion +omap t (easymotion-bd-tl) +" Use uppercase target labels and type as a lower case +let g:EasyMotion_use_upper = 1 + " type `l` and match `l`&`L` +let g:EasyMotion_smartcase = 1 +" Smartsign (type `3` and match `3`&`#`) +let g:EasyMotion_use_smartsign_us = 1 +``` + + +Installation +------------ +### Pathogen (https://github.com/tpope/vim-pathogen) +``` +git clone https://github.com/easymotion/vim-easymotion ~/.vim/bundle/vim-easymotion +``` + +### Vundle (https://github.com/gmarik/vundle) +``` +Plugin 'easymotion/vim-easymotion' +``` + +### NeoBundle (https://github.com/Shougo/neobundle.vim) +``` +NeoBundle 'easymotion/vim-easymotion' +``` + +### Vim-Plug (https://github.com/junegunn/vim-plug) +``` +Plug 'easymotion/vim-easymotion' +``` + +### Vim8 Native Plugin Manager (https://vimhelp.org/repeat.txt.html#packages) +``` +git clone https://github.com/easymotion/vim-easymotion.git ~/.vim/pack/plugins/start/vim-easymotion +``` + +Minimal Configuration Tutorial +------------------------------ +**I recommend configuring and map keys by yourself if you are true Vimmer.** + +**Please do not be satisfied with just installing vim-easymotion, configuring it yourself boost your productivity more and more!** + +Default `` prefix isn't easy to press, and I leave them just for backwards compatibility. +You should at least change the prefix key like this `map (easymotion-prefix)` + +Minimal but useful vimrc example: + +```vim +let g:EasyMotion_do_mapping = 0 " Disable default mappings + +" Jump to anywhere you want with minimal keystrokes, with just one key binding. +" `s{char}{label}` +nmap s (easymotion-overwin-f) +" or +" `s{char}{char}{label}` +" Need one more keystroke, but on average, it may be more comfortable. +nmap s (easymotion-overwin-f2) + +" Turn on case-insensitive feature +let g:EasyMotion_smartcase = 1 + +" JK motions: Line motions +map j (easymotion-j) +map k (easymotion-k) +``` +Now, all you need to remember is `s` and JK motions bindings, and it's good enough to boost your cursor speed! + +**`s`** is bidirectional find motion, you can move to anywhere with it. + +**`j`** & **`k`** make it easy to move to the lines. + +Of course, you can use any key you want instead of `s` such as ``, `s`, etc... + +If you want to use more useful mappings, please see [:h easymotion.txt](https://github.com/easymotion/vim-easymotion/blob/master/doc/easymotion.txt) for more detail. diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/Rakefile b/home-rc/dot-files/.vim/bundle/vim-easymotion/Rakefile new file mode 100644 index 0000000..63a3a36 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/Rakefile @@ -0,0 +1,11 @@ +#!/usr/bin/env rake + +task :ci => [:dump, :test] + +task :dump do + sh 'vim --version' +end + +task :test do + sh 'bundle exec vim-flavor test' +end diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/EasyMotion.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/EasyMotion.vim new file mode 100644 index 0000000..2a47223 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/EasyMotion.vim @@ -0,0 +1,1610 @@ +scriptencoding utf-8 +" EasyMotion - Vim motions on speed! +" +" Author: Kim Silkebækken +" haya14busa +" Source: https://github.com/easymotion/vim-easymotion +"============================================================================= +" Saving 'cpoptions' {{{ +let s:save_cpo = &cpo +set cpo&vim +" }}} + +let s:TRUE = !0 +let s:FALSE = 0 +let s:DIRECTION = { 'forward': 0, 'backward': 1, 'bidirection': 2} + + +" Init: {{{ +let s:loaded = s:FALSE +function! EasyMotion#init() + if s:loaded + return + endif + let s:loaded = s:TRUE + call EasyMotion#highlight#load() + " Store previous motion info + let s:previous = {} + " Store previous operator-pending motion info for '.' repeat + let s:dot_repeat = {} + " Prepare 1-key Migemo Dictionary + let s:migemo_dicts = {} + let s:EasyMotion_is_active = 0 + call EasyMotion#reset() + " Anywhere regular expression: {{{ + let re = '\v' . + \ '(<.|^$)' . '|' . + \ '(.>|^$)' . '|' . + \ '(\l)\zs(\u)' . '|' . + \ '(_\zs.)' . '|' . + \ '(#\zs.)' + " 1. word + " 2. end of word + " 3. CamelCase + " 4. after '_' hoge_foo + " 5. after '#' hoge#foo + let g:EasyMotion_re_anywhere = get(g:, 'EasyMotion_re_anywhere', re) + + " Anywhere regular expression within line: + let re = '\v' . + \ '(<.|^$)' . '|' . + \ '(.>|^$)' . '|' . + \ '(\l)\zs(\u)' . '|' . + \ '(_\zs.)' . '|' . + \ '(#\zs.)' + let g:EasyMotion_re_line_anywhere = get(g:, 'EasyMotion_re_line_anywhere', re) + "}}} + " For other plugin + let s:EasyMotion_is_cancelled = 0 + " 0 -> Success + " 1 -> Cancel + let g:EasyMotion_ignore_exception = 0 + return "" +endfunction +"}}} +" Reset: {{{ +function! EasyMotion#reset() + let s:flag = { + \ 'within_line' : 0, + \ 'dot_repeat' : 0, + \ 'regexp' : 0, + \ 'bd_t' : 0, + \ 'find_bd' : 0, + \ 'linewise' : 0, + \ 'count_dot_repeat' : 0, + \ } + " regexp: -> regular expression + " This value is used when multi input find motion. If this values is + " 1, input text is treated as regexp.(Default: escaped) + " bd_t: -> bi-directional 't' motion + " This value is used to re-define regexp only for bi-directional 't' + " motion + " find_bd: -> bi-directional find motion + " This value is used to recheck the motion is inclusive or exclusive + " because 'f' & 't' forward find motion is inclusive, but 'F' & 'T' + " backward find motion is exclusive + " count_dot_repeat: -> dot repeat with count + " https://github.com/easymotion/vim-easymotion/issues/164 + let s:current = { + \ 'is_operator' : 0, + \ 'is_search' : 0, + \ 'dot_repeat_target_cnt' : 0, + \ 'dot_prompt_user_cnt' : 0, + \ 'changedtick' : 0, + \ } + " \ 'start_position' : [], + " \ 'cursor_position' : [], + + " is_operator: + " Store is_operator value first because mode(1) value will be + " changed by some operation. + " dot_* : + " These values are used when '.' repeat for automatically + " select marker/label characters.(Using count avoid recursive + " prompt) + " changedtick: + " :h b:changedtick + " This value is used to avoid side effect of overwriting buffer text + " which will change b:changedtick value. To overwrite g:repeat_tick + " value(defined tpope/vim-repeat), I can avoid this side effect of + " conflicting with tpope/vim-repeat + " start_position: + " Original, start cursor position. + " cursor_position: + " Usually, this values is same with start_position, but in + " visualmode and 'n' key motion, this value could be different. + return "" +endfunction "}}} + +" Motion Functions: {{{ +" -- Find Motion ------------------------- +" Note: {{{ +" num_strokes: +" The number of input characters. Currently provide 1, 2, or -1. +" '-1' means no limit. +" visualmode: +" Vim script couldn't detect the function is called in visual mode by +" mode(1), so tell whether it is in visual mode by argument explicitly +" direction: +" 0 -> forward +" 1 -> backward +" 2 -> bi-direction (handle forward & backward at the same time) }}} +function! EasyMotion#S(num_strokes, visualmode, direction) " {{{ + if a:direction == 1 + let is_inclusive = 0 + else + " Note: Handle bi-direction later because 'f' motion is inclusive but + " 'F' motion is exclusive + let is_inclusive = mode(1) ==# 'no' ? 1 : 0 + endif + let s:flag.find_bd = a:direction == 2 ? 1 : 0 + let re = s:findMotion(a:num_strokes, a:direction) + if s:handleEmpty(re, a:visualmode) | return | endif + call s:EasyMotion(re, a:direction, a:visualmode ? visualmode() : '', is_inclusive) + return s:EasyMotion_is_cancelled +endfunction " }}} +function! EasyMotion#OverwinF(num_strokes) " {{{ + let re = s:findMotion(a:num_strokes, s:DIRECTION.bidirection) + call EasyMotion#reset() + if re isnot# '' + return EasyMotion#overwin#move(re) + endif +endfunction "}}} +function! EasyMotion#T(num_strokes, visualmode, direction) " {{{ + if a:direction == 1 + let is_inclusive = 0 + else + " Note: Handle bi-direction later because 't' motion is inclusive but + " 'T' motion is exclusive + let is_inclusive = mode(1) ==# 'no' ? 1 : 0 + endif + let s:flag.find_bd = a:direction == 2 ? 1 : 0 + let re = s:findMotion(a:num_strokes, a:direction) + if s:handleEmpty(re, a:visualmode) | return | endif + if a:direction == 2 + let s:flag.bd_t = 1 + elseif a:direction == 1 + let re = s:convert_t_regexp(re, 1) " backward + else + let re = s:convert_t_regexp(re, 0) " forward + endif + call s:EasyMotion(re, a:direction, a:visualmode ? visualmode() : '', is_inclusive) + return s:EasyMotion_is_cancelled +endfunction " }}} +" -- Word Motion ------------------------- +function! EasyMotion#WB(visualmode, direction) " {{{ + "FIXME: inconsistent with default vim motion + "FIXED: -> EasyMotion#WBK() + let s:current.is_operator = mode(1) ==# 'no' ? 1: 0 + call s:EasyMotion('\(\<.\|^$\)', a:direction, a:visualmode ? visualmode() : '', 0) + return s:EasyMotion_is_cancelled +endfunction " }}} +function! EasyMotion#WBW(visualmode, direction) " {{{ + let s:current.is_operator = mode(1) ==# 'no' ? 1: 0 + let regex_without_file_ends = '\v(^|\s)\zs\S|^$' + let regex = l:regex_without_file_ends + \ . (a:direction == 1 ? '' : '|%$') + \ . (a:direction == 0 ? '' : '|%^') + call s:EasyMotion(l:regex, a:direction, a:visualmode ? visualmode() : '', 0) + return s:EasyMotion_is_cancelled +endfunction " }}} +function! EasyMotion#WBK(visualmode, direction) " {{{ + " vim's iskeyword style word motion + let s:current.is_operator = mode(1) ==# 'no' ? 1: 0 + let regex_without_file_ends = '\v<|^\S|\s\zs\S|>\zs\S|^$' + let regex = l:regex_without_file_ends + \ . (a:direction == 1 ? '' : '|%$') + \ . (a:direction == 0 ? '' : '|%^') + call s:EasyMotion(l:regex, a:direction, a:visualmode ? visualmode() : '', 0) + return s:EasyMotion_is_cancelled +endfunction " }}} +function! EasyMotion#E(visualmode, direction) " {{{ + let s:current.is_operator = mode(1) ==# 'no' ? 1: 0 + let is_inclusive = mode(1) ==# 'no' ? 1 : 0 + call s:EasyMotion('\(.\>\|^$\)', a:direction, a:visualmode ? visualmode() : '', is_inclusive) + return s:EasyMotion_is_cancelled +endfunction " }}} +function! EasyMotion#EW(visualmode, direction) " {{{ + let s:current.is_operator = mode(1) ==# 'no' ? 1: 0 + let is_inclusive = mode(1) ==# 'no' ? 1 : 0 + " Note: The stopping positions for 'E' and 'gE' differs. Thus, the regex + " for direction==2 cannot be the same in both directions. This will be + " ignored. + let regex_stub = '\v\S(\s|$)' + let regex = l:regex_stub + \ . (a:direction == 0 ? '' : '|^$|%^') + \ . (a:direction == 1 ? '' : '|%$') + call s:EasyMotion(l:regex, a:direction, a:visualmode ? visualmode() : '', 0) + return s:EasyMotion_is_cancelled +endfunction " }}} +function! EasyMotion#EK(visualmode, direction) " {{{ + " vim's iskeyword style word motion + let s:current.is_operator = mode(1) ==# 'no' ? 1: 0 + let is_inclusive = mode(1) ==# 'no' ? 1 : 0 + " Note: The stopping positions for 'e' and 'ge' differs. Thus, the regex + " for direction==2 cannot be the same in both directions. This will be + " ignored. + let regex_stub = '\v.\ze>|\S\ze\s*$|\S\ze\s|\k\zs>\S\ze|\S<' + let regex = l:regex_stub + \ . (a:direction == 0 ? '' : '|^$|%^') + \ . (a:direction == 1 ? '' : '|%$') + call s:EasyMotion(l:regex, a:direction, a:visualmode ? visualmode() : '', 0) + + + return s:EasyMotion_is_cancelled +endfunction " }}} +" -- JK Motion --------------------------- +function! EasyMotion#JK(visualmode, direction) " {{{ + let s:current.is_operator = mode(1) ==# 'no' ? 1: 0 + let s:flag.linewise = 1 + + if g:EasyMotion_startofline + call s:EasyMotion('^\(\w\|\s*\zs\|$\)', a:direction, a:visualmode ? visualmode() : '', 0) + else + let vcol = EasyMotion#helper#vcol('.') + let pattern = printf('^.\{-}\zs\(\%%<%dv.\%%>%dv\|$\)', vcol + 1, vcol) + call s:EasyMotion(pattern, a:direction, a:visualmode ? visualmode() : '', 0) + endif + return s:EasyMotion_is_cancelled +endfunction " }}} +function! EasyMotion#Sol(visualmode, direction) " {{{ + let s:current.is_operator = mode(1) ==# 'no' ? 1: 0 + let s:flag.linewise = 1 + call s:EasyMotion('^\(.\|$\)', a:direction, a:visualmode ? visualmode() : '', '') + return s:EasyMotion_is_cancelled +endfunction " }}} +function! EasyMotion#Eol(visualmode, direction) " {{{ + let s:flag.linewise = 1 + let s:current.is_operator = mode(1) ==# 'no' ? 1: 0 + call s:EasyMotion('\(\w\|\s*\zs\|.\|^\)$', a:direction, a:visualmode ? visualmode() : '', '') + return s:EasyMotion_is_cancelled +endfunction " }}} +" -- Search Motion ----------------------- +function! EasyMotion#Search(visualmode, direction, respect_direction) " {{{ + let s:current.is_operator = mode(1) ==# 'no' ? 1: 0 + let search_direction = a:respect_direction ? + \ (a:direction == 1 ? v:searchforward : 1-v:searchforward) : + \ (a:direction) + call s:EasyMotion(@/, search_direction, a:visualmode ? visualmode() : '', 0) + return s:EasyMotion_is_cancelled +endfunction " }}} +" -- JumpToAnywhere Motion --------------- +function! EasyMotion#JumpToAnywhere(visualmode, direction) " {{{ + let s:current.is_operator = mode(1) ==# 'no' ? 1: 0 + call s:EasyMotion( g:EasyMotion_re_anywhere, a:direction, a:visualmode ? visualmode() : '', 0) + return s:EasyMotion_is_cancelled +endfunction " }}} +" -- Line Motion ------------------------- +function! EasyMotion#SL(num_strokes, visualmode, direction) " {{{ + let s:flag.within_line = 1 + call EasyMotion#S(a:num_strokes, a:visualmode, a:direction) + return s:EasyMotion_is_cancelled +endfunction " }}} +function! EasyMotion#TL(num_strokes, visualmode, direction) " {{{ + let s:flag.within_line = 1 + call EasyMotion#T(a:num_strokes, a:visualmode, a:direction) + return s:EasyMotion_is_cancelled +endfunction " }}} +function! EasyMotion#WBL(visualmode, direction) " {{{ + let s:flag.within_line = 1 + call EasyMotion#WBK(a:visualmode, a:direction) + return s:EasyMotion_is_cancelled +endfunction " }}} +function! EasyMotion#EL(visualmode, direction) " {{{ + let s:flag.within_line = 1 + call EasyMotion#EK(a:visualmode, a:direction) + return s:EasyMotion_is_cancelled +endfunction " }}} +function! EasyMotion#LineAnywhere(visualmode, direction) " {{{ + let s:flag.within_line = 1 + let s:current.is_operator = mode(1) ==# 'no' ? 1: 0 + let re = g:EasyMotion_re_line_anywhere + call s:EasyMotion(re, a:direction, a:visualmode ? visualmode() : '', 0) + return s:EasyMotion_is_cancelled +endfunction " }}} +" -- User Motion ------------------------- +let s:config = { +\ 'pattern': '', +\ 'visualmode': s:FALSE, +\ 'direction': s:DIRECTION.forward, +\ 'inclusive': s:FALSE, +\ 'accept_cursor_pos': s:FALSE, +\ 'overwin': s:FALSE +\ } + +function! s:default_config() abort + let c = copy(s:config) + let m = mode(1) + let c.inclusive = m ==# 'no' ? s:TRUE : s:FALSE + return c +endfunction + +function! EasyMotion#go(...) abort + let c = extend(s:default_config(), get(a:, 1, {})) + if c.overwin + return EasyMotion#overwin#move(c.pattern) + else + let s:current.is_operator = mode(1) ==# 'no' ? 1: 0 + call s:EasyMotion(c.pattern, c.direction, c.visualmode ? visualmode() : '', c.inclusive, c) + return s:EasyMotion_is_cancelled + endif +endfunction +function! EasyMotion#User(pattern, visualmode, direction, inclusive, ...) " {{{ + let s:current.is_operator = mode(1) ==# 'no' ? 1: 0 + let is_inclusive = mode(1) ==# 'no' ? a:inclusive : 0 + let re = a:pattern + call s:EasyMotion(re, a:direction, a:visualmode ? visualmode() : '', is_inclusive, get(a:, 1, {})) + return s:EasyMotion_is_cancelled +endfunction " }}} +" -- Repeat Motion ----------------------- +function! EasyMotion#Repeat(visualmode) " {{{ + " Repeat previous motion with previous targets + if !has_key(s:previous, 'regexp') + call s:Message("Previous targets doesn't exist") + let s:EasyMotion_is_cancelled = 1 + return s:EasyMotion_is_cancelled + endif + let re = s:previous.regexp + let direction = s:previous.direction + let s:flag.within_line = s:previous.line_flag + let s:flag.bd_t = s:previous.bd_t_flag + let s:current.is_operator = mode(1) ==# 'no' ? 1: 0 + " FIXME: is_inclusive value is inappropriate but handling this value is + " difficult and priorities is low because this motion maybe used usually + " as a 'normal' motion. + let is_inclusive = mode(1) ==# 'no' ? 1 : 0 + + call s:EasyMotion(re, direction, a:visualmode ? visualmode() : '', is_inclusive) + return s:EasyMotion_is_cancelled +endfunction " }}} +function! EasyMotion#DotRepeat() " {{{ + let cnt = v:count1 " avoid overwriting + + " Repeat previous '.' motion with previous targets and operator + if !has_key(s:dot_repeat, 'regexp') + call s:Message("Previous motion doesn't exist") + let s:EasyMotion_is_cancelled = 1 + return s:EasyMotion_is_cancelled + endif + + let re = s:dot_repeat.regexp + let direction = s:dot_repeat.direction + let is_inclusive = s:dot_repeat.is_inclusive + + for i in range(cnt) + " s:EasyMotion() always call reset s:flag & s:current + let s:flag.dot_repeat = 1 + let s:flag.within_line = s:dot_repeat.line_flag + let s:flag.bd_t = s:dot_repeat.bd_t_flag + let s:current.is_operator = 1 + + let s:flag.count_dot_repeat = (i > 0 ? 1 : 0) + silent call s:EasyMotion(re, direction, 0, is_inclusive) + endfor + return s:EasyMotion_is_cancelled +endfunction " }}} +function! EasyMotion#NextPrevious(visualmode, direction) " {{{ + " Move next/previous destination using previous motion regexp + let cnt = v:count1 " avoid overwriting + if !has_key(s:previous, 'regexp') + call s:Message("Previous targets doesn't exist") + let s:EasyMotion_is_cancelled = 1 + return s:EasyMotion_is_cancelled + endif + let re = s:previous.regexp + let search_direction = (a:direction == 1 ? 'b' : '') + + if g:EasyMotion_move_highlight + call EasyMotion#highlight#attach_autocmd() + call EasyMotion#highlight#add_highlight(re, g:EasyMotion_hl_move) + endif + + if ! empty(a:visualmode) + " FIXME: blink highlight + silent exec 'normal! gv' + endif + + " Mark jump-list + if cnt > 1 + " Consider Next/Previous motions as jump motion :h jump-motion + " Note: It should add jumplist even if the count isn't given + " considering vim's default behavior of `n` & `N`, but just + " I don't want to do it without the count. Should I add a + " option? + normal! m` + endif + + " Jump + " @vimlint(EVL102, 1, l:_) + for _ in range(cnt) + keepjumps call searchpos(re, search_direction) + endfor + + normal! zv + + call EasyMotion#reset() + " -- Activate EasyMotion ----------------- {{{ + let s:EasyMotion_is_active = 1 + call EasyMotion#attach_active_autocmd() "}}} + return s:EasyMotion_is_cancelled +endfunction " }}} +" }}} +" Helper Functions: {{{ +" -- Message ----------------------------- +function! s:Message(message) " {{{ + if g:EasyMotion_verbose + echo 'EasyMotion: ' . a:message + else + " Make the current message disappear + echo '' + " redraw + endif +endfunction " }}} +function! s:Prompt(message) " {{{ + echohl Question + echo a:message . ': ' + echohl None +endfunction " }}} +function! s:Throw(message) "{{{ + throw 'EasyMotion: ' . a:message +endfunction "}}} + +" -- Save & Restore values --------------- +function! s:SaveValue() "{{{ + if ! s:current.is_search + call EasyMotion#helper#VarReset('&scrolloff', 0) + endif + call EasyMotion#helper#VarReset('&modified', 0) + call EasyMotion#helper#VarReset('&modifiable', 1) + call EasyMotion#helper#VarReset('&readonly', 0) + call EasyMotion#helper#VarReset('&spell', 0) + call EasyMotion#helper#VarReset('&virtualedit', '') + " if &foldmethod !=# 'expr' + call EasyMotion#helper#VarReset('&foldmethod', 'manual') + " endif +endfunction "}}} +function! s:RestoreValue() "{{{ + call EasyMotion#helper#VarReset('&scrolloff') + call EasyMotion#helper#VarReset('&modified') + call EasyMotion#helper#VarReset('&modifiable') + call EasyMotion#helper#VarReset('&readonly') + call EasyMotion#helper#VarReset('&spell') + call EasyMotion#helper#VarReset('&virtualedit') + " if &foldmethod !=# 'expr' + call EasyMotion#helper#VarReset('&foldmethod') + " endif +endfunction "}}} +function! s:turn_off_hl_error() "{{{ + let s:error_hl = EasyMotion#highlight#capture('Error') + call EasyMotion#highlight#turn_off(s:error_hl) + let s:matchparen_hl = EasyMotion#highlight#capture('MatchParen') + call EasyMotion#highlight#turn_off(s:matchparen_hl) +endfunction "}}} +function! s:turn_on_hl_error() "{{{ + if exists('s:error_hl') + call EasyMotion#highlight#turn_on(s:error_hl) + unlet s:error_hl + endif + + if exists('s:matchparen_hl') + call EasyMotion#highlight#turn_on(s:matchparen_hl) + unlet s:matchparen_hl + endif +endfunction "}}} + +" -- Draw -------------------------------- +function! s:SetLines(lines, key) " {{{ + for [line_num, line] in a:lines + keepjumps call setline(line_num, line[a:key]) + endfor +endfunction " }}} + +" -- Get characters from user input ------ +function! s:GetChar(...) abort "{{{ + let mode = get(a:, 1, 0) + while 1 + " Workaround for https://github.com/osyo-manga/vital-over/issues/53 + try + let char = call('getchar', a:000) + catch /^Vim:Interrupt$/ + let char = 3 " + endtry + if char == 27 || char == 3 + " Escape or key pressed + redraw + call s:Message('Cancelled') + return '' + endif + " Workaround for the mappings + if string(char) !=# "\x80\xfd`" + return mode == 1 ? !!char + \ : type(char) == type(0) ? nr2char(char) : char + endif + endwhile +endfunction "}}} + +" -- Find Motion Helper ------------------ +function! s:findMotion(num_strokes, direction) "{{{ + " Find Motion: S,F,T + let s:current.is_operator = mode(1) ==# 'no' ? 1: 0 + " store cursor pos because 'n' key find motion could be jump to offscreen + let s:current.original_position = [line('.'), col('.')] + let s:current.is_search = a:num_strokes == -1 ? 1: 0 + let s:flag.regexp = a:num_strokes == -1 ? 1 : 0 " TODO: remove? + + if g:EasyMotion_add_search_history && a:num_strokes == -1 + let s:previous['input'] = @/ + else + let s:previous['input'] = get(s:previous, 'input', '') + endif + let input = EasyMotion#command_line#GetInput( + \ a:num_strokes, s:previous.input, a:direction) + let s:previous['input'] = input + + " Check that we have an input char + if empty(input) + return '' + endif + + let re = s:convertRegep(input) + + if g:EasyMotion_add_search_history && a:num_strokes == -1 + let history_re = substitute(re, '\\c\|\\C', '', '') + let @/ = history_re "For textobject: 'gn' + call histadd('search', history_re) + endif + + return re +endfunction "}}} +function! s:convertRegep(input) "{{{ + " 1. regexp + " 2. migemo + " 3. smartsign + " 4. smartcase + let use_migemo = s:should_use_migemo(a:input) + let re = use_migemo || s:should_use_regexp() ? a:input : s:escape_regexp_char(a:input) + + " Convert space to match only start of spaces + if re ==# ' ' + let re = '\s\+' + endif + + if use_migemo + let re = s:convertMigemo(re) + endif + + if s:should_use_smartsign(a:input) + let r = s:convertSmartsign(a:input) + if use_migemo + let re = re . '\m\|' . r + else + let re = r + endif + endif + + let case_flag = EasyMotion#helper#should_case_sensitive( + \ a:input, s:current.is_search) ? '\c' : '\C' + let re = case_flag . re + return re +endfunction "}}} +function! s:convertMigemo(re) "{{{ + let re = a:re + + if len(re) > 1 + " System cmigemo + return EasyMotion#cmigemo#getMigemoPattern(re) + endif + + " EasyMotion migemo one key dict + if ! has_key(s:migemo_dicts, &l:encoding) + let s:migemo_dicts[&l:encoding] = EasyMotion#helper#load_migemo_dict() + endif + return get(s:migemo_dicts[&l:encoding], re, a:re) +endfunction "}}} +function! s:convertSmartsign(chars) "{{{ + " Convert given chars to smartsign string + " Example: 12 -> [1!][2@] + " a] -> a[]}] + + " Load smartsign dictionary + let smart_dict = s:load_smart_dict() + " Prepare converted string + let converted_str = '' + " Get `upper_sign` for each given chars + " Split chars into list + for char in split(a:chars, '\zs') + let upper_sign = s:get_escaped_group_char(smart_dict, char) + if upper_sign ==# '' + let converted_str .= s:escape_regexp_char(char) + else + " [1!] + let converted_str .= '[' . char . upper_sign . ']' + endif + endfor + return converted_str +endfunction "}}} +function! s:get_escaped_group_char(dict, char) "{{{ + " Get escaped char from given dictionary + " return '' if char is not find + " Used inside `[]` + return escape(get(a:dict, a:char, ''), '^') +endfunction "}}} +function! s:escape_regexp_char(char) "{{{ + return escape(a:char, '.$^~\[]*') +endfunction "}}} +function! s:convertSmartcase(re, char) "{{{ + let re = a:re + if a:char =~# '\U' "nonuppercase + return '\c' . re + else "uppercase + return '\C' . re + endif +endfunction "}}} +function! s:should_use_regexp() "{{{ + return g:EasyMotion_use_regexp == 1 && s:flag.regexp == 1 +endfunction "}}} +function! s:should_use_migemo(char) "{{{ + if ! g:EasyMotion_use_migemo || match(a:char, '[^!-~]') != -1 + return 0 + endif + + " TODO: use direction to improve + if s:flag.within_line == 1 + let first_line = line('.') + let end_line = line('.') + else + let first_line = line('w0') + let end_line = line('w$') + endif + + " Skip folded line and check if text include multibyte characters + for line in range(first_line, end_line) + if EasyMotion#helper#is_folded(line) + continue + endif + + if EasyMotion#helper#include_multibyte_char(getline(line)) == 1 + return 1 + endif + endfor + + return 0 +endfunction "}}} +function! s:should_use_smartsign(char) "{{{ + " Smartsign Dictionary exists? + " \A: non-alphabetic character + " Do not use smartsign for n-key find search motions + if (exists('g:EasyMotion_use_smartsign_us') || + \ exists('g:EasyMotion_use_smartsign_jp')) && + \ match(a:char, '\A') != -1 && + \ exists('s:current.is_search') && s:current.is_search == 0 + return 1 + else + return 0 + endif +endfunction "}}} +function! s:convert_t_regexp(re, direction) "{{{ + if a:direction == 0 "forward + return '\_.\ze\('.a:re.'\)' + elseif a:direction == 1 "backward + return '\('.a:re.'\)\@<=\_.' + endif +endfunction "}}} + +" -- Handle Visual Mode ------------------ +function! s:GetVisualStartPosition(c_pos, v_start, v_end, search_direction) "{{{ + let vmode = mode(1) + if vmode !~# "^[Vv\]" + call s:Throw('Unkown visual mode:'.vmode) + endif + + if vmode ==# 'V' "line-wise Visual + " Line-wise Visual {{{ + if a:v_start[0] == a:v_end[0] + if a:search_direction == '' + return a:v_start + elseif a:search_direction == 'b' + return a:v_end + else + call s:throw('Unkown search_direction') + endif + else + if a:c_pos[0] == a:v_start[0] + return a:v_end + elseif a:c_pos[0] == a:v_end[0] + return a:v_start + endif + endif + "}}} + else + " Character-wise or Block-wise Visual"{{{ + if a:c_pos == a:v_start + return a:v_end + elseif a:c_pos == a:v_end + return a:v_start + endif + + " virtualedit + if a:c_pos[0] == a:v_start[0] + return a:v_end + elseif a:c_pos[0] == a:v_end[0] + return a:v_start + elseif EasyMotion#helper#is_greater_coords(a:c_pos, a:v_start) == 1 + return a:v_end + else + return a:v_start + endif + "}}} + endif +endfunction "}}} + +" -- Others ------------------------------ +function! s:handleEmpty(input, visualmode) "{{{ + " if empty, reselect and return 1 + if empty(a:input) + if ! empty(a:visualmode) + silent exec 'normal! gv' + endif + let s:EasyMotion_is_cancelled = 1 " Cancel + return 1 + endif + return 0 +endfunction "}}} +function! s:load_smart_dict() "{{{ + if exists('g:EasyMotion_use_smartsign_us') + return g:EasyMotion#sticky_table#us + elseif exists('g:EasyMotion_use_smartsign_jp') + return g:EasyMotion#sticky_table#jp + else + return {} + endif +endfunction "}}} +function! EasyMotion#attach_active_autocmd() "{{{ + " Reference: https://github.com/justinmk/vim-sneak + augroup plugin-easymotion-active + autocmd! + autocmd InsertEnter,WinLeave,BufLeave + \ let s:EasyMotion_is_active = 0 + \ | autocmd! plugin-easymotion-active * + autocmd CursorMoved + \ autocmd plugin-easymotion-active CursorMoved + \ let s:EasyMotion_is_active = 0 + \ | autocmd! plugin-easymotion-active * + augroup END +endfunction "}}} +function! EasyMotion#is_active() "{{{ + return s:EasyMotion_is_active +endfunction "}}} +function! EasyMotion#activate(is_visual) "{{{ + let s:EasyMotion_is_active = 1 + call EasyMotion#attach_active_autocmd() + call EasyMotion#highlight#add_highlight(s:previous.regexp, + \ g:EasyMotion_hl_move) + call EasyMotion#highlight#attach_autocmd() + if a:is_visual == 1 + normal! gv + endif +endfunction "}}} +function! s:restore_cursor_state(visualmode) "{{{ + " -- Restore original cursor position/selection + if ! empty(a:visualmode) + silent exec 'normal! gv' + keepjumps call cursor(s:current.cursor_position) + else + keepjumps call cursor(s:current.original_position) + endif +endfunction " }}} +" Grouping Algorithms: {{{ +let s:grouping_algorithms = { +\ 1: 'SCTree' +\ , 2: 'Original' +\ } +" -- Single-key/closest target priority tree {{{ +" This algorithm tries to assign one-key jumps to all the targets closest to the cursor. +" It works recursively and will work correctly with as few keys as two. +function! s:GroupingAlgorithmSCTree(targets, keys) "{{{ + " Prepare variables for working + let targets_len = len(a:targets) + let keys_len = len(a:keys) + + let groups = {} + + let keys = reverse(copy(a:keys)) + + " Semi-recursively count targets {{{ + " We need to know exactly how many child nodes (targets) this branch will have + " in order to pass the correct amount of targets to the recursive function. + + " Prepare sorted target count list {{{ + " This is horrible, I know. But dicts aren't sorted in vim, so we need to + " work around that. That is done by having one sorted list with key counts, + " and a dict which connects the key with the keys_count list. + + let keys_count = [] + let keys_count_keys = {} + + let i = 0 + for key in keys + call add(keys_count, 0) + + let keys_count_keys[key] = i + + let i += 1 + endfor + " }}} + + let targets_left = targets_len + let level = 0 + let i = 0 + + while targets_left > 0 + " Calculate the amount of child nodes based on the current level + let childs_len = (level == 0 ? 1 : (keys_len - 1) ) + + for key in keys + " Add child node count to the keys_count array + let keys_count[keys_count_keys[key]] += childs_len + + " Subtract the child node count + let targets_left -= childs_len + + if targets_left <= 0 + " Subtract the targets left if we added too many too + " many child nodes to the key count + let keys_count[keys_count_keys[key]] += targets_left + + break + endif + + let i += 1 + endfor + + let level += 1 + endwhile + " }}} + " Create group tree {{{ + let i = 0 + let key = 0 + + call reverse(keys_count) + + for key_count in keys_count + if key_count > 1 + " We need to create a subgroup + " Recurse one level deeper + let groups[a:keys[key]] = s:GroupingAlgorithmSCTree(a:targets[i : i + key_count - 1], a:keys) + elseif key_count == 1 + " Assign single target key + let groups[a:keys[key]] = a:targets[i] + else + " No target + continue + endif + + let key += 1 + let i += key_count + endfor + " }}} + + " Finally! + return groups +endfunction "}}} +" }}} +" -- Original ---------------------------- {{{ +function! s:GroupingAlgorithmOriginal(targets, keys) + " Split targets into groups (1 level) + let targets_len = len(a:targets) + " let keys_len = len(a:keys) + + let groups = {} + + let i = 0 + let root_group = 0 + try + while root_group < targets_len + let groups[a:keys[root_group]] = {} + + for key in a:keys + let groups[a:keys[root_group]][key] = a:targets[i] + + let i += 1 + endfor + + let root_group += 1 + endwhile + catch | endtry + + " Flatten the group array + if len(groups) == 1 + let groups = groups[a:keys[0]] + endif + + return groups +endfunction +" }}} + +" -- Coord/key dictionary creation ------- {{{ +function! s:CreateCoordKeyDict(groups, ...) + " Dict structure: + " 1,2 : a + " 2,3 : b + let sort_list = [] + let coord_keys = {} + let group_key = a:0 == 1 ? a:1 : '' + + for [key, item] in items(a:groups) + let key = group_key . key + "let key = ( ! empty(group_key) ? group_key : key) + + if type(item) == type([]) " List + " Destination coords + + " The key needs to be zero-padded in order to + " sort correctly + let dict_key = printf('%05d,%05d', item[0], item[1]) + let coord_keys[dict_key] = key + + " We need a sorting list to loop correctly in + " PromptUser, dicts are unsorted + call add(sort_list, dict_key) + else + " Item is a dict (has children) + let coord_key_dict = s:CreateCoordKeyDict(item, key) + + " Make sure to extend both the sort list and the + " coord key dict + call extend(sort_list, coord_key_dict[0]) + call extend(coord_keys, coord_key_dict[1]) + endif + + unlet item + endfor + + return [sort_list, coord_keys] +endfunction +" }}} +" }}} +"}}} +" Core Functions: {{{ +function! s:PromptUser(groups) "{{{ + " Recursive + let group_values = values(a:groups) + + " -- If only one possible match, jump directly to it {{{ + if len(group_values) == 1 + if mode(1) ==# 'no' + " Consider jump to first match + " NOTE: matchstr() handles multibyte characters. + let s:dot_repeat['target'] = matchstr(g:EasyMotion_keys, '^.') + endif + redraw + return group_values[0] + endif + " }}} + + " -- Prepare marker lines ---------------- {{{ + let lines = {} + + let coord_key_dict = s:CreateCoordKeyDict(a:groups) + + let prev_col_num = 0 + for dict_key in sort(coord_key_dict[0]) + " NOTE: {{{ + " let g:EasyMotion_keys = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + " Perform (easymotion-w) + " + " lines[line_num]['orig']: + " Lorem ipsum dolor sit amet consectetur adipisicing + " + " {target_char}: + " {L}orem {i}psum {d}olor {s}it {a}met {c}onsectetur {a}dipisicing + " + " lines[line_num]['marker'], {marker_chars}: + " {A}orem {B}psum {C}olor {D}it {E}met {F}onsectetur {G}dipisicing + " 2-key-combo: {marker_chars} could be 1 or 2 chars like {AB} + " + " }}} + + " Prepare original line and marker line {{{ + let [line_num, col_num] = split(dict_key, ',') + + let line_num = str2nr(line_num) + let col_num = str2nr(col_num) + if ! has_key(lines, line_num) + let current_line = getline(line_num) + let lines[line_num] = { + \ 'orig': current_line, + \ 'marker': current_line, + \ 'mb_compensation': 0, + \ } + " mb_compensation -> multibyte compensation + let prev_col_num = 0 + endif "}}} + + " Multibyte Compensation: {{{ + " Solve multibyte issues by matching the byte column + " number instead of the visual column + " Compensate for byte difference between marker + " character and target character + " + " This has to be done in order to match the correct + " column; \%c matches the byte column and not display + " column. + let col_num = max([prev_col_num + 1, + \ col_num - lines[line_num]['mb_compensation']]) + let prev_col_num = col_num + "}}} + + " Prepare marker characters {{{ + let marker_chars = coord_key_dict[1][dict_key] + let marker_chars_len = EasyMotion#helper#strchars(marker_chars) + "}}} + + " Replace {target} with {marker} & Highlight {{{ + let col_add = 0 " Column add byte length + " Disable two-key-combo feature? + let marker_max_length = g:EasyMotion_disable_two_key_combo == 1 + \ ? 1 : 2 + for i in range(min([marker_chars_len, marker_max_length])) + let marker_char = split(marker_chars, '\zs')[i] + " EOL {{{ + if strlen(lines[line_num]['marker']) < col_num + col_add + " Append marker chars if target is EOL + let lines[line_num]['marker'] .= ' ' + endif "}}} + + let target_col_regexp = '\%' . (col_num + col_add) . 'c.' + let target_char = matchstr(lines[line_num]['marker'], + \ target_col_regexp) + let space_len = strdisplaywidth(target_char) + \ - strdisplaywidth(marker_char) + " Substitute marker character + let substitute_expr = marker_char . repeat(' ', space_len) + + let lines[line_num]['marker'] = substitute( + \ lines[line_num]['marker'], + \ target_col_regexp, + \ escape(substitute_expr,'&'), + \ '') + + " Highlight targets {{{ + let _hl_group = + \ (marker_chars_len == 1) ? g:EasyMotion_hl_group_target + \ : (i == 0) ? g:EasyMotion_hl2_first_group_target + \ : g:EasyMotion_hl2_second_group_target + + if exists('*matchaddpos') + call EasyMotion#highlight#add_pos_highlight( + \ line_num, col_num + col_add, _hl_group) + else + call EasyMotion#highlight#add_highlight( + \ '\%' . line_num . 'l' . target_col_regexp, + \ _hl_group) + endif + "}}} + + " Add marker/target length difference for multibyte compensation + let lines[line_num]['mb_compensation'] += + \ strlen(target_char) - strlen(substitute_expr) + " Shift column + let col_add += strlen(marker_char) + endfor + "}}} + endfor + + let lines_items = items(lines) + " }}} + + " Invoke autocmd so the user can temporarily disable linters, etc. + silent doautocmd User EasyMotionPromptBegin + + " -- Put labels on targets & Get User Input & Restore all {{{ + " Save undo tree + let undo_lock = EasyMotion#undo#save() + try + " Set lines with markers {{{ + call s:SetLines(lines_items, 'marker') + redraw "}}} + + " Get target character {{{ + call s:Prompt('Target key') + let char = s:GetChar() + "}}} + + " Convert uppercase {{{ + if g:EasyMotion_use_upper == 1 && match(g:EasyMotion_keys, '\l') == -1 + let char = toupper(char) + endif "}}} + + " Jump first target when Enter or Space key is pressed "{{{ + if (char ==# "\" && g:EasyMotion_enter_jump_first == 1) || + \ (char ==# "\" && g:EasyMotion_space_jump_first == 1) + " NOTE: matchstr() is multibyte aware. + let char = matchstr(g:EasyMotion_keys, '^.') + endif "}}} + + " For dot repeat {{{ + if mode(1) ==# 'no' + " Store previous target when operator pending mode + if s:current.dot_prompt_user_cnt == 0 + " Store + let s:dot_repeat['target'] = char + else + " Append target chars + let s:dot_repeat['target'] .= char + endif + endif "}}} + + finally + " Restore original lines + call s:SetLines(lines_items, 'orig') + + " Un-highlight targets {{{ + call EasyMotion#highlight#delete_highlight( + \ g:EasyMotion_hl_group_target, + \ g:EasyMotion_hl2_first_group_target, + \ g:EasyMotion_hl2_second_group_target, + \ ) + " }}} + + " Restore undo tree + call undo_lock.restore() + + redraw + + " Invoke autocmd + silent doautocmd User EasyMotionPromptEnd + endtry "}}} + + " -- Check if we have an input char ------ {{{ + if empty(char) + call s:Throw('Cancelled') + endif + " }}} + " -- Check if the input char is valid ---- {{{ + if ! has_key(a:groups, char) + call s:Throw('Invalid target') + endif + " }}} + + let target = a:groups[char] + + if type(target) == type([]) + " Return target coordinates + return target + else + " Prompt for new target character + let s:current.dot_prompt_user_cnt += 1 + return s:PromptUser(target) + endif +endfunction "}}} +function! s:DotPromptUser(groups) "{{{ + " Get char from previous target + let char = s:dot_repeat.target[s:current.dot_repeat_target_cnt] + " For dot repeat target chars + let s:current.dot_repeat_target_cnt += 1 + + let target = a:groups[char] + + if type(target) == type([]) + " Return target coordinates + return target + else + " Prompt for new target character + return s:PromptUser(target) + endif +endfunction "}}} + +function! s:EasyMotion(regexp, direction, visualmode, is_inclusive, ...) " {{{ + let config = extend(s:default_config(), get(a:, 1, {})) + " Store s:current original_position & cursor_position {{{ + " current cursor pos. + let s:current.cursor_position = [line('.'), col('.')] + " original start position. This value could be changed later in visual + " mode + let s:current.original_position = + \ get(s:current, 'original_position', s:current.cursor_position) + "}}} + + let win_first_line = line('w0') " visible first line num + let win_last_line = line('w$') " visible last line num + + " Store the target positions list + " e.g. targets = [ [line, col], [line2, col2], ...] + let targets = [] + + " Store info for Repeat motion {{{ + if s:flag.dot_repeat != 1 + " Store Regular Expression + let s:previous['regexp'] = a:regexp + let s:previous['direction'] = a:direction + let s:previous['operator'] = v:operator + + " Note: 'is_inclusive' value could be changed later when + " bi-directional find motion depend on 'true' direction the cursor + " will move. + let s:previous['is_inclusive'] = a:is_inclusive + + " For special motion flag + let s:previous['line_flag'] = s:flag.within_line + let s:previous['bd_t_flag'] = s:flag.bd_t " bi-directional t motion + endif "}}} + + " To avoid side effect of overwriting buffer for tpope/repeat + " store current b:changedtick. Use this value later + let s:current.changedtick = b:changedtick + + try + " -- Reset properties -------------------- {{{ + " Save original value and set new value + call s:SaveValue() + call s:turn_off_hl_error() + " }}} + " Setup searchpos args {{{ + let search_direction = (a:direction == 1 ? 'b' : '') + let search_stopline = a:direction == 1 ? win_first_line : win_last_line + + if s:flag.within_line == 1 + let search_stopline = s:current.original_position[0] + endif + "}}} + + " Handle visual mode {{{ + if ! empty(a:visualmode) + " Decide at where visual mode start {{{ + normal! gv + let v_start = [line("'<"),col("'<")] " visual_start_position + let v_end = [line("'>"),col("'>")] " visual_end_position + + let v_original_pos = s:GetVisualStartPosition( + \ s:current.cursor_position, v_start, v_end, search_direction) + "}}} + + " Reselect visual text {{{ + keepjumps call cursor(v_original_pos) + exec "normal! " . a:visualmode + keepjumps call cursor(s:current.cursor_position) + "}}} + " Update s:current.original_position + " overwrite original start position + let s:current.original_position = v_original_pos + endif "}}} + + " Handle bi-directional t motion {{{ + if s:flag.bd_t == 1 + let regexp = s:convert_t_regexp(a:regexp, 0) "forward + else + let regexp = a:regexp + endif + "}}} + + " Handle dot repeat with count + if s:flag.count_dot_repeat + let cursor_char = EasyMotion#helper#get_char_by_coord(s:current.cursor_position) + if cursor_char =~# regexp + call add(targets, s:current.cursor_position) + endif + endif + + " Construct match dict {{{ + " Note: searchpos() has side effect which jump cursor position. + " You can disable this side effect by add 'n' flags, + " but in this case, it's better to allows jump side effect + " to gathering matched targets coordinates. + let pos = searchpos(regexp, search_direction . (config.accept_cursor_pos ? 'c' : ''), search_stopline) + while 1 + " Reached end of search range + if pos == [0, 0] + break + endif + + " Skip folded lines {{{ + if EasyMotion#helper#is_folded(pos[0]) + if search_direction ==# 'b' + " FIXME: Hmm... I should use filter() + " keepjumps call cursor(foldclosed(pos[0]), 0) + else + keepjumps call cursor(foldclosedend(pos[0]+1), 0) + endif + else + call add(targets, pos) + endif + "}}} + let pos = searchpos(regexp, search_direction, search_stopline) + endwhile + "}}} + + " Handle bidirection "{{{ + " For bi-directional t motion {{{ + if s:flag.bd_t == 1 + let regexp = s:convert_t_regexp(a:regexp, 1) "backward + endif + "}}} + " Reconstruct match dict + if a:direction == 2 + " Backward + + " Jump back cursor_position + keepjumps call cursor(s:current.cursor_position[0], + \ s:current.cursor_position[1]) + + let targets2 = [] + if s:flag.within_line == 0 + let search_stopline = win_first_line + else + let search_stopline = s:current.cursor_position[0] + endif + while 1 + " TODO: refactoring + let pos = searchpos(regexp, 'b', search_stopline) + " Reached end of search range + if pos == [0, 0] + break + endif + + " Skip folded lines {{{ + if EasyMotion#helper#is_folded(pos[0]) + " keepjumps call cursor(foldclosedend(pos[0]+1), 0) + continue + endif + "}}} + + call add(targets2, pos) + endwhile + " Merge match target dict"{{{ + let t1 = 0 " forward + let t2 = 0 " backward + let targets3 = [] + while t1 < len(targets) || t2 < len(targets2) + " Forward -> Backward -> F -> B -> ... + if t1 < len(targets) + call add(targets3, targets[t1]) + let t1 += 1 + endif + if t2 < len(targets2) + call add(targets3, targets2[t2]) + let t2 += 1 + endif + endwhile + let targets = targets3 + "}}} + endif + "}}} + " Handle no match"{{{ + let targets_len = len(targets) + if targets_len == 0 + call s:Throw('No matches') + endif + "}}} + + " Attach specific key as marker to gathered matched coordinates + let GroupingFn = function('s:GroupingAlgorithm' . s:grouping_algorithms[g:EasyMotion_grouping]) + let groups = GroupingFn(targets, split(g:EasyMotion_keys, '\zs')) + + " -- Shade inactive source --------------- {{{ + if g:EasyMotion_do_shade && targets_len != 1 && s:flag.dot_repeat != 1 + if a:direction == 1 " Backward + let shade_hl_re = s:flag.within_line + \ ? '^.*\%#' + \ : '\%'. win_first_line .'l\_.*\%#' + elseif a:direction == 0 " Forward + let shade_hl_re = s:flag.within_line + \ ? '\%#.*$' + \ : '\%#\_.*\%'. win_last_line .'l' + else " Both directions + let shade_hl_re = s:flag.within_line + \ ? '^.*\%#.*$' + \ : '\_.*' + endif + + call EasyMotion#highlight#add_highlight( + \ shade_hl_re, g:EasyMotion_hl_group_shade) + if g:EasyMotion_cursor_highlight + let cursor_hl_re = '\%#' + call EasyMotion#highlight#add_highlight(cursor_hl_re, + \ g:EasyMotion_hl_inc_cursor) + endif + endif + " }}} + + " -- Jump back before prompt for visual scroll {{{ + " Because searchpos() change current cursor position and + " if you just use cursor(s:current.cursor_position) to jump back, + " current line will become middle of line window + if ! empty(a:visualmode) + keepjumps call winrestview({'lnum' : s:current.cursor_position[0], 'topline' : win_first_line}) + else + " for adjusting cursorline + keepjumps call cursor(s:current.cursor_position) + endif + "}}} + + " -- Prompt user for target group/character {{{ + if s:flag.dot_repeat != 1 + let coords = s:PromptUser(groups) + else + let coords = s:DotPromptUser(groups) + endif + "}}} + + " -- Update cursor position -------------- {{{ + " First, jump back cursor to original position + keepjumps call cursor(s:current.original_position) + + " Consider EasyMotion as jump motion :h jump-motion + normal! m` + + " Update selection for visual mode {{{ + if ! empty(a:visualmode) + exec 'normal! ' . a:visualmode + endif + " }}} + + " For bi-directional motion, checking again whether the motion is + " inclusive is necessary. This value will might be updated later + let is_inclusive_check = a:is_inclusive + " For bi-directional motion, store 'true' direction for dot repeat + " to handling inclusive/exclusive motion + if a:direction == 2 + let true_direction = + \ EasyMotion#helper#is_greater_coords( + \ s:current.original_position, coords) > 0 ? + \ 0 : 1 + " forward : backward + else + let true_direction = a:direction + endif + + if s:flag.dot_repeat == 1 + " support dot repeat {{{ + " Use visual mode to emulate dot repeat + normal! v + + " Deal with exclusive {{{ + if s:dot_repeat.is_inclusive == 0 + " exclusive + if s:dot_repeat.true_direction == 0 "Forward + let coords[1] -= 1 + elseif s:dot_repeat.true_direction == 1 "Backward + " Shift visual selection to left by making cursor one key + " left. + normal! hoh + endif + endif "}}} + + " Jump to destination + keepjumps call cursor(coords[0], coords[1]) + + " Execute previous operator + let cmd = s:dot_repeat.operator + if s:dot_repeat.operator ==# 'c' + let cmd .= getreg('.') + endif + exec 'normal! ' . cmd + "}}} + else + " Handle inclusive & exclusive {{{ + " Overwrite inclusive flag for special case {{{ + if s:flag.find_bd == 1 && true_direction == 1 + " Note: For bi-directional find motion s(f) & t + " If true_direction is backward, the motion is 'exclusive' + let is_inclusive_check = 0 " overwrite + let s:previous.is_inclusive = 0 " overwrite + endif "}}} + if is_inclusive_check + " Note: {{{ + " Inclusive motion requires that we eat one more + " character to the right by forcing the motion to inclusive + " if we're using a forward motion because + " > :h exclusive + " > Note that when using ':' any motion becomes characterwise + " > exclusive. + " and EasyMotion use ':' + " See: h: o_v }}} + normal! v + endif " }}} + + if s:current.is_operator && s:flag.linewise + " TODO: Is there better solution? + " Maike it linewise + normal! V + endif + + " Adjust screen especially for visual scroll & offscreen search {{{ + " Otherwise, cursor line will move middle line of window + keepjumps call winrestview({'lnum' : win_first_line, 'topline' : win_first_line}) + + " Jump to destination + keepjumps call cursor(coords[0], coords[1]) + + " To avoid side effect of overwriting buffer {{{ + " for tpope/vim-repeat + " See: :h b:changedtick + if exists('g:repeat_tick') + if g:repeat_tick == s:current.changedtick + let g:repeat_tick = b:changedtick + endif + endif "}}} + endif + + " Set tpope/vim-repeat {{{ + if s:current.is_operator == 1 && + \ !(v:operator ==# 'y' && match(&cpo, 'y') == -1) + " Store previous info for dot repeat {{{ + let s:dot_repeat.regexp = a:regexp + let s:dot_repeat.direction = a:direction + let s:dot_repeat.line_flag = s:flag.within_line + let s:dot_repeat.is_inclusive = is_inclusive_check + let s:dot_repeat.operator = v:operator + let s:dot_repeat.bd_t_flag = s:flag.bd_t " Bidirectional t motion + let s:dot_repeat.true_direction = true_direction " Check inclusive + "}}} + silent! call repeat#set("\(easymotion-dotrepeat)") + endif "}}} + + " Highlight all the matches by n-key find motions {{{ + if s:current.is_search == 1 && s:current.is_operator == 0 && g:EasyMotion_add_search_history + " It seems let &hlsearch=&hlsearch doesn't work when called + " in script, so use :h feedkeys() instead. + " Ref: :h v:hlsearch + " FIXME: doesn't work with `c` operator + call EasyMotion#helper#silent_feedkeys( + \ ":let &hlsearch=&hlsearch\", + \ 'hlsearch', 'n') + endif "}}} + + call s:Message('Jumping to [' . coords[0] . ', ' . coords[1] . ']') + let s:EasyMotion_is_cancelled = 0 " Success + "}}} + catch /^EasyMotion:.*/ + redraw + + " Show exception message + " The verbose option will take precedence + if g:EasyMotion_verbose == 1 && g:EasyMotion_ignore_exception != 1 + echo v:exception + endif + + let s:previous['regexp'] = a:regexp + " -- Activate EasyMotion ----------------- {{{ + let s:EasyMotion_is_active = 1 + call EasyMotion#attach_active_autocmd() "}}} + + call s:restore_cursor_state(a:visualmode) + let s:EasyMotion_is_cancelled = 1 " Cancel + catch + call s:Message(v:exception . ' : ' . v:throwpoint) + call s:restore_cursor_state(a:visualmode) + let s:EasyMotion_is_cancelled = 1 " Cancel + finally + " -- Restore properties ------------------ {{{ + call s:RestoreValue() + call s:turn_on_hl_error() + call EasyMotion#reset() + " }}} + " -- Remove shading ---------------------- {{{ + call EasyMotion#highlight#delete_highlight() + " }}} + + if s:EasyMotion_is_cancelled == 0 " Success + " -- Landing Highlight ------------------- {{{ + if g:EasyMotion_landing_highlight + call EasyMotion#highlight#add_highlight(a:regexp, + \ g:EasyMotion_hl_move) + call EasyMotion#highlight#attach_autocmd() + endif "}}} + " -- Activate EasyMotion ----------------- {{{ + let s:EasyMotion_is_active = 1 + call EasyMotion#attach_active_autocmd() "}}} + endif + endtry +endfunction " }}} +"}}} +" }}} + +call EasyMotion#init() +" Restore 'cpoptions' {{{ +let &cpo = s:save_cpo +unlet s:save_cpo +" }}} +" vim: fdm=marker:et:ts=4:sw=4:sts=4 diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/EasyMotion/cmigemo.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/EasyMotion/cmigemo.vim new file mode 100644 index 0000000..9a53361 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/EasyMotion/cmigemo.vim @@ -0,0 +1,117 @@ +"============================================================================= +" FILE: autoload/EasyMotion/cmigemo.vim +" AUTHOR: haya14busa +" License: MIT license {{{ +" Permission is hereby granted, free of charge, to any person obtaining +" a copy of this software and associated documentation files (the +" "Software"), to deal in the Software without restriction, including +" without limitation the rights to use, copy, modify, merge, publish, +" distribute, sublicense, and/or sell copies of the Software, and to +" permit persons to whom the Software is furnished to do so, subject to +" the following conditions: +" +" The above copyright notice and this permission notice shall be included +" in all copies or substantial portions of the Software. +" +" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +" IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +" CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +" TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +" SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +" }}} +"============================================================================= +scriptencoding utf-8 +" Saving 'cpoptions' {{{ +let s:save_cpo = &cpo +set cpo&vim +" }}} + +function! s:has_vimproc() "{{{ + if !exists('s:exists_vimproc') + try + silent call vimproc#version() + let s:exists_vimproc = 1 + catch + let s:exists_vimproc = 0 + endtry + endif + + return s:exists_vimproc +endfunction "}}} + +function! EasyMotion#cmigemo#system(...) "{{{ + return call(s:has_vimproc() ? 'vimproc#system' : 'system', a:000) +endfunction "}}} + +function! s:SearchDict2(name) "{{{ + let path = $VIM . ',' . &runtimepath + let dict = globpath(path, "dict/".a:name) + if dict == '' + let dict = globpath(path, a:name) + endif + if dict == '' + for path in [ + \ '/usr/local/share/migemo/', + \ '/usr/local/share/cmigemo/', + \ '/usr/local/share/', + \ '/usr/share/cmigemo/', + \ '/usr/share/', + \ ] + let path = path . a:name + if filereadable(path) + let dict = path + break + endif + endfor + endif + let dict = matchstr(dict, "^[^\]*") + return dict +endfunction "}}} + +function! s:SearchDict() "{{{ + for path in [ + \ 'migemo/'.&encoding.'/migemo-dict', + \ &encoding.'/migemo-dict', + \ 'migemo-dict', + \ ] + let dict = s:SearchDict2(path) + if dict != '' + return dict + endif + endfor + echoerr 'a dictionary for migemo is not found' + echoerr 'your encoding is '.&encoding +endfunction "}}} + +function! EasyMotion#cmigemo#getMigemoPattern(input) "{{{ + if !exists('s:migemodict') + let s:migemodict = s:SearchDict() + endif + + if has('migemo') + " Use migemo(). + if &migemodict !=# '' + return migemo(a:input) + endif + let &migemodict = s:migemodict + try + return migemo(a:input) + finally + let &migemodict = '' + endtry + elseif executable('cmigemo') + " Use cmigemo. + return EasyMotion#cmigemo#system('cmigemo -v -w "'.a:input.'" -d "'.s:migemodict.'"') + else + " Not supported + return a:input + endif +endfunction "}}} + +" Restore 'cpoptions' {{{ +let &cpo = s:save_cpo +unlet s:save_cpo +" }}} +" vim: fdm=marker:et:ts=4:sw=4:sts=4 diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/EasyMotion/command_line.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/EasyMotion/command_line.vim new file mode 100644 index 0000000..18ad282 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/EasyMotion/command_line.vim @@ -0,0 +1,283 @@ +"============================================================================= +" FILE: autoload/EasyMotion/command_line.vim +" AUTHOR: haya14busa +" Reference: https://github.com/osyo-manga/vim-over +" License: MIT license {{{ +" Permission is hereby granted, free of charge, to any person obtaining +" a copy of this software and associated documentation files (the +" "Software"), to deal in the Software without restriction, including +" without limitation the rights to use, copy, modify, merge, publish, +" distribute, sublicense, and/or sell copies of the Software, and to +" permit persons to whom the Software is furnished to do so, subject to +" the following conditions: +" +" The above copyright notice and this permission notice shall be included +" in all copies or substantial portions of the Software. +" +" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +" IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +" CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +" TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +" SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +" }}} +"============================================================================= +scriptencoding utf-8 +" Saving 'cpoptions' {{{ +let s:save_cpo = &cpo +set cpo&vim +" }}} + +" CommandLine: +let s:V = vital#easymotion#new() +let s:cmdline = s:V.import('Over.Commandline.Base') +let s:modules = s:V.import("Over.Commandline.Modules") +let s:search = s:cmdline.make() +let s:search.highlights.prompt = 'Question' + +" Add Module: {{{ +call s:search.connect('Exit') +call s:search.connect('Cancel') +call s:search.connect('Redraw') +call s:search.connect('DrawCommandline') +call s:search.connect('Delete') +call s:search.connect('CursorMove') +call s:search.connect('Paste') +call s:search.connect('BufferComplete') +call s:search.connect('InsertRegister') +call s:search.connect('ExceptionExit') +call s:search.connect(s:modules.get('ExceptionMessage').make('EasyMotion: ', 'echom')) +call s:search.connect(s:modules.get('History').make('/')) +call s:search.connect(s:modules.get('NoInsert').make_special_chars()) +call s:search.connect(s:modules.get('KeyMapping').make_emacs()) +call s:search.connect(s:modules.get('Doautocmd').make('EMCommandLine')) + +let s:module = { +\ "name" : "EasyMotion", +\} +function! s:module.on_char_pre(cmdline) + if a:cmdline.is_input("(em-scroll-f)") + call s:scroll(0) + call a:cmdline.setchar('') + elseif a:cmdline.is_input("(em-scroll-b)") + call s:scroll(1) + call a:cmdline.setchar('') + elseif a:cmdline.is_input("(em-jumpback)") + keepjumps call setpos('.', s:save_orig_pos) + let s:orig_pos = s:save_orig_pos + let s:orig_line_start = getpos('w0') + let s:orig_line_end = getpos('w$') + let s:direction = s:save_direction + call a:cmdline.setchar('') + elseif a:cmdline.is_input("(em-openallfold)") + " TODO: better solution + normal! zR + call a:cmdline.setchar('') + endif +endfunction +call s:search.connect(s:module) +"}}} + +" CommandLine Keymap: {{{ +" .keymapping() won't be remapped by user defined KeyMappings. +function! s:search.keymapping() "{{{ + return { +\ "\" : { +\ "key" : "(exit)", +\ "noremap" : 1, +\ "lock" : 1, +\ }, +\ } +endfunction "}}} + +call s:search.cnoremap("\", '(buffer-complete)') +call s:search.cnoremap("\", '(em-scroll-f)') +call s:search.cnoremap("\", '(em-scroll-b)') +call s:search.cnoremap("\", '(em-jumpback)') +call s:search.cnoremap("\", '(em-openallfold)') + +" Fins Motion CommandLine Mapping Command: {{{ +function! EasyMotion#command_line#cmap(args) + let lhs = s:as_keymapping(a:args[0]) + let rhs = s:as_keymapping(a:args[1]) + call s:search.cmap(lhs, rhs) +endfunction +function! EasyMotion#command_line#cnoremap(args) + let lhs = s:as_keymapping(a:args[0]) + let rhs = s:as_keymapping(a:args[1]) + call s:search.cnoremap(lhs, rhs) +endfunction +function! EasyMotion#command_line#cunmap(lhs) + let lhs = s:as_keymapping(a:lhs) + call s:search.cunmap(lhs) +endfunction +function! s:as_keymapping(key) + execute 'let result = "' . substitute(a:key, '\(<.\{-}>\)', '\\\1', 'g') . '"' + return result +endfunction +"}}} +"}}} + +" Event: {{{ +function! s:search.on_enter(cmdline) "{{{ + if s:num_strokes == -1 + call EasyMotion#highlight#delete_highlight() + call EasyMotion#helper#VarReset('&scrolloff', 0) + if g:EasyMotion_do_shade + call EasyMotion#highlight#add_highlight('\_.*', + \ g:EasyMotion_hl_group_shade) + endif + endif + if g:EasyMotion_cursor_highlight + call EasyMotion#highlight#add_highlight('\%#', + \ g:EasyMotion_hl_inc_cursor) + endif +endfunction "}}} +function! s:search.on_leave(cmdline) "{{{ + if s:num_strokes == -1 + call EasyMotion#highlight#delete_highlight(g:EasyMotion_hl_inc_search) + if g:EasyMotion_do_shade + call EasyMotion#highlight#delete_highlight(g:EasyMotion_hl_group_shade) + endif + endif + if g:EasyMotion_cursor_highlight + call EasyMotion#highlight#delete_highlight(g:EasyMotion_hl_inc_cursor) + endif +endfunction "}}} +function! s:search.on_char(cmdline) "{{{ + if s:num_strokes == -1 + let re = s:search.getline() + if EasyMotion#helper#should_case_sensitive(re, 1) + let case_flag = '\c' + else + let case_flag = '\C' + endif + let re .= case_flag + if g:EasyMotion_inc_highlight + call s:inc_highlight(re) + endif + if g:EasyMotion_off_screen_search + call s:off_screen_search(re) + endif + elseif s:search.line.length() >= s:num_strokes + call s:search.exit() + endif +endfunction "}}} +"}}} + +" Main: +function! EasyMotion#command_line#GetInput(num_strokes, prev, direction) "{{{ + let s:num_strokes = a:num_strokes + + let s:prompt_base = s:getPromptMessage(a:num_strokes) + call s:search.set_prompt(s:prompt_base) + + " Screen: cursor position, first and last line + let s:orig_pos = getpos('.') + let s:orig_line_start = getpos('w0') + let s:orig_line_end = getpos('w$') + let s:save_orig_pos = deepcopy(s:orig_pos) + + " Direction: + let s:direction = a:direction == 1 ? 'b' : '' + let s:save_direction = deepcopy(s:direction) + + let input = s:search.get() + if input == '' && ! s:search.exit_code() + return a:prev + elseif s:search.exit_code() == 1 || s:search.exit_code() == -1 + call s:Cancell() + return '' + else + return input + endif +endfunction "}}} + +" Helper: +function! s:Cancell() " {{{ + call EasyMotion#highlight#delete_highlight() + call EasyMotion#helper#VarReset('&scrolloff') + keepjumps call setpos('.', s:save_orig_pos) + if g:EasyMotion_verbose + echo 'EasyMotion: Cancelled' + endif + return '' +endfunction " }}} +function! s:getPromptMessage(num_strokes) "{{{ + if a:num_strokes == 1 + let prompt = substitute( + \ substitute(g:EasyMotion_prompt,'{n}', a:num_strokes, 'g'), + \ '(s)', '', 'g') + elseif a:num_strokes == -1 + let prompt = substitute( + \ substitute(g:EasyMotion_prompt, '{n}\s\{0,1}', '', 'g'), + \ '(s)', 's', 'g') + else + let prompt = substitute( + \ substitute(g:EasyMotion_prompt,'{n}', a:num_strokes, 'g'), + \ '(s)', 's', 'g') + endif + return prompt +endfunction "}}} + +function! s:off_screen_search(re) "{{{ + " First: search within visible screen range + call s:adjust_screen() + " Error occur when '\zs' without '!' + silent! let pos = searchpos(a:re, s:direction . 'n', s:orig_line_end[1]) + if pos != [0, 0] + " Restore cursor posision + keepjumps call setpos('.', s:orig_pos) + else + " Second: if there were no much, search off screen + silent! let pos = searchpos(a:re, s:direction) + if pos != [0, 0] + " Match + keepjumps call setpos('.', pos) + " Move cursor + if s:save_direction != 'b' + normal! zzH0 + else + normal! zzL0 + endif + else + " No much + call s:adjust_screen() + keepjumps call setpos('.', s:orig_pos) + endif + endif + " redraw +endfunction "}}} +function! s:adjust_screen() "{{{ + if s:save_direction != 'b' + " Forward + keepjumps call setpos('.', s:orig_line_start) + normal! zt + else + " Backward + keepjumps call setpos('.', s:orig_line_end) + normal! zb + endif +endfunction "}}} +function! s:scroll(direction) "{{{ + " direction: 0 -> forward, 1 -> backward + exec a:direction == 0 ? "normal! \" : "normal! \" + let s:orig_pos = getpos('.') + let s:orig_line_start = getpos('w0') + let s:orig_line_end = getpos('w$') + let s:direction = a:direction == 0 ? '' : 'b' +endfunction "}}} +function! s:inc_highlight(re) "{{{ + call EasyMotion#highlight#delete_highlight(g:EasyMotion_hl_inc_search) + if s:search.line.length() > 0 + " Error occur when '\zs' without '!' + silent! call EasyMotion#highlight#add_highlight(a:re, g:EasyMotion_hl_inc_search) + endif +endfunction "}}} + +" Restore 'cpoptions' {{{ +let &cpo = s:save_cpo +unlet s:save_cpo +" }}} +" vim: fdm=marker:et:ts=4:sw=4:sts=4 diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/EasyMotion/helper.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/EasyMotion/helper.vim new file mode 100644 index 0000000..4926566 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/EasyMotion/helper.vim @@ -0,0 +1,185 @@ +"============================================================================= +" FILE: autoload/EasyMotion/helper.vim +" AUTHOR: haya14busa +" License: MIT license {{{ +" Permission is hereby granted, free of charge, to any person obtaining +" a copy of this software and associated documentation files (the +" "Software"), to deal in the Software without restriction, including +" without limitation the rights to use, copy, modify, merge, publish, +" distribute, sublicense, and/or sell copies of the Software, and to +" permit persons to whom the Software is furnished to do so, subject to +" the following conditions: +" +" The above copyright notice and this permission notice shall be included +" in all copies or substantial portions of the Software. +" +" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +" IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +" CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +" TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +" SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +" }}} +"============================================================================= +scriptencoding utf-8 +" Saving 'cpoptions' {{{ +let s:save_cpo = &cpo +set cpo&vim +" }}} + +function! EasyMotion#helper#mode(flag) "{{{ + return mode(a:flag) == "\" ? "C-v" : mode(a:flag) +endfunction "}}} + +function! EasyMotion#helper#get_char_by_coord(coord) "{{{ + " @param coord: [lnum, col] or [bufnum, lnum, col, off] + if len(a:coord) == 4 + let [line_num, col_num] = [a:coord[1], a:coord[2]] + else + let [line_num, col_num] = a:coord + endif + let target_col_regexp = '\%' . (col_num) . 'c.' + return matchstr(getline(line_num), target_col_regexp) +endfunction "}}} + +function! EasyMotion#helper#is_greater_coords(coords1, coords2) "{{{ + " [line_num, col_num] < [line_num, col_num] + " + " coords1 < coords2 : return 1 + " coords1 > coords2 : return -1 + " coords1 == coords2 : return 0 + if a:coords1 == a:coords2 | return 0 | endif + + if a:coords1[0] < a:coords2[0] + return 1 + elseif a:coords1[0] > a:coords2[0] + return -1 + endif + + " Same line + if a:coords1[1] < a:coords2[1] + return 1 + elseif a:coords1[1] > a:coords2[1] + return -1 + endif +endfunction "}}} + +function! EasyMotion#helper#is_folded(line) "{{{ + " Return false if g:EasyMotion_skipfoldedline == 1 + " and line is start of folded lines + let _foldclosed = foldclosed(a:line) + return _foldclosed != -1 && + \ (g:EasyMotion_skipfoldedline == 1 || a:line != _foldclosed) +endfunction "}}} +function! EasyMotion#helper#should_case_sensitive(input, is_search) "{{{ + if !a:is_search + if g:EasyMotion_smartcase == 0 + return 0 + else + " return 1 if input didn't match uppercase letter + return match(a:input, '\u') == -1 + endif + endif + + if (g:EasyMotion_smartcase == 1 && match(a:input, '\u') == -1) || + \ (&ignorecase && &smartcase && match(a:input, '\u') == -1) || + \ (&ignorecase && !&smartcase) + return 1 + endif + return 0 +endfunction "}}} +function! EasyMotion#helper#silent_feedkeys(expr, name, ...) "{{{ + " Ref: + " https://github.com/osyo-manga/vim-over/blob/d51b028c29661d4a5f5b79438ad6d69266753711/autoload/over.vim#L6 + let mode = get(a:, 1, "m") + let name = "easymotion-" . a:name + let map = printf("(%s)", name) + if mode == "n" + let command = "nnoremap" + else + let command = "nmap" + endif + execute command "" map printf("%s:nunmap %s", a:expr, map) + if mode(1) !=# 'ce' + " FIXME: mode(1) !=# 'ce' exists only for the test + " :h feedkeys() doesn't work while runnning a test script + " https://github.com/kana/vim-vspec/issues/27 + call feedkeys(printf("\(%s)", name)) + endif +endfunction "}}} +function! EasyMotion#helper#VarReset(var, ...) "{{{ + if ! exists('s:var_reset') + let s:var_reset = {} + endif + + if a:0 == 0 && has_key(s:var_reset, a:var) + " Reset var to original value + " setbufvar( or bufname): '' or '%' can be used for the current buffer + call setbufvar('%', a:var, s:var_reset[a:var]) + elseif a:0 == 1 + " Save original value and set new var value + + let new_value = a:0 == 1 ? a:1 : '' + + " Store original value + let s:var_reset[a:var] = getbufvar("", a:var) + + " Set new var value + call setbufvar('%', a:var, new_value) + endif +endfunction "}}} + +" Migemo {{{ +function! EasyMotion#helper#load_migemo_dict() "{{{ + let enc = &l:encoding + if enc ==# 'utf-8' + return EasyMotion#migemo#utf8#load_dict() + elseif enc ==# 'cp932' + return EasyMotion#migemo#cp932#load_dict() + elseif enc ==# 'euc-jp' + return EasyMotion#migemo#eucjp#load_dict() + else + let g:EasyMotion_use_migemo = 0 + throw "Error: ".enc." is not supported. Migemo is made disabled." + endif +endfunction "}}} + +" EasyMotion#helper#strchars() {{{ +if exists('*strchars') + function! EasyMotion#helper#strchars(str) + return strchars(a:str) + endfunction +else + function! EasyMotion#helper#strchars(str) + return strlen(substitute(a:str, ".", "x", "g")) + endfunction +endif "}}} +function! EasyMotion#helper#include_multibyte_char(str) "{{{ + return strlen(a:str) != EasyMotion#helper#strchars(a:str) +endfunction "}}} + +function! EasyMotion#helper#vcol(expr) abort + let col_num = col(a:expr) + let line = getline(a:expr) + let before_line = col_num > 2 ? line[: col_num - 2] + \ : col_num is# 2 ? line[0] + \ : '' + let vcol_num = 1 + for c in split(before_line, '\zs') + let vcol_num += c is# "\t" ? s:_virtual_tab2spacelen(vcol_num) : len(c) + endfor + return vcol_num +endfunction + +function! s:_virtual_tab2spacelen(col_num) abort + return &tabstop - ((a:col_num - 1) % &tabstop) +endfunction + +"}}} + +" Restore 'cpoptions' {{{ +let &cpo = s:save_cpo +unlet s:save_cpo +" }}} +" vim: fdm=marker:et:ts=4:sw=4:sts=4 diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/EasyMotion/highlight.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/EasyMotion/highlight.vim new file mode 100644 index 0000000..fa915a6 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/EasyMotion/highlight.vim @@ -0,0 +1,251 @@ +"============================================================================= +" FILE: highlight.vim +" AUTHOR: haya14busa +" Reference: https://github.com/t9md/vim-smalls +" License: MIT license {{{ +" Permission is hereby granted, free of charge, to any person obtaining +" a copy of this software and associated documentation files (the +" "Software"), to deal in the Software without restriction, including +" without limitation the rights to use, copy, modify, merge, publish, +" distribute, sublicense, and/or sell copies of the Software, and to +" permit persons to whom the Software is furnished to do so, subject to +" the following conditions: +" +" The above copyright notice and this permission notice shall be included +" in all copies or substantial portions of the Software. +" +" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +" IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +" CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +" TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +" SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +" }}} +"============================================================================= +scriptencoding utf-8 +" Saving 'cpoptions' {{{ +let s:save_cpo = &cpo +set cpo&vim +" }}} + +function! EasyMotion#highlight#load() + "load +endfunction + +" -- Default highlighting ---------------- {{{ +let g:EasyMotion_hl_group_target = get(g:, + \ 'EasyMotion_hl_group_target', 'EasyMotionTarget') +let g:EasyMotion_hl2_first_group_target = get(g:, + \ 'EasyMotion_hl2_first_group_target', 'EasyMotionTarget2First') +let g:EasyMotion_hl2_second_group_target = get(g:, + \ 'EasyMotion_hl2_second_group_target', 'EasyMotionTarget2Second') +let g:EasyMotion_hl_group_shade = get(g:, + \ 'EasyMotion_hl_group_shade', 'EasyMotionShade') + +let g:EasyMotion_hl_inc_search = get(g:, + \ 'EasyMotion_hl_inc_search', 'EasyMotionIncSearch') +let g:EasyMotion_hl_inc_cursor = get(g:, + \ 'EasyMotion_hl_inc_cursor', 'EasyMotionIncCursor') +let g:EasyMotion_hl_move = get(g:, + \ 'EasyMotion_hl_move', 'EasyMotionMoveHL') + +let s:target_hl_defaults = { + \ 'gui' : ['NONE', '#ff0000' , 'bold'] + \ , 'cterm256': ['NONE', '196' , 'bold'] + \ , 'cterm' : ['NONE', 'red' , 'bold'] + \ } + +let s:target_hl2_first_defaults = { + \ 'gui' : ['NONE', '#ffb400' , 'bold'] + \ , 'cterm256': ['NONE', '11' , 'bold'] + \ , 'cterm' : ['NONE', 'yellow' , 'bold'] + \ } + +let s:target_hl2_second_defaults = { + \ 'gui' : ['NONE', '#b98300' , 'bold'] + \ , 'cterm256': ['NONE', '3' , 'bold'] + \ , 'cterm' : ['NONE', 'yellow' , 'bold'] + \ } + +let s:shade_hl_defaults = { + \ 'gui' : ['NONE', '#777777' , 'NONE'] + \ , 'cterm256': ['NONE', '242' , 'NONE'] + \ , 'cterm' : ['NONE', 'grey' , 'NONE'] + \ } + +let s:shade_hl_line_defaults = { + \ 'gui' : ['red' , '#FFFFFF' , 'NONE'] + \ , 'cterm256': ['red' , '242' , 'NONE'] + \ , 'cterm' : ['red' , 'grey' , 'NONE'] + \ } + +let s:target_hl_inc = { + \ 'gui' : ['NONE', '#7fbf00' , 'bold'] + \ , 'cterm256': ['NONE', '40' , 'bold'] + \ , 'cterm' : ['NONE', 'green' , 'bold'] + \ } +let s:target_hl_inc_cursor = { + \ 'gui' : ['#ACDBDA', '#121813' , 'bold'] + \ , 'cterm256': ['cyan' , '232' , 'bold'] + \ , 'cterm' : ['cyan' , 'black' , 'bold'] + \ } +let s:target_hl_move = { + \ 'gui' : ['#7fbf00', '#121813' , 'bold'] + \ , 'cterm256': ['green' , '15' , 'bold'] + \ , 'cterm' : ['green' , 'white' , 'bold'] + \ } +" }}} +function! EasyMotion#highlight#InitHL(group, colors) " {{{ + let group_default = a:group . 'Default' + + " Prepare highlighting variables + let guihl = printf('guibg=%s guifg=%s gui=%s', a:colors.gui[0], a:colors.gui[1], a:colors.gui[2]) + let ctermhl = &t_Co == 256 + \ ? printf('ctermbg=%s ctermfg=%s cterm=%s', a:colors.cterm256[0], a:colors.cterm256[1], a:colors.cterm256[2]) + \ : printf('ctermbg=%s ctermfg=%s cterm=%s', a:colors.cterm[0], a:colors.cterm[1], a:colors.cterm[2]) + + " Create default highlighting group + execute printf('hi default %s %s %s', group_default, guihl, ctermhl) + + " Check if the hl group exists + if hlexists(a:group) + redir => hlstatus | exec 'silent hi ' . a:group | redir END + + " Return if the group isn't cleared + if hlstatus !~ 'cleared' + return + endif + endif + + " No colors are defined for this group, link to defaults + execute printf('hi default link %s %s', a:group, group_default) +endfunction " }}} +function! EasyMotion#highlight#init() "{{{ + call EasyMotion#highlight#InitHL(g:EasyMotion_hl_group_target, s:target_hl_defaults) + call EasyMotion#highlight#InitHL(g:EasyMotion_hl2_first_group_target, s:target_hl2_first_defaults) + call EasyMotion#highlight#InitHL(g:EasyMotion_hl2_second_group_target, s:target_hl2_second_defaults) + call EasyMotion#highlight#InitHL(g:EasyMotion_hl_group_shade, s:shade_hl_defaults) + call EasyMotion#highlight#InitHL(g:EasyMotion_hl_inc_search, s:target_hl_inc) + call EasyMotion#highlight#InitHL(g:EasyMotion_hl_inc_cursor, s:target_hl_inc_cursor) + call EasyMotion#highlight#InitHL(g:EasyMotion_hl_move, s:target_hl_move) + if exists(':CSApprox') == 2 && g:EasyMotion_force_csapprox + "TODO: better solution or remove completly + CSApprox! + endif +endfunction "}}} + +" Reset highlighting after loading a new color scheme {{{ +augroup EasyMotionInitHL + autocmd! + autocmd ColorScheme * call EasyMotion#highlight#init() +augroup end +" }}} + +call EasyMotion#highlight#init() +" Init: {{{ +let s:h = {} +let s:h.ids = {} +let s:priorities = { + \ g:EasyMotion_hl_group_target : 100, + \ g:EasyMotion_hl2_first_group_target : 100, + \ g:EasyMotion_hl2_second_group_target : 100, + \ g:EasyMotion_hl_group_shade : 0, + \ g:EasyMotion_hl_inc_search : 1, + \ g:EasyMotion_hl_inc_cursor : 2, + \ g:EasyMotion_hl_move : 0, + \ } +for s:group in keys(s:priorities) + let s:h.ids[s:group] = [] +endfor +unlet s:group +"}}} + +function! EasyMotion#highlight#delete_highlight(...) "{{{ + let groups = !empty(a:000) ? a:000 : keys(s:priorities) + for group in groups + for id in s:h.ids[group] + silent! call matchdelete(id) + endfor + let s:h.ids[group] = [] + endfor +endfunction "}}} +function! EasyMotion#highlight#add_highlight(re, group) "{{{ + call add(s:h.ids[a:group], matchadd(a:group, a:re, s:priorities[a:group])) +endfunction "}}} +function! EasyMotion#highlight#add_pos_highlight(line_num, col_num, group) "{{{ + call add(s:h.ids[a:group], matchaddpos(a:group, [[a:line_num, a:col_num]], s:priorities[a:group])) +endfunction "}}} +function! EasyMotion#highlight#attach_autocmd() "{{{ + " Reference: https://github.com/justinmk/vim-sneak + augroup plugin-easymotion + autocmd! + autocmd InsertEnter,WinLeave,BufLeave + \ silent! call EasyMotion#highlight#delete_highlight() + \ | autocmd! plugin-easymotion * + autocmd CursorMoved + \ autocmd plugin-easymotion CursorMoved + \ silent! call EasyMotion#highlight#delete_highlight() + \ | autocmd! plugin-easymotion * + augroup END +endfunction "}}} +function! EasyMotion#highlight#add_color_group(new_groups) "{{{ + let s:priorities = extend(deepcopy(s:priorities), a:new_groups) + for group in keys(a:new_groups) + let s:h.ids[group] = [] + endfor +endfunction "}}} + +function! EasyMotion#highlight#capture(hlname) "{{{ + " Based On: https://github.com/t9md/vim-ezbar + " https://github.com/osyo-manga/vital-over + let hlname = a:hlname + if !hlexists(hlname) + return + endif + while 1 + let save_verbose = &verbose + let &verbose = 0 + try + redir => HL_SAVE + execute 'silent! highlight ' . hlname + redir END + finally + let &verbose = save_verbose + endtry + if !empty(matchstr(HL_SAVE, 'xxx cleared$')) + return '' + endif + " follow highlight link + let ml = matchlist(HL_SAVE, 'links to \zs.*') + if !empty(ml) + let hlname = ml[0] + continue + endif + break + endwhile + let HL_SAVE = substitute(matchstr(HL_SAVE, 'xxx \zs.*'), + \ '[ \t\n]\+', ' ', 'g') + return [hlname, HL_SAVE] +endfunction "}}} +function! EasyMotion#highlight#turn_off(hl) "{{{ + if type(a:hl) != type([]) + return + endif + execute 'highlight ' . a:hl[0] . ' NONE' +endfunction "}}} +function! EasyMotion#highlight#turn_on(hl) "{{{ + if type(a:hl) != type([]) + return + endif + execute 'highlight ' . a:hl[0] . ' ' . a:hl[1] +endfunction "}}} + +" Restore 'cpoptions' {{{ +let &cpo = s:save_cpo +unlet s:save_cpo +" }}} +" __END__ {{{ +" vim: expandtab softtabstop=4 shiftwidth=4 +" vim: foldmethod=marker +" }}} diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/EasyMotion/migemo/cp932.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/EasyMotion/migemo/cp932.vim new file mode 100644 index 0000000..4db547b --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/EasyMotion/migemo/cp932.vim @@ -0,0 +1,97 @@ +function! EasyMotion#migemo#cp932#load_dict() + return { + \ '!' : '\%([I!]\|\_s*Q\_s*\)', + \ '"' : '[hgV"]', + \ '#' : '[#]', + \ '$' : '[\$]', + \ '%' : '\%([%]\|p\_s*[\_s*Z\_s*\_s*g\)', + \ '&' : '\%([&]\|A\_s*\_s*\%(h\|p\_s*T\_s*\_s*h\)\)', + \ "'" : '\%([YheLf'']\|A\_s*|\_s*X\_s*g\_s*\_s*t\_s*B\)', + \ '(' : '[ikywm(]', + \ ')' : '[zxjn)]', + \ '*' : '[~\*]', + \ '+' : '[}{+]', + \ ',' : '[CA,]', + \ '-' : '\%([\|[]`-]\|}\_s*C\_s*i\_s*X\| \_s*c\_s* \)', + \ '.' : '\%([dBDEc\.]\|h\_s*b\_s*g\_s*\%(l\_s*b\_s*g\|R\_s*\)\)', + \ '/' : '\%([^\/]\|s\_s*l\_s*a\_s*s\_s*h\_s*d\_s*o\_s*t\|X\_s*\_s*\%(h\|b\_s*V\_s*\_s*h\_s*b\_s*g\)\)', + \ '0' : '\%([ZO0]\|[\_s*\|z\_s*e\_s*r\_s*o\)', + \ '1' : '\%([\SGMKhYZEPTnmcyzdafp똟P1]\|V\_s*b\_s*N\_s*X\_s*e\_s*B\_s*[\_s*\|s\_s*\%(e\_s*v\_s*e\_s*n\_s*t\_s*e\_s*e\_s*n\|i\_s*x\_s*t\_s*e\_s*e\_s*n\)\|g\_s*E\_s*F\_s*\_s*[u]\|C\_s*\_s*\%(u\_s*\|\_s*\)\|n\_s*\_s*h\_s*\_s*b\_s*h\|T\_s*\%([\_s*e\_s*B\_s*[\_s*\|E\_s*U\_s*\_s*h\)\|g\_s*i\_s*g\_s*a\|M\_s*K\|\_s*K\|k\_s*i\_s*l\_s*o\|L\_s*\|w\_s*N\_s*g\|e\_s*\%(i\_s*g\_s*h\_s*t\_s*e\_s*e\_s*n\|l\_s*e\_s*v\_s*e\_s*n\|x\_s*a\)\|G\_s*\%(C\_s*e\_s*B\_s*[\_s*\|N\_s*T\)\|y\_s*^\|t\_s*\%(w\_s*e\_s*l\_s*v\_s*e\|h\_s*\%(i\_s*r\_s*t\_s*e\_s*e\_s*n\|o\_s*u\_s*s\_s*a\_s*n\_s*d\)\|e\_s*\%(n\|r\_s*a\)\)\|e\_s*[]\|i\_s*\%(m\|C\_s*\_s*e\_s*B\_s*[\_s*\)\|}\_s*C\_s*N\_s*\|~\_s*\%(\|N\_s*\)\|Z\_s*\%(\_s*\_s*e\_s*B\_s*[\_s*\|u\_s*\_s*e\_s*B\_s*[\_s*\|\_s*`\)\|\_s*\%(^\|N\_s*g\)\|[\_s*\%(^\|v\_s*g\)\|f\_s*[JV]\|A\_s*g\|s\_s*R\|t\_s*\%(B\_s*t\_s*e\_s*B\_s*[\_s*\|H\_s*[\_s*e\_s*B\_s*[\_s*\|F\_s*\_s*g\|@\_s*[\_s*X\_s*g\)\|\_s*\|o\_s*n\_s*e\)', + \ '2' : '\%([Q2]\|g\_s*E\_s*F\_s*\_s*e\_s*B\|Z\_s*J\_s*\_s*h\|t\_s*w\_s*\%(o\|e\_s*n\_s*t\_s*y\)\|c\_s*[\)', + \ '3' : '\%([OR3]\|E\_s*E\_s*E\|\_s* \_s*\_s* \_s*\|T\_s*[\_s*\%(h\|e\_s*B\)\|X\_s*\_s*[\|t\_s*h\_s*\%(i\_s*r\_s*t\_s*y\|r\_s*e\_s*e\)\)', + \ '4' : '\%([lS4]\|f\_s*o\_s*u\_s*r\|t\_s*H\_s*[\)', + \ '5' : '\%([T5]\|f\_s*i\_s*\%(f\_s*t\_s*y\|v\_s*e\)\|t\_s*\%(B\_s*t\_s*\%(X\|e\_s*B\)\|@\_s*C\_s*u\)\)', + \ '6' : '\%([ZU6]\|s\_s*i\_s*x\|V\_s*b\_s*N\_s*X\)', + \ '7' : '\%([V7]\|Z\_s*u\_s*\|s\_s*e\_s*v\_s*e\_s*n\)', + \ '8' : '\%([W8]\|G\_s*C\_s*\%([Xg]\|e\_s*B\)\|e\_s*i\_s*g\_s*h\_s*t\)', + \ '9' : '\%([X9]\|i\_s*C\_s*\|n\_s*i\_s*n\_s*e\)', + \ ':' : '[cF:]', + \ ';' : '[G;]', + \ '<' : '[<]', + \ '=' : '[߁=]', + \ '>' : '[>]', + \ '?' : '[H?]', + \ '@' : '[@]', + \ 'A' : '\%([ݕNҊ{b]毛^w܏o@C糕ӓJlVȌlˆ^؜{Qz鸈WEB{M榏Qkw{ꁋ\N}Ho{tVpA֔\HՓaSN[ړaWo㻓֏~ĔMؒg禈ŊN[ΎѕҚae}RyvXI\॑ŐVaz\eXEV~dYэʊ늿ߎӕT瑀剎ՕP]JÓV쉐˖ԋY͈b般HꙌ卋ǖsN𗺌摏L[jPNzӟEDɏ͏W쏺HVq襞B\͈ԑ~㪌ZQōs}ĈLjƈ풩@rb~`qgݝю鈩[ޝ脋ōCK\ؐԐzЕɈŒ}ራSݑYK򗁍rgҘa𞓍GcLJ}숢jޜO[㝧ȁ_&ڋ͈󁨁ˁ́܌WāNLMOf``p@AA]\|\_s*\|\_s*\|\_s*\|\_s*\|Z\_s*\%(n\|i\_s*n\_s*c\)\|\_s*q\|\_s*\|E\_s*n\|\_s*\|f\_s*\|M\_s*V\_s*\|\_s*T\|\_s*\|Z\_s*q\|\_s*\|l\_s*\|\_s*\|^\_s*\|\_s*\|\_s*\|\_s*w\|\_s*[]\|\_s*p\|\_s*\|\_s*\|L\_s*a\_s*r\_s*d\_s*i\_s*z\_s*a\_s*b\_s*a\_s*l\_s*a\_s*c\_s*e\_s*a\_s*e\|\_s*{\|\_s*\%(\|\_s*q\)\|\_s*\%(\|\_s*\_s*\_s*\_s*\)\|H\_s*a\_s*b\|H\_s*a\_s*l\_s*o\_s*r\_s*a\_s*g\_s*a\_s*l\_s*e\_s*s\|\_s*F\|\_s*\|\_s*`\|^\_s*\_s*\_s*\|\_s*\|\_s*\|D\_s*`\|a\_s*\%(t\_s*t\_s*o\|c\_s*c\_s*e\_s*n\_s*t\)\|\_s*[K]\|\_s*G\|\_s*[mF]\|\_s*x\|\_s*\|\_s*\|\_s*\|p\_s*\%([ۓc]\|\_s*p\|\_s*\)\|\_s*[ɁX]\|E\_s*\%(s\|i\_s*n\_s*s\_s*t\_s*e\_s*i\_s*n\_s*i\_s*u\_s*m\)\|h\_s*\%(o\_s*d\_s*b\|b\_s*\%(^\_s*O\|J\_s*[\_s*h\)\)\|I\_s*\%(r\_s*i\_s*d\_s*a\_s*l\_s*e\_s*s\|P\_s*\%(d\_s*b\|A\_s*h\_s*\_s*X\)\|D\_s*J\_s*[\_s*h\|C\_s*\%(^\_s*O\|J\_s*[\_s*h\)\)\|\_s*~\|\_s*\|c\_s*\|n\_s*\_s*\|C\_s*[^ml]\|R\_s*u\_s*b\_s*i\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|\_s*\_s*a\_s*\|\_s*\|\_s*n\|\_s*[nꆖ]\|M\_s*a\_s*l\_s*v\_s*a\_s*l\_s*e\_s*s\|g\_s*\_s*v\_s*\_s*A\| \_s*A\_s*N\_s*V\_s*A\_s*\|\_s*\|\_s*f\|q\_s*f\|\_s*s\_s*\_s*x\_s*Z\_s*p\_s*\_s*\_s*\|\_s*\|\_s*Y\|\_s*\|G\_s*o\_s*l\_s*d\|\_s*\_s*\%(\_s*\_s*\_s*\_s*\_s*\_s*@\|a\_s*\_s*\_s*@\)\|\_s*\|\_s*\|\_s*\|\_s*\_s*\|Z\_s*\_s*g\_s*L\_s*b\_s*c\_s*l\|S\_s*\%(b\|i\_s*l\_s*v\_s*e\_s*r\)\|\_s*p\_s*\_s*\\|g\_s*p\_s*\_s*\\|Z\_s*@\|\_s*\_s*\_s*\|I\_s*\%(\|M\_s*\_s*X\_s*^\_s*\|h\_s*\_s*C\|\_s*O\_s*X\_s*g\_s*\_s*[\_s*\|\_s*\%(g\_s*L\_s*[\|^\_s*\%([[i]\|l\_s*\%([\_s*g\|C\_s*g\)\)\)\|[\_s*\%([NKTg]\|j\_s*\_s*O\|L\_s*V\_s*\|u\_s*\_s*[\|o\_s*[\_s*h\|x\_s*\_s*W\_s*\|M\_s*\_s*X\_s*\%(g\|^\_s*\)\|]\_s*\_s*k\|X\_s*\%(`\_s*\|e\_s*B\_s*\|^\_s*[\|g\_s*\%(\_s*A\|\_s*\_s*A\)\)\|h\_s*\_s*[\|W\_s*\%([F[]\|I\_s*\_s*W\)\|f\_s*B\_s*\%(I\|G\_s*\_s*X\|V\_s*\_s*\|g\_s*\_s*A\_s*\)\|^\_s*\|\\_s*\%(\_s*e\_s*B\|\_s*C\_s*Y\)\|Z\_s*\_s*e\_s*B\_s*b\_s*N\|\_s*\)\)\|z\_s*\|o\_s*C\_s*g\|n\_s*\_s*}\_s*Q\_s*h\_s*\|\_s*\|l\_s*H\_s*\%(\_s*\_s*\|m\_s*\\)\|C\_s*\%([\_s*W\_s*X\|I\_s*\|\\_s*b\_s*v\)\|}\_s*\_s*h\_s*D\_s*[\_s*N\|\_s*\%(z\_s*\|\_s*\|\_s*p\)\|t\_s*^\|\_s*p\|G\_s*\%([jA[C]\|b\_s*`\|\_s*\%(h\_s*\_s*\|W\_s*F\_s*\%(\|\_s*b\_s*N\)\|[\_s*\)\|\_s*A\|I\_s*\_s*A\|X\_s*e\|v\_s*\_s*\)\)', + \ 'B' : '\%([ݍxftݖv{}~Ϟrs`pؖnlmqK䛖e㤝ԕORE廖bӖQgԜRWaXZU`YNϙ˛Sc]fhT^d@Gە덛͕d敕WJV_K럑k㰋Йpgꈕ̕ѝV燙ęܛ~Aᾙjוؕى•粂בD[kuqJڟܐ[W᳓ؐߕܖܘŕhᕷFᕑoFx~w򐁕ŐU@sԕ捐lLJxʕTCZz[m㢛ߕpCޜrF{qn蓕S焛唒IalL[߁eὟەdcb`_aeroZg]XΔzۓє䊑ыsI[@bVU㭔jAcUPWєm\e}tS̔i䕜ޔ|ꀊL{~}Ŕf\ҔԖ_Jmה”dHݔ֔ӔՔԔؖ따\nmtHŔlnyk΁gےꉺ~|ab_攞{onmpoaurAqxB]\|\_s*\%(\_s*\|\_s*\|\_s*\|\_s*\|\_s*\)\|b\_s*[{xuro]\|\_s*[ڂׂԂт]\|\_s*\|\_s*\|A\_s*\|P\_s*a\_s*e\_s*o\_s*n\_s*i\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|\_s*\|\_s*Z\|\_s*\|r\_s*r\|\_s*\|\_s*\|\_s*_\|\_s*_\|\_s*\|E\_s*\|\_s*\|\_s*C\|\_s*\|X\_s*[j]\|R\_s*\_s*O\|F\_s*a\_s*g\_s*a\_s*l\_s*e\_s*s\|z\_s*c\|\_s*\|u\_s*\%(\|l\_s*b\_s*N\|V\_s*l\_s*}\)\|\_s*q\|t\_s*q\|\_s*\|L\_s*[O]\|\_s*\|V\_s*A\_s*O\|\_s*[ĘU]\|b\_s*i\_s*o\_s*t\_s*o\_s*p\_s*e\|\\_s*D\|\_s*[D]\|\_s*\|o\_s*\_s*\|\_s*\|\_s*\|S\_s*a\_s*n\_s*t\_s*a\_s*l\_s*a\_s*l\_s*e\_s*s\|h\_s*\|\_s*[q@]\|\_s*[Žq]\|\\_s*\|\_s*\|\_s*\|\_s*q\|c\_s*\_s*\_s*\|b\_s*\_s*\|R\_s*o\_s*s\_s*a\_s*l\_s*e\_s*s\|K\_s*N\|\_s*q\|\_s*\%([јJy]\|\_s*\_s*\)\|\_s*\|\_s*\|\_s*\|A\_s*n\_s*n\_s*o\_s*n\_s*a\_s*c\_s*e\_s*a\_s*e\|\_s*[]\|\_s*\|f\_s*\_s*\|v\_s*\_s*R\_s*M\|\_s*\_s*\|I\_s*[\_s*g\_s*o\_s*C\|\_s*[b]\|t\_s*@\_s*S\_s*b\_s*g\|w\_s*i\|k\_s*\|y\_s*\%(L\_s*\|e\_s*\_s*M\_s*E\_s*X\)\|L\_s*f\|C\_s*M\_s*\_s*X\|\_s*f\|z\_s*E\_s*f\)', + \ 'C' : '\%([a|ҜDޏns}ĜlaʗۗᶐsДfَřbIziꑍC麌Z欉䓚৐}əY`nXMٍȜkύߌ匣ӍeWBLݖϙiҔQbm秋tRK{}`肍L琍fݚJkiQ硟LsJ𔸙lEHnr੘mt൙{XERn㝍h}HyߝK朑nK}֞\@囍yෙ΍[⠍xuXSe倘Ji^’@VAW썄GDTᩍ`p᧍B]PIzt_kOjRwuPIa|qFXZsmcDrJLޛܝwlWgVڞׁ܋ZXčᑆՙs|˙Ze،؝sZhⰍٕ֒]ی㨏hןzËП绌ꉍ烜ٌnj@ux삱NËZ驉kşQLTGiL↝BގEِېߐCGАዙ[Tאɐ͐ȐǞNdϞ囡pә㙟㚘jA䦈a_tbAAbxaH柞ECJ⤑GSL⒑WsrDJAL񙒐枙@ۑMHlFKDB@Ghǐ坡NdDIRŖ|˝ōv⫝ꎍΐyH`Ր}Uҙ[ǐzzMKⱟJ㖍IHEbzoxAܗϕDBӏ~B䱌sZYᯙӞᮛM֌NvK@{^Z퐾^č鶔ňʈUÑqC~VWRUSXT܉_wo^鿌~GF䇚`p̃Y۞ƌIӘޚPMuoӞc苟m痈qHM῍C​晠J{vv͘ҊXɜgˍgܜ|E؋捃BAPDY`LZ连xZlWȓGFaƎb乗MEsCFnD㈵㦃Ƌs]Ŗl⚑^潔AgߞΖ儞bɖΕݜ臐wp玬d쎹g[諎^GNH˒ΐÎᕹRK\ސˌKŽK򛍉toqϔOӎ͚̍͟byP᪎jAϐ֙̎ݐ┐^܎ېΎގڎYώՎˎΎɎԎߎЈޝiSCGဎfztWV题fEiglhk{蜕婙oJ蕘ꟚVh娔hKqF榚SQFT酝nSXKUڏMGjEaNODCALRTWIBH@M᭜\貚я忏w{vxs⡏urfݐpuVyJUZ]jP曚A՜fY`Ds橝ΐaO凓cjcѐUaNfdCkXLTQWiR[MebI\S^VΏnZ勋o|ב_䓏w򏎏vߓɚ[mיЎKО_cRuB䐠ϞƐLҜћ辛頔I׏[縜B䀙n␏K♏яҁuiœϏ]疏֏ӐԚА躐ϏUJnސŜ܏ߏُGᏧଏ͏ǏɏЏˏ暏ďΏƏ͏ڏ؏ɏ\plTegߐ@CܑDI冐BGAHEuowʕEey򚬞@hџ|Xꏎю}ؗ⿎loŎ~dstwћLypinÎk䍟߁Y`omo{j`V@m@iyIِynXnBg~vsЎoN᎒ZuiU抎f]Kj{J{r˙藂yNJr݊jƌyĈ呁eAiMꝕrPTMvᚃȍfjsehoqgptr鹜NJDRUğdzᥕpȌڋAԎ‹_雔Bߗދȋ\Ίۖ͋wdTezJxŌ`ӕ^ȔHXRCPtqKŠ閔@ϞJ{嶔㹊|ؙ^歒Se顊j舊sFጐdP}gya`fSWmeOݑ]ڛ̊ňה@쁨F`OP[\铐gಉGh󓂞Њ~yۉ}qɐ͘V،~ऐc͌buwvxXiÕLꖊƓKG̜SR魓CЈߕKv֓S哑tݓk䡞S湝誜vᙊdn]QLڒI跏ʜh\frlymznkkgcstio݉BvdߝjlgqupmGd觛Z嵙j珚ԘBiWqr[~D䠊^񔐘\X{Ž\箊IؘrH_j~F׊@EmLGDŊAKJC`՚QɟIW錟a檚A洚jbaYホe⻞䯙qT㻛fpN㼝c㣎V늬Mϊ䅟jFrȟ綝mlb˙_xpᒔcg|}ۊ@يΞ؊󊩐Ҋ@ʊŞ̊ɊƜAL萊ъš^׊ĊÊԊՊNJ֊͊ϊwxsqPgӊehӏՉɉՉ܃`͉ތF㞉S˚ZQ草ؚm׊]͉Ȍ嗉eDvqҎxT|~o戟ω̉ߍю딃̉ƞg`ϙ֑dUݙJƎa͉ۉяÚКk旓zЊ|䑉嘉㟉qČCa{斎҉ǟ뛺◉Ή։lEc‹āىUCD@wAztxGN{vH^TSrR_[`FLI~qB}MV]EpuPKZY\OQy|sJ􄾄~ԃqXWہACFNՋ\ȐߕϐڃJRVZbC]\|\_s*[]\|b\_s*[RZNVJ]\|\_s*[q]\|\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\|\_s*y\|\_s*m\|\_s*F\|\_s*\|\_s*\|S\_s*\|f\_s*o\_s*o\_s*t\_s* \_s*a\_s*n\_s*d\_s* \_s*m\_s*o\_s*u\_s*s\_s*e\_s* \_s*d\_s*i\_s*s\_s*e\_s*a\_s*s\_s*e\|\_s*C\|\_s*\|A\_s*\%(r\_s*c\_s*h\_s*i\_s*c\_s*h\_s*l\_s*a\_s*m\_s*y\_s*d\_s*e\_s*a\_s*e\|p\_s*i\_s*a\_s*l\_s*e\_s*s\)\|U\_s*m\_s*b\_s*e\_s*l\_s*l\_s*i\_s*f\_s*l\_s*o\_s*r\_s*a\_s*e\|\_s*\|}\_s*\|\_s*@\|O\_s*[ȍ]\|\_s*[U]\|P\_s*y\|\_s*\|\_s*[ρX]\|~\_s*\|\_s*\|S\_s*[Z]\|\_s*h\|9\_s*[]\|^\_s*{\|Q\_s*O\|\_s*\|\_s*\%(\|\_s*\)\|\_s*\|\_s*|\|T\_s*\_s*\|T\_s*\|\_s*\_s*\|H\_s*e\_s*l\_s*l\_s*e\_s*b\_s*o\_s*r\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|\_s*\|J\_s*u\_s*g\_s*l\_s*a\_s*n\_s*d\_s*a\_s*l\_s*e\_s*s\|Z\_s*\|n\_s*_\|s\_s*q\|R\_s*h\_s*a\_s*m\_s*n\_s*a\_s*l\_s*e\_s*s\|V\_s*\|]\_s*\|f\_s*[l]\|\_s*A\|s\_s*[mE]\|\_s*\|L\_s*a\_s*\%(u\_s*r\_s*\%(a\_s*c\_s*e\_s*a\_s*e\|o\_s*i\_s*d\_s*e\_s*a\_s*e\)\|b\_s*i\_s*a\_s*t\_s*a\_s*e\|m\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\)\|\_s*\_s*\|\_s*\|\_s*\|~\_s*\|\_s*t\_s*\|\_s*_\|\_s*\|\_s*Y\|\_s*\|\_s*\|I\_s*\%(s\_s*o\_s*p\_s*y\_s*r\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|l\_s*l\_s*i\_s*c\_s*i\_s*a\_s*c\_s*e\_s*a\_s*e\)\|W\_s*i\_s*n\_s*t\_s*e\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\|`\_s*\|]\_s*[]X]\|\_s*\%([ƗuʑɎ茓]\|\_s*\|[\_s*\|\_s*\)\|\_s*\%(X\_s*\_s*\|\_s*\_s*\)\|V\_s*\|7\_s*\|\_s*\|S\_s*[]\|4\_s*\|R\_s*{\|\_s*\|h\_s*t\|\_s*[ʈ]\|\_s*\|O\_s*\%(\|\_s*\)\||\_s*[“]\|A\_s*[o]\|\_s*\|B\_s*r\|\_s*[NY]\|\_s*[]\|r\_s*[ꏎ]\|Q\_s*\|\_s*Y\|b\_s*\|c\_s*e\|\_s*\|M\_s*\%(e\_s*t\_s*a\_s*c\_s*h\_s*l\_s*a\_s*m\_s*y\_s*d\_s*e\_s*a\_s*e\|u\_s*s\_s*a\_s*l\_s*e\_s*s\)\|S\_s*\%([ge]\|p\_s*e\_s*r\_s*m\_s*a\_s*t\_s*o\_s*p\_s*h\_s*y\_s*t\_s*a\|c\_s*i\_s*t\_s*a\_s*m\_s*i\_s*n\_s*e\_s*a\_s*e\)\|Z\_s*i\_s*n\_s*g\_s*i\_s*b\_s*e\_s*r\_s*a\_s*l\_s*e\_s*s\|\_s*\%(\_s*{\_s*\%(I\|\_s*I\)\|\_s*\_s*a\_s*\_s*W\)\|\_s*Z\|\_s*q\|\_s*\|z\_s*\|R\_s*\%(C\_s*o\|\_s*q\|z\_s*\)\|j\_s*\|\_s*\_s*\_s*\|r\_s*C\|b\_s*[]\|\_s*\|}\_s*\|\_s*\%(\|`\_s*\)\|\_s*[]\|\_s*\|V\_s*\%(\|l\_s*\)\|\_s*q\||\_s*\_s*\|O\_s*x\_s*a\_s*l\_s*i\_s*d\_s*a\_s*c\_s*e\_s*a\_s*e\|\_s*[]\|\_s*r\||\_s*\|]\_s*\|\\_s*\|\_s*q\_s*\|\_s*[ay]\|\_s*\|\_s*\|E\_s*\%(b\_s*e\_s*n\_s*a\_s*l\_s*e\_s*s\|l\_s*a\_s*n\_s*a\_s*l\_s*e\_s*s\)\|\_s*R\_s*q\|\_s*\|\_s*\|P\_s*\%(i\_s*p\_s*e\_s*r\_s*a\_s*\%(l\_s*e\_s*s\|c\_s*e\_s*a\_s*e\)\|t\_s*e\_s*r\_s*i\_s*d\_s*o\_s*s\_s*p\_s*e\_s*r\_s*m\_s*\%(a\_s*l\_s*e\_s*s\|i\_s*d\_s*a\_s*e\)\|o\_s*\%(t\_s*a\_s*s\_s*s\_s*i\_s*u\_s*m\|d\_s*o\_s*s\_s*t\_s*e\_s*m\_s*o\_s*n\_s*a\_s*l\_s*e\_s*s\)\)\|y\_s*\|A\_s*g\|k\_s*k\|@\_s*\|\_s*t\_s*\|\_s*\%(\|q\_s*\)\|\_s*\|\_s*\|Z\_s*\%(c\|C\_s*\)\|\_s*\|\_s*[r]\|\_s*\%([_]\|C\_s*\|\_s*s\_s*\_s*\_s*w\_s*Z\_s*p\_s*\_s*w\)\|C\_s*[G]\|(\_s*\_s*)\|\_s*\_s*\|\_s*\|\_s*\|m\_s*\%(\|\_s*\)\|~\_s*\_s*\|o\_s*c\|Y\_s*t\|_\_s*o\|\_s*\|B\_s*\|A\_s*\|T\_s*\%(h\_s*a\_s*l\_s*i\_s*c\_s*t\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|u\_s*b\_s*i\_s*f\_s*l\_s*o\_s*r\_s*a\_s*e\)\|\_s*\_s*\_s*\_s*\_s*u\|\_s*\_s*\_s*e\_s*N\_s*m\_s*T\_s*C\_s*G\_s*\_s*X\|\_s*\|X\_s*\_s*[\_s*Y\|\_s*e\|g\_s*\_s*\_s*v\|c\_s*\%(e\_s*n\_s*t\_s*i\|r\_s*e\_s*s\_s*c\)\|\_s*[{v]\|\_s*G\_s*\_s*\_s*Z\_s*b\_s*g\_s*v\_s*Z\_s*@\|T\_s*\%(\_s*`\_s*[\_s*\|G\_s*\|C\_s*\%(g\_s*J\_s*C\_s*\|\_s*X\|N\_s*\%([]\|\_s*\%(\|b\_s*N\)\)\|{\_s*\%(E\_s*Y\|[\_s*O\)\|o\_s*\%([\|l\_s*e\_s*B\_s*\%(b\_s*N\|N\_s*X\)\)\|\_s*\_s*[\_s*\|_\_s*[\|t\_s*@\_s*[\|l\_s*\_s*A\)\|[\_s*\%(e\_s*B\_s*t\_s*B\_s*P\_s*[\_s*V\_s*\_s*\|N\_s*\|J\_s*\%(X\|\_s*X\_s*N\_s*\%(\_s*C\_s*u\|\_s*v\_s*V\_s*\_s*\)\)\|L\_s*\%(\_s*\%(\_s*[\|\_s*[\_s*\%(^\_s*[\|V\_s*\_s*\)\)\|b\_s*g\)\)\)\|}\_s*h\_s*\_s*X\|\_s*\|P\_s*\%([AC]\|t\_s*F\_s*E\_s*X\|v\_s*X\_s*g\_s*\_s*[]\|`\_s*\_s*b\_s*v\|\_s*\%(^\_s*E\_s*\%(\|\_s*X\)\|u\_s*\_s*b\_s*W\)\|[\_s*\%([LWuvX]\|N\_s*E\_s*H\_s*[\_s*N\|\\_s*\|^\_s*\_s*\_s*O\|p\_s*\%([\|r\_s*\_s*e\_s*B\)\|V\_s*\_s*O\|\_s*[\)\|\_s*\%(g\|x\_s*\_s*X\|e\_s*B\_s*b\_s*N\|r\_s*\%(\|[\_s*j\)\)\|~\_s*\%(J\_s*\|X\_s*g\)\)\|L\_s*\%(\_s*m\_s*\|v\_s*\_s*X\|P\_s*\|\_s*\%([C[A]\|\_s*F\|r\_s*\%(Y\_s*\|X\_s*\)\|\_s*\%(X\|b\_s*g\)\|\_s*[\_s*^\_s*[\|\_s*\\_s*[\|\_s*\%([\|E\_s*\|A\_s*X\|I\_s*V\_s*e\_s*B\)\)\|A\_s*\%(\|[\_s*\|\_s*e\_s*B\)\|`\_s*\|g\_s*T\_s*\|\_s*\|}\_s*C\_s*\|b\_s*J\|\_s*[\_s*g\|\_s*\%([hpXu]\|f\_s*\%(B\|\_s*b\_s*N\)\|r\_s*\%([Al]\|e\_s*\%(B\|[\_s*V\_s*\_s*\)\)\|x\_s*c\|o\_s*\%(\_s*[GA]\|\_s*[\)\|g\_s*\|V\_s*[\|T\_s*\_s*\|^\_s*s\_s*\|s\_s*\%(g\_s*\|^\_s*\%(\|\_s*Y\_s*\)\)\|v\_s*\%(\|V\_s*\_s*\|e\_s*\|`\_s*\)\|Z\_s*\%(C\|\_s*[\_s*\)\|b\_s*\%([cg`v]\|T\_s*o\|X\_s*\|V\_s*\%(\|\_s*O\|\_s*\%([\|u\_s*\)\)\)\|j\_s*\%(I\_s*\|X\_s*^\_s*[\)\|i\_s*\|m\_s*\%(\|[\_s*\|s\_s*[\)\|~\_s*\\_s*[\_s*\|\_s*\%(\|\_s*\%(\|b\_s*g\)\)\|\_s*\%(\|E\_s*F\_s*C\|\_s*\|\_s*C\_s*[i]\|b\_s*g\)\|\_s*b\_s*g\|\_s*\%([R[A]\|o\_s*[\|u\_s*\_s*[\_s*V\_s*\_s*\|b\_s*W\|\_s*O\)\|Y\_s*\)\|\_s*\%(R\|X\_s*g\|V\_s*^\_s*\)\)\|\_s*p\|`\_s*\%([^}A]\|\_s*\|\_s*[\|\_s*h\|\_s*j\_s*[\|R\_s*\|b\_s*\%([vN]\|e\_s*\_s*I\|^\_s*S\_s*\)\|L\_s*\%(\|[\_s*^\)\|\_s*\%(A\_s*u\_s*\|[\_s*C\_s*\_s*K\_s*\)\|[\_s*\%([tgvNY]\|p\_s*[\|^\_s*[\)\|F\_s*\%([XJRA]\|U\_s*\%(\|[\_s*\)\|\_s*\%(j\_s*[\|V\_s*[\|m\_s*u\_s*C\_s*\)\|\_s*\%([\|X\_s*g\|b\_s*V\_s*\|\_s*\)\|\_s*\%(X\_s*^\|\_s*R\_s*t\)\|r\_s*`\_s*F\_s*t\|_\_s*[\|`\_s*F\_s*\|b\_s*\%([gNJ]\|L\_s*\_s*O\)\|C\_s*\%([X]\|j\_s*[\|T\_s*[\|V\_s*\_s*O\)\|[\_s*\%(\|U\_s*\|z\_s*t\)\)\|\_s*\%([IthCRE]\|c\_s*l\|N\_s*\|v\_s*^\_s*[\|p\_s*e\_s*B\|y\_s*\%(\|b\_s*N\)\|`\_s*\|l\_s*\%(\|\_s*[\|\_s*\_s*O\)\|b\_s*\%([Ng]\|s\_s*[\|v\_s*\%(}\_s*\|\_s*\)\)\|^\_s*\%(\_s*[C[]\|\_s*\_s*O\)\|\_s*}\_s*[\_s*X\|\_s*\_s*W\|\_s*\|[\_s*\%([`^gW]\|r\_s*\|~\_s*\%([\|\_s*O\)\|\_s*[\|\_s*\%([YX]\|g\_s*\)\)\|\_s*\_s*S\)\|\_s*\%([R]\|C\_s*X\|\_s*X\_s*L\_s*[\|[\_s*\%(N\|T\_s*[\|J\_s*[\|L\_s*\_s*O\)\|S\_s*\|b\_s*\%(v\|s\_s*[\|p\_s*[\)\|\_s*\\)\)\|\_s*W\|\_s*\|\_s*\|\_s*\%(\|Y\_s*\_s*`\_s*\)\|p\_s*\|c\_s*\%(@\_s*[\|B\_s*\_s*\|F\_s*\%([\|\_s*j\_s*[\|\_s*\)\)\|Y\_s*f\)', + \ 'D' : '\%([다hbraǏBtN{cjۓÓ̊椓ՓœǙI^ӛkNU˒~}X駁߁̓ԓӓWV֓g˓zގ{ymw^~xWZvǎF≓BHDsMub\BadƂŃdߐhȍjΓ`sˌngAtːϒ݋lВÐ}ނÃaߗ͎nIL֓|ʔZ睏JNMҋʍxJ_يڒ|ԊxFڒDEN璑ДUՒinm聄Гْ̓U[ghkifcdejƑǑʎP[S֚֝\ǐȐəTP䶗cĕkř[яoCAD\.dEchg\BƂch_WDtƒfD]\|\_s*\%(\_s*\|\_s*\|\_s*\|\_s*\|\_s*\)\|b\_s*[hfda_]\|\_s*[ǂłÂ]\|\_s*\|s\_s*X\_s*\|\_s*\|S\_s*a\_s*u\_s*r\_s*u\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\|C\_s*\%(u\|o\_s*p\_s*p\_s*e\_s*r\)\|\_s*V\_s*\|\_s*\|@\_s*\|\_s*\|Y\_s*\|S\_s*t\_s*\|\_s*\|\_s*\|\_s*[t]\|\_s*\|\_s*\|\_s*[I]\|\_s*\|m\_s*b\|x\_s*\|\_s*q\|\_s*q\|\_s*\|\_s*K\|\_s*\|\_s*B\|R\_s*\|\_s*\|\_s*k\_s*B\_s*\|\_s*\%([Ɍ]\|\_s*L\|\_s*V\_s*c\|\_s*\%(\|\_s*b\)\)\|T\_s*[B]\|\_s*\|\_s*|\|\_s*\%(\_s*\|\_s*f\_s*[\_s*^\_s*x\_s*[\_s*X\)\|R\_s*\_s*\_s*r\_s*A\|Y\_s*\%(\_s*[\_s*X\|b\_s*N\)\|C\_s*\_s*J\|\_s*\|\_s*m\|\_s*\|s\_s*\_s*\|\_s*\_s*\_s*\|n\_s*[\_s*O\|\_s*\_s*\_s*\_s*\|j\_s*\_s*\%(\|\_s*\)\|\_s*\_s*q\|L\_s*q\_s*q\|\\_s*i\_s*\|[\_s*b\_s*P\_s*\|\_s*\_s*\|\_s*\|\_s*\_s*\|d\_s*\%(b\_s*m\_s*s\|e\_s*c\_s*\%([ia]\|r\_s*e\_s*s\)\|o\_s*u\_s*b\_s*l\_s*e\_s* \_s*i\_s*n\_s*c\_s*o\_s*m\_s*e\_s*,\_s* \_s*n\_s*o\_s* \_s*k\_s*i\_s*d\_s*s\|i\_s*m\)\|\_s*\)', + \ 'E' : '\%([ኙPGҋ`ܐݑ傉滌ӏ^ΛxVx{y㈔t厚z郉uՉvwt鴝oHHў́dvꁊ_脚ঢ়Q`腖b膞Ł܉⥟}|叉͉lU~Itok㗚Țzoi͉joĉblgsdm繉erfhnci}I߈ˉ|㉙dGq`Ήbldʉ`da]ΕU߁́Q}MNpΎIŃdRL|Ä^GE]\|A\_s*\%([ʔ^]\|V\_s*\%(@\_s*\|\_s*D\)\|B\_s*\%(^\|C\_s*\)\)\|`\_s*\%([ʔ^]\|u\_s*\%(@\_s*\|\_s*D\)\|a\_s*^\)\|\_s*\%(\|\_s*\)\|O\_s*\_s*\|M\_s*T\_s*C\_s*Y\|l\_s*T\_s*C\_s*Y\|G\_s*X\_s*q\|\_s*\|g\_s*\|E\_s*\|\_s*\_s*q\|\_s*y\|\_s*x\|\_s*H\|x\_s*\|\_s*[s]\|\_s*\|g\_s*q\|k\_s*\%(T\_s*C\_s*Y\|k\_s*T\_s*C\_s*Y\)\|L\_s*\%(T\_s*C\_s*Y\|L\_s*\%(T\_s*C\_s*Y\|\_s*\)\)\|\_s*\%([仗Q]\|m\_s*\)\|N\_s*\|m\_s*\%([‹ɋ]\|\_s*\|p\_s*`\|g\_s*j\_s*z\_s*[\_s*\)\|\_s*\|Z\_s*\|\_s*X\_s*r\_s*[\_s*H\_s*i\|S\_s*\%([]\|T\_s*C\_s*Y\|N\_s*\|F\_s*\_s*\)\|r\_s*\%([gȋ]\|T\_s*C\_s*Y\|m\_s*\|e\_s*\_s*\)\|q\_s*[y]\|w\_s*\%([r]\|\_s*F\_s*\)\|X\_s*\%([r]\|O\_s*\|\_s*F\_s*\)\|A\_s*\|\_s*\|C\_s*\%(l\|h\_s*l\_s*o\_s*r\_s*i\_s*n\_s*e\)\|C\_s*\%(V\|W\_s*\)\|\_s*s\_s*\_s*\_s*x\_s*\_s*\_s*c\_s*c\|\_s*[\_s*N\_s*X\_s*e\_s*[\_s*V\_s*\_s*\|\_s*\%(B\|\_s*b\)\|^\_s*\%(B\|\_s*b\)\|\_s*[\_s*\_s*\%(s\_s*A\_s*\|b\_s*p\)\|\_s*\%(A\_s*\|E\_s*\_s*s\_s*E\_s*\|\_s*C\_s*J\|[\_s*\%(\|m\_s*X\|j\_s*X\|W\_s*\%(\|[\_s*\)\|h\_s*\|\_s*J\|\_s*\%(X\|V\_s*A\)\|t\_s*\%(\_s*e\_s*X\|H\_s*\%(\_s*A\|j\_s*A\_s*\)\)\|N\_s*\_s*b\_s*h\|J\_s*\)\)\|\_s*W\|\_s*\|\_s*\_s*\_s*\_s*\|d\_s*q\_s*\_s*\%([\_s*\|C\_s*\)\|\_s*W\|]\_s*\_s*\_s*\|\_s*\_s*\|S\_s*\_s*\_s*T\|J\_s*v\_s*Z\_s*\_s*\|I\_s*\%([\|C\_s*\%(\_s*[\|Q\_s*\)\)\|\_s*s\|g\_s*\|\_s*O\|\_s*Q\_s*\|A\_s*\%([C]\|j\_s*h\|[\_s*\%([}X]\|E\_s*B\_s*\|\_s*\|j\_s*[\|l\_s*X\_s*g\|~\_s*\|V\_s*[\|\_s*[\)\)\|\_s*\|e\_s*\%(x\_s*a\|R\_s*}\_s*[\_s*X\|\_s*[\_s*j\_s*\_s*O\)\|C\_s*\%([uA[]\|W\_s*F\_s*N\_s*g\|t\_s*F\_s*N\_s*[g^]\|R\_s*\%([\_s*\|\_s*C\_s*[YU]\)\|v\_s*V\_s*\_s*\|~\_s*\_s*\_s*\%([\_s*[g^]\|C\_s*^\)\|x\_s*\_s*\%(g\|^\_s*[\)\|m\_s*b\_s*N\|l\_s*[\_s*u\_s*\|M\_s*\_s*X\|\_s*O\_s*\%(\_s*\_s*h\|\_s*b\_s*V\_s*\)\|b\_s*`\|\_s*\%([\|\_s*\_s*O\|t\_s*H\_s*\|z\_s*\)\|O\_s*W\_s*\%(b\_s*g\|X\_s*g\)\|N\_s*\%(X\|A\_s*\_s*e\_s*B\)\|X\_s*t\_s*@\_s*n\_s*\|\_s*[A]\|\_s*\%([\_s*\%(X\|U\_s*[\|T\_s*[\)\|C\_s*\%(\|U\_s*[\|T\_s*[\)\|u\_s*\)\)\|E\_s*\%([\|W\_s*F\_s*[\_s*k\)\)', + \ 'F' : '\%([[ΉM֓~y`[脟T͈j͊ȎD^J㬐䔕bʟX䙆앶|tyMD၂⁃᳍ĘWoK敖lᆕ慊p̐k⿕谌Pc霜i񕥕huCcޔX܊ܕteoon劚]wwSܙ󕄉畆yDXY|[~Y\V~zBUv䘕㧕ЕtsDz@缕u•tbҕ}GHt{䎙ʖ|ӓŚx܋ŋUe󕤕tUF]\|\_s*\|b\_s*t\|\_s*\|\_s*\|A\_s*X\|\_s*\|\_s*\|E\_s*u\_s*p\_s*t\_s*e\_s*l\_s*e\_s*a\_s*c\_s*e\_s*a\_s*e\|\_s*\_s*\|\_s*i\|}\_s*\_s*\|C\_s*f\|\_s*\%(C\|\_s*[]\)\|\_s*C\|_\_s*\|\_s*\|\_s*\|\_s*~\|\_s*\|\_s*c\|M\_s*y\_s*r\_s*t\_s*a\_s*l\_s*e\_s*s\|\_s*[R]\|\_s*t\|B\_s*u\_s*d\_s*d\_s*l\_s*e\_s*j\_s*a\_s*c\_s*e\_s*a\_s*e\|k\_s*\|G\_s*e\_s*r\_s*a\_s*n\_s*i\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|Q\_s*[l“]\|h\_s*\|2\_s*\%([l“]\|\_s*\)\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|~\_s*~\_s*~\|\_s*\|\_s*\|\_s*\_s*o\|I\_s*r\_s*o\_s*n\|\_s*\_s*\_s*\|_\_s*\_s*\|`\_s*\|z\_s*\%(\_s*C\_s*G\|C\_s*\|\_s*\%(}\_s*\%(\_s*g\|\_s*\)\|\_s*A\_s*\%(~\_s*h\|\_s*f\_s*q\_s*h\)\)\)\|\_s*t\|@\_s*\\|\_s*\|\_s*\_s*\|C\_s*\|q\_s*\%(\|\_s*[\_s*[Y]\)\|\_s*1\_s*v\_s*f\|P\_s*\%(^\_s*\_s*\_s*\_s*\|\_s*\)\|\_s*s\|n\_s*\%(G\|\_s*u\_s*\|\_s*\)\|_\_s*\_s*\|\_s*g\_s*\|G\_s*t\|f\_s*\%(e\_s*m\_s*t\_s*o\|o\_s*\%(n\_s*t\_s*-\_s*f\_s*a\_s*m\_s*i\_s*l\_s*y\|r\_s*t\_s*e\)\)\)', + \ 'G' : '\%([EDĉ愍܍Ό՘ᖈ@W龚oXߍnS΍crŠ穚ꇟ|ߍ܌Ɍ݌ߋɉz5⺙Z䲌뛈TގqIwxౌ免@㓆驌纞Q|k轚nj}~|YPꖕFqÙ䋌ῌVȌZɉĉRтC򕳕ȍIƑqʌ䣋Xȋ{j㸌SQRԋgOHًF[hߌNۋқً⚞f耋ʋzCČɛ邙F‹ƋŋÍsኋst_CFcEٌV㺌~E[]供ҋbUaXa^؋W`ซZ鰒\YVE_㎆雔WᥟdmAԛݔvʊŕ꓁^`e寊qI}dPjkhG_~܌ݙʊہ꜋܊ߌ猎|罚ْꛞٛ{Ӝԙkzx{ywR♓GN᳚PUn᫊YPKw䈊HVQZSXMTW[Oa䉾Gώ؉@݉ɑ֑`މbʉꏑ͉뛴䮔|PMA₪⁄fKSɃ̓Ѓ˃σȃ̃ǃƃʃÃՃ΃у҃ăӃԃŃփMOsQCG]\|\_s*\%(\_s*\|\_s*\|\_s*\|\_s*\|\_s*\)\|b\_s*[SQOMK]\|\_s*[]\|\_s*\|\_s*\|\_s*\_s*\|\_s*\_s*~\|\_s*\|\_s*y\|P\_s*e\_s*r\_s*s\_s*o\_s*n\_s*a\_s*l\_s*e\_s*s\|\_s*\|\_s*s\_s*\|\_s*q\|H\_s*\|\_s*\|\_s*\_s*\|~\_s*\|i\_s*\%([ԉ]\|V\_s*\)\|P\_s*\_s*\|]\_s*\%([ÌΏB]\|k\_s*\)\|\_s*[`]\|\_s*\|w\_s*\|i\_s*F\|\_s*\|\_s*\|m\_s*\|\_s*\|\_s*[]\|\_s*[ō]\|\_s*\|\_s*E\|\_s*\|~\_s*\_s*\_s*F\|H\_s*\|\_s*[Սi]\|g\_s*@\|\_s*\|{\_s*\|\_s*\%([알]\|Z\_s*\)\|\_s*\%([@]\|s\_s*\_s*\|\_s*\_s*@\)\|A\_s*g\|S\_s*\%(c\_s*r\_s*o\_s*p\_s*h\_s*u\_s*l\_s*a\_s*r\_s*i\_s*a\_s*c\_s*e\_s*a\_s*e\|y\_s*m\_s*p\_s*e\_s*t\_s*a\_s*l\_s*a\_s*e\|i\_s*l\_s*v\_s*e\_s*r\)\|\_s*c\|\_s*\_s*J\|\_s*t\|L\_s*q\|Y\_s*\|\_s*\|\_s*\|T\_s*y\_s*p\_s*a\_s*l\_s*e\_s*s\|\_s*[]\|\_s*\_s*\|\_s*\|\_s*q\|\_s*^\|b\_s*\|\_s*\|g\_s*\%(i\_s*g\_s*a\|h\_s*o\_s*s\_s*t\_s*s\_s*c\_s*r\_s*i\_s*p\_s*t\)\|k\_s*[\|\_s*\_s*\_s*\|j\_s*\_s*[\_s*Y\|m\_s*[\_s*\|\_s*i\_s*\_s*\|A\_s*\_s*\_s*R\_s*\_s*i\_s*\_s*\|q\_s*\|N\_s*b\_s*p\|\_s*q\|n\_s*{\_s*\_s*[\_s*l\|\_s*\|\_s*[\_s*e\_s*{\_s*\|G\_s*[\_s*e\_s*{\_s*\|C\_s*F\_s*\%([\_s*e\_s*{\_s*\|e\_s*{\_s*\)\|\_s*\|w\_s*\%(\_s*\_s*h\|\_s*}\_s*\)\|h\_s*C\_s*c\|\_s*g\_s*v\_s*\|[\_s*\%(\_s*\%(`\_s*\|j\_s*E\_s*\)\|\_s*N\_s*\_s*b\_s*v\|m\_s*A\|\_s*g\_s*\_s*}\_s*\|l\_s*\%(R\_s*\|\_s*\%(\|\_s*X\_s*g\)\)\)\|\_s*\%(\|w\_s*@\_s*\)\|W\_s*\%([WOmiI[]\|v\_s*V\_s*[\|A\_s*\|b\_s*h\|C\_s*h\|^\_s*\|[\_s*\|\_s*A\_s*\|\_s*b\_s*g\|S\_s*\|\_s*\%(t\|\_s*\%(h\|f\_s*B\_s*[\_s*m\)\)\|\_s*\%([\|\_s*h\)\|o\_s*\_s*V\_s*[\|u\_s*\%(\|\_s*\_s*^\_s*\)\|x\_s*\%(\_s*i\_s*E\|\_s*\_s*\)\|l\_s*b\_s*g\|\_s*\%(b\_s*g\|\_s*@\_s*\_s*[ji]\|o\_s*\_s*[ji]\|R\_s*\%([\_s*\\|\_s*_\)\|\_s*\%(W\|_\_s*[\_s*m\)\|[\_s*\%(W\|[\_s*b\_s*g\)\)\|\_s*\%(\|C\_s*\%(\|\_s*Y\|A\_s*\_s*[cg]\)\|R\_s*\%(\|\_s*b\_s*e\_s*B\)\|[\_s*}\_s*\)\|j\_s*[\|\_s*\%([l]\|[\_s*b\_s*y\|\_s*\%(A\|[\_s*j\|G\_s*b\_s*^\)\|k\_s*\%(r\_s*G\_s*[\_s*u\|\_s*B\_s*G\_s*[\_s*\)\)\|F\_s*\%([t}l]\|X\_s*`\_s*\_s*[\|\_s*j\_s*\|\_s*\%([\_s*[gh]\|\_s*\%(h\|f\_s*B\_s*\|_\_s*C\_s*\)\)\|~\_s*j\|j\_s*[\|m\_s*\%([Ao]\|\_s*@\|\_s*[\_s*Y\|T\_s*C\_s*h\)\|\_s*\%(}\|g\_s*\%(\|\_s*[B[]\)\|_\_s*[\)\)\)\)', + \ 'H' : '\%([Η䀉LN{wʔMSܖŖyj壌uׁ󜓏c]Kg֚\✖{xjښNWœYuqIc_p沖Q}䚑鵖N闈{BPaHKAOfDG̜dMOEvLC󝻝eMіk@棕nܚO􍛕䕒eK̚MꅕߒJ~s܉Y癗_͌zu`œLKHQ蓕QɕE憕wǝ́ݕՕxҝGٖݕ͒⍛iyQaÛz˕rǕ•糌粐w˂̘[Ή։A~y`[脟TǏ͈͊ȎD^J㬐䔕bʟX䎟앶|tyMD⁄᳘WoBK敖lᆕ慊p̐k⿕谌ꄜ霘ŜiFӋhuⷁޔX܊ܕteoon劚]wwSܙ󕄉畀yXY|[x~Y\~BUv䘕㧕ЕtsDz@缕u•tbҕ}GHt{VQ_~PcݕAS鯏GG哝ǁ|ጄՉ颕Ejhk_l㏟qoĕnmpgiםʕfgRʒJI@Pvzh啸Ǐd֋ϏēdΒPՓƑml1PuഁH͏ݝfە\PFt鷑MJ焕SZOznIQT䊌QP㟋jEWqGgϏEShꤊ[OGmT_ALJCNȕLDlJC捍rMKgHIjuq~U銕VG^Y~Z֙dߕ[]W\{_iuywDڔޝّޔٔ۔唊X䙶Og|]`ۘҍ澝ΞK瀊]ݔBBwߛEܔO栂ʎzjHԗ󌃙㔈墏Ȝ[OXJyٓ}j݋Еoޝ՝؏ދ@@Tmה喗IjYDscPĔJ`eƈn]nG|FɉIꡓzyt妝ppSƗ|杙br@؉X瞞dzxX򒌑\➕^⦔Rx펾њ虘NJAM唏隤Rdʌv}є`ڔ񏉘o@WIᢔ@Ҕuښ輏v`uit\ECpBᓔoxޔywWprqsDzȔ֟NW⛔aJÍ➷^䗖}ፖ|YK唺Ϟϔ͔ٔ㆔הєŔǍʔƔɔ̔ĔД_lyP㵔Ôfڙhޝcjpbh[enUfƙȉHiՑf͚ĉʒ蘗td۔ǐHmcJ঑|ꏛƓ\̈́g]tgqzwnH]\|\_s*[]\|b\_s*[zwtqn]\|\_s*[قւӂЂ]\|\_s*\|q\_s*K\|\_s*\|m\_s*[CF]\|\_s*\|\_s*}\|\_s*[ΐ]\|\_s*{\|S\_s*\|_\_s*\|p\_s*K\|\_s*\_s*F\|g\_s*[]\|T\_s*r\_s*i\_s*u\_s*r\_s*i\_s*d\_s*a\_s*l\_s*e\_s*s\|\_s*\|\_s*@\|a\_s*\|\_s*q\||\_s*\%(\\|\_s*\)\|\_s*q\|\_s*\|\_s*\|\_s*\|\_s*Z\|h\_s*e\_s*c\_s*t\_s*o\|\_s*\|c\_s*l\_s*a\_s*u\_s*s\_s*t\_s*r\_s*o\_s*p\_s*h\_s*o\_s*b\_s*i\_s*a\|\_s*\|\_s*\|\_s*\|E\_s*\%(r\_s*i\_s*o\_s*c\_s*a\_s*u\_s*l\_s*a\_s*l\_s*e\_s*s\|u\_s*p\_s*t\_s*e\_s*l\_s*e\_s*a\_s*c\_s*e\_s*a\_s*e\)\|\_s*\%(\_s*\|\_s*\)\|\_s*i\|\_s*C\|\_s*\|\_s*\|\_s*~\|\_s*\|f\_s*\%(o\_s*r\_s*t\_s*e\|e\_s*m\_s*t\_s*o\)\|\_s*[R]\|\_s*t\|k\_s*\|G\_s*e\_s*r\_s*a\_s*n\_s*i\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|h\_s*\|\_s*\_s*\|\_s*\_s*\|~\_s*~\_s*~\|\_s*\%(\|\_s*\_s*\)\|\_s*\|]\_s*c\_s*\|\_s*\|\_s*I\|\_s*\|\_s*\_s*\|\_s*@\|_\_s*[]\|I\_s*\|\_s*\|i\_s*a\|\_s*\|\_s*\%([lo]\|\_s*o\_s*\)\|\_s*\|\_s*\|f\_s*\|\_s*V\_s*q\|_\_s*[]\|\_s*l\|\_s*[ƁX]\|\_s*\_s*\%(\|\_s*\)\|A\_s*\%(s\|r\_s*s\_s*e\_s*n\_s*i\_s*c\|n\_s*g\_s*i\_s*o\_s*s\_s*p\_s*e\_s*r\_s*m\_s*a\_s*e\)\|\_s*f\_s*]\|\_s*\_s*\|\_s*[c]\|\_s*\|\_s*[B]\|\_s*\|\_s*\_s*\|h\_s*\|\_s*[js]\|K\_s*W\|e\_s*\|W\_s*\|\_s*q\|\_s*q\|\_s*\|\_s*\|\_s*\|\_s*\_s*\|n\_s*\|\_s*\|\_s*\|\_s*\%(\|\_s*\)\|`\_s*\|\_s*\|N\_s*e\_s*l\_s*u\_s*m\_s*b\_s*o\_s*n\_s*a\_s*c\_s*e\_s*a\_s*e\|o\_s*\_s*|\|\_s*E\|\_s*\|\_s*[]\|y\_s*[t]\|q\_s*[fC]\|\_s*t\|\_s*\_s*l\|\_s*\|x\_s*q\|\_s*J\|\_s*\_s*\|Z\_s*\|\_s*\|\_s*]\|K\_s*[q]\|{\_s*\%(\_s*\|\_s*\)\|E\_s*[l]\|\_s*s\|w\_s*\|Q\_s*\%([l“]\|O\_s*[Γ]\)\|2\_s*\%([l“]\|\_s*\|0\_s*\)\|W\_s*|\|8\_s*\|q\_s*\|P\_s*\%(t\|o\_s*t\_s*a\_s*m\_s*o\_s*g\_s*e\_s*t\_s*o\_s*n\_s*a\_s*l\_s*e\_s*s\|l\_s*a\_s*t\_s*i\_s*n\_s*u\_s*m\)\|C\_s*\%([if]\|\_s*\_s*\|f\_s*\)\|\_s*\|\_s*\|\_s*\|\_s*\|R\_s*S\_s*I\|M\_s*\%(y\_s*r\_s*t\_s*a\_s*l\_s*e\_s*s\|e\_s*r\_s*c\_s*u\_s*r\_s*y\)\|F\_s*\|\_s*a\_s*_\_s*\|E\_s*[\_s*S\|\_s*\%([\|y\_s*[\_s*\|x\_s*[\_s*\|C\_s*X\_s*}\_s*\_s*X\|S\_s*[\|O\_s*m\_s*[\|}\_s*j\_s*\%(e\|X\_s*[g]\)\)\|\_s*\|\\_s*Z\_s*i\_s*\|\_s*\|\_s*`\|C\_s*\%(_\_s*\_s*S\|X\_s*p\_s*j\_s*A\|\_s*[\_s*\|G\_s*\)\|I\_s*\%([[]\|i\_s*[\|m\_s*\|\_s*t\_s*\_s*[\_s*\|l\_s*\%(X\_s*\%(g\|e\_s*B\)\|Q\_s*\)\|e\_s*\|\_s*K\_s*[\|}\_s*[\_s*W\_s*\)\|A\_s*\%(\_s*\%(\|x\_s*[\_s*\)\|l\_s*X\_s*g\|\_s*[\|_\_s*}\_s*[\_s*\|V\_s*F\_s*b\_s*g\|r\_s*^\_s*V\_s*I\_s*\|[\_s*\%(l\_s*X\_s*g\|m\_s*\_s*N\_s*[\_s*\)\)\|G\_s*\%(f\_s*B\|\_s*\_s*P\|\_s*\%(i\|[\_s*k\)\|\_s*C\_s*[\_s*Y\|N\_s*g\_s*\|\_s*\%(Q\_s*\|\_s*F\|\_s*X\|}\_s*\|~\_s*\%(b\_s*g\|[\_s*g\)\|u\_s*\_s*\|i\_s*\_s*f\_s*X\|L\_s*\_s*[\_s*\)\|m\_s*N\|C\_s*`\|b\_s*`\)\|\_s*[╽f]\)', + \ 'I' : '\%([Ń~ꍘcTUn翔䑌폒恍ݍrxÉj囚|dQU|ƗBd{佈S\嫉䆍mnؐFAtF̌Ì䉳LdƜјJiꌒՕakvɔžo֍y󙬌ME|ځe퐈M臐YOΖZ}xא򌵉MՁO䗚P{bN~}zcct硉Ɏ䕟JsW]bK\Tซ]r䟈ZЛTmĈMßΉCm覉@BuAA܊jHڈΊֈYÈ1PyDIDR۔шዏܐRΔđP_ʈމ‘Ehe˗v֍s}وߐƈݟDᒒK֋҉]~˓шڏΗ͛HB܈횀}ՋU䏜SΉuЈ׈ۈӘߗǔ@bߏo؈Uw͉]ਖ看̈g؂XJzˁɈD灿hCIyI]\|E\_s*\_s*[\_s*\|a\_s*\|J\_s*u\_s*n\_s*c\_s*a\_s*l\_s*e\_s*s\|\_s*R\|c\_s*J\|\_s*\_s*\|c\_s*\|G\_s*s\|\\_s*Z\_s*\|Q\_s*q\|G\_s*\|\_s*\_s*\|\_s*\|\_s*\|\_s*\_s*\|N\_s*a\_s*j\_s*a\_s*d\_s*a\_s*l\_s*e\_s*s\|\_s*G\|\_s*\|\_s*t\_s*\|5\_s*[“]\|T\_s*[“]\|\_s*E\|r\_s*U\|\_s*\|\_s*Y\|\_s*[\|\_s*\_s*\|\_s*\|~\_s*\|{\_s*\|o\_s*\|\_s*g\|Y\_s*[q]\|@\_s*\|h\_s*[‘]\|U\_s*r\_s*t\_s*i\_s*c\_s*a\_s*l\_s*e\_s*s\|E\_s*[cR]\|P\_s*\%(o\_s*a\_s*l\_s*e\_s*s\|l\_s*u\_s*m\_s*b\_s*a\_s*g\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\)\|a\_s*\|C\_s*\|d\_s*\%(`\_s*r\_s*s\|u\_s*d\)\|w\_s*h\|\_s*\|]\_s*[햅oZ]\|\_s*\|K\_s*{\|\_s*q\|_\_s*\|\_s*r\_s*\|\_s*\_s*\|G\_s*\%(r\_s*a\_s*m\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\|l\_s*u\_s*m\_s*i\_s*f\_s*l\_s*o\_s*r\_s*a\_s*e\|i\_s*n\_s*k\_s*g\_s*o\_s*p\_s*s\_s*i\_s*d\_s*a\)\|\_s*\|r\_s*\|s\_s*\_s*\|o\_s*[E]\|\_s*[Wk]\|C\_s*[؎Q]\|\_s*\\|\_s*\_s*[ΒY]\|_\_s*F\|e\_s*\|p\_s*\%(\|g\_s*\)\|\_s*\_s*\|\_s*\|D\_s*i\_s*a\_s*p\_s*e\_s*n\_s*s\_s*i\_s*a\_s*l\_s*e\_s*s\|\_s*[ō]\|<\_s*=\_s*=\_s*>\|K\_s*v\_s*\\_s*\_s*\_s*\|\_s*\|\_s*{\_s*A\_s*C\_s*E\_s*r\_s*[\_s*E\_s*G\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\%(\_s*\_s*\_s*\_s*w\|W\_s*\_s*\_s*@\_s*\\)\|t\_s*\_s*U\_s*t\_s*[\_s*\_s*G\_s*\_s*\|\_s*\_s*q\|\_s*\_s*\|\_s*\_s*\|\_s*\|\_s*\_s*^\|\_s*m\_s*[\_s*h\|i\_s*\%(A\_s*v\_s*\|P\_s*o\_s*d\|\_s*[\_s*h\|M\_s*a\_s*c\|m\_s*[\_s*h\)\|\_s*\_s*\|\_s*\%(\_s*\|\_s*\)\|A\_s*[\_s*@\|\_s*\_s*\|s\_s*\%([”@]\|[\_s*\)\|\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*S\|\_s*\%(A\_s*\|V\_s*t\|[\_s*h\|E\_s*f\)\|A\_s*\%(C\|[\_s*\%(\_s*B\_s*\|r\_s*\)\|\_s*\%(v\_s*\_s*\_s*v\_s*\%(`\_s*\|e\_s*\)\|f\_s*p\_s*\_s*_\_s*\|t\_s*H\_s*\_s*\%(\_s*\|}\_s*e\_s*B\_s*[\_s*N\)\)\)\)', + \ 'J' : '\%([󓈓Ȟ펱ƎwxHÛKbHזiᶘu@vސnՉ`rxosqwptl䥞`œҏtJ珊RPtigYU{ㅐ媚ߘjhŘ竐ҝmYo@Ïꏗ`~]吷꞊󝵏휵hGڜGQ榏A@uQhxmnpq⢓ďmÏ|m՟~[x{䤏zy}汛}杆nG໒^E☸sF_`Oca_Y[]b\Zedꎠm䢛ykdHmˎ掝~Ŏn~Im熉a玘JȎqj^ZiVݒ䝎ڐ׋YҎl苂DuE`_iFvzJWJ]\|\_s*\_s*\|b\_s*W\|\_s*\|G\_s*\%(\_s*\|p\_s*\)\|Z\_s*\%(r\|i\_s*r\_s*c\_s*o\_s*n\_s*i\_s*u\_s*m\)\|D\_s*y\|f\_s*\%(\_s*\|p\_s*\)\|x\_s*x\|\_s*\|c\_s*\_s*\%(\_s*\|c\_s*\)\|Q\_s*\|2\_s*\|\_s*q\|b\_s*\_s*\_s*\_s*\_s*\_s*M\_s*h\_s*p\_s*\|k\_s*\$\_s*_\_s*{\_s*e\_s*f\_s*f\_s*}\_s*\$\|[\_s*\%(\|\_s*\)\|`\_s*\_s*\|\_s*\%(\|\_s*\)\|\_s*\|\_s*\|\_s*\|R\_s*l\|y\_s*_\|\_s*\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*r\_s*\|\_s*v\|\_s*\|\_s*\|\_s*\|\_s*[@S]\|C\_s*a\_s*b\_s*o\_s*m\_s*b\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|\_s*q\|\_s*\|P\_s*\%(Q\|O\_s*[i]\|P\_s*\|U\_s*i\|W\_s*\)\|t\_s*\|\_s*\|R\_s*\|1\_s*\%(0\|1\_s*\|8\_s*\|2\_s*\)\|\_s*\|\_s*\|\_s*\|\_s*\|O\_s*\_s*\|\_s*\|G\_s*\|\_s*\|\_s*q\|\_s*\_s*\_s*\_s*\|j\_s*\%(T\_s*e\_s*X\|L\_s*a\_s*T\_s*e\_s*X\|B\_s*i\_s*b\_s*T\_s*e\_s*X\)\|[\_s*\_s*[\|G\_s*\%(z\_s*o\|\_s*R\|\_s*~\_s*\|\_s*T\_s*\_s*\|b\_s*T\_s*C\)\|w\_s*\%(\_s*X\|X\_s*X\)\|q\_s*\_s*l\_s*X\|`\_s*Q\|k\_s*\_s*\_s*[\_s*\%(\|\_s*w\_s*Z\_s*p\_s*\_s*w\_s*@\_s*\_s*w\)\|n\_s*\%(C\_s*\|\_s*y\_s*[\_s*j\_s*\)\|\_s*\|\_s*\%([ji[]\|C\_s*\|G\_s*\|\_s*m\|\_s*h\|k\_s*\%(X\|V\_s*\)\|X\_s*p\_s*[\_s*X\|R\_s*[ru]\|b\_s*P\)\|t\_s*\%(@\_s*[i]\|\_s*[IA]\)\|Y\_s*{\_s*\|\_s*\%([n_m]\|\_s*Q\_s*\|[\_s*\%([m]\|Q\_s*\_s*g\|f\_s*B\_s*b\_s*g\)\|\_s*\%(O\|P\_s*\|J\_s*[\)\|s\_s*e\_s*\|b\_s*[JV]\)\|C\_s*\%(G\_s*\%([iX]\|\_s*\%(X\|Z\_s*\)\|Y\_s*X\)\|F\_s*\%(i\|\_s*\%(X\|[\_s*\|Z\_s*\)\|[\_s*K\_s*[\|\_s*\%(N\|T\_s*\_s*\)\)\)\|z\_s*\%([^Z]\|\_s*w\|z\_s*o\|A\_s*\%(\|L\_s*\)\)\|\_s*\%([ui]\|\_s*\%(O\|_\_s*\)\|G\_s*\|A\_s*\%(L\_s*\|q\_s*\)\|[\_s*t\|V\_s*\%(t\|\_s*A\)\|[\_s*\%([hg]\|f\_s*\|[\_s*t\)\|Z\_s*t\|n\_s*[il]\)\)', + \ 'K' : '\%([a|VшҜDޏnsߐE}ĈۗᶎsДfꎖIzEꑍC欉䓚䢐uS}┍əY`nXMȜkύ卭ӍeW՝BLݖϙiҔQbm秘jtRK{M`肍ȎL琍fݚJkiQ硟LsJ𔸙lEHnr੘mt൙{XERn㝍h}HyߝK朑nK}֞\囍yෙΜˍxuXSe倘Ji^’@VAW썄GDTᩍ`p᧍B]iPIzt_kKOjRwUuPIa|qsmcDrJLޛܝw΍яWgVڐမZčᑆՙs|˙Zeq؝sZhⰍČٕ֒]eۏ㨏hןzÌП绌ꉍ烜ًÌnj΍@ux삱s|qWO׏b]{Ȍt_^晘PΘn[BӐKrK{yLC[N訙i٘_ݟ]ܜpwٝ惞JJʌ㮛ӌ@ęF鄌Ōښ_犙gDϞfZwcl|lkal㋜dPnrz壌u殌ek\gbYp]v[ٖяRƔzzMKɞⱟJ㖍򍥛IHEbzoxAܗDBӏ~B䱌sZYᯙӞᮛMֈvڌLK@{^Z򏾓^č㦖鶔ňʈUÑqC~ܒwo^鿌~GF䇚`p̃LYƌIގԚPMEu{OoӞcmċᙊHM῍C​晠Jv͎ތɜgˍgHܜ|E؂iwJGrzW__loC∋̛mG摋d򐟏~焌N۟@A^ϛlɝhhfkeid_AZ߁DO񁣁MQGE^|PXYT\N{HRcaKSLB}b܁C⁃IJʁ][䁏FɁWVWUsה܍@ߍXan݋j~gˋR⮝vv[⯙ߋazҝЋی׋؋ы͋ՋӋϋދًԋߋ֋_⦉R䐘c`篋ыNj蝋⟙K s㳝OvwSy⸋t|^vOtI[h➍FpZig݌xZNj]䰚񋧋o運dqkpt瓜_溈ڂX}緋kËuyZ|Pl{vux~}z֘Ғڙr㱋FMNP؋BYyqVHP鉩Y{dO恊kɋLƚ_ΚGhUȝM針iDʞXMJkE˝Ib_J㙒BCb쟃auQWQXqScߟDWP^Hru看RuK鞗yNJr݊jƌyĈꁽeAiMꝕrPTMvrᚁfjsehoqgptrƒb鹜NJDRUğdzᥕpȌڋAԎ‹_雔Bߗދȋ\Ίۖ͋wdTezJxŌ`ӕ^ȔHXRCPqŠ閔@ϞJ{艁嶔㹊|ؙ^歒Se顊j舊sFጐdP}gya`fSWmeOݑ]ڛ̊Ŕ@쁨FOkP[\铑ಉGh@󓂞Њ~yۍ\}ɐ͘V،~ऐc͌buwvxXÕLꖊCƓKGSR魓CЈߕKv֓S哑tݓk䡞S湝誜vᙊdn]QLڒI跏ʜh\frlymznkkgcstio݉BvdߝjlgqupmGd觛Z嵙j珚ԘBiWqr[~D䠊^񔐘\X{Ž\箊IؘrH_j~_F׊@EmLGDŊAKJC`՚QɟIW錟a檚A洚jbaYホe⻞䯙qT㻛fpN㼝c㣟V뙁Mϊ䅟jFrȟ綝mlb˙_xpᒔcAg|}ۊ@يΞ؊󊩐ȊҊ@ʊŞ̊ɊƜAL萊ъš^׊ĊÊԊՊNJ֊͊ϊwxsqPgӊehӏՉɉՉ܃`͉ތF㞉S˚ZQ草ؚm׊]͉ی嗉eDvqҎxT|~o戟ω̉ߍю딃̉ƞg`ϙ֑dUݙJƎa͉ۉяÚКk旓zЊ|䑉嘉㟉qČCa{斎؉҉ǟϛ◉Ή։l߄VR`ijN~qȃLJK{ԃPK]\|\_s*[]\|b\_s*[RPNLJ]\|\_s*[q]\|O\_s*\|\_s*\|\_s*\_s*\|\_s*J\|H\_s*\|\_s*\_s*\|\_s*\|\_s*y\|\_s*F\|\_s*\|\_s*\|S\_s*\|M\_s*e\_s*t\_s*a\_s*c\_s*h\_s*l\_s*a\_s*m\_s*y\_s*d\_s*e\_s*a\_s*e\|f\_s*o\_s*o\_s*t\_s* \_s*a\_s*n\_s*d\_s* \_s*m\_s*o\_s*u\_s*s\_s*e\_s* \_s*d\_s*i\_s*s\_s*e\_s*a\_s*s\_s*e\|O\_s*A\_s*\|\_s*u\|\_s*\|\_s*\|S\_s*i\|\_s*\|S\_s*[Z]\|9\_s*[]\|^\_s*{\|Q\_s*O\|\_s*\|\_s*|\|T\_s*\_s*\|L\_s*a\_s*u\_s*r\_s*\%(a\_s*c\_s*e\_s*a\_s*e\|o\_s*i\_s*d\_s*e\_s*a\_s*e\)\|T\_s*\|\_s*\|c\_s*r\_s*e\_s*s\_s*c\|\_s*\_s*\|H\_s*e\_s*l\_s*l\_s*e\_s*b\_s*o\_s*r\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|J\_s*u\_s*g\_s*l\_s*a\_s*n\_s*d\_s*a\_s*l\_s*e\_s*s\|Z\_s*\|n\_s*_\|s\_s*q\|B\_s*\|z\_s*n\|k\_s*i\_s*l\_s*o\|\_s*[qV]\|\_s*\|m\_s*F\|\\_s*\|\_s*\_s*\|X\_s*e\|@\_s*\|\_s*s\|\_s*\|f\_s*n\|\_s*\|\_s*z\|G\_s*o\_s*l\_s*d\|A\_s*\%(u\|r\_s*c\_s*h\_s*i\_s*c\_s*h\_s*l\_s*a\_s*m\_s*y\_s*d\_s*e\_s*a\_s*e\|s\_s*t\_s*e\_s*r\_s*a\_s*l\_s*e\_s*s\|c\_s*a\_s*n\_s*t\_s*h\_s*a\_s*c\_s*e\_s*a\_s*e\)\|\_s*\_s*\|\_s*\|R\_s*\%(h\_s*\%(o\_s*e\_s*a\_s*d\_s*a\_s*l\_s*e\_s*s\|a\_s*m\_s*n\_s*a\_s*l\_s*e\_s*s\)\|u\_s*n\_s*u\_s*n\_s*c\_s*u\_s*l\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|a\_s*n\_s*\%(u\_s*n\_s*c\_s*u\_s*l\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|a\_s*l\_s*e\_s*s\)\)\|\_s*\|e\_s*[]\|o\_s*[]\|j\_s*[]\|{\_s*\|n\_s*\|X\_s*\%([]\|\_s*\)\|\_s*\|\_s*Z\|\_s*q\|\_s*T\|\_s*\|z\_s*\|\_s*x\|R\_s*\%(\_s*q\|z\_s*\)\|j\_s*\|\_s*\_s*\_s*\|}\_s*\|\_s*\%(\|`\_s*\)\|\_s*\|\_s*[]\|\_s*\|V\_s*\%(\|l\_s*\)\|\_s*q\||\_s*\_s*\|O\_s*x\_s*a\_s*l\_s*i\_s*d\_s*a\_s*c\_s*e\_s*a\_s*e\|\_s*\|t\_s*\|\_s*r\|\_s*Z\||\_s*\|]\_s*\|\\_s*\|\_s*\|\_s*q\_s*\|\_s*[ay]\|\_s*\|\_s*\|E\_s*\%(b\_s*e\_s*n\_s*a\_s*l\_s*e\_s*s\|l\_s*a\_s*n\_s*a\_s*l\_s*e\_s*s\)\|\_s*R\_s*q\|\_s*\|\_s*\|\_s*\|y\_s*\|A\_s*g\|g\_s*\|\_s*t\_s*\|C\_s*\%([ormdaf]\|h\_s*r\_s*o\_s*m\_s*i\_s*u\_s*m\|i\_s*r\_s*c\_s*a\_s*e\_s*a\_s*s\_s*t\_s*e\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\|u\_s*r\_s*i\_s*u\_s*m\|e\_s*r\_s*c\_s*i\_s*d\_s*i\_s*p\_s*h\_s*y\_s*l\_s*l\_s*a\_s*c\_s*e\_s*a\_s*e\|y\_s*p\_s*e\_s*r\_s*a\_s*l\_s*e\_s*s\)\|\_s*\%(\|q\_s*\)\|\_s*\|\_s*\|Z\_s*\%(c\|C\_s*\)\|\_s*\|\_s*[{v]\|\_s*\%(\|\_s*s\_s*\_s*\_s*w\_s*Z\_s*p\_s*\_s*w\)\|(\_s*\_s*)\|\_s*q\|\_s*\_s*\|\_s*\|\_s*\|m\_s*\%(\|\_s*\)\|~\_s*\_s*\|o\_s*c\|Y\_s*t\|\_s*[Iv_]\|\_s*_\|B\_s*\|T\_s*\%(h\_s*a\_s*l\_s*i\_s*c\_s*t\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|u\_s*b\_s*i\_s*f\_s*l\_s*o\_s*r\_s*a\_s*e\)\|m\_s*\%([uE]\|[\_s*\|b\_s*\%([gN]\|e\_s*B\_s*\_s*O\|J\_s*[\|L\_s*\_s*O\)\)\|i\_s*\%(b\_s*\%(N\|v\_s*\%(T\_s*b\_s*N\|U\_s*b\_s*N\)\)\|\_s*b\_s*W\|C\_s*[tgc]\)\|j\_s*\%([\|b\_s*\%(g\|e\_s*B\_s*\_s*O\)\)\|z\_s*\%([\_s*\%(~\_s*[\|\_s*C\)\|\_s*C\_s*j\)\|t\_s*\%(r\_s*\_s*C\|\_s*V\_s*`\_s*\_s*t\)\|n\_s*\%(\|\_s*V\_s*\_s*[\|[\_s*\|o\_s*\_s*t\_s*X\_s*N\|\_s*c\_s*[\_s*\|`\_s*\_s*g\_s*D\_s*\_s*A\_s*\)\|P\_s*\%(i\_s*p\_s*e\_s*r\_s*a\_s*\%(l\_s*e\_s*s\|c\_s*e\_s*a\_s*e\)\|a\_s*p\_s*a\_s*v\_s*e\_s*r\_s*a\_s*l\_s*e\_s*s\|o\_s*\%(d\_s*o\_s*s\_s*t\_s*e\_s*m\_s*o\_s*n\_s*a\_s*l\_s*e\_s*s\|t\_s*a\_s*s\_s*s\_s*i\_s*u\_s*m\)\)\)', + \ 'L' : '\%([HFDB@QP΁Ɂʁ́kȃLɄ|L]\|\_s*[]\|b\_s*[HFDB@]\|\_s*[]\|t\_s*\|\_s*\_s*2\_s*\_s*@\|\.\_s*\.\_s*\.\|f\_s*F\|l\_s*-\_s*\_s*\_s*g\_s*[\_s*\|\_s*\_s*\_s*\_s*\_s*\|\_s*z\|\_s*\|E\_s*G\|\_s*\|w\_s*K\|{\_s*\|\_s*\|_\_s*\|\_s*\%([LCAu{gEXRSO[]\|y\_s*X\|\_s*[\_s*\|G\_s*x\|\_s*\|t\_s*g\|\_s*J\|x\_s*\_s*A\|r\_s*\%([\|\_s*O\|C\_s*\%(X\_s*g\|\_s*O\)\)\|e\_s*B\|T\_s*\_s*\%(W\_s*F\_s*\_s*X\|[\_s*\_s*X\)\|j\_s*[\|N\_s*\_s*A\_s*\|b\_s*\%([W^egN]\|L\_s*\%(\_s*O\|[\_s*h\)\|J\_s*[\)\|P\_s*[\_s*\%([g^]\|V\_s*\_s*\)\|J\_s*[\_s*\|K\_s*[\|M\_s*\_s*O\|W\_s*\%([\|e\_s*b\_s*N\|X\_s*e\_s*B\_s*\%(N\|b\_s*N\)\|J\_s*\|N\_s*[\_s*\|b\_s*[gN]\)\|\_s*\|\_s*\%([SO_]\|{\_s*\%(N\|b\_s*N\)\|o\_s*\_s*f\_s*B\|Y\_s*f\_s*[\_s*\|\_s*[[B]\|W\_s*\|h\_s*\)\|\_s*\%(A\_s*\|b\_s*^\|[\_s*k\|C\_s*\|\_s*\%([\X]\|c\_s*H\)\)\)\|\\\_s*L\_s*a\_s*T\_s*e\_s*X\|\_s*\_s*\|\_s*\%([BZYUTX_|}imkuA[]\|\_s*}\|\_s*h\_s*\|\_s*\|]\_s*`\_s*[\_s*\|R\_s*\%(\_s*X\|s\_s*\)\|N\_s*[\_s*h\|J\_s*\%([\|I\_s*\)\|W\_s*[[]\|f\_s*[B]\|h\_s*J\_s*C\_s*\|v\_s*g\_s*\|p\_s*[\_s*[\|O\_s*\%(j\_s*\|i\_s*\)\|t\_s*\%([Gg]\|^\_s*[\|e\_s*B\_s*\_s*O\)\|e\_s*\_s*[V]\|`\_s*E\_s*\|\\_s*\%(\\_s*[\_s*\|O\_s*\_s*t\_s*B\)\|^\_s*[\|g\_s*\%([]\|}\_s*X\|A\_s*j\_s*A\|O\_s*\_s*t\|o\_s*\_s*X\_s*L\_s*[\)\|I\_s*\%(^\_s*[\_s*\|l\_s*\)\|~\_s*\%(e\_s*b\_s*h\|b\_s*[^g]\)\|\_s*\%([\_s*W\_s*\|l\_s*\|\_s*`\_s*F\_s*b\_s*\)\|\_s*W\_s*\|L\_s*\%(b\_s*h\|\_s*[\_s*\|e\_s*\_s*\%(V\_s*\_s*^\_s*C\_s*\|X\_s*^\_s*C\_s*\)\)\|G\_s*\%(]\_s*\|[\_s*W\_s*\)\|q\_s*e\_s*\_s*V\_s*\_s*^\_s*C\_s*\|l\_s*\%([A]\|b\_s*g\|[\_s*W\_s*\)\|j\_s*A\|x\_s*\%([]\|\_s*A\|\_s*[\_s*V\_s*\_s*\|\_s*e\)\|r\_s*\%([A[]\|h\_s*[\|\_s*O\)\|\_s*\%([X[]\|u\_s*\_s*\_s*[\_s*i\|\_s*\|h\_s*~\_s*\|N\_s*T\_s*\_s*u\_s*[\_s*\|b\_s*N\|V\_s*A\_s*\|~\_s*G\_s*[\_s*\)\|\_s*\%(C\|\_s*O\_s*E\_s*F\)\|\_s*\%(B\_s*\_s*O\_s*X\_s*g\_s*\|@\_s*\%(v\_s*[\_s*\|C\_s*A\_s*T\_s*\)\)\|o\_s*\%(e\_s*B\|^\_s*\_s*A\_s*\%(\|j\_s*Y\_s*\)\|v\_s*[\_s*\|C\_s*A\_s*T\_s*\)\|b\_s*\%([hsv^N`g]\|X\_s*\)\)\|G\_s*\)', + \ 'M' : '\%([ӊߊ㝪ϙ~EぞJI䈐ЎtuqvUpݑmXޖ\ҕ~⋖̜߉bf{eҖ۟͟G㦖̞NaCS֖іЖҖԘR֖]rRᑔȖ̞kGۖΖݒWϏږӛRㅖG̜bpcᾖɖ˖ǖȖʟœҖǖ‰ɏz܌ї㸋Xٟ}ۖV񛘊[|rm籑ΕS}Ɠ絘AWp~׏@d⚕ړkJ⥐Ißz峒Úٖۖdx딍ZQxNaDYKICTϗΗXO̎SZBꎨݜDXL薦ޑÒفvp󁨁zxEG⊖ɗΔFaϓrʘH飌ΎM倐ᡞ䪖s{SAQ`捐vP閨{F[Vg\όȐfŖmO[pr향ϖ▕naῐݐ\ן{fB坏㇓㕓I帑]^ߋ[]HoqhƉMϔdhqʌږp鞔C䍕̓h|{Ê׈welCdꠖqxfUXOEDKBji~ەבSuҖKĎQwĘdG簖aږ_JZՖ攔{VԔћIԙ\ݖޖGM挫D󏫐m_䝖ڐɎU]v^nvGݕᄎTҔdԖsȖ܌򃀁⁆܁}́Ɂ䃢ʁˁہ΁ځȁ́߁~݁まށ֖Zl|}Ń~MʃM]\|\_s*[]\|b\_s*[~}]\|\_s*[߂ނ݂]\|g\_s*[t]\|o\_s*\%([ne]\|\_s*\|\_s*\)\|\_s*o\|\_s*y\_s*\%(\|\_s*\)\|\_s*\%([pen]\|\_s*\)\|\_s*\|\_s*\|\_s*\|\_s*z\_s*\|k\_s*~\_s*\|\_s*\|\_s*p\|\_s*\|\_s*\_s*\|O\_s*l\_s*e\_s*a\_s*l\_s*e\_s*s\|\_s*R\|\_s*\_s*\|j\_s*E\|\_s*\|\_s*[N]\|n\_s*\_s*F\|t\_s*\|J\_s*\_s*\|v\_s*w\|\_s*\|z\_s*\_s*q\|v\_s*\%([pL]\|`\_s*\|H\_s*q\)\|\_s*\|U\_s*\|6\_s*\|\_s*c\|\_s*w\|\_s*\|\_s*]\_s*q\|\_s*n\|B\_s*\%(e\_s*r\_s*b\_s*e\_s*r\_s*i\_s*d\_s*a\_s*c\_s*e\_s*a\_s*e\|i\_s*o\_s*r\_s*r\_s*a\_s*g\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\)\|Y\_s*\|\_s*q\|k\_s*\$\_s*_\_s*{\_s*i\_s*n\_s*f\_s*}\_s*\$\|t\_s*m\|A\_s*\%(b\_s*i\_s*e\_s*s\|p\_s*e\_s*t\_s*a\_s*l\_s*a\_s*e\|c\_s*r\_s*o\_s*s\_s*t\_s*i\_s*c\_s*h\_s*u\_s*m\)\|R\_s*\|\_s*\|e\_s*\|_\_s*[q`]\|d\_s*\|\_s*\|\_s*\|c\_s*[q]\|R\_s*[“]\|3\_s*[“]\|p\_s*[q]\|\_s*\|\_s*\|c\_s*\|C\_s*[_]zIR]\|P\_s*o\_s*d\_s*o\_s*p\_s*h\_s*y\_s*l\_s*l\_s*a\_s*c\_s*e\_s*a\_s*e\|y\_s*[Y]\|\_s*s\|[\_s*]\|\_s*\|\_s*\|e\_s*O\|R\_s*u\_s*t\_s*a\_s*l\_s*e\_s*s\|s\_s*\%(\|\_s*[]_]\)\|\_s*l\_s*}\_s*\_s*m\_s*X\|\_s*X\|\_s*\|\_s*\|\_s*\|\_s*[XЌ]\|\_s*\|S\_s*\|\_s*\|\_s*h\|\_s*\|\_s*\_s*\|{\_s*B\|\_s*v\|\_s*[o]\|\_s*\|}\_s*n\|L\_s*o\_s*g\_s*a\_s*n\_s*i\_s*a\_s*c\_s*e\_s*a\_s*e\|\_s*\|\_s*b\|\_s*m\|S\_s*\%(a\_s*p\_s*i\_s*n\_s*d\_s*a\_s*l\_s*e\_s*s\|c\_s*h\_s*i\_s*s\_s*a\_s*n\_s*d\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\)\|C\_s*\%(a\_s*s\_s*u\_s*a\_s*r\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\|e\_s*r\_s*a\_s*t\_s*o\_s*p\_s*y\_s*l\_s*l\_s*a\_s*c\_s*e\_s*a\_s*e\)\||\_s*\%(\_s*l\|\_s*\)\|H\_s*a\_s*m\_s*a\_s*m\_s*e\_s*l\_s*i\_s*d\_s*a\_s*l\_s*e\_s*s\|\_s*[V]\|\_s*F\|S\_s*j\|\_s*q\|\_s*[P]\|\_s*\_s*N\|\_s*v\|\_s*\_s*\_s*\|\_s*-\_s*q\_s*m\_s*`\|j\_s*[\_s*\_s*j\_s*b\_s*N\|P\_s*\_s*\|\_s*c\|a\_s*z\_s*[]\|\_s*\_s*q\|\_s*\_s*]\|s\_s*[K]\|\_s*\|\_s*\%(\_s*\_s*\_s*h\_s*q\_s*\_s*\_s*\_s*\|{\_s*\)\|m\_s*\%(u\_s*l\_s*t\_s*i\_s*l\_s*i\_s*n\_s*g\_s*u\_s*a\_s*l\_s*i\_s*z\_s*a\_s*t\_s*i\_s*o\_s*n\|i\_s*\%(c\_s*r\_s*o\|l\_s*l\_s*i\)\|e\_s*\%(g\_s*a\|z\_s*z\_s*o\_s* \_s*\%(f\_s*o\_s*r\_s*t\_s*e\|p\_s*i\_s*a\_s*n\_s*o\)\)\|a\_s*\%(k\_s*e\_s*t\_s*@\_s*C\_s*\|d\_s*e\_s* \_s*i\_s*n\_s* \_s*J\_s*a\_s*p\_s*a\_s*n\)\)\|v\_s*Z\_s*@\|\_s*\|U\_s*b\_s*w\_s*\_s*\_s*}\_s*]\_s*b\_s*z\|n\_s*s\_s*I\_s*\_s*\|\_s*s\_s*\%(\_s*\_s*\|\_s*\)\|C\_s*m\|\_s*\|\_s*\|G\_s*\)', + \ 'N' : '\%([ɈҘjC򝼏MlAjfwaXHpLH]`kc䊉ѓoўو풨{EJ돸W@Ћ錛KNXI͓TGcIX^]\_L|ZޟZڔV۔UqWȚˑ_oDE^JCꋑlXLisM൘JKR_QORNQqPHחlBSI\啼KL刐@zXޓF܍fzDѝU{zhGEƝ^吒SLERP{e֏AEUД@PEɔB轟WtswxZXKוfnE͔DFCl׋ѐV_am玘ƓQ2Oǎ獂rW㊓ckj›DTlSVQeowԎPYg粓Q^垙ĎC鼉YّӓHay[ÓܗmGXƖČ`Ɖrဗvᑶiax܏AE}VΎ̔TRf펢josϗoˁK菦baenߖ‹יTrؓޟ[~֓△Lྒྷ⍋PS\Ȅޖjlmʁ`ikm~˃NN]\|\_s*[]\|b\_s*[mlkji]\|\_s*[̂˂ʂɂ]\|\_s*\|\_s*q\|\_s*\|x\_s*U\|\_s*\_s*\|\_s*\_s*\|T\_s*[|]\|\_s*C\|t\_s*\|g\_s*[C]\|j\_s*[]\|\_s*]\|L\_s*\|\_s*\|\_s*q\|\_s*[@q]\|P\_s*q\|F\_s*q\|\_s*\_s*\|h\_s*V\|q\_s*|\|\_s*\_s*\|\_s*\_s*\|m\_s*\|\_s*\|\_s*\|\_s*\|\_s*]\_s*q\|_\_s*\|\_s*P\|I\_s*I\_s*\|^\_s*\|\_s*\|\_s*\|M\_s*y\_s*r\_s*i\_s*s\_s*t\_s*i\_s*c\_s*a\_s*c\_s*e\_s*a\_s*e\|\_s*\|\_s*\%(f\|\_s*\)\||\_s*\|\_s*|\|\_s*T\|s\_s*[]\|L\_s*e\_s*a\_s*d\|P\_s*b\|C\_s*[ۑl]\|C\_s*\%(e\_s*l\_s*a\_s*s\_s*t\_s*r\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|a\_s*r\_s*y\_s*o\_s*p\_s*h\_s*y\_s*l\_s*l\_s*a\_s*l\_s*e\_s*s\)\|\_s*\|\_s*\%(\_s*\|\_s*\)\||\_s*\_s*\|7\_s*[]\|\_s*\|n\_s*k\|\_s*\|s\_s*\|\_s*\_s*X\_s*g\|T\_s*h\_s*e\_s* \_s*N\_s*e\_s*t\_s*w\_s*o\_s*r\_s*k\_s* \_s*I\_s*n\_s*f\_s*o\_s*r\_s*m\_s*a\_s*t\_s*i\_s*o\_s*n\_s* \_s*C\_s*e\_s*n\_s*t\_s*e\_s*r\|S\_s*o\_s*\%(l\_s*a\_s*n\_s*a\_s*l\_s*e\_s*s\|d\_s*i\_s*u\_s*m\)\|\_s*\%(\|\_s*\|\_s*\_s*\_s*\_s*\)\|R\_s*\|t\_s*H\_s*\_s*E\_s*m\_s*C\_s*}\_s*\|\_s*[\_s*m\_s*b\_s*V\_s*\_s*E\_s*t\_s*H\_s*\_s*E\_s*m\_s*C\_s*}\_s*\|I\_s*\_s*\_s*_\|A\_s*\_s*\_s*J\_s*l\_s*b\_s*g\_s*\_s*[\_s*N\|\_s*\|\_s*_\|\_s*z\_s*\|n\_s*\%(\|a\_s*n\_s*o\|o\_s*t\_s* \_s*o\_s*r\)\|\_s*\|\_s*\|G\_s*k\|\_s*f\)', + \ 'O' : '\%([ݐbSMoNOÌQjwdЊdYnnx遒ssና{≬LݜڏP񜁈؋y߁RUVWTSXy􋳙{E⫝e}tcC筞[҉x^拑`qsN`ƛˊxubBdeȊe퐊Kȉ򚙊aCO݈җ㱕zv\dʋUK{|SwD}Ҝig^][aQ_NRVMן^qr誉SB蜊׉ʉꉂWWTgEcTٖQPѕ}ʼn|؏N~֏斃E戳[ODLjuѐܘNYYǘVjvĔɚjIɂ偝a􁾁ɊJnփOḮO]\|\_s*\_s*\_s*\|\_s*p\|\_s*u\|\\_s*\_s*\|S\_s*\|C\_s*\_s*C\_s*\|\_s*\|\_s*@\|\_s*\|\_s*\_s*\|\_s*\|n\_s*\|\_s*\|\_s*\|\_s*[]\|\_s*\|\_s*\|T\_s*[]\|\_s*[q]\|f\_s*[]\|\_s*[]\|H\_s*\|\_s*\|\_s*C\|D\_s*i\_s*l\_s*l\_s*e\_s*n\_s*i\_s*a\_s*l\_s*e\_s*s\|G\_s*u\_s*t\_s*t\_s*i\_s*f\_s*e\_s*r\_s*a\_s*l\_s*e\_s*s\|H\_s*y\_s*p\_s*e\_s*r\_s*i\_s*c\_s*a\_s*l\_s*e\_s*s\|\_s*\|\_s*p\|\_s*[q]\|\_s*N\_s*\|{\_s*\_s*\|\_s*\|\_s*b\|A\_s*l\_s*i\_s*s\_s*m\_s*a\_s*t\_s*a\_s*l\_s*e\_s*s\|K\_s*\|\_s*l\|\_s*c\|C\_s*o\_s*p\_s*t\_s*i\_s*d\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|o\_s*\_s*U\_s*\%(\|\_s*\)\|\_s*m\|\_s*\|\_s*]\|\_s*g\|\_s*\|\_s*\_s*\_s*P\|A\_s*[zn]\|\_s*[H]\|}\_s*\|\_s*F\|w\_s*n\_s*}\|\_s*\|z\_s*[iqmx]\|\_s*\|c\_s*[_]\|\_s*O\|]\_s*c\_s*[ꕃ]\|\_s*[~C]\|\_s*\%(c\|\_s*\_s*\|\_s*V\_s*c\)\|\_s*\|\_s*[G]\|\_s*\_s*\|\_s*m\_s*\_s*\_s*\_s*\_s*\.\|G\_s*[]\|t\_s*h\_s*e\_s* \_s*O\_s*b\_s*j\_s*e\_s*c\_s*t\_s* \_s*M\_s*a\_s*n\_s*a\_s*g\_s*e\_s*m\_s*e\_s*n\_s*t\_s* \_s*G\_s*r\_s*o\_s*u\_s*p\|\_s*\_s*d\_s*@\|E\_s*\|\_s*~\|E\_s*\%(B\|[\_s*\%(Y\|\_s*\)\|\_s*{\_s*\_s*X\)\|o\_s*\|A\_s*\%(\|U\_s*[\|E\_s*\%([`g]\|^\_s*[\)\)\|\_s*{\_s*\\_s*t\_s*g\_s*E\_s*F\_s*A\|\_s*\%(\_s*[N]\|\_s*\)\|\_s*\|\_s*\_s*\|_\_s*\_s*a\|\_s*\_s*\|\_s*\_s*_\_s*f\_s*j\_s*\_s*\|`\_s*\_s*\|\_s*K\_s*\|\_s*\|\_s*Z\_s*q\|\_s*\|_\_s*f\)', + \ 'P' : '\%([BC@{s܂ەy~粕ҕ糕ӕՕћؕzCߕ[UiᢑpoǕś”ƕstuzvdgjHωՃҁ}{ՃӃkoD_Ev|Łji݁aypP΃sP]\|\_s*\%(\_s*\|\_s*\|\_s*\|\_s*\|\_s*\)\|b\_s*[|yvsp]\|\_s*[ۂ؂Ղ҂]\|\_s*\|\_s*l\_s*\|\_s*\|O\_s*[ID]\|\_s*\|\_s*R\|\_s*D\_s*\|\_s*\|\_s*`\|\_s*\|\_s*\|\_s*q\|b\_s*\%(\|\_s*n\)\|S\_s*y\_s*n\_s*a\_s*n\_s*t\_s*h\_s*a\_s*e\|C\_s*y\_s*c\_s*l\_s*a\_s*n\_s*t\_s*h\_s*a\_s*l\_s*e\_s*s\|r\_s*\|B\_s*r\_s*o\_s*m\_s*e\_s*l\_s*i\_s*a\_s*l\_s*e\_s*s\|L\_s*e\_s*a\_s*d\|\_s*[Ž]\|V\_s*\%(\_s*[\_s*h\|\_s*V\_s*r\_s*\)\|T\_s*\%([\_s*\|C\_s*\%([YNPR]\|\_s*V\_s*r\_s*\|\_s*E\_s*\|L\_s*b\_s*N\)\)\|+\_s*\|z\_s*\%(\|X\_s*Q\_s*\)\|q\_s*\_s*|\_s*\|\_s*\%(z\|\_s*o\)\|t\_s*\%(\_s*W\_s*A\_s*\|\_s*\%([\_s*\%(Y\|W\_s*\_s*O\)\|C\_s*W\_s*\_s*O\)\|^\_s*\_s*C\_s*\|H\_s*\%([[mg]\|{\_s*X\|r\_s*A\|X\_s*t\_s*@\_s*[\|j\_s*[\)\|@\_s*\%(C\|\_s*I\|[\_s*\%([W}]\|~\_s*\_s*O\)\|\_s*\%(g\_s*\|^\_s*Y\_s*[}]\)\|\_s*[cX]\|\_s*m\_s*v\_s*V\_s*X\)\|B\_s*\%([]\|W\_s*\%(b\_s*N\_s*X\|J\_s*\)\|[\_s*r\_s*[\|b\_s*V\_s*\_s*O\|\_s*\_s*\|\_s*f\_s*\_s*t\_s*B\_s*A\|\_s*\%([X[Ap]\|b\_s*[vp]\|s\_s*\%(\|[\_s*k\)\)\)\|F\_s*\%([\_s*\%([xY]\|W\_s*\_s*O\)\|C\_s*Y\|\_s*\_s*\|j\_s*\%(\|b\_s*N\_s*X\|L\_s*A\|[\_s*\)\|m\_s*\%(L\_s*V\|[\_s*\)\)\)\|q\_s*\|\_s*\|^\_s*\_s*p\_s*N\_s*\|\_s*\|\_s*\_s*\|i\_s*s\|Z\_s*\|\_s*\|\_s*Z\|\_s*\|\_s*`\|^\_s*\|i\_s*\|J\_s*\_s*E\_s*\|\_s*\_s*\|d\_s*\_s*\|\_s*\_s*^\|o\_s*e\_s*\_s*\|\\_s*\_s*t\_s*\|_\_s*\|\_s*\_s*[a]\|\_s*\|p\_s*\%(T\_s*e\_s*X\|H\_s*\_s*[\_s*^\|e\_s*\%(t\_s*a\|r\_s*l\_s*X\_s*N\_s*\_s*v\_s*g\)\|i\_s*\%(c\_s*o\|a\_s*n\_s*\%(o\|i\_s*s\_s*s\_s*i\_s*\%(m\_s*o\|s\_s*s\_s*i\_s*m\_s*o\)\)\)\)\|\_s*\)', + \ 'Q' : '\%([zzMKɞ՟J㖍򍥛IHEdbzoxAܗϕDCBӊǏ~B䱌sZYᯙӞᮉOM֌NvڊLK@{^Z򏾓^čA㦖鶔rňʈUÑq𔯞C~VWRUSXT܉_wo^鿌~GF䇚`p̃LY۞IfȊsގԚPMEu[{O֞oӁ@󞔐ȓScvmČ痈SqᙊHM῍C​晠J{vv͘ҋXތɜgˍgHܜ|E{윁؋phefgPHNQ]\|\_s*\|b\_s*N\|\_s*\|\_s*\|\_s*\|~\_s*\|\_s*\|\_s*S\|S\_s*[Z]\|\_s*\_s*x\|\_s*\|\_s*h\|\_s*\|9\_s*\|^\_s*{\|\_s*\|Q\_s*O\|\_s*\|\_s*\%(\|\_s*\)\|\_s*\|V\_s*l\_s*\|\_s*|\|T\_s*\_s*\|L\_s*a\_s*u\_s*r\_s*\%(a\_s*c\_s*e\_s*a\_s*e\|o\_s*i\_s*d\_s*e\_s*a\_s*e\)\|T\_s*\|\_s*\|c\_s*r\_s*e\_s*s\_s*c\|\_s*[{]\|C\_s*\|\_s*\_s*\|K\_s*r\|H\_s*e\_s*l\_s*l\_s*e\_s*b\_s*o\_s*r\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|\_s*\%([ƕE]\|o\_s*\)\|\_s*\|\_s*C\_s*a\|J\_s*u\_s*g\_s*l\_s*a\_s*n\_s*d\_s*a\_s*l\_s*e\_s*s\|\_s*\|Z\_s*\|n\_s*_\|s\_s*q\|B\_s*\|R\_s*\_s*q\|C\_s*\%(r\|h\_s*r\_s*o\_s*m\_s*i\_s*u\_s*m\)\|R\_s*h\_s*a\_s*m\_s*n\_s*a\_s*l\_s*e\_s*s\|\_s*s\_s*N\_s*\|`\_s*\_s*\_s*\_s*\_s*}\|w\_s*x\|R\_s*\%([\_s*\_s*\|\_s*e\_s*B\_s*t\_s*@\_s*C\_s*A\)\|\_s*\_s*\|J\_s*\%(U\_s*\|^\_s*[\_s*\|X\_s*o\|[\_s*k\_s*[\_s*\|i\_s*[\_s*g\|_\_s*t\_s*B\|\_s*e\|h\_s*\_s*[\_s*[]\|\_s*\%(`\_s*[FG]\|e\_s*\%(B\_s*G\|b\_s*g\)\)\|\_s*^\_s*[X]\)\|\_s*\|L\_s*\%(g\|u\_s*\|z\_s*[\_s*e\|n\_s*[\_s*_\|\_s*\%(g\|e\_s*B\_s*\_s*O\)\|[\_s*\|m\_s*\|b\_s*V\_s*\|\_s*\%([\|G\_s*\)\)\)', + \ 'R' : '\%([ۘӛěŚ̉h_R{]Ә[\U^MPR䛉R˙CCludN譞Lc屑OcYᑘLSQXᔘWOUĘTRNmIE@醕bbdLFiBe࢘G鐂ڟYxU೙evYׁZatXF䫗ᖗw̟K魟MlI瀗QwYqrQݗ@BA٘H〟pᐗ㾗ۗݗ~ZK蛂ಝ_×ɌIʘZCP䞛gXYVÊ}֗XaᅞWHP˗ԜdhgҙzؗϙחїӗW򗵞OC͗q]x@y饖×A_`p֝H×㇗ߗƗȗɗʗ̗Śi胗ߗ؜ۗ\鋗Ai仂טJəVYO㜛npgBRSETAࣗa茗Eh඗pyq㡟IQ۝Sᚘ痋ff逓tEDw@CAUtxXzvH{NG^STRr_F`[LBqVM}W~IpIuE]KPZDYs|\OyJց㍪XqQτR]\|\_s*[]\|b\_s*[]\|\_s*[]\|\_s*\|\_s*[L]\|h\_s*[Eߎ]\|\_s*\_s*\|6\_s*[]\|E\_s*G\|\_s*\|C\_s*\%(a\_s*l\_s*y\_s*c\_s*a\_s*n\_s*t\_s*h\_s*a\_s*c\_s*e\_s*a\_s*e\|h\_s*o\_s*r\_s*i\_s*p\_s*e\_s*t\_s*a\_s*l\_s*a\_s*e\)\|A\_s*\%(c\_s*t\_s*a\_s*e\_s*a\|p\_s*o\_s*p\_s*e\_s*t\_s*a\_s*l\_s*a\_s*e\)\|\_s*[]\|\_s*\%(\||\_s*\)\|V\_s*e\_s*r\_s*t\_s*i\_s*c\_s*i\_s*l\_s*l\_s*a\_s*t\_s*a\_s*e\|O\_s*r\_s*c\_s*h\_s*i\_s*d\_s*a\_s*l\_s*e\_s*s\|M\_s*i\_s*c\_s*r\_s*o\_s*s\_s*p\_s*e\_s*r\_s*m\_s*a\_s*e\|L\_s*\%([ruia]\|e\_s*i\_s*t\_s*n\_s*e\_s*r\_s*i\_s*a\_s*l\_s*e\_s*s\|A\_s*N\_s*P\_s*[\_s*u\_s*\)\|C\_s*\|G\_s*\%(e\_s*n\_s*t\_s*i\_s*a\_s*n\_s*a\_s*l\_s*e\_s*s\|y\_s*\%(n\_s*a\_s*n\_s*d\_s*r\_s*a\_s*e\|m\_s*n\_s*o\_s*s\_s*p\_s*e\_s*r\_s*m\_s*a\_s*e\)\)\|\_s*W\_s*f\_s*[\_s*^\_s*x\_s*[\_s*X\|\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*s\_s*\_s*w\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*k\_s*\_s*\%(\_s*\|w\_s*d\_s*C\_s*\_s*M\_s*\_s*\_s*\)\|d\_s*C\_s*\_s*M\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*Z\_s*b\_s*g\_s*v\_s*Z\_s*@\|\_s*\|K\_s*\|g\_s*\|r\_s*u\_s*b\_s*y\_s*X\_s*N\_s*\_s*v\_s*g\|v\_s*\|\_s*\|\_s*A\|\_s*[M]\|\_s*\|\_s*\_s*\|Q\_s*\%(l\_s*\_s*\|\_s*^\)\|@\_s*\\_s*\_s*\_s*P\_s*\|\_s*A\_s*I\|F\_s*\|\_s*K\_s*\\_s*\|A\_s*[\_s*\)', + \ 'S' : '\%([}[Ty}Q^ēih掞y{GOʗcUtwⶊQ锑뙩suक़xƔK}柛”a╛^ԛyꑅz|S\䇛q~Hxyܑ䵑qBJtvƑNⵑr|swpnmyn\F絖uLMXgedבbfe􈷑YSa[isƈꋟ^hj꒑`clzNNZ驉kŋQLGiLↁސِېڐߞCG@Sዙ[Tאɐ͊֐ȐǞNdϞ囡pә㙟㚘jA䦈_tbAAbxaHܟCJI⤑GSL⒑Wsr葁DJAL񙒐枙@ېMHlFKDB@GhǝNdDRŖ|˝v⫝呝yHՐ}Uҙ[ߝpS爊caopIDcER䊔TωsꈝؐCShᓩ]T\~yu̖齗VŒsvǐEpz~dǛ俑Ypnzy羝裐䍐␕ځȁˁ΁݁}ʁށ~́܁၆Ɂ袜ၐvℐxNːXaV䐆Hz`Xʐ]䐟֋󓧖LizZDBAPDY`LZ连xZxw圑ȓGFaƎb乗MEsCFZnD㈵㦃Ƌs]Ŗl⚑^潔AgΖ儞ɖΏdݜ臐wp玬d쎹g[諎^GNH˒Ύm\ސːKŽKtoqϔ͚͎bP᪎jAϐ֙̎ݐ┐^ܐΎގڎ؎YώΎɎԎߎЈޝȕiSCGဎ偊fztWV题㌎瑲fEiglk{蜕婙oJ蕘ꟚkVh娔hKqF榚SQFT酝nSXKUڏMGjEaNOPDCALRTIB@M᭜貚я忏w{vxs⡏turfݚpuVyJUZ]jP曚A՜fY`Ds橝ΐaO凓cjcѐUahNfdCkXLTQWgiR[MebI_SΏnZ勋o|׊_䓏wb򏎏vߓɚ[mיАО_cRuB䐠ϞƐLҜћ辛頔׏[MB䀙n␏୚K♏яҁuiϏ]疏ցijӐԚϏUJnސŜ܏ߏُGଏޑď͏ǏɏЏۏ暐̏ďΏƏ͏ڏ؏ɏȏplTegߐ@RCܑFDI冐BAHEuowʕEey򚬞@џ|Xꏎю}ؗ⿎l_oŎstћLypik䍟ߊ``oor{zj`V@@iy掂IِynXnBg~vsЎoN᎒ZuiU抎f]Kjq{J{r˙׎藂ۚ~礉JLfVWlȕ̐䰐TᰗlIJMhEU嶎\zGԑuV\V֔fXMˍǏxš皔m匈^꛽O@՛N\󎘊jۗB睋ʼnbq@dNmPbq嗝WƔfⲝHFHBr{吷ᵞvWtuĉh|招E䋫🛋t剎럈E`fsœ|̝acHKcߙӎ[ǎWXㄐVҎ\r]ZPR3Q^OUSRY_ATCD搔@FD\qGӍƎEǛː؟NZrԜ淍Kȍ͙Pꎍ`BڛvɍVҍۍЍю΍؍Ӎ̐č֍ՍȍÍˍҍٍ΍ō鑨焞or⧍ey|skwN񍻓ዎˋÎюhnr䳍~⑁ʛˍlORğAL璍om򉺍⍽}S_sK^dw@YYご򄋄ZYÁWnŽOyʁ`efW_TZTrV\XbЃRS]\|\_s*[]\|b\_s*[\ZXVT]\|\_s*[]\|\_s*\|\\_s*\%(H\|I\_s*\)\|~\_s*\|\_s*\|\_s*\|\_s*\|\_s*g\|\_s*\|v\_s*[Xv]\|\_s*n\|\_s*\|\_s*c\|\_s*\|B\_s*[BX]\|\_s*C\|\_s*\|U\_s*m\_s*b\_s*e\_s*l\_s*l\_s*i\_s*f\_s*l\_s*o\_s*r\_s*a\_s*e\|\_s*\|}\_s*\|c\_s*e\_s*n\_s*t\_s*i\|\_s*[U]\|C\_s*\|\_s*\|}\_s*\|T\_s*\|G\_s*Y\|f\_s*\|V\_s*[c]\|V\_s*i\_s*o\_s*l\_s*a\_s*l\_s*e\_s*s\|N\_s*y\_s*m\_s*p\_s*h\_s*a\_s*e\_s*\%(a\_s*c\_s*e\_s*a\_s*e\|o\_s*i\_s*d\_s*e\_s*a\_s*e\)\|\_s*\|\_s*\|b\_s*\%(^\|\_s*\)\|V\_s*\|]\_s*\|\_s*\|s\_s*[mE]\|L\_s*a\_s*\%(b\_s*i\_s*a\_s*t\_s*a\_s*e\|m\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\)\|\_s*\_s*\|\_s*\|~\_s*\|\_s*t\_s*\|\_s*\|\_s*_\|\_s*\|\_s*Y\|\_s*\|\_s*\|I\_s*\%(s\_s*o\_s*p\_s*y\_s*r\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|l\_s*l\_s*i\_s*c\_s*i\_s*a\_s*c\_s*e\_s*a\_s*e\)\|W\_s*i\_s*n\_s*t\_s*e\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\|`\_s*\|\_s*[J]\|]\_s*[]X]\|\_s*\%(X\_s*\_s*\|\_s*\_s*\)\|\_s*\%([֌ڎu]\|\_s*\)\|V\_s*\|7\_s*\|S\_s*[]\|4\_s*\|R\_s*{\|h\_s*t\|\_s*u\|\_s*\|A\_s*[o]\|\_s*[NY]\|\_s*[]\|r\_s*[ꏎ]\|\_s*\|c\_s*e\|\_s*\|\_s*\%(_\|C\_s*\)\|Z\_s*i\_s*n\_s*g\_s*i\_s*b\_s*e\_s*r\_s*a\_s*l\_s*e\_s*s\|\_s*\%(\_s*{\_s*\%(I\|\_s*I\)\|\_s*\_s*a\_s*\_s*W\)\|\_s*[Η]\|\_s*\|\_s*\|\_s*\|e\_s*\_s*\|C\_s*\%([es]\|y\_s*c\_s*a\_s*d\_s*\%(i\_s*d\_s*a\_s*e\|o\_s*\%(p\_s*s\_s*i\_s*d\_s*a\|f\_s*i\_s*l\_s*i\_s*c\_s*a\_s*l\_s*e\_s*s\)\)\|h\_s*l\_s*o\_s*r\_s*a\_s*n\_s*t\_s*h\_s*a\_s*c\_s*e\_s*a\_s*e\|\_s*\|D\_s*X\|^\_s*\_s*\|a\_s*\%(s\_s*s\_s*y\_s*t\_s*h\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|c\_s*t\_s*a\_s*l\_s*e\_s*s\)\)\|\_s*K\||\_s*[“]\|\_s*p\_s*\|G\_s*\|\_s*\|\_s*\_s*\%(\_s*[N]\|X\_s*[N]\)\|h\_s*l\|S\_s*\_s*g\|\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*e\|\_s*\|\_s*\%(@\|\_s*\_s*\)\|\_s*\|G\_s*\|\_s*q\|P\_s*\%(a\_s*r\_s*i\_s*e\_s*t\_s*a\_s*l\_s*e\_s*s\|t\_s*e\_s*r\_s*i\_s*d\_s*o\_s*s\_s*p\_s*e\_s*r\_s*m\_s*\%(a\_s*l\_s*e\_s*s\|i\_s*d\_s*a\_s*e\)\|r\_s*i\_s*m\_s*u\_s*l\_s*a\_s*l\_s*e\_s*s\)\|A\_s*\%(p\_s*i\_s*a\_s*l\_s*e\_s*s\|r\_s*a\_s*l\_s*e\_s*s\|n\_s*t\_s*i\_s*m\_s*o\_s*n\_s*y\)\|s\_s*f\_s*o\_s*r\_s*z\_s*a\_s*n\_s*d\_s*o\|\_s*[T]\|B\_s*\%(r\|V\_s*F\_s*\)\|g\_s*\_s*q\|\_s*\_s*\|\_s*\|u\_s*\|A\_s*\_s*`\_s*\_s*\|\\_s*\_s*\|D\_s*o\_s*n\_s*a\_s*t\_s*i\_s*o\_s*n\_s* \_s*A\_s*l\_s*p\_s*h\_s*o\_s*n\_s*s\_s*e\_s* \_s*F\_s*r\_s*a\_s*n\_s*c\_s*o\_s*i\_s*s\_s* \_s*d\_s*e\_s* \_s*S\_s*a\_s*d\_s*e\|M\_s*\%(e\_s*r\_s*c\_s*u\_s*r\_s*y\|u\_s*s\_s*a\_s*l\_s*e\_s*s\|a\_s*r\_s*q\_s*u\_s*i\_s*s\_s* \_s*d\_s*e\_s* \_s*S\_s*a\_s*d\_s*e\)\|\_s*\%(V\|s\_s*\%(\_s*\_s*\|\_s*\)\)\|T\_s*\%(e\_s*t\_s*r\_s*a\_s*c\_s*e\_s*n\_s*t\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\|i\_s*n\|h\_s*e\_s* \_s*S\_s*i\_s*m\_s*p\_s*l\_s*e\_s* \_s*A\_s*P\_s*I\_s* \_s*f\_s*o\_s*r\_s* \_s*e\_s*v\_s*e\_s*n\_s*t\_s*-\_s*b\_s*a\_s*s\_s*e\_s*d\_s* \_s*X\_s*M\_s*L\_s* \_s*p\_s*a\_s*r\_s*s\_s*i\_s*n\_s*g\)\|P\_s*C\_s*f\|]\_s*f\|v\_s*\_s*\_s*\_s*\_s*\_s*w\_s*\|l\_s*b\_s*g\_s*T\_s*[\_s*r\_s*X\|U\_s*\%(b\_s*N\|N\_s*Z\_s*\|r\_s*[\_s*l\|E\_s*o\_s*[\|\_s*[\_s*N\_s*\_s*E\_s*g\|\_s*U\|\_s*c\|C\_s*\%([]\|\_s*[\|f\_s*\)\|[\_s*\%([]\|\_s*\)\)\|\_s*\|[\_s*~\|i\_s*g\_s*\_s*E\_s*\|]\_s*\%(\|\_s*f\|[\_s*\%(\|\_s*\_s*Q\_s*\)\|t\_s*B\_s*[\)\|W\_s*\%(\|[\_s*\%([ON]\|\_s*\_s*[YX]\)\|O\_s*\_s*\_s*g\|\_s*\%(\_s*\|O\_s*V\_s*\_s*s\_s*[\_s*\|e\_s*[\_s*[\)\)\|\_s*\|G\_s*X\)', + \ 'T' : '\%([ĜR牉șhЌ☝ωiמRh|c툪H֓騗֋㜐C䃕۔y榏QFbr\c͙ʓד՘JcٓؓڐJxɍΖrqNPדь{ԍǘ؝沖L௜{ී“ΓCjߙ㛟D椟Xbى⅝TwF~㫛䞨[џẓ}衞Δ󓎌BUÓĉDڎ獙WMꊐzcbuٓ幓鉓~鍓򓀓˓e{Ox~茤yZ䷞nZ^u̔mqėy}olropVĔÏ\pvjn掷nϙ\EitNOg\lhꚤrlWPȎod͙W難ÓR瘉LNJU猓HњVzAUVځChAzDdDFx[^៓UzaZLW⽓YQINGPOcSYꚉٞq|ǞhtL礓B@稒ఒAeVƂ•͕皁ITP햱׏gwΐىWhіʉt`I␎aSڎBڐRȕpAn䆉I~焍ߑzc摂u񗾎id͌gQǒٚ؍jq塔|ȕȓ`B\Չ㔖ꉌۑԔԒ̒v׏IĐȒŒnj雅əݙ֒ߘsrsnUTӑn쑢LUΌCU֋ސTĜɞՍy㋒ÝpkxːϔЋlsʜߐZᶝAAڕthՊJY_ZoTSNĒZN༒m֖’ޒ}zke玐ŗ͓ߝQEk浔IO՞`蠙ÒeP障KUUݓCoLLjly鬒k踒𒜒{⒳\_񒝓[d}ޒ渒xQhI峜JaCԁnNfRhtpmon~n@ؒTw鳚vꃒrlhՐƌsUnt筒mpuokvqxᗒyJ}֓}ԐugqKfeޞ˒MoRГLᷖ靌ٜyg栌˘l|]漒K]̎^DM骝Dl퓬eȒ@gihYkXSݛ̝EYUԕۏXIHa蒒FC}{CJFמlSs韞퓃ࣕYۈɗ吥ҋkBznҊmԚKtpЋBŗYk˜[]썰͗K’eʖd休sb饕|cGBٍked뛹k残ċbCWFVOhx^В|⹑tMFW̝^tTH`ؒ]Kßp[ϟ~֒hj̜ݝdW`^WUႚVJRἔCQVa_\杒OSXWYbdZTÒPAfV]pFѝFU鮒{I痑~x擑[讖wʑH֟铉O\lߑړܒБ⛔EܑՑԑۑґؑݑّё̑ޑבΑА茌o]SBHᢞSOlNϑ֋N睒šfuPBcّ_̌W`V~^ΓyfsE\؃XWƃUcN]g`cE[^sфSeT]\|\_s*[]\|b\_s*[gec`^]\|\_s*[ƂÂ]\|\_s*\|\_s*n\_s*\|\_s*[]\|\_s*\|\_s*l\|\_s*\|\_s*V\|\_s*\|i\_s*[v]\|\_s*P\|h\_s*\|\_s*\|D\_s*\_s*\|\_s*[]\|\_s*[q]\|W\_s*\|\_s*\_s*E\_s*\|\_s*\|H\_s*y\_s*d\_s*r\_s*o\_s*c\_s*h\_s*a\_s*r\_s*i\_s*t\_s*a\_s*l\_s*e\_s*s\|\_s*\|\_s*x\|G\_s*[ߓh]\|\_s*[]\|F\_s*N\_s*\|i\_s*[vq]\|A\_s*c\_s*o\_s*n\_s*i\_s*t\_s*u\_s*m\|\_s*\|\_s*j\|\_s*j\|F\_s*e\|I\_s*r\_s*o\_s*n\|\_s*\|\_s*\|g\_s*\|Z\_s*\|Q\_s*~\_s*S\|\_s*j\|\_s*\%(\|\_s*q\)\|S\_s*[Z]\|\_s*\%(\|\_s*a\)\|X\_s*\|\_s*X\|\_s*J\|\_s*~\|~\_s*J\|\_s*\|\_s*\|\_s*\|\_s*[]\|B\_s*a\_s*l\_s*a\_s*n\_s*o\_s*p\_s*h\_s*o\_s*r\_s*a\_s*l\_s*e\_s*s\|P\_s*\%(\|O\_s*\)\|\_s*\|1\_s*\%(\|0\_s*\)\|\_s*l\_s*\|E\_s*\%(u\_s*p\_s*h\_s*o\_s*r\_s*b\_s*i\_s*a\_s*l\_s*e\_s*s\|r\_s*i\_s*c\_s*a\_s*l\_s*e\_s*s\)\|\_s*\%(v\|\_s*F\)\|g\_s*\|\_s*\|`\_s*\|\_s*w\|\_s*\%(V\_s*\|\_s*F\)\|\_s*\%([]\|[\_s*\|\_s*\_s*N\)\|\_s*v\|r\_s*q\|\_s*r\_s*q\|\_s*[a]\|\_s*\|\_s*\|@\_s*\_s*\|L\_s*q\|S\_s*\|\_s*\|J\_s*i\_s*a\_s*n\_s*g\_s*s\_s*u\|]\_s*h\|G\_s*\|u\_s*[˔]\|k\_s*J\|\_s*\|\_s*I\_s*q\|\_s*a\|\_s*p\|\_s*[]\|A\_s*\|\_s*[]\|\_s*\_s*\|\_s*\_s*\\|\_s*\%(\\_s*\|A\_s*\_s*[]\)\|t\_s*\%(\|{\_s*V\)\|h\_s*\|e\_s*\|\_s*\|\_s*[]\|\_s*s\|\_s*\%([\|\_s*q\)\|\_s*v\|\_s*\|P\_s*\|\_s*\|\_s*\%(\|\_s*\)\|\_s*\|E\_s*\|P\_s*\%(\.\_s*S\_s*\.\|o\_s*l\_s*y\_s*\%(g\_s*o\_s*n\_s*a\_s*l\_s*e\_s*s\|c\_s*a\_s*r\_s*p\_s*i\_s*c\_s*a\_s*e\)\|a\_s*n\_s*d\_s*a\_s*n\_s*a\_s*l\_s*e\_s*s\)\|s\_s*\|\_s*\|E\_s*w\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*q\|\\_s*[V]\|w\_s*\|\_s*\|i\_s*K\|\_s*\_s*p\|\_s*B\|M\_s*\%(e\_s*n\_s*i\_s*s\_s*p\_s*e\_s*r\_s*m\_s*a\_s*c\_s*e\_s*a\_s*e\|o\_s*n\_s*o\_s*\%(p\_s*e\_s*t\_s*a\_s*l\_s*a\_s*e\|c\_s*\%(h\_s*l\_s*a\_s*m\_s*y\_s*d\_s*e\_s*a\_s*e\|o\_s*t\_s*y\_s*l\_s*e\_s*d\_s*o\_s*n\_s*e\_s*a\_s*e\)\)\)\|\_s*\|\_s*\|\_s*q\|\_s*\|\_s*\|f\_s*B\_s*X\|R\_s*\_s*\|\_s*l\|\\_s*\%([\_s*[gv]\|\_s*[\)\|w\_s*[\_s*O\|[\_s*[CA]\|Z\_s*\%(I\|\_s*}\|\_s*\%(\|j\_s*A\_s*X\)\|\_s*s\_s*\%([\|X\_s*g\)\)\|V\_s*\%(\|b\_s*N\|X\_s*\|A\_s*^\_s*[\|\\_s*[\_s*\_s*X\|I\_s*h\_s*A\|[\_s*[t^]\)\|T\_s*\%([C]\|~\_s*\_s*O\|E\_s*U\_s*\_s*h\|\_s*u\_s*\_s*b\_s*h\|[\_s*\%([h]\|e\_s*B\|X\_s*g\_s*\|Y\_s*f\_s*[CB[]\|}\_s*\)\|b\_s*`\_s*\_s*[\|\_s*\%(N\|_\_s*[\|L\_s*\_s*[\)\|\_s*h\_s*}\_s*C\_s*h\)\||\_s*\_s*y\_s*v\_s*`\_s*h\|O\_s*\%(a\_s*y\|A\_s*\_s*\)\|\\\_s*T\_s*e\_s*X\|\_s*\_s*\|\_s*\_s*\|t\_s*e\_s*\%(r\_s*a\|m\_s*p\_s*o\_s*r\_s*a\_s*r\_s*y\)\|p\_s*\|d\_s*\%([b]\|C\_s*\_s*M\_s*\_s*\_s*\)\)', + \ 'U' : '\%([yhȌle[f񓴑a؈ϑ鎽[XDWr䷙\wuќzD鴑ߚXi^ښR従LMf~ӑr戏楓]搗wS^̗É򃑂k։\uLGQmPO⣐HQmIVߊaXSn|UoJy팻fʈژⓐxԋʏݓAω]りC]D^@TAmSYv_ZrNTTݗƓaHZJLQnLI̝j󌂟J䥎˔^opᱝꚉEӏKюY𓢙ǓeAZFGNtE҄TU]\|\_s*\|\_s*\|\_s*\|T\_s*\|\_s*\_s*\|\_s*\|H\_s*\_s*R\|\_s*\|D\_s*\%(k\_s*[Lj]\|\_s*\)\|\_s*i\|e\_s*\|\_s*\|A\_s*\|\_s*y\_s*[]\|y\_s*\|\_s*\|\_s*[\|\_s*\|\_s*\|\_s*\|\_s*`\|\_s*c\_s*\_s*\|W\_s*\%(\|\_s*\_s*\)\|\_s*\%(\|\_s*\)\|\_s*\|\_s*\|\_s*\%(\|\_s*\)\|s\_s*\_s*\|\_s*\|\_s*\|A\_s*r\_s*i\_s*s\_s*t\_s*o\_s*l\_s*o\_s*c\_s*h\_s*i\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|`\_s*\|\_s*C\_s*\|\_s*\|O\_s*Y\|\_s*\|\_s*[CB]\|\_s*\%(\|\_s*\_s*\)\|C\_s*u\_s*c\_s*u\_s*r\_s*b\_s*i\_s*t\_s*a\_s*l\_s*e\_s*s\|\_s*\|c\_s*\|C\_s*M\_s*\_s*X\|I\_s*}\_s*\|\_s*\_s*s\_s*\\|\_s*\%(p\_s*\|L\_s*\)\|A\_s*\%([X]\|O\_s*\_s*[\|[\_s*\%(V\_s*\_s*\|W\_s*F\_s*\_s*g\|o\_s*\)\|\_s*e\_s*B\_s*\_s*b\_s*g\||\_s*\|b\_s*\%(v\|p\_s*[\|V\_s*\_s*[\)\)\|P\_s*\%(\|\_s*\)\|\_s*\%([^j[]\|g\_s*\%(\_s*\|\_s*q\_s*g\)\|\_s*\%(A\|V\_s*[\_s*Y\)\|v\_s*V\_s*\_s*\|l\_s*X\_s*R\|i\_s*\%(J\_s*C\_s*g\|C\_s*e\_s*b\_s*h\)\|r\_s*L\_s*\%(^\_s*X\|m\_s*\)\)\)', + \ 'V' : '\%([Flu۔ńrBɃV]\|\_s*\_s*\|b\_s*\|\_s*\|\_s*\|\_s*\_s*D\|v\_s*e\_s*r\_s*s\_s*u\_s*s\|`\_s*F\_s*\|\_s*^\| \_s*r\_s*N\_s*g\_s*[\_s*\|\_s*o\|\_s*z\|j\_s*X\|\_s*\|P\_s*^\|\_s*\%(f\_s*B\_s*\|M\_s*i\|j\_s*X\|Z\_s*\_s*\|N\_s*`\_s*\|\_s*L\_s*\_s*[\_s*\|\_s*\_s*[\|[\_s*j\_s*\)\|\_s*b\|{\_s*\%(X\_s*g\_s*[\_s*N\|\_s*S\_s*\|\_s*\%([K{g^]\|e\_s*\%(b\_s*N\_s*X\|[\_s*[W]\)\)\|\_s*\_s*[\_s*\|\_s*\_s*\%(`\|e\_s*B\_s*A\|^\_s*\_s*[\)\|\_s*[\|R\_s*[\_s*_\|[\_s*\%([gO]\|\_s*g\|h\_s*r\_s*\%(\|\_s*A\_s*\)\|p\_s*\|_\_s*t\_s*H\_s*\|J\_s*\%(\|\_s*X\_s*g\)\)\|L\_s*\_s*u\_s*\_s*\|C\_s*\%([hX]\|W\_s*\_s*[\|V\_s*\_s*O\)\)\|w\_s*b\_s*g\|\_s*\_s*\|\_s*\|t\_s*\%(@\_s*\%(\|h\_s*[\_s*c\)\|H\_s*\%(\|\_s*\%(N\|J\_s*[\)\)\|F\_s*\_s*\_s*[\_s*\)\|E\_s*\%(\_s*\%(f\_s*B\_s*~\_s*[\_s*\|W\_s*\%([\_s*~\_s*\|~\_s*[\_s*\|I\_s*X\_s*g\_s*\%(N\|b\_s*N\)\)\)\|B\_s*\%(\_s*i\|\_s*X\)\|H\_s*b\_s*J\|C\_s*\%(\_s*X\|\_s*i\_s*[\)\|F\_s*\%(\_s*M\_s*\_s*E\_s*X\|k\_s*X\)\)\|r\_s*\%([AuoXU]\|K\_s*[\|n\_s*[\_s*\|^\_s*~\_s*\|\_s*\%(b\_s*W\|\_s*C\)\|r\_s*\%(A\_s*\|b\_s*h\)\|b\_s*\%(N\|L\_s*[\)\|Z\_s*\_s*e\|N\_s*\%(^\_s*[\|g\_s*\%(\|\_s*[[A]\)\)\|V\_s*\%(\_s*X\|\\_s*\_s*[\_s*Y\)\|\_s*\%([`X]\|\\_s*\|e\_s*[\_s*W\|Z\_s*\_s*g\)\|l\_s*\%(K\_s*[\|O\_s*\_s*b\_s*g\)\|j\_s*\%([[]\|\_s*f\_s*\)\|\_s*[\|G\_s*\_s*`\_s*\_s*\|W\_s*\%(\|b\_s*g\|^\_s*[\|\_s*\%(\|i\_s*\_s*[\)\|\_s*A\_s*\%(\|\_s*C\_s*\%(Y\|[\_s*[\_s*V\_s*\_s*\)\)\)\|_\_s*\|f\_s*I\|\_s*\%(S\|k\_s*[\_s*u\)\|I\_s*\|\_s*W\_s*A\_s*\|B\_s*[\_s*i\_s*X\|[\_s*\%({\|\_s*X\|N\_s*\|i\_s*X\)\)\|x\_s*\%([K]\|g\_s*i\_s*\|C\_s*_\_s*[\|[\_s*\%(\|_\_s*[\)\|e\_s*\_s*\|b\_s*Z\_s*\|X\_s*\%([g^p]\|r\_s*I\)\|N\_s*\%(^\|g\_s*\)\|W\_s*^\_s*\%(u\_s*\|\_s*A\_s*\)\|\_s*\%([B[]\|t\_s*@\_s*C\|T\_s*C\_s*\)\|\_s*\%(i\|V\_s*e\_s*B\|[\_s*i\|j\_s*[JN]\)\|\_s*\%(f\|x\_s*b\_s*g\|_\_s*\|\_s*[\_s*k\|T\_s*\%([\_s*`\|C\_s*\)\|\_s*b\_s*g\)\|m\_s*\|j\_s*[XA]\|l\_s*\%(V\_s*\_s*\|`\_s*A\|c\_s*B\_s*A\|Y\_s*G\_s*\)\)\|u\_s*\%(C\|\_s*\%(h\|b\_s*h\)\|[\_s*h\_s*D\_s*[\)\|o\_s*\%([]\|C\_s*\%([AuI]\|p\_s*[\|^\_s*\%(\|\_s*e\_s*B\)\|L\_s*\_s*O\|U\_s*[\|V\_s*\)\|b\_s*g\|`\_s*J\_s*\|M\_s*i\|K\_s*{\_s*\_s*h\|\_s*\%(i\_s*V\|G\_s*e\_s*B\)\|T\_s*\|X\_s*\%(R\|P\_s*X\)\|J\_s*\_s*X\|P\_s*[\_s*V\_s*\_s*\|L\_s*\_s*[\_s*\|E\_s*`\_s*\_s*[\|\_s*\%(\|G\_s*[\_s*V\_s*\_s*\|\_s*[\|A\_s*\%(u\_s*\|\_s*g\)\|b\_s*h\|f\_s*[\_s*V\_s*\_s*\)\|k\_s*A\_s*c\|j\_s*\%(\|[\_s*\)\|\_s*\%([[]\|\_s*\|\_s*[\|\_s*\%(V\_s*A\|`\_s*m\|^\_s*C\_s*\)\)\|[\_s*\%([SO]\|`\_s*\_s*\|\_s*g\_s*D\_s*[\_s*h\|o\_s*\|{\_s*X\|x\_s*i\|e\_s*B\_s*J\_s*\|T\_s*X\|W\_s*\%(\|j\_s*A\|\_s*\)\|m\_s*\|j\_s*A\|\_s*\_s*g\|~\_s*\%(\_s*I\_s*\|L\_s*\_s*\_s*C\_s*g\)\)\|i\_s*\%(L\_s*\_s*\_s*[\|W\_s*E\_s*\)\)\)', + \ 'W' : '\%([YɔjyhȃҌle[f񓴑a؈鎽[XDW䷙\wuќzD鴑ߚXi^ښR従LMf~ӑr戏楓]搗wS^̗É򃑂k։\uLGQmPO⣐HQmIVߊaXSn|UoJy팻fʈژⓐxԋʏݓAω]゜]D^@TAmUSYvZrNTTݗƓaZJLQnLI̝j󌂟J䥎˔^opᱝꚉEӏKюY𓢙ǓeAZFG܉c㩟|㘔͊ϊpԉЍЋƋZǜkYeonm܏Νtsf氖^]o_rqpc˜iqǘjnȎGFd̘eΘcQC崙NZʒtሽgfhl֘aONcb̔fjZ`•iH핝ȔgvEW]\|\_s*[]\|b\_s*[E]\|\_s*[]\|\_s*\_s*~\_s*_\|\_s*\|\_s*\|\_s*\|T\_s*\|\_s*\_s*\|\_s*\|H\_s*\_s*R\|\_s*\|D\_s*\%(k\_s*[Lj]\|\_s*\)\|\_s*i\|e\_s*\|\_s*\|A\_s*\|\_s*y\_s*[]\|y\_s*\|\_s*\|\_s*[\|\_s*\|\_s*\|\_s*\|\_s*c\_s*\_s*\|W\_s*\%(\|\_s*\_s*\)\|\_s*\%(\|\_s*\)\|\_s*\|\_s*\|\_s*\%(\|\_s*\)\|s\_s*\_s*\|\_s*\|\_s*\|A\_s*r\_s*i\_s*s\_s*t\_s*o\_s*l\_s*o\_s*c\_s*h\_s*i\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|`\_s*\|\_s*C\_s*\|\_s*\|O\_s*Y\|\_s*\|\_s*[CB]\|\_s*\%(\|\_s*\_s*\)\|C\_s*u\_s*c\_s*u\_s*r\_s*b\_s*i\_s*t\_s*a\_s*l\_s*e\_s*s\|\_s*\|c\_s*\|\_s*\|o\_s*D\|\_s*Y\_s*\|\_s*\|i\_s*\_s*j\|(\_s*\_s*)\|\_s*[]\|R\_s*\|Y\_s*z\|x\_s*\|x\_s*\%(\|V\_s*\_s*c\|\_s*F\_s*\)\|Y\_s*\%(\|V\_s*\_s*c\|\_s*F\_s*\)\|\_s*\_s*\|\_s*\_s*\|\_s*[R]\|\_s*\|a\_s*t\|\_s*\_s*\_s*D\_s*\|\_s*\%(`\|\_s*m\_s*\_s*\)\|^\_s*B\_s*\_s*D\|\_s*\%(\_s*\_s*\_s*E\_s*\_s*\|\_s*\_s*\_s*E\_s*\_s*\)\|u\_s*\_s*c\_s*u\_s*\_s*N\|\_s*\_s*O\|\_s*\%(\|C\_s*X\|b\_s*J\_s*[\|X\_s*\%(\_s*[\|\_s*\_s*O\)\)\|\_s*\%([\_s*X\|\_s*N\_s*\|X\_s*g\)\|\_s*\_s*\_s*\|\_s*\%(b\_s*\%([vp]\|s\_s*\_s*O\)\|C\_s*\%([^g]\|e\_s*B\_s*\_s*O\)\)\|{\_s*\_s*t\|t\_s*\%([[]\|@\_s*C\_s*\|B\_s*\%([\_s*g\|b\_s*`\)\)\|z\_s*\%(G\_s*[[CA]\|[\_s*\|C\_s*\%([\_s*\%(\|\_s*[\)\|b\_s*\%(v\|X\_s*\|p\_s*[\|g\_s*\%(j\_s*[\|}\_s*\)\)\)\|\_s*\%(C\|b\_s*[gc]\)\)\|x\_s*\_s*i\_s*[\|w\_s*e\_s*b\_s*T\_s*\%(C\_s*g\|[\_s*\%(o\|r\_s*X\)\)\|x\_s*\|o\_s*\_s*^\_s*[\|\_s*\%(\_s*\_s*c\_s*u\_s*\_s*N\|H\_s*\_s*t\|B\_s*\%([[]\|\_s*\%(\|w\_s*\_s*\)\)\|F\_s*\%(\_s*_\_s*[\_s*X\|\_s*i\_s*[\|[\_s*o\_s*[\|C\_s*\)\|@\_s*\%(C\_s*[X]\|[\_s*O\_s*i\_s*[\|\_s*_\|\_s*\%(^\_s*[\|L\_s*\_s*[\_s*\)\)\)\|T\_s*\%(h\_s*e\_s* \_s*W\_s*o\_s*r\_s*l\_s*d\_s* \_s*W\_s*i\_s*d\_s*e\_s* \_s*W\_s*e\_s*b\_s* \_s*C\_s*o\_s*n\_s*s\_s*o\_s*r\_s*t\_s*i\_s*u\_s*m\|u\_s*n\_s*g\_s*s\_s*t\_s*e\_s*n\)\|_\_s*u\_s*\_s*\_s*[\|^\_s*\_s*O\_s*X\_s*e\_s*\)', + \ 'X' : '\%([HFDB@ẃ~VX]\|\_s*[]\|b\_s*[HFDB@]\|\_s*[]\|V\_s*\_s*\%(t\_s*H\_s*\|z\_s*\)\|W\_s*I\_s*\|[\_s*\%(r\_s*E\_s*X\|\_s*\%(b\_s*N\_s*X\|O\_s*\_s*t\_s*B\)\)\|n\_s*r\_s*G\_s*\|U\_s*\%(\|r\_s*G\_s*\)\|L\_s*\%(V\_s*\%(\|\_s*\|\_s*g\_s*[\_s*\)\|Z\_s*m\_s*\|T\_s*\_s*\%(`\_s*\|^\_s*\)\)\|E\_s*x\_s*t\_s*e\_s*n\_s*s\_s*i\_s*b\_s*l\_s*e\_s* \_s*M\_s*a\_s*r\_s*k\_s*u\_s*p\_s* \_s*L\_s*a\_s*n\_s*g\_s*u\_s*a\_s*g\_s*e\|N\_s*\%(V\_s*[\|\_s*X\_s*|\_s*X\_s*g\|Z\_s*\%(i\_s*L\_s*X\|m\_s*t\_s*H\_s*\)\|U\_s*\_s*B\_s*G\|T\_s*\%(C\|\_s*\%(g\_s*X\|e\_s*B\_s*b\_s*y\|`\_s*b\_s*y\)\)\|\_s*X\_s*}\_s*X\)\|G\_s*\%(N\_s*X\|b\_s*N\_s*X\)\)', + \ 'Y' : '\%([։ߕ֍HVşꔗ㊽؊ZݝZg|~}ĔϑbbщxX\cciUFg`mꡞ՛@TfxJuןLys~@籝Xyꢗqsi^wgsjfgt匍roחldnpїwzmÏhS^@焉^r`椌Pao\˗_]ߔ\SlPlaPQĉrIKb㒏̎͒oɒt沖LuVKᛮ|w䓎樏଎zڗWFQw些CޗGCPEZXONSЗ[HI֗FYJL@ሑgM祗h|懖kߗVOJR`g埓A䥐䲃ŃꍘcTUn翔䑌恍ݍrxÉj囚|dQU|ƗBd{Nj佈䆍mnؐFAtF̌Ì䉳LdƜјJiꌒՓkvɔžo֍y󙬌ME|ځe퐈M臐YOΖZ}xא򌵉MՁO䗚P{bwN~}zcc硉Ɏh䕟JsW]bK\Tซ]r䟈ZЛTmĈDMßICm覉@BuAA܊jHڈΊֈÈ1PyDIDR۔шዏܐRΔđP_ʈމ‘Ehe˗v֍s}وߓƈݟDᒒK֋҉]~˓ڏΗ͛HB܈횀}ɋU䏜SΉuЈ׈ۈӘߗǔ@bo؈Uw͉]ਖ看̈g؂Ԅ`tcbّqۈŔsMlhE`_ʗSQn_a–zl˗DyيVo原KZ꞉vNu򎾛k欎ຏkstqrRГ@ݜD洗{kєJT׈ՋxNۈiዖ熔Wt❔ĔjJE˕a뉉̖\~ƝxuE~FvCJ҄\zY]\|\_s*[ղ]\|b\_s*[C]\|\_s*[䂢]\|^\_s*\_s*b\|\_s*\_s*b\|I\_s*\|\_s*\|B\_s*\|I\_s*\|y\_s*o\_s*\%(t\_s*t\_s*a\|c\_s*t\_s*o\)\|4\_s*\%([“]\|\_s*\|\_s*\)\|\_s*\|m\_s*j\|\_s*\|\_s*\|F\_s*\|\_s*\|j\_s*\|\_s*[q]\|h\_s*L\|V\_s*\|\_s*[j]\|@\_s*\|\_s*[q]\|i\_s*\|W\_s*\|8\_s*\|\_s*\|t\_s*\%(\|^\_s*[\_s*\)\|\_s*\|\_s*\|\_s*\|~\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|S\_s*\|L\_s*i\_s*l\_s*i\_s*\%(o\_s*p\_s*s\_s*i\_s*d\_s*a\|a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\)\|\_s*\%(Y\|\_s*\)\|\_s*M\|\_s*\|\_s*\|\_s*\|E\_s*\%(u\|\_s*[\_s*\)\|a\_s*\|J\_s*u\_s*\%(l\_s*i\_s*a\_s*n\_s*i\_s*a\_s*l\_s*e\_s*s\|n\_s*c\_s*a\_s*l\_s*e\_s*s\)\|c\_s*J\|c\_s*\|G\_s*s\|\\_s*Z\_s*\|Q\_s*q\|G\_s*\|\_s*\_s*\|\_s*\|\_s*\|N\_s*a\_s*j\_s*a\_s*d\_s*a\_s*l\_s*e\_s*s\|\_s*G\|\_s*\|\_s*t\_s*\|5\_s*[“]\|T\_s*[“]\|\_s*E\|r\_s*U\|\_s*\|\_s*Y\|\_s*[\|\_s*\_s*\|\_s*\|~\_s*\|{\_s*\|o\_s*\|\_s*g\|Y\_s*[q]\|@\_s*\|h\_s*[‘]\|U\_s*\%(\|^\_s*[\_s*\|r\_s*t\_s*i\_s*c\_s*a\_s*l\_s*e\_s*s\)\|E\_s*[cR]\|C\_s*\|d\_s*\%(`\_s*r\_s*s\|u\_s*d\)\|]\_s*[햅oZ]\|\_s*\|\_s*q\|_\_s*\|\_s*r\_s*\|\_s*\_s*\|G\_s*\%(r\_s*a\_s*m\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\|l\_s*u\_s*m\_s*i\_s*f\_s*l\_s*o\_s*r\_s*a\_s*e\|i\_s*n\_s*k\_s*g\_s*o\_s*p\_s*s\_s*i\_s*d\_s*a\)\|\_s*\|\_s*\_s*\|r\_s*\|s\_s*\_s*\|o\_s*[E]\|\_s*[Wk]\|C\_s*[؎Q]\|\_s*\\|\_s*\_s*[ΒY]\|_\_s*F\|e\_s*[]\|p\_s*\%([꓍]\|g\_s*\)\|\_s*\_s*\|\_s*[ȉ]\|D\_s*i\_s*a\_s*p\_s*e\_s*n\_s*s\_s*i\_s*a\_s*l\_s*e\_s*s\|s\_s*[”@]\|\_s*{\|\_s*\_s*\|\_s*\|\_s*L\_s*n\|\_s*\|\_s*[c]\|R\_s*a\_s*f\_s*f\_s*l\_s*e\_s*s\_s*i\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|\_s*\|\_s*\|\_s*\|V\_s*\\|`\_s*G\|\_s*{\_s*\_s*\|\_s*a\|T\_s*\%(h\_s*e\_s*l\_s*i\_s*g\_s*o\_s*n\_s*a\_s*l\_s*e\_s*s\|r\_s*o\_s*c\_s*h\_s*o\_s*d\_s*e\_s*n\_s*d\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\)\|M\_s*y\_s*r\_s*i\_s*c\_s*a\_s*l\_s*e\_s*s\|\_s*\_s*t\|\_s*\|P\_s*\%(o\_s*a\_s*l\_s*e\_s*s\|l\_s*u\_s*m\_s*b\_s*a\_s*g\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\|a\_s*l\_s*m\_s*a\_s*l\_s*e\_s*s\|r\_s*\%(o\_s*t\_s*e\_s*a\_s*l\_s*e\_s*s\|i\_s*n\_s*c\_s*i\_s*p\_s*e\_s*s\)\)\|A\_s*r\_s*a\_s*c\_s*a\_s*l\_s*e\_s*s\|\_s*q\|\_s*[j]\|G\_s*\%(z\_s*o\|t\_s*Q\_s*j\_s*[\|\_s*\_s*@\_s*\|j\_s*Z\_s*C\|[\_s*\)\|\_s*C\)', + \ 'Z' : '\%([󉀉ꑹ㔑ґmhXfّۑ\]Y萊AK㿑RUWN征͑V陑TPQfOS⚃ҐƐōUӂžlb齕AZB钎@笐~tߒÐ|}CD󓈓Ȟ펱ƎwxcH苍׎l䝎ڐ㒼ÓKbHזiᶘu@vސnՉ`rxosqwptl䥞`œҏtJ珊RPtigYU{ㅐ媚ߘjhŘ竐ҝmYo@ݖÏꏗ`~]꞊󝵏휵hGڜGQ榏A@uQhxmnpq⢓ďmÏ|m՟~[x{䤏zy}汛}杆nG໒^E☸sF_`Oca_Y[]b\Zedꎠm䢛ykdHmˎ掝~Ŏn~Im熉a玘JȎqj^ZiVV␷╛NM趞ƎLGQZSR͛؜kO槎SbΜ͎acZˍϙ܍ލߍ݊oY፿U[]wGY]ZUyWĄH[xZ]\|\_s*\%(\_s*\|\_s*\|\_s*\|\_s*\|\_s*\)\|b\_s*[][YWU]\|\_s*[]\|\_s*\|\_s*\|o\_s*\|\_s*[q]\|\_s*\|z\_s*e\_s*\%(t\_s*t\_s*a\|p\_s*t\_s*o\)\|\_s*\_s*\|\_s*\|O\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*p\|\_s*o\|C\_s*@\|m\_s*\|\_s*\|k\_s*[ߌY]\|\_s*\|\_s*s\|F\_s*i\_s*g\_s*u\_s*r\_s*e\|\_s*\|G\_s*\%(\_s*\|p\_s*\)\|D\_s*y\|f\_s*\%(\_s*\|p\_s*\)\|x\_s*x\|\_s*\|Q\_s*\|2\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*q\|J\_s*\%(I\_s*S\_s*R\_s*[\_s*h\||\_s*b\_s*v\|R\_s*\_s*\_s*{\)\|\_s*q\|b\_s*\_s*\_s*\_s*\_s*\_s*M\_s*h\_s*p\_s*\|k\_s*\$\_s*_\_s*{\_s*e\_s*f\_s*f\_s*}\_s*\$\|[\_s*\%(\|\_s*\)\|`\_s*\_s*\|\_s*\%(\|\_s*\)\|\_s*\|\_s*\|\_s*\|R\_s*l\|y\_s*_\|\_s*\|\_s*\|\_s*\|\_s*r\_s*\|\_s*v\|\_s*\|\_s*\|\_s*\|\_s*[@S]\|C\_s*a\_s*b\_s*o\_s*m\_s*b\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|i\_s*\%(\_s*[\_s*O\||\_s*b\_s*v\|t\_s*m\_s*j\_s*n\)\|\_s*q\|\_s*\|P\_s*\%(Q\|O\_s*[i]\|P\_s*\|U\_s*i\|W\_s*\)\|t\_s*\|\_s*\|R\_s*\|1\_s*\%(0\|1\_s*\|8\_s*\|2\_s*\)\|\_s*\|\_s*\|\_s*\|\_s*u\|e\_s*\|\_s*\|\_s*\|\_s*{\|U\_s*\_s*\|\_s*H\|\_s*\|T\_s*\%(\_s*\|\_s*|\_s*[\_s*j\_s*\|\_s*S\_s*T\)\|V\_s*\%(^\_s*[\_s*\|I\_s*\%(\|j\_s*\%(X\_s*g\|Y\_s*\)\)\)\|c\_s*\%(@\_s*\%(\_s*g\_s*D\_s*X\_s*g\_s*\|C\_s*g\)\|F\_s*\%(i\_s*[\|b\_s*y\_s*\_s*\|\_s*}\_s*b\_s*g\)\|B\_s*\%(N\_s*\_s*X\|^\_s*[\|[\_s*O\_s*\_s*[\|\_s*\%(o\_s*\_s*\|}\_s*[\_s*}\_s*\)\|S\_s*C\_s*l\_s*\)\)\|`\_s*\%(N\_s*\_s*X\|A\_s*m\_s*[\_s*[\|\_s*[\_s*\_s*\%(q\|b\_s*q\)\|\_s*\_s*_\_s*b\_s*V\_s*\|S\_s*C\_s*l\_s*\_s*\_s*C\_s*[\_s*\)\)', + \ '[' : '[kmwy[]', + \ '\' : '[Ɂ_\\]', + \ ']' : '[zxnl]]', + \ '_' : '[@Q_]', + \ '`' : '[geM`]', + \ 'a' : '\%([ݕNҊ{b]毛^w܏o@C糕ӓJlVȌlˆ^؜{Qz鸈WEB{M榏Qkw{ꁋ\N}Ho{tVpA֔\HՓaSN[ړaWo㻓֏~ĔMؒg禈ŊN[ΎѕҚae}RyvXI\॑ŐVaz\eXEV~dYэʊ늿ߎӕT瑀剎ՕP]JÓV쉐˖ԋY͈b般HꙌ卋ǖsN𗺌摏L[jPNzӟEDɏ͏W쏺HVq襞B\͈ԑ~㪌ZQōs}ĈLjƈ풩@rb~`qgݝю鈩[ޝ脋ōCK\ؐԐzЕɈŒ}ራSݑYK򗁍rgҘa𞓍GcLJ}숢jޜO[㝧ȁ_&ڋ͈󁨁ˁ́܌WāNLMOf`p@Aa]\|\_s*\|\_s*\|\_s*\|\_s*\|Z\_s*\%(n\|i\_s*n\_s*c\)\|\_s*q\|\_s*\|E\_s*n\|\_s*\|f\_s*\|M\_s*V\_s*\|\_s*T\|\_s*\|Z\_s*q\|\_s*\|l\_s*\|\_s*\|^\_s*\|\_s*\|\_s*\|\_s*w\|\_s*[]\|\_s*p\|\_s*\|\_s*\|L\_s*a\_s*r\_s*d\_s*i\_s*z\_s*a\_s*b\_s*a\_s*l\_s*a\_s*c\_s*e\_s*a\_s*e\|\_s*{\|\_s*\%(\|\_s*q\)\|\_s*\%(\|\_s*\_s*\_s*\_s*\)\|H\_s*a\_s*b\|H\_s*a\_s*l\_s*o\_s*r\_s*a\_s*g\_s*a\_s*l\_s*e\_s*s\|\_s*F\|\_s*\|\_s*`\|^\_s*\_s*\_s*\|\_s*\|\_s*\|D\_s*`\|\_s*[K]\|\_s*G\|\_s*[mF]\|\_s*x\|\_s*\|\_s*\|\_s*\|p\_s*\%([ۓc]\|\_s*p\|\_s*\)\|\_s*[ɁX]\|E\_s*\%(s\|i\_s*n\_s*s\_s*t\_s*e\_s*i\_s*n\_s*i\_s*u\_s*m\)\|h\_s*\%(o\_s*d\_s*b\|b\_s*\%(^\_s*O\|J\_s*[\_s*h\)\)\|I\_s*\%(r\_s*i\_s*d\_s*a\_s*l\_s*e\_s*s\|P\_s*\%(d\_s*b\|A\_s*h\_s*\_s*X\)\|D\_s*J\_s*[\_s*h\|C\_s*\%(^\_s*O\|J\_s*[\_s*h\)\)\|\_s*~\|\_s*\|c\_s*\|n\_s*\_s*\|C\_s*[^ml]\|R\_s*u\_s*b\_s*i\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|\_s*\_s*a\_s*\|\_s*\|\_s*n\|\_s*[nꆖ]\|M\_s*a\_s*l\_s*v\_s*a\_s*l\_s*e\_s*s\|g\_s*\_s*v\_s*\_s*A\| \_s*A\_s*N\_s*V\_s*A\_s*\|\_s*\|\_s*f\|q\_s*f\|\_s*s\_s*\_s*x\_s*Z\_s*p\_s*\_s*\_s*\|\_s*\|\_s*Y\|\_s*\|G\_s*o\_s*l\_s*d\|\_s*\_s*\%(\_s*\_s*\_s*\_s*\_s*\_s*@\|a\_s*\_s*\_s*@\)\|\_s*\|\_s*\|\_s*\|\_s*\_s*\|Z\_s*\_s*g\_s*L\_s*b\_s*c\_s*l\|S\_s*\%(b\|i\_s*l\_s*v\_s*e\_s*r\)\|\_s*p\_s*\_s*\\|g\_s*p\_s*\_s*\\|Z\_s*@\|\_s*\_s*\_s*\|I\_s*\%(\|M\_s*\_s*X\_s*^\_s*\|h\_s*\_s*C\|\_s*O\_s*X\_s*g\_s*\_s*[\_s*\|\_s*\%(g\_s*L\_s*[\|^\_s*\%([[i]\|l\_s*\%([\_s*g\|C\_s*g\)\)\)\|[\_s*\%([NKTg]\|j\_s*\_s*O\|L\_s*V\_s*\|u\_s*\_s*[\|o\_s*[\_s*h\|x\_s*\_s*W\_s*\|M\_s*\_s*X\_s*\%(g\|^\_s*\)\|]\_s*\_s*k\|X\_s*\%(`\_s*\|e\_s*B\_s*\|^\_s*[\|g\_s*\%(\_s*A\|\_s*\_s*A\)\)\|h\_s*\_s*[\|W\_s*\%([F[]\|I\_s*\_s*W\)\|f\_s*B\_s*\%(I\|G\_s*\_s*X\|V\_s*\_s*\|g\_s*\_s*A\_s*\)\|^\_s*\|\\_s*\%(\_s*e\_s*B\|\_s*C\_s*Y\)\|Z\_s*\_s*e\_s*B\_s*b\_s*N\|\_s*\)\)\|z\_s*\|o\_s*C\_s*g\|n\_s*\_s*}\_s*Q\_s*h\_s*\|\_s*\|l\_s*H\_s*\%(\_s*\_s*\|m\_s*\\)\|C\_s*\%([\_s*W\_s*X\|I\_s*\|\\_s*b\_s*v\)\|}\_s*\_s*h\_s*D\_s*[\_s*N\|\_s*\%(z\_s*\|\_s*\|\_s*p\)\|A\_s*\%([tlrImc]\|u\_s*s\_s*t\_s*r\_s*o\_s*b\_s*a\_s*i\_s*l\_s*e\_s*y\_s*a\_s*c\_s*e\_s*a\_s*e\|n\_s*t\_s*i\_s*m\_s*o\_s*n\_s*y\|K\_s*C\_s*L\|S\_s*C\_s*I\_s*I\|s\_s*t\_s*a\_s*t\_s*i\_s*n\_s*e\|^\_s*C\_s*v\|T\_s*O\_s*K\|N\_s*S\_s*I\|V\_s*V\_s*X\_s*e\_s*\|L\_s*T\_s*L\_s*[\|\_s*\_s*N\|E\_s*R\_s*A\|D\_s*S\_s*L\_s*\_s*f\_s*\|h\_s*\_s*C\_s*u\|d\_s*a\|M\_s*\_s*W\_s*I\|b\_s*s\_s*t\_s*r\_s*a\_s*c\_s*t\_s* \_s*C\_s*o\_s*n\_s*t\_s*r\_s*o\_s*l\_s* \_s*M\_s*o\_s*d\_s*e\_s*l\|J\_s*b\_s*v\|N\_s*\_s*X\|C\_s*A\_s*_\_s*v\_s*^\)\|t\_s*^\|`\_s*\%([S^]\|\_s*\_s*\|a\_s*\%(^\|\_s*\_s*\_s*\)\|^\_s*C\_s*v\|s\_s*\_s*s\|\_s*\%(\_s*\|\_s*\_s*\_s*\)\|\_s*\_s*N\|h\_s*G\_s*L\_s*X\_s*p\_s*[\_s*g\|^\_s*c\_s*R\_s*\_s*o\_s*[\_s*^\|h\_s*\_s*C\_s*u\|\_s*\_s*\_s*\|J\_s*b\_s*v\|N\_s*\_s*X\|\_s*\_s*\_s*\)\|\_s*p\|G\_s*\%([jA[C]\|b\_s*`\|\_s*\%(h\_s*\_s*\|W\_s*F\_s*\%(\|\_s*b\_s*N\)\|[\_s*\)\|\_s*A\|I\_s*\_s*A\|X\_s*e\|v\_s*\_s*\)\)', + \ 'b' : '\%([ݍxftݖv{}~Ϟrs`pؖnlmqK䛖e㤝ԕORE廖bӖQgԜRWaXZU`YNϙ˛Sc]fhT^d@Gە덛͕d敕WJV_K럑k㰋Йpgꈕ̕ѝV燙ęܛ~Aᾙjוؕى•粂בD[kuqJڟܐ[W᳓ؐߕܖܘŕhᕷFᕑoFx~w򐁕ŐU@sԕ捐lLJxʕTCZz[m㢛ߕpCޜrF{qn蓕S焛唒IalL[߁eὟەdcb`_aeroZg]XΔzۓє䊑ыsI[@bVU㭔jAcUPWєm\e}tS̔i䕜ޔ|ꀊL{~}Ŕf\ҔԖ_Jmה”dHݔ֔ӔՔԔؖ따\nmtHŔlnyk΂gےꉺ~|ab_攞{onmpourAqxb]\|\_s*\%(\_s*\|\_s*\|\_s*\|\_s*\|\_s*\)\|b\_s*[{xuro]\|\_s*[ڂׂԂт]\|\_s*\|\_s*\|A\_s*\|P\_s*a\_s*e\_s*o\_s*n\_s*i\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|\_s*\|\_s*Z\|\_s*\|r\_s*r\|\_s*\|\_s*\|\_s*_\|\_s*_\|\_s*\|E\_s*\|\_s*\|\_s*C\|\_s*\|X\_s*[j]\|R\_s*\_s*O\|F\_s*a\_s*g\_s*a\_s*l\_s*e\_s*s\|z\_s*c\|\_s*\|u\_s*\%(\|l\_s*b\_s*N\|V\_s*l\_s*}\)\|\_s*q\|t\_s*q\|\_s*\|L\_s*[O]\|\_s*\|V\_s*A\_s*O\|\_s*[ĘU]\|\\_s*D\|\_s*[D]\|\_s*\|o\_s*\_s*\|\_s*\|\_s*\|S\_s*a\_s*n\_s*t\_s*a\_s*l\_s*a\_s*l\_s*e\_s*s\|h\_s*\|\_s*[q@]\|\_s*[Žq]\|\\_s*\|\_s*\|\_s*\|\_s*q\|c\_s*\_s*\_s*\|b\_s*\_s*\|R\_s*o\_s*s\_s*a\_s*l\_s*e\_s*s\|K\_s*N\|\_s*q\|\_s*\%([јJy]\|\_s*\_s*\)\|\_s*\|\_s*\|\_s*\|A\_s*n\_s*n\_s*o\_s*n\_s*a\_s*c\_s*e\_s*a\_s*e\|\_s*[]\|\_s*\|f\_s*\_s*\|v\_s*\_s*R\_s*M\|\_s*\_s*\|I\_s*[\_s*g\_s*o\_s*C\|\_s*[b]\|t\_s*@\_s*S\_s*b\_s*g\|w\_s*i\|k\_s*\|y\_s*\%(L\_s*\|e\_s*\_s*M\_s*E\_s*X\)\|L\_s*f\|C\_s*M\_s*\_s*X\|a\_s*\%([ʔ^]\|\_s*E\|^\_s*C\_s*v\|h\_s*\_s*C\_s*u\|J\_s*b\_s*v\|N\_s*\_s*X\||\_s*X\_s*v\_s*\_s*C\_s*\|\_s*\_s*\_s*m\_s*\_s*\_s*\|\_s*\_s* \_s*d\_s*\_s*\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*N\)\|B\_s*\%([hʔ^kiae]\|C\_s*\_s*\|N\_s*F\_s*(\_s*B\_s*a\_s*c\_s*k\_s*u\_s*s\_s*-\_s*N\_s*a\_s*u\_s*r\_s* \_s*F\_s*o\_s*r\_s*m\_s*)\|B\_s*C\|^\_s*C\_s*v\|u\_s*r\_s*k\_s*i\_s*n\_s*a\_s* \_s*F\_s*a\_s*s\_s*o\|t\_s*\_s*b\_s*c\|h\_s*\_s*C\_s*u\|J\_s*b\_s*v\|N\_s*\_s*X\|M\_s*P\_s*t\_s*@\_s*C\_s*\|X\_s*v\_s*\_s*C\_s*\|S\_s*\%(D\|L\_s*[\|`\_s*\_s*[\_s*i\|A\_s*\_s*e\_s*i\|f\_s*W\_s*^\_s*\)\|O\_s*X\_s*Z\_s*b\_s*g\|I\_s*T\_s*N\_s*E\_s*T\|r\_s*o\_s*m\_s*i\_s*n\_s*e\|\_s*\_s*N\|o\_s*\%(h\_s*r\_s*i\_s*u\_s*m\|v\_s*i\_s*n\_s*e\_s* \_s*S\_s*p\_s*o\_s*n\_s*g\_s*i\_s*f\_s*o\_s*r\_s*m\_s* \_s*E\_s*n\_s*c\_s*e\_s*p\_s*h\_s*a\_s*l\_s*o\_s*p\_s*a\_s*t\_s*h\_s*y\|o\_s*k\|r\_s*o\_s*n\)\)\|\_s*f\|z\_s*E\_s*f\)', + \ 'c' : '\%([a|ҜDޏns}ĜlaʗۗᶐsДfَřbIziꑍC麌Z欉䓚৐}əY`nXMٍȜkύߌ匣ӍeWBLݖϙiҔQbm秋tRK{}`肍L琍fݚJkiQ硟LsJ𔸙lEHnr੘mt൙{XERn㝍h}HyߝK朑nK}֞\@囍yෙ΍[⠍xuXSe倘Ji^’@VAW썄GDTᩍ`p᧍B]PIzt_kOjRwuPIa|qFXZsmcDrJLޛܝwlWgVڞׁ܋ZXčᑆՙs|˙Ze،؝sZhⰍٕ֒]ی㨏hןzËП绌ꉍ烜ٌnj@ux삱NËZ驉kşQLTGiL↝BގEِېߐCGАዙ[Tאɐ͐ȐǞNdϞ囡pә㙟㚘jA䦈a_tbAAbxaH柞ECJ⤑GSL⒑WsrDJAL񙒐枙@ۑMHlFKDB@Ghǐ坡NdDIRŖ|˝ōv⫝ꎍΐyH`Ր}Uҙ[ǐzzMKⱟJ㖍IHEbzoxAܗϕDBӏ~B䱌sZYᯙӞᮛM֌NvK@{^Z퐾^č鶔ňʈUÑqC~VWRUSXT܉_wo^鿌~GF䇚`p̃Y۞ƌIӘޚPMuoӞc苟m痈qHM῍C​晠J{vv͘ҊXɜgˍgܜ|E؋捃BAPDY`LZ连xZlWȓGFaƎb乗MEsCFnD㈵㦃Ƌs]Ŗl⚑^潔AgߞΖ儞bɖΕݜ臐wp玬d쎹g[諎^GNH˒ΐÎᕹRK\ސˌKŽK򛍉toqϔOӎ͚̍͟byP᪎jAϐ֙̎ݐ┐^܎ېΎގڎYώՎˎΎɎԎߎЈޝiSCGဎfztWV题fEiglhk{蜕婙oJ蕘ꟚVh娔hKqF榚SQFT酝nSXKUڏMGjEaNODCALRTWIBH@M᭜\貚я忏w{vxs⡏urfݐpuVyJUZ]jP曚A՜fY`Ds橝ΐaO凓cjcѐUaNfdCkXLTQWiR[MebI\S^VΏnZ勋o|ב_䓏w򏎏vߓɚ[mיЎKО_cRuB䐠ϞƐLҜћ辛頔I׏[縜B䀙n␏K♏яҁuiœϏ]疏֏ӐԚА躐ϏUJnސŜ܏ߏُGᏧଏ͏ǏɏЏˏ暏ďΏƏ͏ڏ؏ɏ\plTegߐ@CܑDI冐BGAHEuowʕEey򚬞@hџ|Xꏎю}ؗ⿎loŎ~dstwћLypinÎk䍟߁Y`omo{j`V@m@iyIِynXnBg~vsЎoN᎒ZuiU抎f]Kj{J{r˙藂yNJr݊jƌyĈ呁eAiMꝕrPTMvᚃȍfjsehoqgptr鹜NJDRUğdzᥕpȌڋAԎ‹_雔Bߗދȋ\Ίۖ͋wdTezJxŌ`ӕ^ȔHXRCPtqKŠ閔@ϞJ{嶔㹊|ؙ^歒Se顊j舊sFጐdP}gya`fSWmeOݑ]ڛ̊ňה@쁨F`OP[\铐gಉGh󓂞Њ~yۉ}qɐ͘V،~ऐc͌buwvxXiÕLꖊƓKG̜SR魓CЈߕKv֓S哑tݓk䡞S湝誜vᙊdn]QLڒI跏ʜh\frlymznkkgcstio݉BvdߝjlgqupmGd觛Z嵙j珚ԘBiWqr[~D䠊^񔐘\X{Ž\箊IؘrH_j~F׊@EmLGDŊAKJC`՚QɟIW錟a檚A洚jbaYホe⻞䯙qT㻛fpN㼝c㣎V늬Mϊ䅟jFrȟ綝mlb˙_xpᒔcg|}ۊ@يΞ؊󊩐Ҋ@ʊŞ̊ɊƜAL萊ъš^׊ĊÊԊՊNJ֊͊ϊwxsqPgӊehӏՉɉՉ܃`͉ތF㞉S˚ZQ草ؚm׊]͉Ȍ嗉eDvqҎxT|~o戟ω̉ߍю딃̉ƞg`ϙ֑dUݙJƎa͉ۉяÚКk旓zЊ|䑉嘉㟉qČCa{斎҉ǟ뛺◉Ή։lEc‹āىUCD@wAztxGN{vH^TSrR_[`FLI~qB}MV]EpuPKZY\OQy|sJ􄾄~ԃqXWہACFNՋ\ȐߕϐڃJRVZc]\|\_s*[]\|b\_s*[RZNVJ]\|\_s*[q]\|\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\|\_s*y\|\_s*m\|\_s*F\|\_s*\|\_s*\|S\_s*\|f\_s*o\_s*o\_s*t\_s* \_s*a\_s*n\_s*d\_s* \_s*m\_s*o\_s*u\_s*s\_s*e\_s* \_s*d\_s*i\_s*s\_s*e\_s*a\_s*s\_s*e\|\_s*C\|\_s*\|A\_s*\%(r\_s*c\_s*h\_s*i\_s*c\_s*h\_s*l\_s*a\_s*m\_s*y\_s*d\_s*e\_s*a\_s*e\|p\_s*i\_s*a\_s*l\_s*e\_s*s\)\|U\_s*m\_s*b\_s*e\_s*l\_s*l\_s*i\_s*f\_s*l\_s*o\_s*r\_s*a\_s*e\|\_s*\|}\_s*\|\_s*@\|O\_s*[ȍ]\|\_s*[U]\|P\_s*y\|\_s*\|\_s*[ρX]\|~\_s*\|\_s*\|S\_s*[Z]\|\_s*h\|9\_s*[]\|^\_s*{\|Q\_s*O\|\_s*\|\_s*\%(\|\_s*\)\|\_s*\|\_s*|\|T\_s*\_s*\|T\_s*\|\_s*\_s*\|H\_s*e\_s*l\_s*l\_s*e\_s*b\_s*o\_s*r\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|\_s*\|J\_s*u\_s*g\_s*l\_s*a\_s*n\_s*d\_s*a\_s*l\_s*e\_s*s\|Z\_s*\|n\_s*_\|s\_s*q\|R\_s*h\_s*a\_s*m\_s*n\_s*a\_s*l\_s*e\_s*s\|V\_s*\|]\_s*\|f\_s*[l]\|\_s*A\|s\_s*[mE]\|\_s*\|L\_s*a\_s*\%(u\_s*r\_s*\%(a\_s*c\_s*e\_s*a\_s*e\|o\_s*i\_s*d\_s*e\_s*a\_s*e\)\|b\_s*i\_s*a\_s*t\_s*a\_s*e\|m\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\)\|\_s*\_s*\|\_s*\|\_s*\|~\_s*\|\_s*t\_s*\|\_s*_\|\_s*\|\_s*Y\|\_s*\|\_s*\|I\_s*\%(s\_s*o\_s*p\_s*y\_s*r\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|l\_s*l\_s*i\_s*c\_s*i\_s*a\_s*c\_s*e\_s*a\_s*e\)\|W\_s*i\_s*n\_s*t\_s*e\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\|`\_s*\|]\_s*[]X]\|\_s*\%([ƗuʑɎ茓]\|\_s*\|[\_s*\|\_s*\)\|\_s*\%(X\_s*\_s*\|\_s*\_s*\)\|V\_s*\|7\_s*\|\_s*\|S\_s*[]\|4\_s*\|R\_s*{\|\_s*\|h\_s*t\|\_s*[ʈ]\|\_s*\|O\_s*\%(\|\_s*\)\||\_s*[“]\|A\_s*[o]\|\_s*\|B\_s*r\|\_s*[NY]\|\_s*[]\|r\_s*[ꏎ]\|Q\_s*\|\_s*Y\|b\_s*\|c\_s*e\|\_s*\|M\_s*\%(e\_s*t\_s*a\_s*c\_s*h\_s*l\_s*a\_s*m\_s*y\_s*d\_s*e\_s*a\_s*e\|u\_s*s\_s*a\_s*l\_s*e\_s*s\)\|S\_s*\%([ge]\|p\_s*e\_s*r\_s*m\_s*a\_s*t\_s*o\_s*p\_s*h\_s*y\_s*t\_s*a\|c\_s*i\_s*t\_s*a\_s*m\_s*i\_s*n\_s*e\_s*a\_s*e\)\|Z\_s*i\_s*n\_s*g\_s*i\_s*b\_s*e\_s*r\_s*a\_s*l\_s*e\_s*s\|\_s*\%(\_s*{\_s*\%(I\|\_s*I\)\|\_s*\_s*a\_s*\_s*W\)\|\_s*Z\|\_s*q\|\_s*\|z\_s*\|R\_s*\%(C\_s*o\|\_s*q\|z\_s*\)\|j\_s*\|\_s*\_s*\_s*\|r\_s*C\|b\_s*[]\|\_s*\|}\_s*\|\_s*\%(\|`\_s*\)\|\_s*[]\|\_s*\|V\_s*\%(\|l\_s*\)\|\_s*q\||\_s*\_s*\|O\_s*x\_s*a\_s*l\_s*i\_s*d\_s*a\_s*c\_s*e\_s*a\_s*e\|\_s*[]\|\_s*r\||\_s*\|]\_s*\|\\_s*\|\_s*q\_s*\|\_s*[ay]\|\_s*\|\_s*\|E\_s*\%(b\_s*e\_s*n\_s*a\_s*l\_s*e\_s*s\|l\_s*a\_s*n\_s*a\_s*l\_s*e\_s*s\)\|\_s*R\_s*q\|\_s*\|\_s*\|P\_s*\%(i\_s*p\_s*e\_s*r\_s*a\_s*\%(l\_s*e\_s*s\|c\_s*e\_s*a\_s*e\)\|t\_s*e\_s*r\_s*i\_s*d\_s*o\_s*s\_s*p\_s*e\_s*r\_s*m\_s*\%(a\_s*l\_s*e\_s*s\|i\_s*d\_s*a\_s*e\)\|o\_s*\%(t\_s*a\_s*s\_s*s\_s*i\_s*u\_s*m\|d\_s*o\_s*s\_s*t\_s*e\_s*m\_s*o\_s*n\_s*a\_s*l\_s*e\_s*s\)\)\|y\_s*\|A\_s*g\|k\_s*k\|@\_s*\|\_s*t\_s*\|\_s*\%(\|q\_s*\)\|\_s*\|\_s*\|Z\_s*\%(c\|C\_s*\)\|\_s*\|\_s*[r]\|\_s*\%([_]\|C\_s*\|\_s*s\_s*\_s*\_s*w\_s*Z\_s*p\_s*\_s*w\)\|C\_s*[G]\|(\_s*\_s*)\|\_s*\_s*\|\_s*\|\_s*\|m\_s*\%(\|\_s*\)\|~\_s*\_s*\|o\_s*c\|Y\_s*t\|_\_s*o\|\_s*\|B\_s*\|A\_s*\|T\_s*\%(h\_s*a\_s*l\_s*i\_s*c\_s*t\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|u\_s*b\_s*i\_s*f\_s*l\_s*o\_s*r\_s*a\_s*e\)\|\_s*\_s*\_s*\_s*\_s*u\|\_s*\_s*\_s*e\_s*N\_s*m\_s*T\_s*C\_s*G\_s*\_s*X\|\_s*\|X\_s*\_s*[\_s*Y\|\_s*e\|g\_s*\_s*\_s*v\|\_s*[{v]\|\_s*G\_s*\_s*\_s*Z\_s*b\_s*g\_s*v\_s*Z\_s*@\|T\_s*\%(\_s*`\_s*[\_s*\|G\_s*\|C\_s*\%(g\_s*J\_s*C\_s*\|\_s*X\|N\_s*\%([]\|\_s*\%(\|b\_s*N\)\)\|{\_s*\%(E\_s*Y\|[\_s*O\)\|o\_s*\%([\|l\_s*e\_s*B\_s*\%(b\_s*N\|N\_s*X\)\)\|\_s*\_s*[\_s*\|_\_s*[\|t\_s*@\_s*[\|l\_s*\_s*A\)\|[\_s*\%(e\_s*B\_s*t\_s*B\_s*P\_s*[\_s*V\_s*\_s*\|N\_s*\|J\_s*\%(X\|\_s*X\_s*N\_s*\%(\_s*C\_s*u\|\_s*v\_s*V\_s*\_s*\)\)\|L\_s*\%(\_s*\%(\_s*[\|\_s*[\_s*\%(^\_s*[\|V\_s*\_s*\)\)\|b\_s*g\)\)\)\|}\_s*h\_s*\_s*X\|\_s*\|P\_s*\%([AC]\|t\_s*F\_s*E\_s*X\|v\_s*X\_s*g\_s*\_s*[]\|`\_s*\_s*b\_s*v\|\_s*\%(^\_s*E\_s*\%(\|\_s*X\)\|u\_s*\_s*b\_s*W\)\|[\_s*\%([LWuvX]\|N\_s*E\_s*H\_s*[\_s*N\|\\_s*\|^\_s*\_s*\_s*O\|p\_s*\%([\|r\_s*\_s*e\_s*B\)\|V\_s*\_s*O\|\_s*[\)\|\_s*\%(g\|x\_s*\_s*X\|e\_s*B\_s*b\_s*N\|r\_s*\%(\|[\_s*j\)\)\|~\_s*\%(J\_s*\|X\_s*g\)\)\|L\_s*\%(\_s*m\_s*\|v\_s*\_s*X\|P\_s*\|\_s*\%([C[A]\|\_s*F\|r\_s*\%(Y\_s*\|X\_s*\)\|\_s*\%(X\|b\_s*g\)\|\_s*[\_s*^\_s*[\|\_s*\\_s*[\|\_s*\%([\|E\_s*\|A\_s*X\|I\_s*V\_s*e\_s*B\)\)\|A\_s*\%(\|[\_s*\|\_s*e\_s*B\)\|`\_s*\|g\_s*T\_s*\|\_s*\|}\_s*C\_s*\|b\_s*J\|\_s*[\_s*g\|\_s*\%([hpXu]\|f\_s*\%(B\|\_s*b\_s*N\)\|r\_s*\%([Al]\|e\_s*\%(B\|[\_s*V\_s*\_s*\)\)\|x\_s*c\|o\_s*\%(\_s*[GA]\|\_s*[\)\|g\_s*\|V\_s*[\|T\_s*\_s*\|^\_s*s\_s*\|s\_s*\%(g\_s*\|^\_s*\%(\|\_s*Y\_s*\)\)\|v\_s*\%(\|V\_s*\_s*\|e\_s*\|`\_s*\)\|Z\_s*\%(C\|\_s*[\_s*\)\|b\_s*\%([cg`v]\|T\_s*o\|X\_s*\|V\_s*\%(\|\_s*O\|\_s*\%([\|u\_s*\)\)\)\|j\_s*\%(I\_s*\|X\_s*^\_s*[\)\|i\_s*\|m\_s*\%(\|[\_s*\|s\_s*[\)\|~\_s*\\_s*[\_s*\|\_s*\%(\|\_s*\%(\|b\_s*g\)\)\|\_s*\%(\|E\_s*F\_s*C\|\_s*\|\_s*C\_s*[i]\|b\_s*g\)\|\_s*b\_s*g\|\_s*\%([R[A]\|o\_s*[\|u\_s*\_s*[\_s*V\_s*\_s*\|b\_s*W\|\_s*O\)\|Y\_s*\)\|\_s*\%(R\|X\_s*g\|V\_s*^\_s*\)\)\|\_s*p\|`\_s*\%([^}A]\|\_s*\|\_s*[\|\_s*h\|\_s*j\_s*[\|R\_s*\|b\_s*\%([vN]\|e\_s*\_s*I\|^\_s*S\_s*\)\|L\_s*\%(\|[\_s*^\)\|\_s*\%(A\_s*u\_s*\|[\_s*C\_s*\_s*K\_s*\)\|[\_s*\%([tgvNY]\|p\_s*[\|^\_s*[\)\|F\_s*\%([XJRA]\|U\_s*\%(\|[\_s*\)\|\_s*\%(j\_s*[\|V\_s*[\|m\_s*u\_s*C\_s*\)\|\_s*\%([\|X\_s*g\|b\_s*V\_s*\|\_s*\)\|\_s*\%(X\_s*^\|\_s*R\_s*t\)\|r\_s*`\_s*F\_s*t\|_\_s*[\|`\_s*F\_s*\|b\_s*\%([gNJ]\|L\_s*\_s*O\)\|C\_s*\%([X]\|j\_s*[\|T\_s*[\|V\_s*\_s*O\)\|[\_s*\%(\|U\_s*\|z\_s*t\)\)\|\_s*\%([IthCRE]\|c\_s*l\|N\_s*\|v\_s*^\_s*[\|p\_s*e\_s*B\|y\_s*\%(\|b\_s*N\)\|`\_s*\|l\_s*\%(\|\_s*[\|\_s*\_s*O\)\|b\_s*\%([Ng]\|s\_s*[\|v\_s*\%(}\_s*\|\_s*\)\)\|^\_s*\%(\_s*[C[]\|\_s*\_s*O\)\|\_s*}\_s*[\_s*X\|\_s*\_s*W\|\_s*\|[\_s*\%([`^gW]\|r\_s*\|~\_s*\%([\|\_s*O\)\|\_s*[\|\_s*\%([YX]\|g\_s*\)\)\|\_s*\_s*S\)\|\_s*\%([R]\|C\_s*X\|\_s*X\_s*L\_s*[\|[\_s*\%(N\|T\_s*[\|J\_s*[\|L\_s*\_s*O\)\|S\_s*\|b\_s*\%(v\|s\_s*[\|p\_s*[\)\|\_s*\\)\)\|\_s*W\|\_s*\|\_s*\|\_s*\%(\|Y\_s*\_s*`\_s*\)\|p\_s*\|C\_s*\%([srdfDeRoa]\|\_s*\|^\_s*\_s*\|y\_s*p\_s*e\_s*r\_s*a\_s*l\_s*e\_s*s\|P\_s*\%(U\|S\_s*(\_s*C\_s*o\_s*n\_s*t\_s*i\_s*n\_s*u\_s*a\_s*t\_s*i\_s*o\_s*n\_s*-\_s*P\_s*a\_s*s\_s*s\_s*i\_s*n\_s*g\_s* \_s*S\_s*t\_s*y\_s*l\_s*e\_s*)\)\|u\_s*r\_s*i\_s*u\_s*m\|M\_s*\%(U\|\\_s*\_s*O\)\|^\_s*C\_s*v\|T\_s*\%(X\_s*L\_s*\_s*\|R\_s*L\_s*L\_s*[\)\|V\_s*F\_s*\|S\_s*\%(V\_s*t\_s*@\_s*C\_s*\|`\_s*\_s*[\_s*i\|A\_s*\_s*e\_s*i\)\|J\_s*b\_s*v\|N\_s*\_s*X\|R\_s*\_s*p\_s*C\_s*\|C\_s*\%(R\_s*(\_s*C\_s*r\_s*e\_s*e\_s*d\_s*e\_s*n\_s*c\_s*e\_s* \_s*C\_s*l\_s*e\_s*a\_s*r\_s*w\_s*a\_s*t\_s*e\_s*r\_s* \_s*R\_s*e\_s*v\_s*i\_s*v\_s*a\_s*l\_s*)\|D\_s*J\_s*\_s*\)\|h\_s*\_s*C\_s*u\|+\_s*+\|L\_s*\%(X\|O\_s*S\|I\_s*S\_s*P\)\|E\_s*S\_s*P\|A\_s*\%(D\|S\_s*[LE]\)\|\_s*\_s*N\|I\_s*S\_s*C\|h\_s*\%(l\_s*o\_s*r\_s*\%(a\_s*n\_s*t\_s*h\_s*a\_s*c\_s*e\_s*a\_s*e\|i\_s*n\_s*e\)\|r\_s*o\_s*m\_s*i\_s*u\_s*m\|a\_s*S\_s*e\_s*n\)\|O\_s*\%(B\_s*O\_s*L\|N\_s*T\_s*R\_s*O\_s*L\_s*L\_s*[\)\)\|b\_s*\%([^]\|l\_s*\\_s*\_s*O\|^\_s*C\_s*v\|J\_s*b\_s*v\|N\_s*\_s*X\|\_s*r\|c\_s*|\_s*q\_s*n\_s*l\|h\_s*\_s*C\_s*u\|{\_s*{\|\_s*\_s*N\|n\_s*2\|\_s*b\_s*\%(\|n\_s*X\_s*g\_s*A\)\|\_s*\)\|c\_s*\%(@\_s*[\|B\_s*\_s*\|F\_s*\%([\|\_s*j\_s*[\|\_s*\)\)\|Y\_s*f\)', + \ 'd' : '\%([다hbraǏBtN{cjۓÓ̊椓ՓœǙI^ӛkNU˒~}X駁߁̓ԓӓWV֓g˓zގ{ymw^~xWZvǎF≓BHDsMub\BadƂŃdߐhȍjΓ`sˌngAtːϒ݋lВÐ}ނÃaߗ͎nIL֓|ʔZ睏JNMҋʍxJ_يڒ|ԊxFڒDEN璑ДUՒinm聄Гْ̓U[ghkifcdejƑǑʎP[S֚֝\ǐȐəTP䶗cĕkř[яoCAD\.dEchg\Bƃh_WDtƒfd]\|\_s*\%(\_s*\|\_s*\|\_s*\|\_s*\|\_s*\)\|b\_s*[hfda_]\|\_s*[ǂłÂ]\|\_s*\|s\_s*X\_s*\|\_s*\|S\_s*a\_s*u\_s*r\_s*u\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\|C\_s*\%(u\|o\_s*p\_s*p\_s*e\_s*r\)\|\_s*V\_s*\|\_s*\|@\_s*\|\_s*\|Y\_s*\|S\_s*t\_s*\|\_s*\|\_s*\|\_s*[t]\|\_s*\|\_s*\|\_s*[I]\|\_s*\|m\_s*b\|x\_s*\|\_s*q\|\_s*q\|\_s*\|\_s*K\|\_s*\|\_s*B\|R\_s*\|\_s*\|\_s*k\_s*B\_s*\|\_s*\%([Ɍ]\|\_s*L\|\_s*V\_s*c\|\_s*\%(\|\_s*b\)\)\|T\_s*[B]\|\_s*\|\_s*|\|\_s*\%(\_s*\|\_s*f\_s*[\_s*^\_s*x\_s*[\_s*X\)\|R\_s*\_s*\_s*r\_s*A\|Y\_s*\%(\_s*[\_s*X\|b\_s*N\)\|C\_s*\_s*J\|\_s*\|\_s*m\|\_s*\|s\_s*\_s*\|\_s*\_s*\_s*\|n\_s*[\_s*O\|\_s*\_s*\_s*\_s*\|j\_s*\_s*\%(\|\_s*\)\|\_s*\_s*q\|L\_s*q\_s*q\|c\_s*\%(_\|^\_s*C\_s*v\|h\_s*\_s*C\_s*u\|J\_s*b\_s*v\|b\_s*u\_s*\_s*\_s*h\|\_s*\_s*\_s*\|\_s*\_s*N\|\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\)\|\\_s*i\_s*\|[\_s*b\_s*P\_s*\|\_s*\_s*\|\_s*\|\_s*\_s*\|\_s*\|D\_s*\%(b\|^\_s*C\_s*v\|T\_s*\%(E\|P\_s*\\_s*t\_s*g\|M\_s*\\_s*t\_s*g\)\|M\_s*A\|h\_s*\_s*C\_s*u\|J\_s*b\_s*v\|C\_s*\%(J\_s*[\_s*h\|u\_s*\_s*\_s*h\)\|u\_s*b\_s*n\_s*i\_s*u\_s*m\|B\_s*\%(M\_s*S\|T\_s*[\_s*o\)\|H\_s*C\_s*P\_s*\%(T\_s*[\_s*o\|N\_s*\_s*C\_s*A\_s*\_s*g\)\|y\_s*\%(s\_s*p\_s*r\_s*o\_s*s\_s*i\_s*u\_s*m\|l\_s*a\_s*n\)\|r\_s* \_s*P\_s*e\_s*p\_s*p\_s*e\_s*r\|\_s*\_s*N\|V\_s*D\_s*\%({\_s*b\_s*N\_s*X\|V\_s*\_s*b\_s*v\|P\_s*[\_s*X\|f\_s*b\_s*L\|h\_s*\_s*C\_s*u\|I\_s*[\_s*f\_s*B\_s*I\|v\_s*\_s*\%(C\_s*\_s*[\|[\_s*\_s*[\)\|\_s*b\_s*N\|\_s*R\_s*[\_s*_\_s*[\|}\_s*\_s*`\|r\_s*f\_s*I\)\|O\_s*S\|o\_s*\%(c\_s*u\_s*m\_s*e\_s*n\_s*t\_s* \_s*\%(T\_s*y\_s*p\_s*e\_s* \_s*D\_s*e\_s*f\_s*i\_s*n\_s*i\_s*t\_s*i\_s*o\_s*n\|O\_s*b\_s*j\_s*e\_s*c\_s*t\_s* \_s*M\_s*o\_s*d\_s*e\_s*l\)\|C\_s*o\_s*M\_s*o\)\|e\_s*\%(g\_s*e\_s*n\_s*e\_s*r\_s*i\_s*a\_s*c\_s*e\_s*a\_s*e\|l\_s*a\_s*w\_s*a\_s*r\_s*e\)\|E\_s*\%(C\|L\_s*L\_s*[\)\|I\_s*\%(P\_s*X\_s*C\_s*b\_s*`\|S\_s*K\)\|i\_s*\%(r\_s*e\_s*c\_s*t\_s* \_s*M\_s*e\_s*m\_s*o\_s*r\_s*y\_s* \_s*A\_s*c\_s*c\_s*e\_s*s\_s*s\|s\_s*t\_s*r\_s*i\_s*c\_s*t\_s* \_s*o\_s*f\_s* \_s*C\_s*o\_s*l\_s*u\_s*m\_s*b\_s*i\_s*a\|g\_s*i\_s*t\_s*a\_s*l\)\)\)', + \ 'e' : '\%([ኙPGҋ`ܐݑ傉滌ӏ^ΛxVx{y㈔t厚z郉uՉvwt鴝oHHў́dvꁊ_脚ঢ়Q`腖b膞Ł܉⥟}|叉͉lU~Itok㗚Țzoi͉joĉblgsdm繉erfhnci}I߈ˉ|㉙dGq`Ήbldʉ`da]ΕU߁́Q}MNpΎIŃRL|Ä^Ge]\|A\_s*\%([ʔ^]\|V\_s*\%(@\_s*\|\_s*D\)\|B\_s*\%(^\|C\_s*\)\)\|`\_s*\%([ʔ^]\|u\_s*\%(@\_s*\|\_s*D\)\|a\_s*^\)\|\_s*\%(\|\_s*\)\|O\_s*\_s*\|M\_s*T\_s*C\_s*Y\|l\_s*T\_s*C\_s*Y\|G\_s*X\_s*q\|\_s*\|g\_s*\|E\_s*\|\_s*\_s*q\|\_s*y\|\_s*x\|\_s*H\|x\_s*\|\_s*[s]\|\_s*\|g\_s*q\|k\_s*\%(T\_s*C\_s*Y\|k\_s*T\_s*C\_s*Y\)\|L\_s*\%(T\_s*C\_s*Y\|L\_s*\%(T\_s*C\_s*Y\|\_s*\)\)\|\_s*\%([仗Q]\|m\_s*\)\|N\_s*\|m\_s*\%([‹ɋ]\|\_s*\|p\_s*`\|g\_s*j\_s*z\_s*[\_s*\)\|\_s*\|Z\_s*\|\_s*X\_s*r\_s*[\_s*H\_s*i\|S\_s*\%([]\|T\_s*C\_s*Y\|N\_s*\|F\_s*\_s*\)\|r\_s*\%([gȋ]\|T\_s*C\_s*Y\|m\_s*\|e\_s*\_s*\)\|q\_s*[y]\|w\_s*\%([r]\|\_s*F\_s*\)\|X\_s*\%([r]\|O\_s*\|\_s*F\_s*\)\|A\_s*\|\_s*\|C\_s*\%(l\|h\_s*l\_s*o\_s*r\_s*i\_s*n\_s*e\)\|C\_s*\%(V\|W\_s*\)\|\_s*s\_s*\_s*\_s*x\_s*\_s*\_s*c\_s*c\|\_s*[\_s*N\_s*X\_s*e\_s*[\_s*V\_s*\_s*\|\_s*\%(B\|\_s*b\)\|^\_s*\%(B\|\_s*b\)\|\_s*[\_s*\_s*\%(s\_s*A\_s*\|b\_s*p\)\|\_s*\%(A\_s*\|E\_s*\_s*s\_s*E\_s*\|\_s*C\_s*J\|[\_s*\%(\|m\_s*X\|j\_s*X\|W\_s*\%(\|[\_s*\)\|h\_s*\|\_s*J\|\_s*\%(X\|V\_s*A\)\|t\_s*\%(\_s*e\_s*X\|H\_s*\%(\_s*A\|j\_s*A\_s*\)\)\|N\_s*\_s*b\_s*h\|J\_s*\)\)\|\_s*W\|\_s*\|d\_s*q\_s*\_s*\%([\_s*\|C\_s*\)\|\_s*W\|]\_s*\_s*\_s*\|\_s*\_s*\|S\_s*\_s*\_s*T\|J\_s*v\_s*Z\_s*\_s*\|I\_s*\%([\|C\_s*\%(\_s*[\|Q\_s*\)\)\|\_s*s\|g\_s*\|\_s*O\|\_s*Q\_s*\|d\_s*\%(o\_s*n\|h\_s*\_s*C\_s*u\|c\_s*x\_s*[\_s*^\|\_s*\_s*\_s*\|J\_s*b\_s*v\|\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\|^\_s*C\_s*v\)\|A\_s*\%([C]\|j\_s*h\|[\_s*\%([}X]\|E\_s*B\_s*\|\_s*\|j\_s*[\|l\_s*X\_s*g\|~\_s*\|V\_s*[\|\_s*[\)\)\|\_s*\|E\_s*\%(r\|O\_s*F\|u\_s*\%(p\_s*o\_s*m\_s*a\_s*t\_s*i\_s*a\_s*c\_s*e\_s*a\_s*e\|r\_s*o\_s*p\_s*i\_s*u\_s*m\)\|U\_s*C\_s*R\_s*[\_s*h\|P\_s*\_s*R\_s*[\_s*h\|h\_s*\_s*C\_s*u\|d\_s*i\_s*t\_s*i\_s*n\_s*g\_s* \_s*M\_s*A\_s*C\_s*r\_s*o\_s*S\|-\_s*m\_s*a\_s*i\_s*l\|\_s*[\_s*\|J\_s*b\_s*v\|R\_s*}\_s*[\_s*X\|N\_s*T\_s*E\_s*R\_s*L\_s*[\|^\_s*C\_s*v\|i\_s*n\_s*s\_s*t\_s*e\_s*i\_s*n\_s*i\_s*u\_s*m\|S\_s*\%(P\|C\_s*L\_s*[\)\|l\_s*k\|m\_s*a\_s*c\_s*s\)\|C\_s*\%([uA[]\|W\_s*F\_s*N\_s*g\|t\_s*F\_s*N\_s*[g^]\|R\_s*\%([\_s*\|\_s*C\_s*[YU]\)\|v\_s*V\_s*\_s*\|~\_s*\_s*\_s*\%([\_s*[g^]\|C\_s*^\)\|x\_s*\_s*\%(g\|^\_s*[\)\|m\_s*b\_s*N\|l\_s*[\_s*u\_s*\|M\_s*\_s*X\|\_s*O\_s*\%(\_s*\_s*h\|\_s*b\_s*V\_s*\)\|b\_s*`\|\_s*\%([\|\_s*\_s*O\|t\_s*H\_s*\|z\_s*\)\|O\_s*W\_s*\%(b\_s*g\|X\_s*g\)\|N\_s*\%(X\|A\_s*\_s*e\_s*B\)\|X\_s*t\_s*@\_s*n\_s*\|\_s*[A]\|\_s*\%([\_s*\%(X\|U\_s*[\|T\_s*[\)\|C\_s*\%(\|U\_s*[\|T\_s*[\)\|u\_s*\)\)\|E\_s*\%([\|W\_s*F\_s*[\_s*k\)\)', + \ 'f' : '\%([[ΉM֓~y`[脟T͈j͊ȎD^J㬐䔕bʟX䙆앶|tyMD၂⁃᳍ĘWoK敖lᆕ慊p̐k⿕谌Pc霜i񕥕huCcޔX܊ܕteoon劚]wwSܙ󕄉畆yDXY|[~Y\V~zBUv䘕㧕ЕtsDz@缕u•tbҕ}GHt{䎙ʖ|ӂŚx܋ŋU󕤕tFUf]\|\_s*\|b\_s*t\|\_s*\|\_s*\|A\_s*X\|\_s*\|\_s*\|E\_s*u\_s*p\_s*t\_s*e\_s*l\_s*e\_s*a\_s*c\_s*e\_s*a\_s*e\|\_s*\_s*\|\_s*i\|}\_s*\_s*\|C\_s*f\|\_s*\%(C\|\_s*[]\)\|\_s*C\|_\_s*\|\_s*\|\_s*\|\_s*~\|\_s*\|\_s*c\|M\_s*y\_s*r\_s*t\_s*a\_s*l\_s*e\_s*s\|\_s*[R]\|\_s*t\|B\_s*u\_s*d\_s*d\_s*l\_s*e\_s*j\_s*a\_s*c\_s*e\_s*a\_s*e\|k\_s*\|G\_s*e\_s*r\_s*a\_s*n\_s*i\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|Q\_s*[l“]\|h\_s*\|2\_s*\%([l“]\|\_s*\)\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|~\_s*~\_s*~\|\_s*\|\_s*\|\_s*\_s*o\|I\_s*r\_s*o\_s*n\|\_s*\_s*\_s*\|_\_s*\_s*\|`\_s*\|z\_s*\%(\_s*C\_s*G\|C\_s*\|\_s*\%(}\_s*\%(\_s*g\|\_s*\)\|\_s*A\_s*\%(~\_s*h\|\_s*f\_s*q\_s*h\)\)\)\|\_s*t\|@\_s*\\|\_s*\|\_s*\_s*\|C\_s*\|q\_s*\%(\|\_s*[\_s*[Y]\)\|\_s*1\_s*v\_s*f\|P\_s*\%(^\_s*\_s*\_s*\_s*\|\_s*\)\|\_s*s\|n\_s*\%(G\|\_s*u\_s*\|\_s*\)\|_\_s*\_s*\|e\_s*\%(P\|J\_s*b\_s*v\|^\_s*C\_s*v\|\_s*\%(\|\_s*\)\|\_s*\_s*\_s*\_s*\)\|\_s*g\_s*\|G\_s*t\)', + \ 'g' : '\%([EDĉ愍܍Ό՘ᖈ@W龚oXߍnS΍crŠ穚ꇟ|ߍ܌Ɍ݌ߋɉz5⺙Z䲌뛈TގqIwxౌ免@㓆驌纞Q|k轚nj}~|YPꖕFqÙ䋌ῌVȌZɉĉRтC򕳕ȍIƑqʌ䣋Xȋ{j㸌SQRԋgOHًF[hߌNۋқً⚞f耋ʋzCČɛ邙F‹ƋŋÍsኋst_CFcEٌV㺌~E[]供ҋbUaXa^؋W`ซZ鰒\YVE_㎆雔WᥟdmAԛݔvʊŕ꓁^`e寊qI}dPjkhG_~܌ݙʊہ꜋܊ߌ猎|罚ْꛞٛ{Ӝԙkzx{ywR♓GN᳚PUn᫊YPKw䈊HVQZSXMTW[Oa䉾Gώ؉@݉ɑ֑`މbʉꏑ͉뛴䮔|PMA₪⁄KSɃ̓Ѓ˃σȃ̃ǃƃʃÃՃ΃у҃ăӃԃŃփMOsQCg]\|\_s*\%(\_s*\|\_s*\|\_s*\|\_s*\|\_s*\)\|b\_s*[SQOMK]\|\_s*[]\|\_s*\|\_s*\|\_s*\_s*\|\_s*\_s*~\|\_s*\|\_s*y\|P\_s*e\_s*r\_s*s\_s*o\_s*n\_s*a\_s*l\_s*e\_s*s\|\_s*\|\_s*s\_s*\|\_s*q\|H\_s*\|\_s*\|\_s*\_s*\|~\_s*\|i\_s*\%([ԉ]\|V\_s*\)\|P\_s*\_s*\|]\_s*\%([ÌΏB]\|k\_s*\)\|\_s*[`]\|\_s*\|w\_s*\|i\_s*F\|\_s*\|\_s*\|m\_s*\|\_s*\|\_s*[]\|\_s*[ō]\|\_s*\|\_s*E\|\_s*\|~\_s*\_s*\_s*F\|H\_s*\|\_s*[Սi]\|g\_s*@\|\_s*\|{\_s*\|\_s*\%([알]\|Z\_s*\)\|\_s*\%([@]\|s\_s*\_s*\|\_s*\_s*@\)\|A\_s*g\|S\_s*\%(c\_s*r\_s*o\_s*p\_s*h\_s*u\_s*l\_s*a\_s*r\_s*i\_s*a\_s*c\_s*e\_s*a\_s*e\|y\_s*m\_s*p\_s*e\_s*t\_s*a\_s*l\_s*a\_s*e\|i\_s*l\_s*v\_s*e\_s*r\)\|\_s*c\|\_s*\_s*J\|\_s*t\|L\_s*q\|Y\_s*\|\_s*\|\_s*\|T\_s*y\_s*p\_s*a\_s*l\_s*e\_s*s\|\_s*[]\|\_s*\_s*\|\_s*\|\_s*q\|\_s*^\|b\_s*\|\_s*\|k\_s*[\|f\_s*\%(n\_s*q\_s*n\|a\_s*\_s*\_s*\|\_s*\|J\_s*b\_s*v\|^\_s*C\_s*v\|X\_s*|\_s*b\_s*g\|p\_s*\|\_s*\_s*\)\|j\_s*\_s*[\_s*Y\|m\_s*[\_s*\|\_s*i\_s*\_s*\|A\_s*\_s*\_s*R\_s*\_s*i\_s*\_s*\|q\_s*\|N\_s*b\_s*p\|\_s*q\|n\_s*{\_s*\_s*[\_s*l\|\_s*\|\_s*[\_s*e\_s*{\_s*\|G\_s*[\_s*e\_s*{\_s*\|C\_s*F\_s*\%([\_s*e\_s*{\_s*\|e\_s*{\_s*\)\|\_s*\|G\_s*\%([dae]\|o\_s*m\_s*o\_s*r\_s*t\_s*e\_s*g\_s*a\_s*c\_s*e\_s*a\_s*e\|M\_s*\%(T\|D\_s*(\_s*G\_s*e\_s*r\_s*m\_s*a\_s*n\_s* \_s*N\_s*a\_s*t\_s*i\_s*o\_s*n\_s*a\_s*l\_s* \_s*R\_s*e\_s*s\_s*e\_s*a\_s*r\_s*c\_s*h\_s* \_s*C\_s*e\_s*n\_s*t\_s*e\_s*r\_s* \_s*f\_s*o\_s*r\_s* \_s*C\_s*o\_s*m\_s*p\_s*u\_s*t\_s*e\_s*r\_s* \_s*S\_s*c\_s*i\_s*e\_s*n\_s*c\_s*e\_s*)\)\|\_s*\|C\_s*L\|c\_s*c\|J\_s*b\_s*v\|^\_s*C\_s*v\|X\_s*|\_s*b\_s*g\|p\_s*\|P\_s*L\|n\_s*u\_s*s\|I\_s*\%(N\_s*A\_s*(\_s*t\_s*h\_s*e\_s* \_s*G\_s*e\_s*n\_s*e\_s*r\_s*i\_s*c\_s* \_s*I\_s*n\_s*t\_s*e\_s*r\_s*a\_s*c\_s*t\_s*i\_s*v\_s*e\_s* \_s*A\_s*p\_s*p\_s*l\_s*i\_s*c\_s*a\_s*t\_s*i\_s*o\_s*n\_s*)\|F\_s*\%(t\_s*@\_s*C\_s*\|A\_s*j\_s*\)\)\|U\_s*I\|N\_s*U\|O\_s*T\_s*C\_s*\|E\_s*T\_s*\_s*\\_s*b\_s*h\)\|w\_s*\%(\_s*\_s*h\|\_s*}\_s*\)\|h\_s*C\_s*c\|\_s*g\_s*v\_s*\|[\_s*\%(\_s*\%(`\_s*\|j\_s*E\_s*\)\|\_s*N\_s*\_s*b\_s*v\|m\_s*A\|\_s*g\_s*\_s*}\_s*\|l\_s*\%(R\_s*\|\_s*\%(\|\_s*X\_s*g\)\)\)\|\_s*\%(\|w\_s*@\_s*\)\|W\_s*\%([WOmiI[]\|v\_s*V\_s*[\|A\_s*\|b\_s*h\|C\_s*h\|^\_s*\|[\_s*\|\_s*A\_s*\|\_s*b\_s*g\|S\_s*\|\_s*\%(t\|\_s*\%(h\|f\_s*B\_s*[\_s*m\)\)\|\_s*\%([\|\_s*h\)\|o\_s*\_s*V\_s*[\|u\_s*\%(\|\_s*\_s*^\_s*\)\|x\_s*\%(\_s*i\_s*E\|\_s*\_s*\)\|l\_s*b\_s*g\|\_s*\%(b\_s*g\|\_s*@\_s*\_s*[ji]\|o\_s*\_s*[ji]\|R\_s*\%([\_s*\\|\_s*_\)\|\_s*\%(W\|_\_s*[\_s*m\)\|[\_s*\%(W\|[\_s*b\_s*g\)\)\|\_s*\%(\|C\_s*\%(\|\_s*Y\|A\_s*\_s*[cg]\)\|R\_s*\%(\|\_s*b\_s*e\_s*B\)\|[\_s*}\_s*\)\|j\_s*[\|\_s*\%([l]\|[\_s*b\_s*y\|\_s*\%(A\|[\_s*j\|G\_s*b\_s*^\)\|k\_s*\%(r\_s*G\_s*[\_s*u\|\_s*B\_s*G\_s*[\_s*\)\)\|F\_s*\%([t}l]\|X\_s*`\_s*\_s*[\|\_s*j\_s*\|\_s*\%([\_s*[gh]\|\_s*\%(h\|f\_s*B\_s*\|_\_s*C\_s*\)\)\|~\_s*j\|j\_s*[\|m\_s*\%([Ao]\|\_s*@\|\_s*[\_s*Y\|T\_s*C\_s*h\)\|\_s*\%(}\|g\_s*\%(\|\_s*[B[]\)\|_\_s*[\)\)\)\)', + \ 'h' : '\%([Η䀉LN{wʔMSܖŖyj壌uׁ󜓏c]Kg֚\✖{xjښNWœYuqIc_p沖Q}䚑鵖N闈{BPaHKAOfDG̜dMOEvLC󝻝eMіk@棕nܚO􍛕䕒eK̚MꅕߒJ~s܉Y癗_͌zu`œLKHQ蓕QɕE憕wǝ́ݕՕxҝGٖݕ͒⍛iyQaÛz˕rǕ•糌粐w˂̘[Ή։A~y`[脟TǏ͈͊ȎD^J㬐䔕bʟX䎟앶|tyMD⁄᳘WoBK敖lᆕ慊p̐k⿕谌ꄜ霘ŜiFӋhuⷁޔX܊ܕteoon劚]wwSܙ󕄉畀yXY|[x~Y\~BUv䘕㧕ЕtsDz@缕u•tbҕ}GHt{VQ_~PcݕAS鯏GG哝ǁ|ጄՉ颕Ejhk_l㏟qoĕnmpgiםʕfgRʒJI@Pvzh啸Ǐd֋ϏēdΒPՓƑml1PuഁH͏ݝfە\PFt鷑MJ焕SZOznIQT䊌QP㟋jEWqGgϏEShꤊ[OGmT_ALJCNȕLDlJC捍rMKgHIjuq~U銕VG^Y~Z֙dߕ[]W\{_iuywDڔޝّޔٔ۔唊X䙶Og|]`ۘҍ澝ΞK瀊]ݔBBwߛEܔO栂ʎzjHԗ󌃙㔈墏Ȝ[OXJyٓ}j݋Еoޝ՝؏ދ@@Tmה喗IjYDscPĔJ`eƈn]nG|FɉIꡓzyt妝ppSƗ|杙br@؉X瞞dzxX򒌑\➕^⦔Rx펾њ虘NJAM唏隤Rdʌv}є`ڔ񏉘o@WIᢔ@Ҕuښ輏v`uit\ECpBᓔoxޔywWprqsDzȔ֟NW⛔aJÍ➷^䗖}ፖ|YK唺Ϟϔ͔ٔ㆔הєŔǍʔƔɔ̔ĔД_lyP㵔Ôfڙhޝcjpbh[enUfƙȉHiՑf͚ĉʒ蘗td۔ǐHmcJ঑|ꏛƓ\͂g]tqzwnh]\|\_s*[]\|b\_s*[zwtqn]\|\_s*[قւӂЂ]\|\_s*\|q\_s*K\|\_s*\|m\_s*[CF]\|\_s*\|\_s*}\|\_s*[ΐ]\|\_s*{\|S\_s*\|_\_s*\|p\_s*K\|\_s*\_s*F\|g\_s*[]\|T\_s*r\_s*i\_s*u\_s*r\_s*i\_s*d\_s*a\_s*l\_s*e\_s*s\|\_s*\|\_s*@\|a\_s*\|\_s*q\||\_s*\%(\\|\_s*\)\|\_s*q\|\_s*\|\_s*\|\_s*\|\_s*Z\|\_s*\|c\_s*l\_s*a\_s*u\_s*s\_s*t\_s*r\_s*o\_s*p\_s*h\_s*o\_s*b\_s*i\_s*a\|\_s*\|\_s*\|\_s*\|E\_s*\%(r\_s*i\_s*o\_s*c\_s*a\_s*u\_s*l\_s*a\_s*l\_s*e\_s*s\|u\_s*p\_s*t\_s*e\_s*l\_s*e\_s*a\_s*c\_s*e\_s*a\_s*e\)\|\_s*\%(\_s*\|\_s*\)\|\_s*i\|\_s*C\|\_s*\|\_s*\|\_s*~\|\_s*\|f\_s*\%(o\_s*r\_s*t\_s*e\|e\_s*m\_s*t\_s*o\)\|\_s*[R]\|\_s*t\|k\_s*\|G\_s*e\_s*r\_s*a\_s*n\_s*i\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|h\_s*\|\_s*\_s*\|\_s*\_s*\|~\_s*~\_s*~\|\_s*\%(\|\_s*\_s*\)\|\_s*\|]\_s*c\_s*\|\_s*\|\_s*I\|\_s*\|\_s*\_s*\|\_s*@\|_\_s*[]\|I\_s*\|\_s*\|i\_s*a\|\_s*\|\_s*\%([lo]\|\_s*o\_s*\)\|\_s*\|\_s*\|f\_s*\|\_s*V\_s*q\|_\_s*[]\|\_s*l\|\_s*[ƁX]\|\_s*\_s*\%(\|\_s*\)\|A\_s*\%(s\|r\_s*s\_s*e\_s*n\_s*i\_s*c\|n\_s*g\_s*i\_s*o\_s*s\_s*p\_s*e\_s*r\_s*m\_s*a\_s*e\)\|\_s*f\_s*]\|\_s*\_s*\|\_s*[c]\|\_s*\|\_s*[B]\|\_s*\|\_s*\_s*\|h\_s*\|\_s*[js]\|K\_s*W\|e\_s*\|W\_s*\|\_s*q\|\_s*q\|\_s*\|\_s*\|\_s*\|\_s*\_s*\|n\_s*\|\_s*\|\_s*\|\_s*\%(\|\_s*\)\|`\_s*\|\_s*\|N\_s*e\_s*l\_s*u\_s*m\_s*b\_s*o\_s*n\_s*a\_s*c\_s*e\_s*a\_s*e\|o\_s*\_s*|\|\_s*E\|\_s*\|\_s*[]\|y\_s*[t]\|q\_s*[fC]\|\_s*t\|\_s*\_s*l\|\_s*\|x\_s*q\|\_s*J\|\_s*\_s*\|Z\_s*\|\_s*\|\_s*]\|K\_s*[q]\|{\_s*\%(\_s*\|\_s*\)\|E\_s*[l]\|\_s*s\|w\_s*\|Q\_s*\%([l“]\|O\_s*[Γ]\)\|2\_s*\%([l“]\|\_s*\|0\_s*\)\|W\_s*|\|8\_s*\|q\_s*\|P\_s*\%(t\|o\_s*t\_s*a\_s*m\_s*o\_s*g\_s*e\_s*t\_s*o\_s*n\_s*a\_s*l\_s*e\_s*s\|l\_s*a\_s*t\_s*i\_s*n\_s*u\_s*m\)\|C\_s*\%([if]\|\_s*\_s*\|f\_s*\)\|\_s*\|\_s*\|\_s*\|\_s*\|R\_s*S\_s*I\|M\_s*\%(y\_s*r\_s*t\_s*a\_s*l\_s*e\_s*s\|e\_s*r\_s*c\_s*u\_s*r\_s*y\)\|F\_s*\|\_s*a\_s*_\_s*\|E\_s*[\_s*S\|\_s*\%([\|y\_s*[\_s*\|x\_s*[\_s*\|C\_s*X\_s*}\_s*\_s*X\|S\_s*[\|O\_s*m\_s*[\|}\_s*j\_s*\%(e\|X\_s*[g]\)\)\|\_s*\|\\_s*Z\_s*i\_s*\|\_s*\|\_s*`\|C\_s*\%(_\_s*\_s*S\|X\_s*p\_s*j\_s*A\|\_s*[\_s*\|G\_s*\)\|g\_s*\%(\|J\_s*b\_s*v\|\_s*\_s*\_s*\_s*\|\_s*\%(W\|a\_s*\_s*\_s*\)\)\|I\_s*\%([[]\|i\_s*[\|m\_s*\|\_s*t\_s*\_s*[\_s*\|l\_s*\%(X\_s*\%(g\|e\_s*B\)\|Q\_s*\)\|e\_s*\|\_s*K\_s*[\|}\_s*[\_s*W\_s*\)\|A\_s*\%(\_s*\%(\|x\_s*[\_s*\)\|l\_s*X\_s*g\|\_s*[\|_\_s*}\_s*[\_s*\|V\_s*F\_s*b\_s*g\|r\_s*^\_s*V\_s*I\_s*\|[\_s*\%(l\_s*X\_s*g\|m\_s*\_s*N\_s*[\_s*\)\)\|H\_s*\%([fsPeo]\|i\_s*m\_s*a\_s*n\_s*t\_s*a\_s*n\_s*d\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\|J\_s*b\_s*v\|T\_s*\%(M\_s*L\_s*t\_s*@\_s*C\_s*\|T\_s*P\_s*T\_s*[\_s*o\)\|D\_s*D\_s*\_s*R\_s*[\_s*_\_s*[\|u\_s*r\_s*d\|a\_s*\%(s\_s*s\_s*i\_s*u\_s*m\|f\_s*n\_s*i\_s*u\_s*m\|w\_s*a\_s*i\_s*i\)\|y\_s*\%(p\_s*e\_s*r\_s* \_s*T\_s*e\_s*x\_s*t\_s* \_s*M\_s*a\_s*r\_s*k\_s*u\_s*p\_s* \_s*L\_s*a\_s*n\_s*g\_s*u\_s*a\_s*g\_s*e\|d\_s*\%(n\_s*o\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\|r\_s*\%(a\_s*s\_s*t\_s*i\_s*d\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|o\_s*\%(s\_s*t\_s*a\_s*c\_s*h\_s*y\_s*d\_s*a\_s*l\_s*e\_s*s\|g\_s*e\_s*n\)\)\)\)\)\|G\_s*\%(f\_s*B\|\_s*\_s*P\|\_s*\%(i\|[\_s*k\)\|\_s*C\_s*[\_s*Y\|N\_s*g\_s*\|\_s*\%(Q\_s*\|\_s*F\|\_s*X\|}\_s*\|~\_s*\%(b\_s*g\|[\_s*g\)\|u\_s*\_s*\|i\_s*\_s*f\_s*X\|L\_s*\_s*[\_s*\)\|m\_s*N\|C\_s*`\|b\_s*`\)\|\_s*[╽f]\)', + \ 'i' : '\%([Ń~ꍘcTUn翔䑌폒恍ݍrxÉj囚|dQU|ƗBd{佈S\嫉䆍mnؐFAtF̌Ì䉳LdƜјJiꌒՕakvɔžo֍y󙬌ME|ځe퐈M臐YOΖZ}xא򌵉MՁO䗚P{bN~}zcct硉Ɏ䕟JsW]bK\Tซ]r䟈ZЛTmĈMßΉCm覉@BuAA܊jHڈΊֈYÈ1PyDIDR۔шዏܐRΔđP_ʈމ‘Ehe˗v֍s}وߐƈݟDᒒK֋҉]~˓шڏΗ͛HB܈횀}ՋU䏜SΉuЈ׈ۈӘߗǔ@bߏo؈Uw͉]ਖ看̈g؂XJzˁɂD灿hCIyi]\|E\_s*\_s*[\_s*\|a\_s*\|J\_s*u\_s*n\_s*c\_s*a\_s*l\_s*e\_s*s\|\_s*R\|c\_s*J\|\_s*\_s*\|c\_s*\|G\_s*s\|\\_s*Z\_s*\|Q\_s*q\|G\_s*\|\_s*\_s*\|\_s*\|\_s*\|\_s*\_s*\|N\_s*a\_s*j\_s*a\_s*d\_s*a\_s*l\_s*e\_s*s\|\_s*G\|\_s*\|\_s*t\_s*\|5\_s*[“]\|T\_s*[“]\|\_s*E\|r\_s*U\|\_s*\|\_s*Y\|\_s*[\|\_s*\_s*\|\_s*\|~\_s*\|{\_s*\|o\_s*\|\_s*g\|Y\_s*[q]\|@\_s*\|h\_s*[‘]\|U\_s*r\_s*t\_s*i\_s*c\_s*a\_s*l\_s*e\_s*s\|E\_s*[cR]\|P\_s*\%(o\_s*a\_s*l\_s*e\_s*s\|l\_s*u\_s*m\_s*b\_s*a\_s*g\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\)\|a\_s*\|C\_s*\|d\_s*\%(`\_s*r\_s*s\|u\_s*d\)\|w\_s*h\|\_s*\|]\_s*[햅oZ]\|\_s*\|K\_s*{\|\_s*q\|_\_s*\|\_s*r\_s*\|\_s*\_s*\|G\_s*\%(r\_s*a\_s*m\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\|l\_s*u\_s*m\_s*i\_s*f\_s*l\_s*o\_s*r\_s*a\_s*e\|i\_s*n\_s*k\_s*g\_s*o\_s*p\_s*s\_s*i\_s*d\_s*a\)\|\_s*\|r\_s*\|s\_s*\_s*\|o\_s*[E]\|\_s*[Wk]\|C\_s*[؎Q]\|\_s*\\|\_s*\_s*[ΒY]\|_\_s*F\|e\_s*\|p\_s*\%(\|g\_s*\)\|\_s*\_s*\|\_s*\|D\_s*i\_s*a\_s*p\_s*e\_s*n\_s*s\_s*i\_s*a\_s*l\_s*e\_s*s\|\_s*[ō]\|<\_s*=\_s*=\_s*>\|K\_s*v\_s*\\_s*\_s*\_s*\|\_s*\|\_s*{\_s*A\_s*C\_s*E\_s*r\_s*[\_s*E\_s*G\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\%(\_s*\_s*\_s*\_s*w\|W\_s*\_s*\_s*@\_s*\\)\|t\_s*\_s*U\_s*t\_s*[\_s*\_s*G\_s*\_s*\|\_s*\_s*q\|\_s*\_s*\|\_s*\_s*\|\_s*\|\_s*\_s*^\|\_s*\_s*\|\_s*\%(\_s*\|\_s*\)\|A\_s*[\_s*@\|\_s*\_s*\|s\_s*\%([”@]\|[\_s*\)\|\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*S\|I\_s*\%([rPn]\|R\_s*Q\|J\_s*b\_s*v\|C\_s*\%(^\_s*O\|`\_s*b\_s*v\|J\_s*[\_s*h\)\|l\_s*l\_s*i\_s*n\_s*o\_s*i\_s*s\|S\_s*\%(O\|B\_s*N\_s*\%(R\_s*[\_s*h\|\_s*\)\|A\_s*o\_s*X\)\|d\_s*a\_s*h\_s*o\|D\_s*\%(J\_s*[\_s*h\|E\_s*\%(h\_s*\_s*C\_s*u\|f\_s*o\_s*C\_s*X\|P\_s*[\_s*u\_s*\|R\_s*\_s*g\_s*\_s*[\_s*\)\)\|^\_s*[\_s*\|T\_s*\%(V\_s*X\_s*e\_s*\|o\_s*u\_s*\)\|o\_s*\%(w\_s*a\|d\_s*i\_s*n\_s*e\)\)\|\_s*\%(A\_s*\|V\_s*t\|[\_s*h\|E\_s*f\)\|A\_s*\%(C\|[\_s*\%(\_s*B\_s*\|r\_s*\)\|\_s*\%(v\_s*\_s*\_s*v\_s*\%(`\_s*\|e\_s*\)\|f\_s*p\_s*\_s*_\_s*\|t\_s*H\_s*\_s*\%(\_s*\|}\_s*e\_s*B\_s*[\_s*N\)\)\)\)', + \ 'j' : '\%([󓈓Ȟ펱ƎwxHÛKbHזiᶘu@vސnՉ`rxosqwptl䥞`œҏtJ珊RPtigYU{ㅐ媚ߘjhŘ竐ҝmYo@Ïꏗ`~]吷꞊󝵏휵hGڜGQ榏A@uQhxmnpq⢓ďmÏ|m՟~[x{䤏zy}汛}杆nG໒^E☸sF_`Oca_Y[]b\Zedꎠm䢛ykdHmˎ掝~Ŏn~Im熉a玘JȎqj^ZiVݒ䝎ڐ׋YҎl苂DuE`_FvzJWj]\|\_s*\_s*\|b\_s*W\|\_s*\|G\_s*\%(\_s*\|p\_s*\)\|Z\_s*\%(r\|i\_s*r\_s*c\_s*o\_s*n\_s*i\_s*u\_s*m\)\|D\_s*y\|f\_s*\%(\_s*\|p\_s*\)\|x\_s*x\|\_s*\|c\_s*\_s*\%(\_s*\|c\_s*\)\|Q\_s*\|2\_s*\|\_s*q\|b\_s*\_s*\_s*\_s*\_s*\_s*M\_s*h\_s*p\_s*\|k\_s*\$\_s*_\_s*{\_s*e\_s*f\_s*f\_s*}\_s*\$\|[\_s*\%(\|\_s*\)\|`\_s*\_s*\|\_s*\%(\|\_s*\)\|\_s*\|\_s*\|\_s*\|R\_s*l\|y\_s*_\|\_s*\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*r\_s*\|\_s*v\|\_s*\|\_s*\|\_s*\|\_s*[@S]\|C\_s*a\_s*b\_s*o\_s*m\_s*b\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|\_s*q\|\_s*\|P\_s*\%(Q\|O\_s*[i]\|P\_s*\|U\_s*i\|W\_s*\)\|t\_s*\|\_s*\|R\_s*\|1\_s*\%(0\|1\_s*\|8\_s*\|2\_s*\)\|\_s*\|\_s*\|\_s*\|\_s*\|O\_s*\_s*\|\_s*\|G\_s*\|\_s*\|\_s*q\|\_s*\_s*\_s*\_s*\|[\_s*\_s*[\|G\_s*\%(z\_s*o\|\_s*R\|\_s*~\_s*\|\_s*T\_s*\_s*\|b\_s*T\_s*C\)\|w\_s*\%(\_s*X\|X\_s*X\)\|q\_s*\_s*l\_s*X\|`\_s*Q\|k\_s*\_s*\_s*[\_s*\%(\|\_s*w\_s*Z\_s*p\_s*\_s*w\_s*@\_s*\_s*w\)\|n\_s*\%(C\_s*\|\_s*y\_s*[\_s*j\_s*\)\|\_s*\|\_s*\%([ji[]\|C\_s*\|G\_s*\|\_s*m\|\_s*h\|k\_s*\%(X\|V\_s*\)\|X\_s*p\_s*[\_s*X\|R\_s*[ru]\|b\_s*P\)\|t\_s*\%(@\_s*[i]\|\_s*[IA]\)\|J\_s*\%(R\_s*\_s*\_s*{\|\.\_s*S\_s*\.\_s*\%(B\_s*a\_s*c\_s*h\|o\_s*b\_s*n\)\|\_s*[\_s*O\|J\_s*b\_s*v\|C\_s*B\_s*J\_s*[\_s*h\|-\_s*P\_s*O\_s*P\||\_s*b\_s*v\|P\_s*\%(G\_s*t\_s*@\_s*C\_s*\|E\_s*G\_s*t\_s*@\_s*C\_s*\)\|I\_s*S\_s*\%(}\_s*[\_s*N\|R\_s*[\_s*h\)\|a\_s*p\_s*a\_s*n\_s* \_s*A\_s*d\_s*v\_s*a\_s*n\_s*c\_s*e\_s*d\_s* \_s*I\_s*n\_s*s\_s*t\_s*i\_s*t\_s*u\_s*t\_s*e\_s* \_s*o\_s*f\_s* \_s*S\_s*c\_s*i\_s*e\_s*n\_s*c\_s*e\_s* \_s*a\_s*n\_s*d\_s* \_s*T\_s*e\_s*c\_s*h\_s*n\_s*o\_s*l\_s*o\_s*g\_s*y\|A\_s*\%(I\_s*S\_s*T\|N\_s*R\_s*[\_s*h\|V\_s*A\_s*\%(X\_s*N\_s*\_s*v\_s*g\|A\_s*v\_s*\_s*b\_s*g\)\)\|U\_s*N\_s*E\_s*T\)\|Y\_s*{\_s*\|i\_s*\%(Q\||\_s*v\_s*`\_s*u\_s*d\|\_s*[\_s*O\|J\_s*b\_s*v\||\_s*b\_s*v\|h\_s*b\_s*b\_s*o\_s*\|\_s*\|t\_s*\%(r\|m\_s*j\_s*n\)\)\|\_s*\%([n_m]\|\_s*Q\_s*\|[\_s*\%([m]\|Q\_s*\_s*g\|f\_s*B\_s*b\_s*g\)\|\_s*\%(O\|P\_s*\|J\_s*[\)\|s\_s*e\_s*\|b\_s*[JV]\)\|C\_s*\%(G\_s*\%([iX]\|\_s*\%(X\|Z\_s*\)\|Y\_s*X\)\|F\_s*\%(i\|\_s*\%(X\|[\_s*\|Z\_s*\)\|[\_s*K\_s*[\|\_s*\%(N\|T\_s*\_s*\)\)\)\|z\_s*\%([^Z]\|\_s*w\|z\_s*o\|A\_s*\%(\|L\_s*\)\)\|\_s*\%([ui]\|\_s*\%(O\|_\_s*\)\|G\_s*\|A\_s*\%(L\_s*\|q\_s*\)\|[\_s*t\|V\_s*\%(t\|\_s*A\)\|[\_s*\%([hg]\|f\_s*\|[\_s*t\)\|Z\_s*t\|n\_s*[il]\)\)', + \ 'k' : '\%([a|VшҜDޏnsߐE}ĈۗᶎsДfꎖIzEꑍC欉䓚䢐uS}┍əY`nXMȜkύ卭ӍeW՝BLݖϙiҔQbm秘jtRK{M`肍ȎL琍fݚJkiQ硟LsJ𔸙lEHnr੘mt൙{XERn㝍h}HyߝK朑nK}֞\囍yෙΜˍxuXSe倘Ji^’@VAW썄GDTᩍ`p᧍B]iPIzt_kKOjRwUuPIa|qsmcDrJLޛܝw΍яWgVڐမZčᑆՙs|˙Zeq؝sZhⰍČٕ֒]eۏ㨏hןzÌП绌ꉍ烜ًÌnj΍@ux삱s|qWO׏b]{Ȍt_^晘PΘn[BӐKrK{yLC[N訙i٘_ݟ]ܜpwٝ惞JJʌ㮛ӌ@ęF鄌Ōښ_犙gDϞfZwcl|lkal㋜dPnrz壌u殌ek\gbYp]v[ٖяRƔzzMKɞⱟJ㖍򍥛IHEbzoxAܗDBӏ~B䱌sZYᯙӞᮛMֈvڌLK@{^Z򏾓^č㦖鶔ňʈUÑqC~ܒwo^鿌~GF䇚`p̃LYƌIގԚPMEu{OoӞcmċᙊHM῍C​晠Jv͎ތɜgˍgHܜ|E؂iwJGrzW__loC∋̛mG摋d򐟏~焌N۟@A^ϛlɝhhfkeid_AZ߁DO񁣁MQGE^|PXYT\N{HRcaKSLB}b܁C⁃IJʁ][䁏FɁWVWUsה܍@ߍXan݋j~gˋR⮝vv[⯙ߋazҝЋی׋؋ы͋ՋӋϋދًԋߋ֋_⦉R䐘c`篋ыNj蝋⟙K s㳝OvwSy⸋t|^vOtI[h➍FpZig݌xZNj]䰚񋧋o運dqkpt瓜_溈ڂX}緋kËuyZ|Pl{vux~}z֘Ғڙr㱋FMNP؋BYyqVHP鉩Y{dO恊kɋLƚ_ΚGhUȝM針iDʞXMJkE˝Ib_J㙒BCb쟃auQWQXqScߟDWP^Hru看RuK鞗yNJr݊jƌyĈꁽeAiMꝕrPTMvrᚁfjsehoqgptrƒb鹜NJDRUğdzᥕpȌڋAԎ‹_雔Bߗދȋ\Ίۖ͋wdTezJxŌ`ӕ^ȔHXRCPqŠ閔@ϞJ{艁嶔㹊|ؙ^歒Se顊j舊sFጐdP}gya`fSWmeOݑ]ڛ̊Ŕ@쁨FOkP[\铑ಉGh@󓂞Њ~yۍ\}ɐ͘V،~ऐc͌buwvxXÕLꖊCƓKGSR魓CЈߕKv֓S哑tݓk䡞S湝誜vᙊdn]QLڒI跏ʜh\frlymznkkgcstio݉BvdߝjlgqupmGd觛Z嵙j珚ԘBiWqr[~D䠊^񔐘\X{Ž\箊IؘrH_j~_F׊@EmLGDŊAKJC`՚QɟIW錟a檚A洚jbaYホe⻞䯙qT㻛fpN㼝c㣟V뙁Mϊ䅟jFrȟ綝mlb˙_xpᒔcAg|}ۊ@يΞ؊󊩐ȊҊ@ʊŞ̊ɊƜAL萊ъš^׊ĊÊԊՊNJ֊͊ϊwxsqPgӊehӏՉɉՉ܃`͉ތF㞉S˚ZQ草ؚm׊]͉ی嗉eDvqҎxT|~o戟ω̉ߍю딃̉ƞg`ϙ֑dUݙJƎa͉ۉяÚКk旓zЊ|䑉嘉㟉qČCa{斎؉҉ǟϛ◉Ή։l߄VR`iKN~qȃLJK{ԃPk]\|\_s*[]\|b\_s*[RPNLJ]\|\_s*[q]\|O\_s*\|\_s*\|\_s*\_s*\|\_s*J\|H\_s*\|\_s*\_s*\|\_s*\|\_s*y\|\_s*F\|\_s*\|\_s*\|S\_s*\|M\_s*e\_s*t\_s*a\_s*c\_s*h\_s*l\_s*a\_s*m\_s*y\_s*d\_s*e\_s*a\_s*e\|f\_s*o\_s*o\_s*t\_s* \_s*a\_s*n\_s*d\_s* \_s*m\_s*o\_s*u\_s*s\_s*e\_s* \_s*d\_s*i\_s*s\_s*e\_s*a\_s*s\_s*e\|O\_s*A\_s*\|\_s*u\|\_s*\|\_s*\|S\_s*i\|\_s*\|S\_s*[Z]\|9\_s*[]\|^\_s*{\|Q\_s*O\|\_s*\|\_s*|\|T\_s*\_s*\|L\_s*a\_s*u\_s*r\_s*\%(a\_s*c\_s*e\_s*a\_s*e\|o\_s*i\_s*d\_s*e\_s*a\_s*e\)\|T\_s*\|\_s*\|c\_s*r\_s*e\_s*s\_s*c\|\_s*\_s*\|H\_s*e\_s*l\_s*l\_s*e\_s*b\_s*o\_s*r\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|J\_s*u\_s*g\_s*l\_s*a\_s*n\_s*d\_s*a\_s*l\_s*e\_s*s\|Z\_s*\|n\_s*_\|s\_s*q\|B\_s*\|z\_s*n\|\_s*[qV]\|\_s*\|m\_s*F\|\\_s*\|\_s*\_s*\|X\_s*e\|@\_s*\|\_s*s\|\_s*\|f\_s*n\|\_s*\|\_s*z\|G\_s*o\_s*l\_s*d\|A\_s*\%(u\|r\_s*c\_s*h\_s*i\_s*c\_s*h\_s*l\_s*a\_s*m\_s*y\_s*d\_s*e\_s*a\_s*e\|s\_s*t\_s*e\_s*r\_s*a\_s*l\_s*e\_s*s\|c\_s*a\_s*n\_s*t\_s*h\_s*a\_s*c\_s*e\_s*a\_s*e\)\|\_s*\_s*\|\_s*\|R\_s*\%(h\_s*\%(o\_s*e\_s*a\_s*d\_s*a\_s*l\_s*e\_s*s\|a\_s*m\_s*n\_s*a\_s*l\_s*e\_s*s\)\|u\_s*n\_s*u\_s*n\_s*c\_s*u\_s*l\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|a\_s*n\_s*\%(u\_s*n\_s*c\_s*u\_s*l\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|a\_s*l\_s*e\_s*s\)\)\|\_s*\|e\_s*[]\|o\_s*[]\|j\_s*[]\|{\_s*\|n\_s*\|X\_s*\%([]\|\_s*\)\|\_s*\|\_s*Z\|\_s*q\|\_s*T\|\_s*\|z\_s*\|\_s*x\|R\_s*\%(\_s*q\|z\_s*\)\|j\_s*\|\_s*\_s*\_s*\|}\_s*\|\_s*\%(\|`\_s*\)\|\_s*\|\_s*[]\|\_s*\|V\_s*\%(\|l\_s*\)\|\_s*q\||\_s*\_s*\|O\_s*x\_s*a\_s*l\_s*i\_s*d\_s*a\_s*c\_s*e\_s*a\_s*e\|\_s*\|t\_s*\|\_s*r\|\_s*Z\||\_s*\|]\_s*\|\\_s*\|\_s*\|\_s*q\_s*\|\_s*[ay]\|\_s*\|\_s*\|E\_s*\%(b\_s*e\_s*n\_s*a\_s*l\_s*e\_s*s\|l\_s*a\_s*n\_s*a\_s*l\_s*e\_s*s\)\|\_s*R\_s*q\|\_s*\|\_s*\|\_s*\|y\_s*\|A\_s*g\|g\_s*\|\_s*t\_s*\|C\_s*\%([ormdaf]\|h\_s*r\_s*o\_s*m\_s*i\_s*u\_s*m\|i\_s*r\_s*c\_s*a\_s*e\_s*a\_s*s\_s*t\_s*e\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\|u\_s*r\_s*i\_s*u\_s*m\|e\_s*r\_s*c\_s*i\_s*d\_s*i\_s*p\_s*h\_s*y\_s*l\_s*l\_s*a\_s*c\_s*e\_s*a\_s*e\|y\_s*p\_s*e\_s*r\_s*a\_s*l\_s*e\_s*s\)\|\_s*\%(\|q\_s*\)\|\_s*\|\_s*\|Z\_s*\%(c\|C\_s*\)\|\_s*\|\_s*[{v]\|\_s*\%(\|\_s*s\_s*\_s*\_s*w\_s*Z\_s*p\_s*\_s*w\)\|(\_s*\_s*)\|\_s*q\|\_s*\_s*\|\_s*\|\_s*\|m\_s*\%(\|\_s*\)\|~\_s*\_s*\|o\_s*c\|Y\_s*t\|\_s*[Iv_]\|\_s*_\|B\_s*\|T\_s*\%(h\_s*a\_s*l\_s*i\_s*c\_s*t\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|u\_s*b\_s*i\_s*f\_s*l\_s*o\_s*r\_s*a\_s*e\)\|m\_s*\%([uE]\|[\_s*\|b\_s*\%([gN]\|e\_s*B\_s*\_s*O\|J\_s*[\|L\_s*\_s*O\)\)\|i\_s*\%(b\_s*\%(N\|v\_s*\%(T\_s*b\_s*N\|U\_s*b\_s*N\)\)\|\_s*b\_s*W\|C\_s*[tgc]\)\|j\_s*\%([\|b\_s*\%(g\|e\_s*B\_s*\_s*O\)\)\|z\_s*\%([\_s*\%(~\_s*[\|\_s*C\)\|\_s*C\_s*j\)\|t\_s*\%(r\_s*\_s*C\|\_s*V\_s*`\_s*\_s*t\)\|n\_s*\%(\|\_s*V\_s*\_s*[\|[\_s*\|o\_s*\_s*t\_s*X\_s*N\|\_s*c\_s*[\_s*\|`\_s*\_s*g\_s*D\_s*\_s*A\_s*\)\|j\_s*\%([_]\|J\_s*b\_s*v\|\_s*\_s*\_s*\_s*n\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\)\|P\_s*\%(i\_s*p\_s*e\_s*r\_s*a\_s*\%(l\_s*e\_s*s\|c\_s*e\_s*a\_s*e\)\|a\_s*p\_s*a\_s*v\_s*e\_s*r\_s*a\_s*l\_s*e\_s*s\|o\_s*\%(d\_s*o\_s*s\_s*t\_s*e\_s*m\_s*o\_s*n\_s*a\_s*l\_s*e\_s*s\|t\_s*a\_s*s\_s*s\_s*i\_s*u\_s*m\)\)\)', + \ 'l' : '\%([HFDB@ႌQP΁Ɂʁ́ȃLɄ|l]\|\_s*[]\|b\_s*[HFDB@]\|\_s*[]\|t\_s*\|\_s*\_s*2\_s*\_s*@\|\.\_s*\.\_s*\.\|f\_s*F\|\_s*z\|\_s*\|E\_s*G\|\_s*\|w\_s*K\|{\_s*\|\_s*\|_\_s*\|\_s*\%([LCAu{gEXRSO[]\|y\_s*X\|\_s*[\_s*\|G\_s*x\|\_s*\|t\_s*g\|\_s*J\|x\_s*\_s*A\|r\_s*\%([\|\_s*O\|C\_s*\%(X\_s*g\|\_s*O\)\)\|e\_s*B\|T\_s*\_s*\%(W\_s*F\_s*\_s*X\|[\_s*\_s*X\)\|j\_s*[\|N\_s*\_s*A\_s*\|b\_s*\%([W^egN]\|L\_s*\%(\_s*O\|[\_s*h\)\|J\_s*[\)\|P\_s*[\_s*\%([g^]\|V\_s*\_s*\)\|J\_s*[\_s*\|K\_s*[\|M\_s*\_s*O\|W\_s*\%([\|e\_s*b\_s*N\|X\_s*e\_s*B\_s*\%(N\|b\_s*N\)\|J\_s*\|N\_s*[\_s*\|b\_s*[gN]\)\|\_s*\|\_s*\%([SO_]\|{\_s*\%(N\|b\_s*N\)\|o\_s*\_s*f\_s*B\|Y\_s*f\_s*[\_s*\|\_s*[[B]\|W\_s*\|h\_s*\)\|\_s*\%(A\_s*\|b\_s*^\|[\_s*k\|C\_s*\|\_s*\%([\X]\|c\_s*H\)\)\)\|\\\_s*L\_s*a\_s*T\_s*e\_s*X\|k\_s*\%(T\_s*C\_s*Y\|k\_s*T\_s*C\_s*Y\|t\_s*m\_s*`\|\_s*\%(\_s*\|\_s*\%(\_s*\|\_s*\)\)\|\_s*\%(\_s*\|\_s*\|\_s*\)\|\_s*\_s*\|A\_s*s\_s*E\_s*w\|\_s*\%(\_s*\_s*\_s*\|s\_s*\_s*w\|\_s*\_s*\_s*v\_s*\_s*\_s*\_s*\_s*\)\)\|L\_s*\%([DP]\|T\_s*C\_s*Y\|L\_s*T\_s*C\_s*Y\|u\_s*\%(t\_s*e\_s*t\_s*i\_s*u\_s*m\|c\_s*i\_s*d\)\|i\_s*\%(t\_s*h\_s*i\_s*u\_s*m\|s\_s*p\|n\_s*u\_s*x\)\|E\_s*D\_s*\_s*C\_s*g\|e\_s*m\_s*m\_s*a\|o\_s*\%(g\_s*i\_s*c\_s*a\_s*l\_s* \_s*U\_s*n\_s*i\_s*t\_s* \_s*N\_s*u\_s*m\_s*b\_s*e\_s*r\|u\_s*i\_s*s\_s*i\_s*a\_s*n\_s*a\)\|a\_s*\%(w\_s*r\_s*e\_s*n\_s*c\_s*i\_s*u\_s*m\|n\_s*t\_s*h\_s*a\_s*n\_s*u\_s*m\|T\_s*e\_s*X\)\|A\_s*N\)\|\_s*\_s*\|\_s*\%([BZYUTX_|}imkuA[]\|\_s*}\|\_s*h\_s*\|\_s*\|]\_s*`\_s*[\_s*\|R\_s*\%(\_s*X\|s\_s*\)\|N\_s*[\_s*h\|J\_s*\%([\|I\_s*\)\|W\_s*[[]\|f\_s*[B]\|h\_s*J\_s*C\_s*\|v\_s*g\_s*\|p\_s*[\_s*[\|O\_s*\%(j\_s*\|i\_s*\)\|t\_s*\%([Gg]\|^\_s*[\|e\_s*B\_s*\_s*O\)\|e\_s*\_s*[V]\|`\_s*E\_s*\|\\_s*\%(\\_s*[\_s*\|O\_s*\_s*t\_s*B\)\|^\_s*[\|g\_s*\%([]\|}\_s*X\|A\_s*j\_s*A\|O\_s*\_s*t\|o\_s*\_s*X\_s*L\_s*[\)\|I\_s*\%(^\_s*[\_s*\|l\_s*\)\|~\_s*\%(e\_s*b\_s*h\|b\_s*[^g]\)\|\_s*\%([\_s*W\_s*\|l\_s*\|\_s*`\_s*F\_s*b\_s*\)\|\_s*W\_s*\|L\_s*\%(b\_s*h\|\_s*[\_s*\|e\_s*\_s*\%(V\_s*\_s*^\_s*C\_s*\|X\_s*^\_s*C\_s*\)\)\|G\_s*\%(]\_s*\|[\_s*W\_s*\)\|q\_s*e\_s*\_s*V\_s*\_s*^\_s*C\_s*\|l\_s*\%([A]\|b\_s*g\|[\_s*W\_s*\)\|j\_s*A\|x\_s*\%([]\|\_s*A\|\_s*[\_s*V\_s*\_s*\|\_s*e\)\|r\_s*\%([A[]\|h\_s*[\|\_s*O\)\|\_s*\%([X[]\|u\_s*\_s*\_s*[\_s*i\|\_s*\|h\_s*~\_s*\|N\_s*T\_s*\_s*u\_s*[\_s*\|b\_s*N\|V\_s*A\_s*\|~\_s*G\_s*[\_s*\)\|\_s*\%(C\|\_s*O\_s*E\_s*F\)\|\_s*\%(B\_s*\_s*O\_s*X\_s*g\_s*\|@\_s*\%(v\_s*[\_s*\|C\_s*A\_s*T\_s*\)\)\|o\_s*\%(e\_s*B\|^\_s*\_s*A\_s*\%(\|j\_s*Y\_s*\)\|v\_s*[\_s*\|C\_s*A\_s*T\_s*\)\|b\_s*\%([hsv^N`g]\|X\_s*\)\)\|G\_s*\)', + \ 'm' : '\%([ӊߊ㝪ϙ~EぞJI䈐ЎtuqvUpݑmXޖ\ҕ~⋖̜߉bf{eҖ۟͟G㦖̞NaCS֖іЖҖԘR֖]rRᑔȖ̞kGۖΖݒWϏږӛRㅖG̜bpcᾖɖ˖ǖȖʟœҖǖ‰ɏz܌ї㸋Xٟ}ۖV񛘊[|rm籑ΕS}Ɠ絘AWp~׏@d⚕ړkJ⥐Ißz峒Úٖۖdx딍ZQxNaDYKICTϗΗXO̎SZBꎨݜDXL薦ޑÒفvp󁨁zxEG⊖ɗΔFaϓrʘH飌ΎM倐ᡞ䪖s{SAQ`捐vP閨{F[Vg\όȐfŖmO[pr향ϖ▕naῐݐ\ן{fB坏㇓㕓I帑]^ߋ[]HoqhƉMϔdhqʌږp鞔C䍕̓h|{Ê׈welCdꠖqxfUXOEDKBji~ەבSuҖKĎQwĘdG簖aږ_JZՖ攔{VԔћIԙ\ݖޖGM挫D󏫐m_䝖ڐɎU]v^nvGݕᄎTҔdԖsȖ܂򃀁⁆܁}́Ɂ䃢ʁˁہ΁ځȁ́߁~݁まށ֖Z|}Ń~Mʃm]\|\_s*[]\|b\_s*[~}]\|\_s*[߂ނ݂]\|g\_s*[t]\|o\_s*\%([ne]\|\_s*\|\_s*\)\|\_s*o\|\_s*y\_s*\%(\|\_s*\)\|\_s*\%([pen]\|\_s*\)\|\_s*\|\_s*\|\_s*\|\_s*z\_s*\|k\_s*~\_s*\|\_s*\|\_s*p\|\_s*\|\_s*\_s*\|O\_s*l\_s*e\_s*a\_s*l\_s*e\_s*s\|\_s*R\|\_s*\_s*\|j\_s*E\|\_s*\|\_s*[N]\|n\_s*\_s*F\|t\_s*\|J\_s*\_s*\|v\_s*w\|\_s*\|z\_s*\_s*q\|v\_s*\%([pL]\|`\_s*\|H\_s*q\)\|\_s*\|U\_s*\|6\_s*\|\_s*c\|\_s*w\|\_s*\|\_s*]\_s*q\|\_s*n\|B\_s*\%(e\_s*r\_s*b\_s*e\_s*r\_s*i\_s*d\_s*a\_s*c\_s*e\_s*a\_s*e\|i\_s*o\_s*r\_s*r\_s*a\_s*g\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\)\|Y\_s*\|\_s*q\|k\_s*\$\_s*_\_s*{\_s*i\_s*n\_s*f\_s*}\_s*\$\|t\_s*m\|A\_s*\%(b\_s*i\_s*e\_s*s\|p\_s*e\_s*t\_s*a\_s*l\_s*a\_s*e\|c\_s*r\_s*o\_s*s\_s*t\_s*i\_s*c\_s*h\_s*u\_s*m\)\|R\_s*\|\_s*\|e\_s*\|_\_s*[q`]\|d\_s*\|\_s*\|\_s*\|c\_s*[q]\|R\_s*[“]\|3\_s*[“]\|p\_s*[q]\|\_s*\|\_s*\|c\_s*\|C\_s*[_]zIR]\|P\_s*o\_s*d\_s*o\_s*p\_s*h\_s*y\_s*l\_s*l\_s*a\_s*c\_s*e\_s*a\_s*e\|y\_s*[Y]\|\_s*s\|[\_s*]\|\_s*\|\_s*\|e\_s*O\|R\_s*u\_s*t\_s*a\_s*l\_s*e\_s*s\|s\_s*\%(\|\_s*[]_]\)\|\_s*l\_s*}\_s*\_s*m\_s*X\|\_s*X\|\_s*\|\_s*\|\_s*\|\_s*[XЌ]\|\_s*\|S\_s*\|\_s*\|\_s*h\|\_s*\|\_s*\_s*\|{\_s*B\|\_s*v\|\_s*[o]\|\_s*\|}\_s*n\|L\_s*o\_s*g\_s*a\_s*n\_s*i\_s*a\_s*c\_s*e\_s*a\_s*e\|\_s*\|\_s*b\|\_s*m\|S\_s*\%(a\_s*p\_s*i\_s*n\_s*d\_s*a\_s*l\_s*e\_s*s\|c\_s*h\_s*i\_s*s\_s*a\_s*n\_s*d\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\)\|C\_s*\%(a\_s*s\_s*u\_s*a\_s*r\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\|e\_s*r\_s*a\_s*t\_s*o\_s*p\_s*y\_s*l\_s*l\_s*a\_s*c\_s*e\_s*a\_s*e\)\||\_s*\%(\_s*l\|\_s*\)\|H\_s*a\_s*m\_s*a\_s*m\_s*e\_s*l\_s*i\_s*d\_s*a\_s*l\_s*e\_s*s\|\_s*[V]\|\_s*F\|S\_s*j\|\_s*q\|\_s*[P]\|\_s*\_s*N\|\_s*v\|\_s*\_s*\_s*\|j\_s*[\_s*\_s*j\_s*b\_s*N\|P\_s*\_s*\|\_s*c\|a\_s*z\_s*[]\|\_s*\_s*q\|\_s*\_s*]\|s\_s*[K]\|\_s*\|\_s*\%(\_s*\_s*\_s*h\_s*q\_s*\_s*\_s*\_s*\|{\_s*\)\|l\_s*\%(g\_s*\|T\_s*C\_s*Y\|r\_s*|\_s*c\_s*n\_s*r\|k\_s*T\_s*C\_s*Y\|\_s*D\|\_s*\_s*\|\_s*b\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\|\_s*\)\|v\_s*Z\_s*@\|\_s*\|U\_s*b\_s*w\_s*\_s*\_s*}\_s*]\_s*b\_s*z\|n\_s*s\_s*I\_s*\_s*\|\_s*s\_s*\%(\_s*\_s*\|\_s*\)\|C\_s*m\|\_s*\|\_s*\|M\_s*\%([dgtnOo]\|X\_s*e\_s*\_s*r\|T\_s*C\_s*Y\|S\_s*-\_s*D\_s*O\_s*S\|L\_s*T\_s*C\_s*Y\|P\_s*3\_s*v\_s*\_s*\%([\_s*\_s*[\|C\_s*\_s*[\)\|D\_s*\%(v\_s*\_s*[\_s*\_s*[\|\_s*R\_s*[\_s*_\_s*[\)\|c\_s*C\_s*a\_s*r\_s*t\_s*h\_s*y\|e\_s*\%(d\_s*u\_s*s\_s*a\_s*n\_s*d\_s*r\_s*a\_s*l\_s*e\_s*s\|i\_s*t\_s*n\_s*e\_s*r\_s*i\_s*u\_s*m\|t\_s*a\_s*F\_s*o\_s*n\_s*t\|n\_s*\%(y\_s*a\_s*n\_s*t\_s*h\_s*a\_s*l\_s*e\_s*s\|d\_s*e\_s*l\_s*e\_s*v\_s*i\_s*u\_s*m\)\|C\_s*a\_s*b\)\|u\_s*l\_s*e\|A\_s*C\_s*A\_s*h\_s*\_s*X\|a\_s*\%(g\_s*n\_s*\%(o\_s*l\_s*i\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|e\_s*s\_s*i\_s*u\_s*m\)\|n\_s*\%(u\_s*\%(e\_s*d\|s\_s*c\_s*r\_s*i\_s*p\_s*t\_s* \_s*E\_s*d\_s*i\_s*t\_s*i\_s*n\_s*g\)\|g\_s*a\_s*n\_s*e\_s*s\_s*e\)\|r\_s*y\_s*l\_s*a\_s*n\_s*d\|i\_s*n\_s*e\|k\_s*e\_s*f\_s*i\_s*l\_s*e\|c\_s*\%(h\|i\_s*n\_s*t\_s*o\_s*s\_s*h\)\|s\_s*\%(s\_s*a\_s*c\_s*h\_s*u\_s*s\_s*e\_s*t\_s*t\_s*s\|t\_s*e\_s*r\_s*C\_s*a\_s*r\_s*d\)\)\|i\_s*\%(n\_s*n\_s*e\_s*s\_s*o\_s*t\_s*a\|s\_s*s\_s*\%(i\_s*s\_s*s\_s*i\_s*p\_s*p\_s*i\|o\_s*u\_s*r\_s*i\)\|c\_s*\%(r\_s*o\_s* \_s*S\_s*o\_s*f\_s*t\_s*w\_s*a\_s*r\_s*e\_s* \_s*A\_s*s\_s*s\_s*o\_s*c\_s*i\_s*a\_s*t\_s*e\_s*s\|h\_s*i\_s*g\_s*a\_s*n\)\)\|I\_s*\%(T\|P\_s*S\|M\_s*D\)\)\|G\_s*\)', + \ 'n' : '\%([݃ɈҘjC򝼏MlAjfwaXHpLH]`kc䊉ѓoўو풨{EJ돸W@Ћ錛KNXI͓TGcIX^]\_L|ZޟZڔV۔UqWȚˑ_oDE^JCꋑlXLisM൘JKR_QORNQqPHחlBSI\啼KL刐@zXޓF܍fzDѝU{zhGEƝ^吒SLERP{e֏AEUД@PEɔB轟WtswxZXKוfnE͔DFCl׋ѐV_am玘ƓQ2Oǎ獂rW㊓ckj›DTlSVQeowԎPYg粓Q^垙ĎC鼉YّӓHay[ÓܗmGXƖČ`Ɖrဗvᑶiax܏AE}VΎ̔TRf펢josϗoˁK菦baenߖ‹יTrؓޟ[~֓△Lྒྷ⍋PS\Ȅޖjlʁ`ikm~˃Nn]\|\_s*\|\_s*q\|\_s*\|x\_s*U\|\_s*\_s*\|\_s*\_s*\|T\_s*[|]\|\_s*C\|t\_s*\|g\_s*[C]\|j\_s*[]\|\_s*]\|L\_s*\|\_s*\|\_s*q\|\_s*[@q]\|P\_s*q\|F\_s*q\|\_s*\_s*\|h\_s*V\|q\_s*|\|\_s*\_s*\|\_s*\_s*\|m\_s*\|\_s*\|\_s*\|\_s*\|\_s*]\_s*q\|_\_s*\|\_s*P\|I\_s*I\_s*\|^\_s*\|\_s*\|\_s*\|M\_s*y\_s*r\_s*i\_s*s\_s*t\_s*i\_s*c\_s*a\_s*c\_s*e\_s*a\_s*e\|\_s*\|\_s*\%(f\|\_s*\)\||\_s*\|\_s*|\|\_s*T\|s\_s*[]\|L\_s*e\_s*a\_s*d\|P\_s*b\|C\_s*[ۑl]\|C\_s*\%(e\_s*l\_s*a\_s*s\_s*t\_s*r\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|a\_s*r\_s*y\_s*o\_s*p\_s*h\_s*y\_s*l\_s*l\_s*a\_s*l\_s*e\_s*s\)\|\_s*\|\_s*\%(\_s*\|\_s*\)\||\_s*\_s*\|7\_s*[]\|\_s*\|n\_s*k\|\_s*\|s\_s*\|\_s*\_s*X\_s*g\|T\_s*h\_s*e\_s* \_s*N\_s*e\_s*t\_s*w\_s*o\_s*r\_s*k\_s* \_s*I\_s*n\_s*f\_s*o\_s*r\_s*m\_s*a\_s*t\_s*i\_s*o\_s*n\_s* \_s*C\_s*e\_s*n\_s*t\_s*e\_s*r\|S\_s*o\_s*\%(l\_s*a\_s*n\_s*a\_s*l\_s*e\_s*s\|d\_s*i\_s*u\_s*m\)\|R\_s*\|t\_s*H\_s*\_s*E\_s*m\_s*C\_s*}\_s*\|\_s*[\_s*m\_s*b\_s*V\_s*\_s*E\_s*t\_s*H\_s*\_s*E\_s*m\_s*C\_s*}\_s*\|I\_s*\_s*\_s*_\|A\_s*\_s*\_s*J\_s*l\_s*b\_s*g\_s*\_s*[\_s*N\|\_s*\|\_s*_\|m\_s*\%([_n]\|N\_s*B\_s*[\_s*\|\.\_s*x\_s*\.\|h\_s*e\_s*s\_s*x\|\_s*\_s*\_s*\|\_s*\%(\_s*\|\_s*\_s*\_s*\)\|\_s*\%(w\_s*s\|\_s*\_s*\_s*\|\_s*|\_s*i\_s*\_s*\_s*\_s*\_s*\|v\_s*r\|\_s*\_s*\_s*\)\|d\_s*\%(\_s*\_s*\_s*\|s\_s*\_s*\_s*\_s*\)\|\_s*\%(D\|v\_s*\)\)\|\_s*z\_s*\|\_s*\|\_s*\|G\_s*k\|N\_s*\%([dpbaeoi]\|R\_s*Z\_s*I\|-\_s*g\_s*r\_s*a\_s*m\|G\_s*\_s*[\_s*h\|H\_s*K\_s*\%(z\_s*[\_s*\|\_s*W\_s*I\)\|T\_s*T\|Y\_s*_\_s*E\|U\_s*L\_s*L\|A\_s*S\_s*A\|E\_s*\%(C\|p\_s*o\_s*c\_s*h\|m\_s*a\_s*c\_s*s\)\)\|\_s*f\)', + \ 'o' : '\%([ݐbSMoNOÌQjwdЊdYnnx遒ssና{≬LݜڏP񜁈؋y߁RUVWTSXy􋳙{E⫝e}tcC筞[҉x^拑`qsN`ƛˊxubBdeȊe퐊Kȉ򚙊aCO݈җ㱕zv\dʋUK{|SwD}Ҝig^][aQ_NRVMן^qr誉SB蜊׉ʉꉂWWTgEcTٖQPѕ}ʼn|؏N~֏斃E戳[ODLjuѐܘNYYǘVjvĔɚjIɂ偝a􁾁ɊJփOḮo]\|\_s*\_s*\_s*\|\_s*p\|\_s*u\|\\_s*\_s*\|S\_s*\|C\_s*\_s*C\_s*\|\_s*\|\_s*@\|\_s*\|\_s*\_s*\|\_s*\|n\_s*\|\_s*\|\_s*\|\_s*[]\|\_s*\|\_s*\|T\_s*[]\|\_s*[q]\|f\_s*[]\|\_s*[]\|H\_s*\|\_s*\|\_s*C\|D\_s*i\_s*l\_s*l\_s*e\_s*n\_s*i\_s*a\_s*l\_s*e\_s*s\|G\_s*u\_s*t\_s*t\_s*i\_s*f\_s*e\_s*r\_s*a\_s*l\_s*e\_s*s\|H\_s*y\_s*p\_s*e\_s*r\_s*i\_s*c\_s*a\_s*l\_s*e\_s*s\|\_s*\|\_s*p\|\_s*[q]\|\_s*N\_s*\|{\_s*\_s*\|\_s*\|\_s*b\|A\_s*l\_s*i\_s*s\_s*m\_s*a\_s*t\_s*a\_s*l\_s*e\_s*s\|K\_s*\|\_s*l\|\_s*c\|C\_s*o\_s*p\_s*t\_s*i\_s*d\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|o\_s*\_s*U\_s*\%(\|\_s*\)\|\_s*m\|\_s*\|\_s*]\|\_s*g\|\_s*\|\_s*\_s*\_s*P\|A\_s*[zn]\|\_s*[H]\|}\_s*\|\_s*F\|w\_s*n\_s*}\|\_s*\|z\_s*[iqmx]\|\_s*\|c\_s*[_]\|\_s*O\|]\_s*c\_s*[ꕃ]\|\_s*[~C]\|\_s*\%(c\|\_s*\_s*\|\_s*V\_s*c\)\|\_s*\|\_s*[G]\|\_s*\_s*\|\_s*m\_s*\_s*\_s*\_s*\_s*\.\|G\_s*[]\|t\_s*h\_s*e\_s* \_s*O\_s*b\_s*j\_s*e\_s*c\_s*t\_s* \_s*M\_s*a\_s*n\_s*a\_s*g\_s*e\_s*m\_s*e\_s*n\_s*t\_s* \_s*G\_s*r\_s*o\_s*u\_s*p\|\_s*\_s*d\_s*@\|E\_s*\|\_s*~\|E\_s*\%(B\|[\_s*\%(Y\|\_s*\)\|\_s*{\_s*\_s*X\)\|o\_s*\|A\_s*\%(\|U\_s*[\|E\_s*\%([`g]\|^\_s*[\)\)\|\_s*{\_s*\\_s*t\_s*g\_s*E\_s*F\_s*A\|\_s*\%(\_s*[N]\|\_s*\)\|\_s*\|\_s*\_s*\|_\_s*\_s*a\|\_s*\_s*\|\_s*\_s*_\_s*f\_s*j\_s*\_s*\|`\_s*\_s*\|\_s*K\_s*\|n\_s*\%([r^]\|q\_s*d\|\.\_s*j\_s*\.\|r\_s*X\|\_s*\_s*O\|\_s*\_s*\_s*\%(k\_s*\_s*\_s*\|v\_s*\_s*\_s*\_s*\_s*\_s*\)\)\|\_s*\|\_s*Z\_s*q\|\_s*\|_\_s*f\|O\_s*\%([^rsS]\|h\_s*i\_s*o\|k\_s*l\_s*a\_s*h\_s*o\_s*m\_s*a\|b\_s*j\_s*e\_s*c\_s*t\_s*-\_s*O\_s*r\_s*i\_s*e\_s*n\_s*t\_s*e\_s*d\|O\_s*\%(D\_s*L\|P\_s*L\)\|M\_s*R\_s*O\_s*N\|A\_s*N\_s*\_s*[\_s*i\_s*[\|C\_s*R\_s*\\_s*t\_s*g\|r\_s*e\_s*g\_s*o\_s*n\|''\_s*R\_s*e\_s*i\_s*l\_s*l\_s*y\_s* \_s*J\_s*a\_s*p\_s*a\_s*n\|\_s*\_s*O\|p\_s*e\_s*n\_s*W\_s*i\_s*n\_s*d\_s*o\_s*w\|x\_s*y\_s*g\_s*e\_s*n\)\)', + \ 'p' : '\%([BC@{s܂ەy~粕ҕ糕ӕՕћؕzCߕ[UiᢑpoǕś”ƕstuzvdgjHςՃҁ}{ՃӃkD_Ev|Łji݁aypP΃sp]\|\_s*\%(\_s*\|\_s*\|\_s*\|\_s*\|\_s*\)\|b\_s*[|yvsp]\|\_s*[ۂ؂Ղ҂]\|\_s*\|\_s*l\_s*\|\_s*\|O\_s*[ID]\|\_s*\|\_s*R\|\_s*D\_s*\|\_s*\|\_s*`\|\_s*\|\_s*\|\_s*q\|b\_s*\%(\|\_s*n\)\|S\_s*y\_s*n\_s*a\_s*n\_s*t\_s*h\_s*a\_s*e\|C\_s*y\_s*c\_s*l\_s*a\_s*n\_s*t\_s*h\_s*a\_s*l\_s*e\_s*s\|r\_s*\|B\_s*r\_s*o\_s*m\_s*e\_s*l\_s*i\_s*a\_s*l\_s*e\_s*s\|L\_s*e\_s*a\_s*d\|\_s*[Ž]\|V\_s*\%(\_s*[\_s*h\|\_s*V\_s*r\_s*\)\|T\_s*\%([\_s*\|C\_s*\%([YNPR]\|\_s*V\_s*r\_s*\|\_s*E\_s*\|L\_s*b\_s*N\)\)\|+\_s*\|z\_s*\%(\|X\_s*Q\_s*\)\|q\_s*\_s*|\_s*\|\_s*\%(z\|\_s*o\)\|t\_s*\%(\_s*W\_s*A\_s*\|\_s*\%([\_s*\%(Y\|W\_s*\_s*O\)\|C\_s*W\_s*\_s*O\)\|^\_s*\_s*C\_s*\|H\_s*\%([[mg]\|{\_s*X\|r\_s*A\|X\_s*t\_s*@\_s*[\|j\_s*[\)\|@\_s*\%(C\|\_s*I\|[\_s*\%([W}]\|~\_s*\_s*O\)\|\_s*\%(g\_s*\|^\_s*Y\_s*[}]\)\|\_s*[cX]\|\_s*m\_s*v\_s*V\_s*X\)\|B\_s*\%([]\|W\_s*\%(b\_s*N\_s*X\|J\_s*\)\|[\_s*r\_s*[\|b\_s*V\_s*\_s*O\|\_s*\_s*\|\_s*f\_s*\_s*t\_s*B\_s*A\|\_s*\%([X[Ap]\|b\_s*[vp]\|s\_s*\%(\|[\_s*k\)\)\)\|F\_s*\%([\_s*\%([xY]\|W\_s*\_s*O\)\|C\_s*Y\|\_s*\_s*\|j\_s*\%(\|b\_s*N\_s*X\|L\_s*A\|[\_s*\)\|m\_s*\%(L\_s*V\|[\_s*\)\)\)\|q\_s*\|\_s*\|^\_s*\_s*p\_s*N\_s*\|\_s*\|\_s*\_s*\|i\_s*s\|Z\_s*\|\_s*\|\_s*Z\|\_s*\|\_s*`\|^\_s*\|o\_s*\%(g\|k\_s*@\|b\_s*\%(^\_s*`\_s*s\|X\_s*W\|\_s*f\_s*\)\|\_s*\_s*\_s*r\_s*\_s*\_s*\_s*\_s*\|r\_s*D\|D\_s*r\_s*D\|\_s*\_s*h\_s*\_s*\|\_s*\_s*\%(\_s*\_s*\|\_s*\_s*\_s*\)\|\_s*\_s*\%(\|\_s*\_s*\)\)\|i\_s*\|J\_s*\_s*E\_s*\|\_s*\_s*\|d\_s*\_s*\|\_s*\_s*^\|o\_s*e\_s*\_s*\|\\_s*\_s*t\_s*\|_\_s*\|\_s*\_s*[a]\|\_s*\|P\_s*\%([umdCaor]\|K\_s*\|D\_s*F\_s*t\_s*@\_s*C\_s*\|R\_s*[\_s*h\|^\_s*C\_s*\|\.\_s*S\_s*\.\|S\_s*\%(\.\|Y\_s*E\_s*S\)\|I\_s*C\_s*}\_s*C\_s*R\_s*\|l\_s*\%(a\_s*t\_s*i\_s*n\_s*u\_s*m\|u\_s*t\_s*o\_s*n\_s*i\_s*u\_s*m\)\|E\_s*T\_s*{\_s*g\_s*\|O\_s*S\_s*\%(V\_s*X\_s*e\_s*\|I\_s*X\|T\_s*\_s*\\_s*b\_s*h\)\|e\_s*\%(r\_s*l\|n\_s*\%(t\_s*\%(o\_s*x\_s*y\_s*l\_s*i\_s*d\_s*a\_s*e\|i\_s*u\_s*m\)\|n\_s*s\_s*y\_s*l\_s*v\_s*a\_s*n\_s*i\_s*a\)\)\|h\_s*o\_s*s\_s*p\_s*h\_s*o\_s*r\_s*u\_s*s\)\|\_s*\)', + \ 'q' : '\%([zzMKɞ՟J㖍򍥛IHEdbzoxAܗϕDCBӊǏ~B䱌sZYᯙӞᮉOM֌NvڊLK@{^Z򏾓^čA㦖鶔rňʈUÑq𔯞C~VWRUSXT܉_wo^鿌~GF䇚`p̃LY۞IfȊsގԚPMEu[{O֞oӁ@󞔐ȓScvmČ痈SqᙊHM῍C​晠J{vv͘ҋXތɜgˍgHܜ|E{윁؋hefgPHNq]\|\_s*\|b\_s*N\|\_s*\|\_s*\|\_s*\|~\_s*\|\_s*\|\_s*S\|S\_s*[Z]\|\_s*\_s*x\|\_s*\|\_s*h\|\_s*\|9\_s*\|^\_s*{\|\_s*\|Q\_s*O\|\_s*\|\_s*\%(\|\_s*\)\|\_s*\|V\_s*l\_s*\|\_s*|\|T\_s*\_s*\|L\_s*a\_s*u\_s*r\_s*\%(a\_s*c\_s*e\_s*a\_s*e\|o\_s*i\_s*d\_s*e\_s*a\_s*e\)\|T\_s*\|\_s*\|c\_s*r\_s*e\_s*s\_s*c\|\_s*[{]\|C\_s*\|\_s*\_s*\|K\_s*r\|H\_s*e\_s*l\_s*l\_s*e\_s*b\_s*o\_s*r\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|\_s*\%([ƕE]\|o\_s*\)\|\_s*\|\_s*C\_s*a\|J\_s*u\_s*g\_s*l\_s*a\_s*n\_s*d\_s*a\_s*l\_s*e\_s*s\|\_s*\|Z\_s*\|n\_s*_\|s\_s*q\|B\_s*\|R\_s*\_s*q\|C\_s*\%(r\|h\_s*r\_s*o\_s*m\_s*i\_s*u\_s*m\)\|R\_s*h\_s*a\_s*m\_s*n\_s*a\_s*l\_s*e\_s*s\|p\_s*\_s*`\|\_s*s\_s*N\_s*\|`\_s*\_s*\_s*\_s*\_s*}\|Q\_s*\%(I\_s*C\|R\_s*R\_s*[\_s*h\|C\_s*T\_s*[\_s*N\_s*\|U\_s*O\_s*J\_s*[\_s*h\)\|w\_s*x\|R\_s*\%([\_s*\_s*\|\_s*e\_s*B\_s*t\_s*@\_s*C\_s*A\)\|\_s*\_s*\|J\_s*\%(U\_s*\|^\_s*[\_s*\|X\_s*o\|[\_s*k\_s*[\_s*\|i\_s*[\_s*g\|_\_s*t\_s*B\|\_s*e\|h\_s*\_s*[\_s*[]\|\_s*\%(`\_s*[FG]\|e\_s*\%(B\_s*G\|b\_s*g\)\)\|\_s*^\_s*[X]\)\|\_s*\|L\_s*\%(g\|u\_s*\|z\_s*[\_s*e\|n\_s*[\_s*_\|\_s*\%(g\|e\_s*B\_s*\_s*O\)\|[\_s*\|m\_s*\|b\_s*V\_s*\|\_s*\%([\|G\_s*\)\)\)', + \ 'r' : '\%([ۘӛěŚ̉h_R{]Ә[\U^MPR䛉R˙CCludN譞Lc屑OcYᑘLSQXᔘWOUĘTRNmIE@醕bbdLFiBe࢘G鐂ڟYxU೙evYׁZatXF䫗ᖗw̟K魟MlI瀗QwYqrQݗ@BA٘H〟pᐗ㾗ۗݗ~ZK蛂ಝ_×ɌIʘZCP䞛gXYVÊ}֗XaᅞWHP˗ԜdhgҙzؗϙחїӗW򗵞OC͗q]x@y饖×A_`p֝H×㇗ߗƗȗɗʗ̗Śi胗ߗ؜ۗ\鋗Ai仂טJəVYO㜛npgBRSETAࣗa茗Eh඗pyq㡟IQ۝Sᚘ痋ff逓t炒EDw@CAUtxXzvH{NG^STRr_F`[LBqVM}W~IpIuE]KPZDYs|\OyJց㍪XQτr]\|\_s*[]\|b\_s*[]\|\_s*[]\|\_s*\|\_s*[L]\|h\_s*[Eߎ]\|\_s*\_s*\|6\_s*[]\|E\_s*G\|\_s*\|C\_s*\%(a\_s*l\_s*y\_s*c\_s*a\_s*n\_s*t\_s*h\_s*a\_s*c\_s*e\_s*a\_s*e\|h\_s*o\_s*r\_s*i\_s*p\_s*e\_s*t\_s*a\_s*l\_s*a\_s*e\)\|A\_s*\%(c\_s*t\_s*a\_s*e\_s*a\|p\_s*o\_s*p\_s*e\_s*t\_s*a\_s*l\_s*a\_s*e\)\|\_s*[]\|\_s*\%(\||\_s*\)\|V\_s*e\_s*r\_s*t\_s*i\_s*c\_s*i\_s*l\_s*l\_s*a\_s*t\_s*a\_s*e\|O\_s*r\_s*c\_s*h\_s*i\_s*d\_s*a\_s*l\_s*e\_s*s\|M\_s*i\_s*c\_s*r\_s*o\_s*s\_s*p\_s*e\_s*r\_s*m\_s*a\_s*e\|L\_s*\%([ruia]\|e\_s*i\_s*t\_s*n\_s*e\_s*r\_s*i\_s*a\_s*l\_s*e\_s*s\|A\_s*N\_s*P\_s*[\_s*u\_s*\)\|C\_s*\|G\_s*\%(e\_s*n\_s*t\_s*i\_s*a\_s*n\_s*a\_s*l\_s*e\_s*s\|y\_s*\%(n\_s*a\_s*n\_s*d\_s*r\_s*a\_s*e\|m\_s*n\_s*o\_s*s\_s*p\_s*e\_s*r\_s*m\_s*a\_s*e\)\)\|\_s*W\_s*f\_s*[\_s*^\_s*x\_s*[\_s*X\|\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*s\_s*\_s*w\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*k\_s*\_s*\%(\_s*\|w\_s*d\_s*C\_s*\_s*M\_s*\_s*\_s*\)\|d\_s*C\_s*\_s*M\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*Z\_s*b\_s*g\_s*v\_s*Z\_s*@\|\_s*\|K\_s*\|g\_s*\|v\_s*\|\_s*\|\_s*A\|\_s*[M]\|\_s*\|\_s*\_s*\|Q\_s*\%(l\_s*\_s*\|\_s*^\)\|q\_s*\%(h\_s*m\_s*`\|\_s*c\|r\_s*|\_s*Q\_s*R\_s*Q\_s*b\|\_s*\_s*\_s*\_s*\|\_s*\_s*\)\|@\_s*\\_s*\_s*\_s*P\_s*\|\_s*A\_s*I\|F\_s*\|R\_s*\%([bnfeauh]\|i\_s*c\_s*h\_s*a\_s*r\_s*d\_s* \_s*M\_s*\.\_s* \_s*S\_s*t\_s*a\_s*l\_s*l\_s*m\_s*a\_s*n\|C\_s*S\|S\_s*S\_s*\_s*[\_s*_\|I\_s*S\_s*C\|A\_s*M\|O\_s*M\|E\_s*\%(M\_s*\_s*\|T\_s*U\_s*R\_s*N\_s*L\_s*[\|A\_s*D\_s*M\_s*E\)\)\|\_s*K\_s*\\_s*\|A\_s*[\_s*\)', + \ 's' : '\%([}[Ty}Q^ēih掞y{GOʗcUtwⶊQ锑뙩suक़xƔK}柛”a╛^ԛyꑅz|S\䇛q~Hxyܑ䵑qBJtvƑNⵑr|swpnmyn\F絖uLMXgedבbfe􈷑YSa[isƈꋟ^hj꒑`clzNNZ驉kŋQLGiLↁސِېڐߞCG@Sዙ[Tאɐ͊֐ȐǞNdϞ囡pә㙟㚘jA䦈_tbAAbxaHܟCJI⤑GSL⒑Wsr葁DJAL񙒐枙@ېMHlFKDB@GhǝNdDRŖ|˝v⫝呝yHՐ}Uҙ[ߝpS爊caopIDcER䊔TωsꈝؐCShᓩ]T\~yu̖齗VŒsvǐEpz~dǛ俑Ypnzy羝裐䍐␕ځȁˁ΁݁}ʁށ~́܁၆Ɂ袜ၐvℐxNːXaV䐆Hz`Xʐ]䐟֋󓧖LizZDBAPDY`LZ连xZxw圑ȓGFaƎb乗MEsCFZnD㈵㦃Ƌs]Ŗl⚑^潔AgΖ儞ɖΏdݜ臐wp玬d쎹g[諎^GNH˒Ύm\ސːKŽKtoqϔ͚͎bP᪎jAϐ֙̎ݐ┐^ܐΎގڎ؎YώΎɎԎߎЈޝȕiSCGဎ偊fztWV题㌎瑲fEiglk{蜕婙oJ蕘ꟚkVh娔hKqF榚SQFT酝nSXKUڏMGjEaNOPDCALRTIB@M᭜貚я忏w{vxs⡏turfݚpuVyJUZ]jP曚A՜fY`Ds橝ΐaO凓cjcѐUahNfdCkXLTQWgiR[MebI_SΏnZ勋o|׊_䓏wb򏎏vߓɚ[mיАО_cRuB䐠ϞƐLҜћ辛頔׏[MB䀙n␏୚K♏яҁuiϏ]疏ցijӐԚϏUJnސŜ܏ߏُGଏޑď͏ǏɏЏۏ暐̏ďΏƏ͏ڏ؏ɏȏplTegߐ@RCܑFDI冐BAHEuowʕEey򚬞@џ|Xꏎю}ؗ⿎l_oŎstћLypik䍟ߊ``oor{zj`V@@iy掂IِynXnBg~vsЎoN᎒ZuiU抎f]Kjq{J{r˙׎藂ۚ~礉JLfVWlȕ̐䰐TᰗlIJMhEU嶎\zGԑuV\V֔fXMˍǏxš皔m匈^꛽O@՛N\󎘊jۗB睋ʼnbq@dNmPbq嗝WƔfⲝHFHBr{吷ᵞvWtuĉh|招E䋫🛋t剎럈E`fsœ|̝acHKcߙӎ[ǎWXㄐVҎ\r]ZPR3Q^OUSRY_ATCD搔@FD\qGӍƎEǛː؟NZrԜ淍Kȍ͙Pꎍ`BڛvɍVҍۍЍю΍؍Ӎ̐č֍ՍȍÍˍҍٍ΍ō鑨焞or⧍ey|skwN񍻓ዎˋÎюhnr䳍~⑁ʛˍlORğAL璍om򉺍⍽}S_sK^dw@YYご򄋄ZYÁWnŽOyʁ`efW_TZTV\XbЃRs]\|\_s*[]\|b\_s*[\ZXVT]\|\_s*[]\|\_s*\|\\_s*\%(H\|I\_s*\)\|~\_s*\|\_s*\|\_s*\|\_s*\|\_s*g\|\_s*\|v\_s*[Xv]\|\_s*n\|\_s*\|\_s*c\|\_s*\|B\_s*[BX]\|\_s*C\|\_s*\|U\_s*m\_s*b\_s*e\_s*l\_s*l\_s*i\_s*f\_s*l\_s*o\_s*r\_s*a\_s*e\|\_s*\|}\_s*\|c\_s*e\_s*n\_s*t\_s*i\|\_s*[U]\|C\_s*\|\_s*\|}\_s*\|T\_s*\|G\_s*Y\|f\_s*\|V\_s*[c]\|V\_s*i\_s*o\_s*l\_s*a\_s*l\_s*e\_s*s\|N\_s*y\_s*m\_s*p\_s*h\_s*a\_s*e\_s*\%(a\_s*c\_s*e\_s*a\_s*e\|o\_s*i\_s*d\_s*e\_s*a\_s*e\)\|\_s*\|\_s*\|b\_s*\%(^\|\_s*\)\|V\_s*\|]\_s*\|\_s*\|s\_s*[mE]\|L\_s*a\_s*\%(b\_s*i\_s*a\_s*t\_s*a\_s*e\|m\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\)\|\_s*\_s*\|\_s*\|~\_s*\|\_s*t\_s*\|\_s*\|\_s*_\|\_s*\|\_s*Y\|\_s*\|\_s*\|I\_s*\%(s\_s*o\_s*p\_s*y\_s*r\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|l\_s*l\_s*i\_s*c\_s*i\_s*a\_s*c\_s*e\_s*a\_s*e\)\|W\_s*i\_s*n\_s*t\_s*e\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\|`\_s*\|\_s*[J]\|]\_s*[]X]\|\_s*\%(X\_s*\_s*\|\_s*\_s*\)\|\_s*\%([֌ڎu]\|\_s*\)\|V\_s*\|7\_s*\|S\_s*[]\|4\_s*\|R\_s*{\|h\_s*t\|\_s*u\|\_s*\|A\_s*[o]\|\_s*[NY]\|\_s*[]\|r\_s*[ꏎ]\|\_s*\|c\_s*e\|\_s*\|\_s*\%(_\|C\_s*\)\|Z\_s*i\_s*n\_s*g\_s*i\_s*b\_s*e\_s*r\_s*a\_s*l\_s*e\_s*s\|\_s*\%(\_s*{\_s*\%(I\|\_s*I\)\|\_s*\_s*a\_s*\_s*W\)\|\_s*[Η]\|\_s*\|\_s*\|\_s*\|e\_s*\_s*\|C\_s*\%([es]\|y\_s*c\_s*a\_s*d\_s*\%(i\_s*d\_s*a\_s*e\|o\_s*\%(p\_s*s\_s*i\_s*d\_s*a\|f\_s*i\_s*l\_s*i\_s*c\_s*a\_s*l\_s*e\_s*s\)\)\|h\_s*l\_s*o\_s*r\_s*a\_s*n\_s*t\_s*h\_s*a\_s*c\_s*e\_s*a\_s*e\|\_s*\|D\_s*X\|^\_s*\_s*\|a\_s*\%(s\_s*s\_s*y\_s*t\_s*h\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|c\_s*t\_s*a\_s*l\_s*e\_s*s\)\)\|\_s*K\||\_s*[“]\|\_s*p\_s*\|G\_s*\|\_s*\|\_s*\_s*\%(\_s*[N]\|X\_s*[N]\)\|h\_s*l\|S\_s*\_s*g\|\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*e\|\_s*\|\_s*\%(@\|\_s*\_s*\)\|\_s*\|G\_s*\|\_s*q\|P\_s*\%(a\_s*r\_s*i\_s*e\_s*t\_s*a\_s*l\_s*e\_s*s\|t\_s*e\_s*r\_s*i\_s*d\_s*o\_s*s\_s*p\_s*e\_s*r\_s*m\_s*\%(a\_s*l\_s*e\_s*s\|i\_s*d\_s*a\_s*e\)\|r\_s*i\_s*m\_s*u\_s*l\_s*a\_s*l\_s*e\_s*s\)\|A\_s*\%(p\_s*i\_s*a\_s*l\_s*e\_s*s\|r\_s*a\_s*l\_s*e\_s*s\|n\_s*t\_s*i\_s*m\_s*o\_s*n\_s*y\)\|\_s*[T]\|B\_s*\%(r\|V\_s*F\_s*\)\|g\_s*\_s*q\|\_s*\|u\_s*\|A\_s*\_s*`\_s*\_s*\|\\_s*\_s*\|D\_s*o\_s*n\_s*a\_s*t\_s*i\_s*o\_s*n\_s* \_s*A\_s*l\_s*p\_s*h\_s*o\_s*n\_s*s\_s*e\_s* \_s*F\_s*r\_s*a\_s*n\_s*c\_s*o\_s*i\_s*s\_s* \_s*d\_s*e\_s* \_s*S\_s*a\_s*d\_s*e\|M\_s*\%(e\_s*r\_s*c\_s*u\_s*r\_s*y\|u\_s*s\_s*a\_s*l\_s*e\_s*s\|a\_s*r\_s*q\_s*u\_s*i\_s*s\_s* \_s*d\_s*e\_s* \_s*S\_s*a\_s*d\_s*e\)\|\_s*\%(V\|s\_s*\%(\_s*\_s*\|\_s*\)\)\|T\_s*\%(e\_s*t\_s*r\_s*a\_s*c\_s*e\_s*n\_s*t\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\|i\_s*n\|h\_s*e\_s* \_s*S\_s*i\_s*m\_s*p\_s*l\_s*e\_s* \_s*A\_s*P\_s*I\_s* \_s*f\_s*o\_s*r\_s* \_s*e\_s*v\_s*e\_s*n\_s*t\_s*-\_s*b\_s*a\_s*s\_s*e\_s*d\_s* \_s*X\_s*M\_s*L\_s* \_s*p\_s*a\_s*r\_s*s\_s*i\_s*n\_s*g\)\|P\_s*C\_s*f\|]\_s*f\|v\_s*\_s*\_s*\_s*\_s*\_s*w\_s*\|l\_s*b\_s*g\_s*T\_s*[\_s*r\_s*X\|U\_s*\%(b\_s*N\|N\_s*Z\_s*\|r\_s*[\_s*l\|E\_s*o\_s*[\|\_s*[\_s*N\_s*\_s*E\_s*g\|\_s*U\|\_s*c\|C\_s*\%([]\|\_s*[\|f\_s*\)\|[\_s*\%([]\|\_s*\)\)\|\_s*\|[\_s*~\|i\_s*g\_s*\_s*E\_s*\|]\_s*\%(\|\_s*f\|[\_s*\%(\|\_s*\_s*Q\_s*\)\|t\_s*B\_s*[\)\|W\_s*\%(\|[\_s*\%([ON]\|\_s*\_s*[YX]\)\|O\_s*\_s*\_s*g\|\_s*\%(\_s*\|O\_s*V\_s*\_s*s\_s*[\_s*\|e\_s*[\_s*[\)\)\|r\_s*\%([Ȏ]\|T\_s*C\_s*Y\|r\_s*T\_s*C\_s*Y\|\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\|t\_s*m\|\_s*\%(\|\_s*\_s*\_s*`\_s*\_s*\_s*\_s*\)\|h\_s*b\_s*o\_s*(\_s*S\_s*t\_s*r\_s*u\_s*c\_s*t\_s*u\_s*r\_s*e\_s* \_s*a\_s*n\_s*d\_s* \_s*I\_s*n\_s*t\_s*e\_s*r\_s*p\_s*r\_s*e\_s*t\_s*a\_s*t\_s*i\_s*o\_s*n\_s* \_s*o\_s*f\_s* \_s*C\_s*o\_s*m\_s*p\_s*u\_s*t\_s*e\_s*r\_s* \_s*P\_s*r\_s*o\_s*g\_s*r\_s*a\_s*m\_s*s\_s*)\||\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|n\_s*m\_s*x\_s* \_s*m\_s*d\_s*v\_s*r\|\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*u\)\|\_s*\|G\_s*X\|S\_s*\%([nrgmce]\|G\_s*M\_s*L\|T\_s*C\_s*Y\|S\_s*T\_s*C\_s*Y\|F\_s*}\_s*K\_s*W\_s*\|Q\_s*U\_s*A\_s*R\_s*E\_s* \_s*E\_s*N\_s*I\_s*X\|K\_s*\%(K\|Y\_s* \_s*P\_s*e\_s*r\_s*f\_s*e\_s*c\_s*T\_s*V\_s*!\)\|a\_s*\%(r\_s*\%(r\_s*a\_s*c\_s*e\_s*n\_s*i\_s*a\_s*l\_s*e\_s*s\|g\_s*e\_s*n\_s*t\_s*o\_s*d\_s*o\_s*x\_s*a\_s*c\_s*e\_s*a\_s*e\)\|m\_s*a\_s*r\_s*i\_s*u\_s*m\)\|M\_s*\%(v\_s*\_s*C\|N\_s*\_s*u\)\|P\_s*\%(\_s*R\_s*[\_s*h\|A\_s*C\_s*E\_s*L\_s*[\)\|p\_s*\%(l\_s*u\_s*s\|e\_s*\%(r\_s*m\_s*a\_s*t\_s*o\_s*p\_s*h\_s*y\_s*t\_s*a\|c\_s*a\_s*l\_s*i\_s*t\_s*y\_s* \_s*S\_s*t\_s*o\_s*r\_s*e\_s* \_s*R\_s*e\_s*t\_s*a\_s*i\_s*l\_s*e\_s*r\_s* \_s*o\_s*f\_s* \_s*P\_s*r\_s*i\_s*v\_s*a\_s*t\_s*e\_s* \_s*L\_s*a\_s*b\_s*e\_s*l\_s* \_s*A\_s*p\_s*p\_s*a\_s*r\_s*e\_s*l\)\|a\_s*\%(t\_s*h\_s*i\_s*f\_s*l\_s*o\_s*r\_s*a\_s*e\|r\_s*c\)\)\|H\_s*I\_s*F\_s*T\_s*L\_s*[\|C\_s*S\_s*I\|T\_s*\%(k\|A\_s*R\)\|h\_s*u\_s*g\_s*a\_s*r\_s*t\_s* \_s*A\_s*s\_s*s\_s*o\_s*c\_s*i\_s*a\_s*t\_s*e\_s*s\_s* \_s*S\_s*y\_s*s\_s*t\_s*e\_s*m\_s* \_s*I\_s*n\_s*t\_s*e\_s*r\_s*f\_s*a\_s*c\_s*e\|A\_s*\%(P\|S\_s*I\)\|i\_s*\%(m\_s*p\_s*l\_s*e\_s* \_s*K\_s*a\_s*n\_s*a\_s* \_s*t\_s*o\_s* \_s*K\_s*a\_s*n\_s*j\_s*i\_s* \_s*c\_s*o\_s*n\_s*v\_s*e\_s*r\_s*s\_s*i\_s*o\_s*n\_s* \_s*p\_s*r\_s*o\_s*g\_s*r\_s*a\_s*m\|l\_s*i\_s*c\_s*o\_s*n\)\|t\_s*r\_s*o\_s*n\_s*t\_s*i\_s*u\_s*m\|o\_s*\%(u\_s*t\_s*h\_s* \_s*\%(D\_s*a\_s*k\_s*o\_s*t\_s*a\|C\_s*a\_s*r\_s*o\_s*l\_s*i\_s*n\_s*a\)\|l\_s*a\_s*r\_s*i\_s*s\|f\_s*t\_s*w\_s*a\_s*r\_s*e\_s* \_s*R\_s*e\_s*s\_s*e\_s*a\_s*r\_s*c\_s*h\_s* \_s*A\_s*s\_s*s\_s*o\_s*c\_s*i\_s*a\_s*t\_s*e\_s*,\_s*I\_s*n\_s*c\_s*\.\)\|u\_s*\%(n\|l\_s*f\_s*u\_s*r\)\)\)', + \ 't' : '\%([ĜR牉șhЌ☝ωiמRh|c툪H֓騗֋㜐C䃕۔y榏QFbr\c͙ʓד՘JcٓؓڐJxɍΖrqNPדь{ԍǘ؝沖L௜{ී“ΓCjߙ㛟D椟Xbى⅝TwF~㫛䞨[џẓ}衞Δ󓎌BUÓĉDڎ獙WMꊐzcbuٓ幓鉓~鍓򓀓˓e{Ox~茤yZ䷞nZ^u̔mqėy}olropVĔÏ\pvjn掷nϙ\EitNOg\lhꚤrlWPȎod͙W難ÓR瘉LNJU猓HњVzAUVځChAzDdDFx[^៓UzaZLW⽓YQINGPOcSYꚉٞq|ǞhtL礓B@稒ఒAeVƂ•͕皁ITP햱׏gwΐىWhіʉt`I␎aSڎBڐRȕpAn䆉I~焍ߑzc摂u񗾎id͌gQǒٚ؍jq塔|ȕȓ`B\Չ㔖ꉌۑԔԒ̒v׏IĐȒŒnj雅əݙ֒ߘsrsnUTӑn쑢LUΌCU֋ސTĜɞՍy㋒ÝpkxːϔЋlsʜߐZᶝAAڕthՊJY_ZoTSNĒZN༒m֖’ޒ}zke玐ŗ͓ߝQEk浔IO՞`蠙ÒeP障KUUݓCoLLjly鬒k踒𒜒{⒳\_񒝓[d}ޒ渒xQhI峜JaCԁnNfRhtpmon~n@ؒTw鳚vꃒrlhՐƌsUnt筒mpuokvqxᗒyJ}֓}ԐugqKfeޞ˒MoRГLᷖ靌ٜyg栌˘l|]漒K]̎^DM骝Dl퓬eȒ@gihYkXSݛ̝EYUԕۏXIHa蒒FC}{CJFמlSs韞퓃ࣕYۈɗ吥ҋkBznҊmԚKtpЋBŗYk˜[]썰͗K’eʖd休sb饕|cGBٍked뛹k残ċbCWFVOhx^В|⹑tMFW̝^tTH`ؒ]Kßp[ϟ~֒hj̜ݝdW`^WUႚVJRἔCQVa_\杒OSXWYbdZTÒPAfV]pFѝFU鮒{I痑~x擑[讖wʑH֟铉O\lߑړܒБ⛔EܑՑԑۑґؑݑّё̑ޑבΑА茌o]SBHᢞSOlNϑ֋N睒šfuPBcّ_̌W`V~^ΓyfsE\؃XWƃUcN]g`cE[^фSet]\|\_s*[]\|b\_s*[gec`^]\|\_s*[ƂÂ]\|\_s*\|\_s*n\_s*\|\_s*[]\|\_s*\|\_s*l\|\_s*\|\_s*V\|\_s*\|i\_s*[v]\|\_s*P\|h\_s*\|\_s*\|D\_s*\_s*\|\_s*[]\|\_s*[q]\|W\_s*\|\_s*\_s*E\_s*\|\_s*\|H\_s*y\_s*d\_s*r\_s*o\_s*c\_s*h\_s*a\_s*r\_s*i\_s*t\_s*a\_s*l\_s*e\_s*s\|\_s*\|\_s*x\|G\_s*[ߓh]\|\_s*[]\|F\_s*N\_s*\|i\_s*[vq]\|A\_s*c\_s*o\_s*n\_s*i\_s*t\_s*u\_s*m\|\_s*\|\_s*j\|\_s*j\|F\_s*e\|I\_s*r\_s*o\_s*n\|\_s*\|\_s*\|g\_s*\|Z\_s*\|Q\_s*~\_s*S\|\_s*j\|\_s*\%(\|\_s*q\)\|S\_s*[Z]\|\_s*\%(\|\_s*a\)\|X\_s*\|\_s*X\|\_s*J\|\_s*~\|~\_s*J\|\_s*\|\_s*\|\_s*\|\_s*[]\|B\_s*a\_s*l\_s*a\_s*n\_s*o\_s*p\_s*h\_s*o\_s*r\_s*a\_s*l\_s*e\_s*s\|P\_s*\%(\|O\_s*\)\|\_s*\|1\_s*\%(\|0\_s*\)\|\_s*l\_s*\|E\_s*\%(u\_s*p\_s*h\_s*o\_s*r\_s*b\_s*i\_s*a\_s*l\_s*e\_s*s\|r\_s*i\_s*c\_s*a\_s*l\_s*e\_s*s\)\|\_s*\%(v\|\_s*F\)\|g\_s*\|\_s*\|`\_s*\|\_s*w\|\_s*\%(V\_s*\|\_s*F\)\|\_s*\%([]\|[\_s*\|\_s*\_s*N\)\|\_s*v\|r\_s*q\|\_s*r\_s*q\|\_s*[a]\|\_s*\|\_s*\|@\_s*\_s*\|L\_s*q\|S\_s*\|\_s*\|J\_s*i\_s*a\_s*n\_s*g\_s*s\_s*u\|]\_s*h\|G\_s*\|u\_s*[˔]\|k\_s*J\|\_s*\|\_s*I\_s*q\|\_s*a\|\_s*p\|\_s*[]\|A\_s*\|\_s*[]\|\_s*\_s*\|\_s*\_s*\\|\_s*\%(\\_s*\|A\_s*\_s*[]\)\|t\_s*\%(\|{\_s*V\)\|h\_s*\|e\_s*\|\_s*\|\_s*[]\|\_s*s\|\_s*\%([\|\_s*q\)\|\_s*v\|\_s*\|P\_s*\|\_s*\|\_s*\%(\|\_s*\)\|\_s*\|E\_s*\|P\_s*\%(\.\_s*S\_s*\.\|o\_s*l\_s*y\_s*\%(g\_s*o\_s*n\_s*a\_s*l\_s*e\_s*s\|c\_s*a\_s*r\_s*p\_s*i\_s*c\_s*a\_s*e\)\|a\_s*n\_s*d\_s*a\_s*n\_s*a\_s*l\_s*e\_s*s\)\|s\_s*\|\_s*\|E\_s*w\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*q\|\\_s*[V]\|w\_s*\|\_s*\|i\_s*K\|\_s*\_s*p\|\_s*B\|M\_s*\%(e\_s*n\_s*i\_s*s\_s*p\_s*e\_s*r\_s*m\_s*a\_s*c\_s*e\_s*a\_s*e\|o\_s*n\_s*o\_s*\%(p\_s*e\_s*t\_s*a\_s*l\_s*a\_s*e\|c\_s*\%(h\_s*l\_s*a\_s*m\_s*y\_s*d\_s*e\_s*a\_s*e\|o\_s*t\_s*y\_s*l\_s*e\_s*d\_s*o\_s*n\_s*e\_s*a\_s*e\)\)\)\|\_s*\|\_s*\|\_s*q\|\_s*\|\_s*\|f\_s*B\_s*X\|R\_s*\_s*\|\_s*l\|\\_s*\%([\_s*[gv]\|\_s*[\)\|w\_s*[\_s*O\|[\_s*[CA]\|Z\_s*\%(I\|\_s*}\|\_s*\%(\|j\_s*A\_s*X\)\|\_s*s\_s*\%([\|X\_s*g\)\)\|V\_s*\%(\|b\_s*N\|X\_s*\|A\_s*^\_s*[\|\\_s*[\_s*\_s*X\|I\_s*h\_s*A\|[\_s*[t^]\)\|T\_s*\%([C]\|~\_s*\_s*O\|E\_s*U\_s*\_s*h\|\_s*u\_s*\_s*b\_s*h\|[\_s*\%([h]\|e\_s*B\|X\_s*g\_s*\|Y\_s*f\_s*[CB[]\|}\_s*\)\|b\_s*`\_s*\_s*[\|\_s*\%(N\|_\_s*[\|L\_s*\_s*[\)\|\_s*h\_s*}\_s*C\_s*h\)\||\_s*\_s*y\_s*v\_s*`\_s*h\|O\_s*\%(a\_s*y\|A\_s*\_s*\)\|\\\_s*T\_s*e\_s*X\|\_s*\_s*\|\_s*\_s*\|p\_s*\|d\_s*\%([b]\|C\_s*\_s*M\_s*\_s*\_s*\)\|s\_s*\%([]\|\_s*E\|j\_s*W\_s*O\|]\_s*[\_s*\|o\_s*b\_s*N\|V\_s*\_s*c\|u\_s*\%(j\_s*\_s*[\_s*X\|Q\_s*[\_s*\|h\_s*\_s*}\|A\_s*j\_s*\)\|b\_s*o\_s*^\_s*h\_s*o\|\_s*\|\_s*\_s*\_s*s\_s*\_s*\_s*\|E\_s*w\|\_s*[w]\)\|T\_s*\%([bcmliahe]\|r\_s*i\_s*m\_s*e\_s*n\_s*i\_s*a\_s*c\_s*e\_s*a\_s*e\|u\_s*n\_s*g\_s*s\_s*t\_s*e\_s*n\|]\_s*[\_s*\|X\_s*T\_s*t\_s*@\_s*C\_s*\|V\_s*\_s*c\|o\_s*b\_s*N\|V\_s*\%(j\_s*\_s*[\_s*X\|Q\_s*[\_s*\|h\_s*\_s*}\|\_s*j\_s*^\|A\_s*j\_s*\|V\_s*\_s*b\_s*s\_s*\_s*O\)\|C\_s*P\|R\_s*[\_s*h\|-\_s*C\_s*o\_s*d\_s*e\|O\_s*E\_s*I\_s*C\|A\_s*\%(C\|I\_s*N\_s*S\|B\_s*L\_s*[\)\|E\_s*L\)\)', + \ 'u' : '\%([yhȌle[f񓴑a؈ϑ鎽[XDWr䷙\wuќzD鴑ߚXi^ښR従LMf~ӑr戏楓]搗wS^̗É򃑂k։\uLGQmPO⣐HQmIVߊaXSn|UoJy팻fʈژⓐxԋʏݓAω]りC]D^@TAmSYv_ZrNTTݗƓaHZJLQnLI̝j󌂟J䥎˔^opᱝꚉEӏKюY𓢙ǓeAZFGNE҄TUu]\|\_s*\|\_s*\|\_s*\|T\_s*\|\_s*\_s*\|\_s*\|H\_s*\_s*R\|\_s*\|D\_s*\%(k\_s*[Lj]\|\_s*\)\|\_s*i\|e\_s*\|\_s*\|A\_s*\|\_s*y\_s*[]\|y\_s*\|\_s*\|\_s*[\|\_s*\|\_s*\|\_s*\|\_s*`\|\_s*c\_s*\_s*\|W\_s*\%(\|\_s*\_s*\)\|\_s*\%(\|\_s*\)\|\_s*\|\_s*\|\_s*\%(\|\_s*\)\|s\_s*\_s*\|\_s*\|\_s*\|A\_s*r\_s*i\_s*s\_s*t\_s*o\_s*l\_s*o\_s*c\_s*h\_s*i\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|`\_s*\|\_s*C\_s*\|\_s*\|O\_s*Y\|\_s*\|\_s*[CB]\|\_s*\%(\|\_s*\_s*\)\|C\_s*u\_s*c\_s*u\_s*r\_s*b\_s*i\_s*t\_s*a\_s*l\_s*e\_s*s\|\_s*\|c\_s*\|C\_s*M\_s*\_s*X\|I\_s*}\_s*\|\_s*\_s*s\_s*\\|\_s*\%(p\_s*\|L\_s*\)\|A\_s*\%([X]\|O\_s*\_s*[\|[\_s*\%(V\_s*\_s*\|W\_s*F\_s*\_s*g\|o\_s*\)\|\_s*e\_s*B\_s*\_s*b\_s*g\||\_s*\|b\_s*\%(v\|p\_s*[\|V\_s*\_s*[\)\)\|P\_s*\%(\|\_s*\)\|t\_s*\%({\_s*[\_s*g\|^\_s*[\_s*\|l\_s*b\_s*N\|m\_s*h\_s*w\_s*\%(t\_s*F\_s*A\_s*[\|}\_s*K\_s*W\_s*\)\)\|\_s*\%([^j[]\|g\_s*\%(\_s*\|\_s*q\_s*g\)\|\_s*\%(A\|V\_s*[\_s*Y\)\|v\_s*V\_s*\_s*\|l\_s*X\_s*R\|i\_s*\%(J\_s*C\_s*g\|C\_s*e\_s*b\_s*h\)\|r\_s*L\_s*\%(^\_s*X\|m\_s*\)\)\)', + \ 'v' : '\%([Fl۔ńrBɃv]\|\_s*\_s*\|b\_s*\|\_s*\|\_s*\|`\_s*F\_s*\|\_s*^\| \_s*r\_s*N\_s*g\_s*[\_s*\|\_s*o\|\_s*z\|j\_s*X\|\_s*\|P\_s*^\|\_s*\%(f\_s*B\_s*\|M\_s*i\|j\_s*X\|Z\_s*\_s*\|N\_s*`\_s*\|\_s*L\_s*\_s*[\_s*\|\_s*\_s*[\|[\_s*j\_s*\)\|u\_s*\%(\|]\_s*[\_s*\|T\_s*C\_s*\|l\_s*b\_s*N\|S\_s*[\_s*\|V\_s*l\|\_s*[\_s*O\|\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\_s*\)\|\_s*b\|{\_s*\%(X\_s*g\_s*[\_s*N\|\_s*S\_s*\|\_s*\%([K{g^]\|e\_s*\%(b\_s*N\_s*X\|[\_s*[W]\)\)\|\_s*\_s*[\_s*\|\_s*\_s*\%(`\|e\_s*B\_s*A\|^\_s*\_s*[\)\|\_s*[\|R\_s*[\_s*_\|[\_s*\%([gO]\|\_s*g\|h\_s*r\_s*\%(\|\_s*A\_s*\)\|p\_s*\|_\_s*t\_s*H\_s*\|J\_s*\%(\|\_s*X\_s*g\)\)\|L\_s*\_s*u\_s*\_s*\|C\_s*\%([hX]\|W\_s*\_s*[\|V\_s*\_s*O\)\)\|w\_s*b\_s*g\|\_s*\_s*\|\_s*\|t\_s*\%(@\_s*\%(\|h\_s*[\_s*c\)\|H\_s*\%(\|\_s*\%(N\|J\_s*[\)\)\|F\_s*\_s*\_s*[\_s*\)\|E\_s*\%(\_s*\%(f\_s*B\_s*~\_s*[\_s*\|W\_s*\%([\_s*~\_s*\|~\_s*[\_s*\|I\_s*X\_s*g\_s*\%(N\|b\_s*N\)\)\)\|B\_s*\%(\_s*i\|\_s*X\)\|H\_s*b\_s*J\|C\_s*\%(\_s*X\|\_s*i\_s*[\)\|F\_s*\%(\_s*M\_s*\_s*E\_s*X\|k\_s*X\)\)\|r\_s*\%([AuoXU]\|K\_s*[\|n\_s*[\_s*\|^\_s*~\_s*\|\_s*\%(b\_s*W\|\_s*C\)\|r\_s*\%(A\_s*\|b\_s*h\)\|b\_s*\%(N\|L\_s*[\)\|Z\_s*\_s*e\|N\_s*\%(^\_s*[\|g\_s*\%(\|\_s*[[A]\)\)\|V\_s*\%(\_s*X\|\\_s*\_s*[\_s*Y\)\|\_s*\%([`X]\|\\_s*\|e\_s*[\_s*W\|Z\_s*\_s*g\)\|l\_s*\%(K\_s*[\|O\_s*\_s*b\_s*g\)\|j\_s*\%([[]\|\_s*f\_s*\)\|\_s*[\|G\_s*\_s*`\_s*\_s*\|W\_s*\%(\|b\_s*g\|^\_s*[\|\_s*\%(\|i\_s*\_s*[\)\|\_s*A\_s*\%(\|\_s*C\_s*\%(Y\|[\_s*[\_s*V\_s*\_s*\)\)\)\|_\_s*\|f\_s*I\|\_s*\%(S\|k\_s*[\_s*u\)\|I\_s*\|\_s*W\_s*A\_s*\|B\_s*[\_s*i\_s*X\|[\_s*\%({\|\_s*X\|N\_s*\|i\_s*X\)\)\|x\_s*\%([K]\|g\_s*i\_s*\|C\_s*_\_s*[\|[\_s*\%(\|_\_s*[\)\|e\_s*\_s*\|b\_s*Z\_s*\|X\_s*\%([g^p]\|r\_s*I\)\|N\_s*\%(^\|g\_s*\)\|W\_s*^\_s*\%(u\_s*\|\_s*A\_s*\)\|\_s*\%([B[]\|t\_s*@\_s*C\|T\_s*C\_s*\)\|\_s*\%(i\|V\_s*e\_s*B\|[\_s*i\|j\_s*[JN]\)\|\_s*\%(f\|x\_s*b\_s*g\|_\_s*\|\_s*[\_s*k\|T\_s*\%([\_s*`\|C\_s*\)\|\_s*b\_s*g\)\|m\_s*\|j\_s*[XA]\|l\_s*\%(V\_s*\_s*\|`\_s*A\|c\_s*B\_s*A\|Y\_s*G\_s*\)\)\|V\_s*\%(H\_s*L\_s*L\_s*(\_s*V\_s*e\_s*r\_s*y\_s* \_s*H\_s*i\_s*g\_s*h\_s* \_s*L\_s*e\_s*v\_s*e\_s*l\_s* \_s*L\_s*a\_s*n\_s*g\_s*u\_s*a\_s*g\_s*e\_s*)\|]\_s*[\_s*\|T\_s*C\_s*\|l\_s*b\_s*N\|S\_s*[\_s*\|J\_s*E\_s*-\_s*\|V\_s*l\|\_s*[\_s*O\|I\_s*S\_s*A\_s*J\_s*[\_s*h\|i\_s*r\_s*g\_s*i\_s*n\_s*i\_s*a\|A\_s*X\|e\_s*r\_s*\%(m\_s*o\_s*n\_s*t\|i\_s*S\_s*i\_s*g\_s*n\)\|a\_s*n\_s*a\_s*d\_s*i\_s*u\_s*m\)\|u\_s*\%(C\|\_s*\%(h\|b\_s*h\)\|[\_s*h\_s*D\_s*[\)\|o\_s*\%([]\|C\_s*\%([AuI]\|p\_s*[\|^\_s*\%(\|\_s*e\_s*B\)\|L\_s*\_s*O\|U\_s*[\|V\_s*\)\|b\_s*g\|`\_s*J\_s*\|M\_s*i\|K\_s*{\_s*\_s*h\|\_s*\%(i\_s*V\|G\_s*e\_s*B\)\|T\_s*\|X\_s*\%(R\|P\_s*X\)\|J\_s*\_s*X\|P\_s*[\_s*V\_s*\_s*\|L\_s*\_s*[\_s*\|E\_s*`\_s*\_s*[\|\_s*\%(\|G\_s*[\_s*V\_s*\_s*\|\_s*[\|A\_s*\%(u\_s*\|\_s*g\)\|b\_s*h\|f\_s*[\_s*V\_s*\_s*\)\|k\_s*A\_s*c\|j\_s*\%(\|[\_s*\)\|\_s*\%([[]\|\_s*\|\_s*[\|\_s*\%(V\_s*A\|`\_s*m\|^\_s*C\_s*\)\)\|[\_s*\%([SO]\|`\_s*\_s*\|\_s*g\_s*D\_s*[\_s*h\|o\_s*\|{\_s*X\|x\_s*i\|e\_s*B\_s*J\_s*\|T\_s*X\|W\_s*\%(\|j\_s*A\|\_s*\)\|m\_s*\|j\_s*A\|\_s*\_s*g\|~\_s*\%(\_s*I\_s*\|L\_s*\_s*\_s*C\_s*g\)\)\|i\_s*\%(L\_s*\_s*\_s*[\|W\_s*E\_s*\)\)\)', + \ 'w' : '\%([YɔjyhȃҌle[f񓴑a؈鎽[XDW䷙\wuќzD鴑ߚXi^ښR従LMf~ӑr戏楓]搗wS^̗É򃑂k։\uLGQmPO⣐HQmIVߊaXSn|UoJy팻fʈژⓐxԋʏݓAω]゜]D^@TAmUSYvZrNTTݗƓaZJLQnLI̝j󌂟J䥎˔^opᱝꚉEӏKюY𓢙ǓeAZFG܉c㩟|㘔͊ϊpԉЍЋƋZǜkYeonm܏Νtsf氖^]o_rqpc˜iqǘjnȎGFd̘eΘcQC崙NZʒtሽgfhl֘aONcb̔fjZ`•iH킗ȔgEw]\|\_s*[]\|b\_s*[E]\|\_s*[]\|\_s*\_s*~\_s*_\|\_s*\|\_s*\|\_s*\|T\_s*\|\_s*\_s*\|\_s*\|H\_s*\_s*R\|\_s*\|D\_s*\%(k\_s*[Lj]\|\_s*\)\|\_s*i\|e\_s*\|\_s*\|A\_s*\|\_s*y\_s*[]\|y\_s*\|\_s*\|\_s*[\|\_s*\|\_s*\|\_s*\|\_s*c\_s*\_s*\|W\_s*\%(\|\_s*\_s*\)\|\_s*\%(\|\_s*\)\|\_s*\|\_s*\|\_s*\%(\|\_s*\)\|s\_s*\_s*\|\_s*\|\_s*\|A\_s*r\_s*i\_s*s\_s*t\_s*o\_s*l\_s*o\_s*c\_s*h\_s*i\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|`\_s*\|\_s*C\_s*\|\_s*\|O\_s*Y\|\_s*\|\_s*[CB]\|\_s*\%(\|\_s*\_s*\)\|C\_s*u\_s*c\_s*u\_s*r\_s*b\_s*i\_s*t\_s*a\_s*l\_s*e\_s*s\|\_s*\|c\_s*\|\_s*\|o\_s*D\|\_s*Y\_s*\|\_s*\|i\_s*\_s*j\|(\_s*\_s*)\|\_s*[]\|R\_s*\|Y\_s*z\|x\_s*\|x\_s*\%(\|V\_s*\_s*c\|\_s*F\_s*\)\|Y\_s*\%(\|V\_s*\_s*c\|\_s*F\_s*\)\|\_s*\_s*\|\_s*\_s*\|\_s*[R]\|\_s*\|a\_s*t\|\_s*\_s*\_s*D\_s*\|\_s*\%(`\|\_s*m\_s*\_s*\)\|^\_s*B\_s*\_s*D\|\_s*\%(\_s*\_s*\_s*E\_s*\_s*\|\_s*\_s*\_s*E\_s*\_s*\)\|u\_s*\_s*c\_s*u\_s*\_s*N\|\_s*\_s*O\|\_s*\%(\|C\_s*X\|b\_s*J\_s*[\|X\_s*\%(\_s*[\|\_s*\_s*O\)\)\|\_s*\%([\_s*X\|\_s*N\_s*\|X\_s*g\)\|\_s*\_s*\_s*\|\_s*\%(b\_s*\%([vp]\|s\_s*\_s*O\)\|C\_s*\%([^g]\|e\_s*B\_s*\_s*O\)\)\|{\_s*\_s*t\|t\_s*\%([[]\|@\_s*C\_s*\|B\_s*\%([\_s*g\|b\_s*`\)\)\|z\_s*\%(G\_s*[[CA]\|[\_s*\|C\_s*\%([\_s*\%(\|\_s*[\)\|b\_s*\%(v\|X\_s*\|p\_s*[\|g\_s*\%(j\_s*[\|}\_s*\)\)\)\|\_s*\%(C\|b\_s*[gc]\)\)\|x\_s*\_s*i\_s*[\|W\_s*\%(S\|N\_s*N\|y\_s*o\_s*m\_s*i\_s*n\_s*g\|O\_s*W\_s*O\_s*W\|I\_s*\%(D\_s*E\|N\_s*T\_s*E\_s*R\_s*P\_s*(\_s*W\_s*i\_s*d\_s*g\_s*e\_s*t\_s* \_s*I\_s*n\_s*t\_s*e\_s*r\_s*p\_s*r\_s*e\_s*t\_s*e\_s*r\_s*)\)\|i\_s*\%(s\_s*c\_s*o\_s*n\_s*s\_s*i\_s*n\|d\_s*g\_s*e\_s*t\|n\_s*d\_s*o\_s*w\_s*s\)\|h\_s*\%(y\_s* \_s*d\_s*o\_s*n\_s*e\_s* \_s*i\_s*t\_s*?\|o\_s* \_s*d\_s*o\_s*n\_s*e\_s* \_s*i\_s*t\_s*?\)\|E\_s*B\_s*\%(u\_s*\_s*E\_s*U\|}\_s*K\_s*W\_s*\)\|e\_s*\%(s\_s*t\_s* \_s*V\_s*i\_s*r\_s*g\_s*i\_s*n\_s*i\_s*a\|b\_s*\%(y\_s*[\_s*W\|\_s*W\_s*I\|R\_s*~\_s*b\_s*N\|T\_s*\%(C\_s*g\|[\_s*\%(o\|r\_s*X\)\)\|h\_s*\_s*}\)\)\|a\_s*s\_s*h\_s*i\_s*n\_s*g\_s*t\_s*o\_s*n\|A\_s*V\_s*t\_s*@\_s*C\_s*\)\|x\_s*\|v\_s*\%(t\|\_s*\|\_s*\_s*\|\_s*\_s*\)\|o\_s*\_s*^\_s*[\|\_s*\%(\_s*\_s*c\_s*u\_s*\_s*N\|H\_s*\_s*t\|B\_s*\%([[]\|\_s*\%(\|w\_s*\_s*\)\)\|F\_s*\%(\_s*_\_s*[\_s*X\|\_s*i\_s*[\|[\_s*o\_s*[\|C\_s*\)\|@\_s*\%(C\_s*[X]\|[\_s*O\_s*i\_s*[\|\_s*_\|\_s*\%(^\_s*[\|L\_s*\_s*[\_s*\)\)\)\|T\_s*\%(h\_s*e\_s* \_s*W\_s*o\_s*r\_s*l\_s*d\_s* \_s*W\_s*i\_s*d\_s*e\_s* \_s*W\_s*e\_s*b\_s* \_s*C\_s*o\_s*n\_s*s\_s*o\_s*r\_s*t\_s*i\_s*u\_s*m\|u\_s*n\_s*g\_s*s\_s*t\_s*e\_s*n\)\|_\_s*u\_s*\_s*\_s*[\|^\_s*\_s*O\_s*X\_s*e\_s*\)', + \ 'x' : '\%([HFDB@́~Vx]\|\_s*[]\|b\_s*[HFDB@]\|\_s*[]\|V\_s*\_s*\%(t\_s*H\_s*\|z\_s*\)\|w\_s*\%([]\|f\_s*[C[]\|\_s*\_s*\_s*\|r\_s*T\_s*C\_s*Y\|k\_s*\%(\_s*\_s*\|T\_s*C\_s*Y\)\|E\_s*B\_s*\_s*h\_s*E\|[\_s*\)\|X\_s*\%([]\|C\_s*o\_s*n\_s*s\_s*o\_s*r\_s*t\_s*i\_s*u\_s*m\|f\_s*[C[]\|P\_s*S\_s*(\_s*e\_s*X\_s*p\_s*a\_s*n\_s*s\_s*i\_s*o\_s*n\_s* \_s*P\_s*a\_s*s\_s*s\_s*i\_s*n\_s*g\_s* \_s*S\_s*t\_s*y\_s*l\_s*e\_s*)\|S\_s*T\_s*C\_s*Y\|l\_s*i\_s*b\|L\_s*\%(i\_s*s\_s*p\|T\_s*C\_s*Y\)\|e\_s*n\_s*o\_s*n\)\|W\_s*I\_s*\|[\_s*\%(r\_s*E\_s*X\|\_s*\%(b\_s*N\_s*X\|O\_s*\_s*t\_s*B\)\)\|n\_s*r\_s*G\_s*\|U\_s*\%(\|r\_s*G\_s*\)\|L\_s*\%(V\_s*\%(\|\_s*\|\_s*g\_s*[\_s*\)\|Z\_s*m\_s*\|T\_s*\_s*\%(`\_s*\|^\_s*\)\)\|E\_s*x\_s*t\_s*e\_s*n\_s*s\_s*i\_s*b\_s*l\_s*e\_s* \_s*M\_s*a\_s*r\_s*k\_s*u\_s*p\_s* \_s*L\_s*a\_s*n\_s*g\_s*u\_s*a\_s*g\_s*e\|N\_s*\%(V\_s*[\|\_s*X\_s*|\_s*X\_s*g\|Z\_s*\%(i\_s*L\_s*X\|m\_s*t\_s*H\_s*\)\|U\_s*\_s*B\_s*G\|T\_s*\%(C\|\_s*\%(g\_s*X\|e\_s*B\_s*b\_s*y\|`\_s*b\_s*y\)\)\|\_s*X\_s*}\_s*X\)\|G\_s*\%(N\_s*X\|b\_s*N\_s*X\)\)', + \ 'y' : '\%([։ߕ֍HVşꔗ㊽؊ZݝZg|~}ĔϑbbщxX\cciUFg`mꡞ՛@TfxJuןLys~@籝Xyꢗqsi^wgsjfgt匍roחldnpїwzmÏhS^@焉^r`椌Pao\˗_]ߔ\SlPlaPQĉrIKb㒏̎͒oɒt沖LuVKᛮ|w䓎樏଎zڗWFQw些CޗGCPEZXONSЗ[HI֗FYJL@ሑgM祗h|懖kߗVOJR`g埓A䥐䲃ŃꍘcTUn翔䑌恍ݍrxÉj囚|dQU|ƗBd{Nj佈䆍mnؐFAtF̌Ì䉳LdƜјJiꌒՓkvɔžo֍y󙬌ME|ځe퐈M臐YOΖZ}xא򌵉MՁO䗚P{bwN~}zcc硉Ɏh䕟JsW]bK\Tซ]r䟈ZЛTmĈDMßICm覉@BuAA܊jHڈΊֈÈ1PyDIDR۔шዏܐRΔđP_ʈމ‘Ehe˗v֍s}وߓƈݟDᒒK֋҉]~˓ڏΗ͛HB܈횀}ɋU䏜SΉuЈ׈ۈӘߗǔ@bo؈Uw͉]ਖ看̈g؂Ԅ`tcbّqۈŔsMlhE`_ʗSQn_a–zl˗DyيVo原KZ꞉vNu򎾛k欎ຏkstqrRГ@ݜD洗{kєJT׈ՋxNۈiዖ熔Wt❔ĔjJE˕a뉉̖\~ƝₙuE~FvCJY҄\zy]\|\_s*[ղ]\|b\_s*[C]\|\_s*[䂢]\|^\_s*\_s*b\|\_s*\_s*b\|I\_s*\|\_s*\|B\_s*\|I\_s*\|4\_s*\%([“]\|\_s*\|\_s*\)\|\_s*\|m\_s*j\|\_s*\|\_s*\|F\_s*\|\_s*\|j\_s*\|\_s*[q]\|h\_s*L\|V\_s*\|\_s*[j]\|@\_s*\|\_s*[q]\|i\_s*\|W\_s*\|8\_s*\|\_s*\|t\_s*\%(\|^\_s*[\_s*\)\|\_s*\|\_s*\|\_s*\|~\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|S\_s*\|L\_s*i\_s*l\_s*i\_s*\%(o\_s*p\_s*s\_s*i\_s*d\_s*a\|a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\)\|\_s*\%(Y\|\_s*\)\|\_s*M\|\_s*\|\_s*\|\_s*\|E\_s*\%(u\|\_s*[\_s*\)\|a\_s*\|J\_s*u\_s*\%(l\_s*i\_s*a\_s*n\_s*i\_s*a\_s*l\_s*e\_s*s\|n\_s*c\_s*a\_s*l\_s*e\_s*s\)\|c\_s*J\|c\_s*\|G\_s*s\|\\_s*Z\_s*\|Q\_s*q\|G\_s*\|\_s*\_s*\|\_s*\|\_s*\|N\_s*a\_s*j\_s*a\_s*d\_s*a\_s*l\_s*e\_s*s\|\_s*G\|\_s*\|\_s*t\_s*\|5\_s*[“]\|T\_s*[“]\|\_s*E\|r\_s*U\|\_s*\|\_s*Y\|\_s*[\|\_s*\_s*\|\_s*\|~\_s*\|{\_s*\|o\_s*\|\_s*g\|Y\_s*[q]\|@\_s*\|h\_s*[‘]\|U\_s*\%(\|^\_s*[\_s*\|r\_s*t\_s*i\_s*c\_s*a\_s*l\_s*e\_s*s\)\|E\_s*[cR]\|C\_s*\|d\_s*\%(`\_s*r\_s*s\|u\_s*d\)\|]\_s*[햅oZ]\|\_s*\|\_s*q\|_\_s*\|\_s*r\_s*\|\_s*\_s*\|G\_s*\%(r\_s*a\_s*m\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\|l\_s*u\_s*m\_s*i\_s*f\_s*l\_s*o\_s*r\_s*a\_s*e\|i\_s*n\_s*k\_s*g\_s*o\_s*p\_s*s\_s*i\_s*d\_s*a\)\|\_s*\|\_s*\_s*\|r\_s*\|s\_s*\_s*\|o\_s*[E]\|\_s*[Wk]\|C\_s*[؎Q]\|\_s*\\|\_s*\_s*[ΒY]\|_\_s*F\|e\_s*[]\|p\_s*\%([꓍]\|g\_s*\)\|\_s*\_s*\|\_s*[ȉ]\|D\_s*i\_s*a\_s*p\_s*e\_s*n\_s*s\_s*i\_s*a\_s*l\_s*e\_s*s\|s\_s*[”@]\|\_s*{\|\_s*\_s*\|\_s*\|\_s*L\_s*n\|\_s*\|\_s*[c]\|R\_s*a\_s*f\_s*f\_s*l\_s*e\_s*s\_s*i\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|\_s*\|\_s*\|\_s*\|V\_s*\\|`\_s*G\|\_s*{\_s*\_s*\|\_s*a\|T\_s*\%(h\_s*e\_s*l\_s*i\_s*g\_s*o\_s*n\_s*a\_s*l\_s*e\_s*s\|r\_s*o\_s*c\_s*h\_s*o\_s*d\_s*e\_s*n\_s*d\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\)\|M\_s*y\_s*r\_s*i\_s*c\_s*a\_s*l\_s*e\_s*s\|\_s*\_s*t\|\_s*\|P\_s*\%(o\_s*a\_s*l\_s*e\_s*s\|l\_s*u\_s*m\_s*b\_s*a\_s*g\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\|a\_s*l\_s*m\_s*a\_s*l\_s*e\_s*s\|r\_s*\%(o\_s*t\_s*e\_s*a\_s*l\_s*e\_s*s\|i\_s*n\_s*c\_s*i\_s*p\_s*e\_s*s\)\)\|A\_s*r\_s*a\_s*c\_s*a\_s*l\_s*e\_s*s\|\_s*q\|\_s*[j]\|x\_s*\%([k]\|V\_s*\_s*c\)\|G\_s*\%(z\_s*o\|t\_s*Q\_s*j\_s*[\|\_s*\_s*@\_s*\|j\_s*Z\_s*C\|[\_s*\)\|\_s*C\)', + \ 'z' : '\%([󉀉ꑹ㔑ґmhXfّۑ\]Y萊AK㿑RUWN征͑V陑TPQfOS⚃ҐƐōUӂžlb齕AZB钎@笐~tߒÐ|}CD󓈓Ȟ펱ƎwxcH苍׎l䝎ڐ㒼ÓKbHזiᶘu@vސnՉ`rxosqwptl䥞`œҏtJ珊RPtigYU{ㅐ媚ߘjhŘ竐ҝmYo@ݖÏꏗ`~]꞊󝵏휵hGڜGQ榏A@uQhxmnpq⢓ďmÏ|m՟~[x{䤏zy}汛}杆nG໒^E☸sF_`Oca_Y[]b\Zedꎠm䢛ykdHmˎ掝~Ŏn~Im熉a玘JȎqj^ZiVV␷╛NM趞ƎLGQZSR͛؜kO槎SbΜ͎acZˍϙ܍ލߍ݊oY፿U[]wGY]ZUWĄH[xz]\|\_s*\%(\_s*\|\_s*\|\_s*\|\_s*\|\_s*\)\|b\_s*[][YWU]\|\_s*[]\|\_s*\|\_s*\|o\_s*\|\_s*[q]\|\_s*\|\_s*\_s*\|\_s*\|O\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*p\|\_s*o\|C\_s*@\|m\_s*\|\_s*\|k\_s*[ߌY]\|\_s*\|\_s*s\|F\_s*i\_s*g\_s*u\_s*r\_s*e\|\_s*\|G\_s*\%(\_s*\|p\_s*\)\|D\_s*y\|f\_s*\%(\_s*\|p\_s*\)\|x\_s*x\|\_s*\|Q\_s*\|2\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*q\|J\_s*\%(I\_s*S\_s*R\_s*[\_s*h\||\_s*b\_s*v\|R\_s*\_s*\_s*{\)\|\_s*q\|b\_s*\_s*\_s*\_s*\_s*\_s*M\_s*h\_s*p\_s*\|k\_s*\$\_s*_\_s*{\_s*e\_s*f\_s*f\_s*}\_s*\$\|[\_s*\%(\|\_s*\)\|`\_s*\_s*\|\_s*\%(\|\_s*\)\|\_s*\|\_s*\|\_s*\|R\_s*l\|y\_s*_\|\_s*\|\_s*\|\_s*\|\_s*r\_s*\|\_s*v\|\_s*\|\_s*\|\_s*\|\_s*[@S]\|C\_s*a\_s*b\_s*o\_s*m\_s*b\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|i\_s*\%(\_s*[\_s*O\||\_s*b\_s*v\|t\_s*m\_s*j\_s*n\)\|\_s*q\|\_s*\|P\_s*\%(Q\|O\_s*[i]\|P\_s*\|U\_s*i\|W\_s*\)\|t\_s*\|\_s*\|R\_s*\|1\_s*\%(0\|1\_s*\|8\_s*\|2\_s*\)\|\_s*\|\_s*\|\_s*\|\_s*u\|e\_s*\|\_s*\|\_s*\|\_s*{\|U\_s*\_s*\|\_s*H\|\_s*\|T\_s*\%(\_s*\|\_s*|\_s*[\_s*j\_s*\|\_s*S\_s*T\)\|Z\_s*\%([r]\|i\_s*\%(r\_s*c\_s*o\_s*n\_s*i\_s*u\_s*m\|n\_s*c\)\|K\_s*\_s*_\_s*\|o\_s*b\_s*t\_s*@\|I\_s*P\_s*t\_s*@\_s*C\_s*\)\|V\_s*\%(^\_s*[\_s*\|I\_s*\%(\|j\_s*\%(X\_s*g\|Y\_s*\)\)\)\|y\_s*\%([]\|\_s*\|\_s*\_s*\_s*\)\|c\_s*\%(@\_s*\%(\_s*g\_s*D\_s*X\_s*g\_s*\|C\_s*g\)\|F\_s*\%(i\_s*[\|b\_s*y\_s*\_s*\|\_s*}\_s*b\_s*g\)\|B\_s*\%(N\_s*\_s*X\|^\_s*[\|[\_s*O\_s*\_s*[\|\_s*\%(o\_s*\_s*\|}\_s*[\_s*}\_s*\)\|S\_s*C\_s*l\_s*\)\)\|`\_s*\%(N\_s*\_s*X\|A\_s*m\_s*[\_s*[\|\_s*[\_s*\_s*\%(q\|b\_s*q\)\|\_s*\_s*_\_s*b\_s*V\_s*\|S\_s*C\_s*l\_s*\_s*\_s*C\_s*[\_s*\)\)', + \ '{' : '[o{]', + \ '|' : '[ba|]', + \ '}' : '[p}]', + \ '~' : '[ʁ`P~]', + \ } +endfunction diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/EasyMotion/migemo/eucjp.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/EasyMotion/migemo/eucjp.vim new file mode 100644 index 0000000..3d7e21b --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/EasyMotion/migemo/eucjp.vim @@ -0,0 +1,97 @@ +function! EasyMotion#migemo#eucjp#load_dict() + return { + \ '!' : '\%([⡪!]\|\_s*ò\_s*\)', + \ '"' : '[ɡȡ"]', + \ '#' : '[#]', + \ '$' : '[\$]', + \ '%' : '\%([%]\|\_s*\_s*\_s*\_s*\)', + \ '&' : '\%([&]\|\_s*\_s*\%(\|\_s*\_s*\_s*\)\)', + \ "'" : '\%([ɡơ졭'']\|\_s*\_s*\_s*\_s*\_s*\_s*\)', + \ '(' : '[ʡ̡ڡء(]', + \ ')' : '[ۡ١ˡ)]', + \ '*' : '[ߢ\*]', + \ '+' : '[ިܨ+]', + \ ',' : '[,]', + \ '-' : '\%([ࡽݨ-]\|\_s*\_s*\_s*\| \_s*\_s* \)', + \ '.' : '\%([š\.]\|\_s*\_s*\_s*\%(\_s*\_s*\|\_s*\)\)', + \ '/' : '\%([ࡿ\/]\|s\_s*l\_s*a\_s*s\_s*h\_s*d\_s*o\_s*t\|\_s*\_s*\%(\|\_s*\_s*\_s*\_s*\_s*\)\)', + \ '0' : '\%([0]\|\_s*\|z\_s*e\_s*r\_s*o\)', + \ '1' : '\%([ɴGMKhYZEPTnmcyzdafpС죱1]\|\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|s\_s*\%(e\_s*v\_s*e\_s*n\_s*t\_s*e\_s*e\_s*n\|i\_s*x\_s*t\_s*e\_s*e\_s*n\)\|\_s*\_s*\_s*\_s*[֥]\|\_s*\_s*\%(\_s*\|\_s*\)\|\_s*\_s*\_s*\_s*\_s*\|\_s*\%(\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\)\|g\_s*i\_s*g\_s*a\|\_s*\|\_s*\|k\_s*i\_s*l\_s*o\|\_s*\|\_s*\_s*\|e\_s*\%(i\_s*g\_s*h\_s*t\_s*e\_s*e\_s*n\|l\_s*e\_s*v\_s*e\_s*n\|x\_s*a\)\|\_s*\%(\_s*\_s*\_s*\_s*\|\_s*\)\|\_s*\|t\_s*\%(w\_s*e\_s*l\_s*v\_s*e\|h\_s*\%(i\_s*r\_s*t\_s*e\_s*e\_s*n\|o\_s*u\_s*s\_s*a\_s*n\_s*d\)\|e\_s*\%(n\|r\_s*a\)\)\|\_s*[]\|\_s*\%(\|\_s*\_s*\_s*\_s*\_s*\)\|\_s*\_s*\_s*\|\_s*\%(\|\_s*\)\|\_s*\%(\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\|\_s*\)\|\_s*\%(\|\_s*\)\|\_s*\%(\|\_s*\)\|\_s*[]\|\_s*\|\_s*\|\_s*\%(\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\)\|\_s*\|o\_s*n\_s*e\)', + \ '2' : '\%([б2]\|\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\|t\_s*w\_s*\%(o\|e\_s*n\_s*t\_s*y\)\|\_s*\)', + \ '3' : '\%([3]\|\_s*\_s*\|\_s* \_s*\_s* \_s*\|\_s*\_s*\%(\|\_s*\)\|\_s*\_s*\|t\_s*h\_s*\%(i\_s*r\_s*t\_s*y\|r\_s*e\_s*e\)\)', + \ '4' : '\%([ͣ4]\|f\_s*o\_s*u\_s*r\|\_s*\_s*\)', + \ '5' : '\%([5]\|f\_s*i\_s*\%(f\_s*t\_s*y\|v\_s*e\)\|\_s*\%(\_s*\_s*\%(\|\_s*\)\|\_s*\_s*\)\)', + \ '6' : '\%([ϻ6]\|s\_s*i\_s*x\|\_s*\_s*\_s*\)', + \ '7' : '\%([7]\|\_s*\_s*\|s\_s*e\_s*v\_s*e\_s*n\)', + \ '8' : '\%([Ȭ8]\|\_s*\_s*\%([]\|\_s*\)\|e\_s*i\_s*g\_s*h\_s*t\)', + \ '9' : '\%([壹9]\|\_s*\_s*\|n\_s*i\_s*n\_s*e\)', + \ ':' : '[ġ:]', + \ ';' : '[;]', + \ '<' : '[<]', + \ '=' : '[⢮=]', + \ '>' : '[>]', + \ '?' : '[?]', + \ '@' : '[@]', + \ 'A' : '\%([ԳȯϾտƭ޾ӡŤƬѫͷʷİͿøܶ쨽̵ᵽ驰нƪ鷹ѻˢǽ½֦½ΦؽǮȲ䰵ǴݯռмԹ޹׹Ϫɽ¹Юͽ㹻ɷŰ庾Ӻ̴ɵఽ;ŷֵϰ̣ðԪƴ갮ůμۭ浱ϯޫۦۥ˾ϾݷԼనʸۣ齶ϰ갥欷ǹ԰ްưɰȰīð­Ӽ밫Ƽǹ˽˰ķʻг㰭մ먰µͭްب˰کʡ&ܶϰ͢΢޸姸ơǢѦA]\|\_s*\|\_s*\|\_s*\|\_s*\|Z\_s*\%(n\|i\_s*n\_s*c\)\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*ŷ\_s*\|\_s*ŵ\|\_s*\|\_s*\|\_s*Ʀ\|\_s*\|\_s*\|\_s*̾\|\_s*̾\|\_s*\|\_s*\|\_s*[Ļ]\|\_s*\|\_s*\|\_s*\|L\_s*a\_s*r\_s*d\_s*i\_s*z\_s*a\_s*b\_s*a\_s*l\_s*a\_s*c\_s*e\_s*a\_s*e\|\_s*\|\_s*\%(\|¹\_s*\)\|\_s*\%(\|\_s*\_s*\_s*ʪ\_s*\)\|\_s*\_s*\|H\_s*a\_s*l\_s*o\_s*r\_s*a\_s*g\_s*a\_s*l\_s*e\_s*s\|ޱ\_s*\|\_s*\|Ʀ\_s*\|\_s*\_s*\_s*\|\_s*¿\|\_s*\|\_s*\|a\_s*\%(t\_s*t\_s*o\|c\_s*c\_s*e\_s*n\_s*t\)\|\_s*[ºǬ]\|\_s*\|\_s*[ɧ]\|\_s*\|\_s*\|\_s*\|Ҹ\_s*\|\_s*\%([]\|\_s*\|\_s*\)\|\_s*[ˡ]\|E\_s*\%(s\|i\_s*n\_s*s\_s*t\_s*e\_s*i\_s*n\_s*i\_s*u\_s*m\)\|\_s*\%(\_s*\_s*\|\_s*\%(\_s*\|\_s*\_s*\)\)\|I\_s*\%(r\_s*i\_s*d\_s*a\_s*l\_s*e\_s*s\|P\_s*\%(\_s*\|\_s*\_s*\_s*\)\|D\_s*\_s*\_s*\|C\_s*\%(\_s*\|\_s*\_s*\)\)\|\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*[ɿο]\|R\_s*u\_s*b\_s*i\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|\_s*\_s*\_s*\|\_s*\|\_s*\|\_s*[]\|M\_s*a\_s*l\_s*v\_s*a\_s*l\_s*e\_s*s\|\_s*\_s*\_s*\_s*A\| \_s*\_s*\_s*\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\|\_s*\|\_s*\|G\_s*o\_s*l\_s*d\|\_s*ư\_s*\%(\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\)\|°\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\|S\_s*\%(b\|i\_s*l\_s*v\_s*e\_s*r\)\|\_s*\_s*\_s*ǽ\|\_s*\_s*\_s*ǽ\|\_s*ˡ\|\_s*\_s*\_s*\|\_s*\%(\|\_s*\_s*\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\%(\_s*\_s*\|\_s*\%([]\|\_s*\%(\_s*\|\_s*\)\)\)\|\_s*\%([ȥ]\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\_s*\%(\|\_s*\)\|\_s*\_s*\|\_s*\%(\_s*\|\_s*\_s*\|\_s*\|\_s*\%(\_s*\|\_s*\_s*\)\)\|\_s*\_s*\|\_s*\%([]\|\_s*\_s*\)\|\_s*\_s*\%(\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\)\|\_s*\|\_s*\%(\_s*\_s*\|\_s*\_s*\)\|\_s*\_s*\_s*\_s*\_s*\|\_s*\)\)\|\_s*\|\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\|\_s*\|\_s*\_s*\%(\_s*\_s*\|\_s*ǽ\)\|\_s*\%(\_s*\_s*\|\_s*\|\_s*\_s*\)\|\_s*\_s*\_s*\_s*\_s*\|\_s*\%(\_s*\|\_s*\|\_s*\)\|\_s*Ͽ\|\_s*\|\_s*\%([˥ᥢ]\|\_s*\|\_s*\%(\_s*\_s*\|\_s*\_s*\%(\|\_s*\_s*\)\|\_s*\)\|\_s*\|\_s*\_s*\|\_s*\|\_s*\_s*\)\)', + \ 'B' : '\%([߹ھڽ𰺱ѳ˦˲̶˳ر˸˹˻˶˺˴˾˵˿Ŵը˫Ħ˷沶ѹʽٷҡ۲˼ū޽ʥ޼޿ʪɲʹʸק̵زǿ⿡ʬԤ͹ɵɤޣֱؾݧɴ졪ǭɼ֢ʿ̤ջ߾׹Ȣ®Ӷȭ˪ƯȪȫʵüɡΥV̥ٶȵȶǢʢʧ㱸Ȥ˽ձ೭ȨؤȹȽȼ㩺ȲȴȳŽβĥͿ̤Сʩ첼ߡݡ¡áܥСϡΡѡУ¥֥ӦҦ¥B]\|\_s*\%(\_s*\|\_s*\|\_s*\|\_s*\|\_s*\)\|\_s*[ܥ٥֥ӥ]\|\_s*[ܤ٤֤Ӥ]\|\_s*\|\_s*\|\_s*\|P\_s*a\_s*e\_s*o\_s*n\_s*i\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*Ǥ\|\_s*\|\_s*[]\|\_s*\_s*ݰ\|F\_s*a\_s*g\_s*a\_s*l\_s*e\_s*s\|\_s*\|\_s*\|\_s*\%(\|\_s*\_s*\|\_s*\_s*\)\|\_s*\|\_s*\|\_s*\|˭\_s*[]\|\_s*\|ŷ\_s*\_s*\|\_s*[϶]\|b\_s*i\_s*o\_s*t\_s*o\_s*p\_s*e\|׽\_s*˥\|\_s*[̡˥]\|\_s*Ҵ\|\_s*Ƭ\_s*\|\_s*\|\_s*\|S\_s*a\_s*n\_s*t\_s*a\_s*l\_s*a\_s*l\_s*e\_s*s\|\_s*\|ʼ\_s*[ˡ]\|\_s*[Ļ]\|ɽ\_s*\|\_s*\|ȯ\_s*\|\_s*\|\_s*\_s*\_s*\|\_s*\_s*\|R\_s*o\_s*s\_s*a\_s*l\_s*e\_s*s\|\_s*\|\_s*\|\_s*\%([ϫ]\|\_s*\_s*\)\|\_s*\|\_s*\|\_s*\|A\_s*n\_s*n\_s*o\_s*n\_s*a\_s*c\_s*e\_s*a\_s*e\|\_s*[]\|\_s*\|\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\_s*\|\_s*[]\|\_s*\_s*\_s*\_s*\|\_s*\|\_s*\|\_s*\%(\_s*\|\_s*\_s*\_s*\_s*\)\|\_s*\|\_s*\_s*\_s*\|\_s*\|\_s*\_s*\)', + \ 'C' : '\%([²ݰťޢ°Я⸿ȽǼۻô㪸ۺ礷򼷻쮱޹ѺϹٹۺѺ縥պ︷ȹ޳Ӭު⺤ӫޫص٫ȺҺۦ־ִṲӳָ̫٬޸ܺս幡й䢹̨ɹж๫ʹá乨ۥ⫹⩹۶չ̹˹عֹ骹¹ݹҹԹθĹӹëӭصĨ̼ܵ٢޵ѻ۹ƺݸջʴڸǻ䲹žݸ檽۸ŵ麮Ķ۸ɸɯŶ˻ܦíӵ޶٣໦Ҫͼ·֣訰Ѣ޷ѩڱ߫ߥѡ٥Ѩڣ̻ګǺخعṶܮݮݬܱܯݫʵߪ÷ٷʤվ߷ţ賷ΦۻҮ·ط״򷬷ڶ˿ֲƺ̽ǰ̰鶰פ޺ޱͿ߸ѦΦ庿ܸȷˮԢʭЦġ궡ȷ㹩家Ң׵Դ񣹸͹ȶҿݹڵ⤯Ա颼ýƳħ󻼲١Ĵɸ¢ֺλߨߧ¼ȻοǦǧкϢ尷樦ȵԦܰǢܾؼ鼮Ĭ߼𭼿ɨũżʻ͸忬ļҺĵհռޯκٱ⬼բμ忼޼мܼѼ׼ͼм˼ּҰʵ༩ǿެոշܤܣƵýʽȽͽɽܼ̿н֭ܶӴ嵼ϸܽµ½Ѯآ߽ضӽؽ޴׽ٽ䣽ֽ߿֪꿾˿Ӣǿп¿Ŀ˿ӿ¿ǿä⿹üʿƿ謹ннؽ׼һ޵黪پطգңֹϾӾԡѽؾѾء髾޾۾騾ľ㾩ாܥ꾤Ͼɾ˾ƴҾ;ƾоȾþϾܾھ˾֤ԧῡ°濣ֻɦƵڴԮӡݻӻǻ߻දԻջ֬ڻϿŻ溡᡺ллǷǡʻ᪶ۿڻףһл̦򼡿ּ׶꼨ǻ徼㬻˻㫻ڹɳ߳˹ȷ̢ư񢿱ƱʡܢᱵʹǡˡԡơɡСҡȡѡաجɳ϶Ѿʸܵȿּĵǣʶͽгϵع˵ۿٸǷͩΫ峻KĴȱ١۫Ȧ滳Ҥٿ龹ôŽ޳ڳ³ư귰¦γǰ㡴姡റҳݲҳ˿ڸিԣϸ³ø֡סٷŭƬŬŨ״׳ŤҰɬŴܷ̳ڲųӾ筢Խڨƿӽdzӡ͡ڡΡۡϡ̳ȳijԳճʳ߱ڼ˳ͳȵҳֳѳרһТӼ߶ݥ袳ЪĻӳܴ߳ٳβ𳭳dz󳬲Ӳ٪۸٢ԬٺҰߵХĽ楼Ѵ޾˸˧ӳޱڿͻôÿȡȴݴ԰ݴ۴ڴԴա̴δ˴עӴӿٴƴŴִ״ɴشϴѴشԳҵȴճƶɳվײ˲ײޥϲӧ鴲ӻβٳϲʸӥ׷ҽԻٷ߲ѲβӼβȹŷѫȻ¥ϲݲľӾ۲Ҵ粽桲Ʒ²ФԲּвزͤıĶƢ۲ø򧶧اۧէ٧ܧק⧿觵ӧ𧼧ߧҧާѧ֧᧱㧺秽䧰ڧݧԧ姫ߨƼ֦ҧݡ׶ܥáC]\|\_s*[]\|\_s*[]\|\_s*[Ҥ]\|\_s*\|\_s*\_s*Ⱦ\|\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*ϧ\|\_s*\|\_s*\|\_s*\|f\_s*o\_s*o\_s*t\_s* \_s*a\_s*n\_s*d\_s* \_s*m\_s*o\_s*u\_s*s\_s*e\_s* \_s*d\_s*i\_s*s\_s*e\_s*a\_s*s\_s*e\|\_s*Ѥ\|\_s*\|A\_s*\%(r\_s*c\_s*h\_s*i\_s*c\_s*h\_s*l\_s*a\_s*m\_s*y\_s*d\_s*e\_s*a\_s*e\|p\_s*i\_s*a\_s*l\_s*e\_s*s\)\|U\_s*m\_s*b\_s*e\_s*l\_s*l\_s*i\_s*f\_s*l\_s*o\_s*r\_s*a\_s*e\|\_s*\|\_s*\|\_s*ˡ\|\_s*[ʺ]\|\_s*[϶]\|ѱ\_s*\|\_s*\|\_s*[̱ѡ]\|\_s*\|\_s*\|ɴ\_s*[߻]\|\_s*\|9\_s*[]\|\_s*\|\_s*\|\_s*\|\_s*\%(\|\_s*\)\|\_s*\|\_s*\|ŵ\_s*\_s*\|õ\_s*\|\_s*¢\_s*\|H\_s*e\_s*l\_s*l\_s*e\_s*b\_s*o\_s*r\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|\_s*\|J\_s*u\_s*g\_s*l\_s*a\_s*n\_s*d\_s*a\_s*l\_s*e\_s*s\|ϻ\_s*\|\_s*\|\_s*\|R\_s*h\_s*a\_s*m\_s*n\_s*a\_s*l\_s*e\_s*s\|Ϸ\_s*\|˾\_s*Ĭ\|\_s*[]\|\_s*Ϣ\|\_s*[Ǧ]\|\_s*\|L\_s*a\_s*\%(u\_s*r\_s*\%(a\_s*c\_s*e\_s*a\_s*e\|o\_s*i\_s*d\_s*e\_s*a\_s*e\)\|b\_s*i\_s*a\_s*t\_s*a\_s*e\|m\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\)\|\_s*\_s*\|ʾ\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*\|\_s*\|ت\_s*ͺ\|\_s*\|\_s*\|I\_s*\%(s\_s*o\_s*p\_s*y\_s*r\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|l\_s*l\_s*i\_s*c\_s*i\_s*a\_s*c\_s*e\_s*a\_s*e\)\|W\_s*i\_s*n\_s*t\_s*e\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\|\_s*ʸ\|\_s*[]\|\_s*\%([αֲ˼]\|\_s*\|Ǽ\_s*\|\_s*\)\|\_s*\%(\_s*\_s*\|\_s*\_s*\)\|\_s*\|7\_s*\|ʸ\_s*\|\_s*[ʬ]\|4\_s*\|\_s*\|\_s*\|\_s*\|\_s*[̰]\|\_s*\|\_s*\%(̣\|\_s*\)\|\_s*[]\|͢\_s*[]\|´\_s*\|B\_s*r\|Ȼ\_s*[ϯϺ]\|\_s*[]\|\_s*[]\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|M\_s*\%(e\_s*t\_s*a\_s*c\_s*h\_s*l\_s*a\_s*m\_s*y\_s*d\_s*e\_s*a\_s*e\|u\_s*s\_s*a\_s*l\_s*e\_s*s\)\|S\_s*\%([ge]\|p\_s*e\_s*r\_s*m\_s*a\_s*t\_s*o\_s*p\_s*h\_s*y\_s*t\_s*a\|c\_s*i\_s*t\_s*a\_s*m\_s*i\_s*n\_s*e\_s*a\_s*e\)\|Z\_s*i\_s*n\_s*g\_s*i\_s*b\_s*e\_s*r\_s*a\_s*l\_s*e\_s*s\|³\_s*\%(\_s*\_s*\%(\|\_s*\)\|\_s*\_s*\_s*\_s*\)\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\%(\_s*\|\_s*\|\_s*ƻ\)\|\_s*\|Υ\_s*\_s*Υ\_s*\|\_s*\|\_s*[]\|\_s*\|\_s*Ƭ\|\_s*\%(\|\_s*\)\|Ĺ\_s*[]\|\_s*\|ŷ\_s*\%(\|\_s*\)\|\_s*\|\_s*\_s*\|O\_s*x\_s*a\_s*l\_s*i\_s*d\_s*a\_s*c\_s*e\_s*a\_s*e\|\_s*[]\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*[]\|̱\_s*\|\_s*\|E\_s*\%(b\_s*e\_s*n\_s*a\_s*l\_s*e\_s*s\|l\_s*a\_s*n\_s*a\_s*l\_s*e\_s*s\)\|\_s*\_s*\|\_s*\|\_s*\|P\_s*\%(i\_s*p\_s*e\_s*r\_s*a\_s*\%(l\_s*e\_s*s\|c\_s*e\_s*a\_s*e\)\|t\_s*e\_s*r\_s*i\_s*d\_s*o\_s*s\_s*p\_s*e\_s*r\_s*m\_s*\%(a\_s*l\_s*e\_s*s\|i\_s*d\_s*a\_s*e\)\|o\_s*\%(t\_s*a\_s*s\_s*s\_s*i\_s*u\_s*m\|d\_s*o\_s*s\_s*t\_s*e\_s*m\_s*o\_s*n\_s*a\_s*l\_s*e\_s*s\)\)\|\_s*\|Ϣ\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*\%(\|\_s*\)\|\_s*\|\_s*\|\_s*\%(\|Ϥ\_s*\)\|\_s*\|\_s*[]\|\_s*\%([]\|\_s*\|\_s*\_s*Ω\_s*\_s*\_s*\_s*\_s*\_s*\)\|\_s*[]\|(\_s*\_s*)\|\_s*\_s*\|\_s*ʼ\|\_s*\|\_s*\%(\|\_s*\)\|\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|ݣ\_s*\|\_s*\|T\_s*\%(h\_s*a\_s*l\_s*i\_s*c\_s*t\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|u\_s*b\_s*i\_s*f\_s*l\_s*o\_s*r\_s*a\_s*e\)\|\_s*\_s*\_s*\_s*\_s*\|\_s*ƣ\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|ʬ\_s*\|\_s*\_s*\_s*\|\_s*\|\_s*\_s*\_s*\|c\_s*\%(e\_s*n\_s*t\_s*i\|r\_s*e\_s*s\_s*c\)\|\_s*[׾]\|ʣ\_s*\_s*̿\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\%(\_s*\_s*\_s*\|\_s*\|\_s*\%(\_s*\_s*\_s*\|\_s*\|\_s*\%([]\|\_s*\%(\|\_s*\)\)\|\_s*\%(\_s*\|\_s*\)\|\_s*\%(\|\_s*\_s*\_s*\%(\_s*\|\_s*\)\)\|\_s*\_s*\_s*\|\_s*\|\_s*\_s*\|\_s*\_s*\)\|\_s*\%(\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\|\_s*\%(\|\_s*\_s*\_s*\%(\_s*\_s*\|\_s*\_s*\_s*\_s*\)\)\|\_s*\%(\_s*\%(\_s*\|\_s*\_s*\%(\_s*\|\_s*\_s*\)\)\|\_s*\)\)\)\|\_s*\_s*\_s*\|\_s*\|\_s*\%([]\|\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*[]\|\_s*\_s*\_s*\|\_s*\%(\_s*\_s*\%(\|\_s*\)\|\_s*\_s*\_s*\)\|\_s*\%([֥ץ]\|\_s*\_s*\_s*\_s*\|\_s*\|\_s*\_s*\_s*\|\_s*\%(\|\_s*\_s*\_s*\)\|\_s*\_s*\|\_s*\)\|\_s*\%(\|\_s*\_s*\|\_s*\_s*\_s*\|\_s*\%(\|\_s*\)\)\|\_s*\%(\_s*\|\_s*\)\)\|\_s*\%(\_s*\_s*\|\_s*\_s*\|\_s*\|\_s*\%([]\|\_s*\|\_s*\%(\_s*\|\_s*\)\|\_s*\%(\|\_s*\)\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*\%(\|\_s*\|\_s*\|\_s*\_s*\_s*\)\)\|\_s*\%(\|\_s*\|\_s*\_s*\)\|\_s*\|\_s*\_s*\|\_s*\|\_s*\_s*\|\_s*\|\_s*\_s*\|\_s*\%([ɥѥ֥]\|\_s*\%(\|\_s*\_s*\)\|\_s*\%([]\|\_s*\%(\|\_s*\_s*\_s*\)\)\|\_s*\|\_s*\%(\_s*[]\|\_s*\)\|\_s*\|\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\%(\_s*\|\_s*\%(\|\_s*\_s*\)\)\|\_s*\%(\|\_s*\_s*\|\_s*\|\_s*\)\|\_s*\%(\|\_s*\_s*\)\|\_s*\%([ĥȥ]\|\_s*\|\_s*\|\_s*\%(\|\_s*\|\_s*\%(\|\_s*\)\)\)\|\_s*\%(\_s*\|\_s*\_s*\)\|\_s*\|\_s*\%(\|\_s*\|\_s*\)\|\_s*\_s*\_s*\|\_s*\%(\|\_s*\%(\|\_s*\)\)\|\_s*\%(\|\_s*\_s*\|\_s*\|\_s*\_s*[]\|\_s*\)\|\_s*\_s*\|\_s*\%([]\|\_s*\|\_s*\_s*\_s*\_s*\_s*\|\_s*\|\_s*\)\|\_s*\)\|\_s*\%(\|\_s*\|\_s*\_s*\)\)\|\_s*\|\_s*\%([ޥ]\|\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*\|\_s*\%([ץ]\|\_s*\_s*\|\_s*\_s*\)\|\_s*\%(\|\_s*\)\|\_s*\%(\_s*\_s*\|\_s*\_s*\_s*\_s*\)\|\_s*\%([եȥץ]\|\_s*\|\_s*\)\|\_s*\%([]\|\_s*\%(\|\_s*\)\|\_s*\%(\_s*\|\_s*\|\_s*\_s*\_s*\)\|\_s*\%(\|\_s*\|\_s*\_s*\|\_s*\)\|\_s*\%(\_s*\|\_s*\_s*\)\|\_s*\_s*\_s*\|\_s*\|\_s*\_s*\|\_s*\%([ȥ]\|\_s*\_s*\)\|\_s*\%([]\|\_s*\|\_s*\|\_s*\_s*\)\|\_s*\%(\|\_s*\|\_s*\)\)\|\_s*\%([եɥ󥳥ꥦ]\|\_s*\|\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\%(\|\_s*\)\|\_s*\|\_s*\%(\|\_s*\|\_s*\_s*\)\|\_s*\%([]\|\_s*\|\_s*\%(\_s*\|\_s*\)\)\|\_s*\%(\_s*[]\|\_s*\_s*\)\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*\|\_s*\%([ȥॸ]\|\_s*\|\_s*\%(\|\_s*\)\|\_s*\|\_s*\%([]\|\_s*\)\)\|\_s*\_s*\)\|\_s*\%([]\|\_s*\|\_s*\_s*\_s*\|\_s*\%(\|\_s*\|\_s*\|\_s*\_s*\)\|\_s*\|\_s*\%(\|\_s*\|\_s*\)\|\_s*\)\)\|\_s*ɸ\|\_s*\|\_s*\|\_s*\%(\|\_s*\_s*\_s*\)\|\_s*³\|\_s*\%(\_s*\|\_s*\_s*\|\_s*\%(\|\_s*\_s*\|\_s*\)\)\|ú\_s*\)', + \ 'D' : '\%([ñӹɾǯĻЧγѪƺѯƫƯƣޡƷƴƼƵƳƸƲƶưƹƱƻȸαϿ׸ͻפɻǩťŮܬҴޡѣžȤǥɶʹ˶¤Դ͸ϢߵſťϼϤ¼êíݺǻïîԵ̺ë۴ֳٹէåæǶʿϡö׼ԥ̼ձټ۴ٽɿίʿѵ߱ΩѼĽФľЦ\.šġɡȢãȣĥɡզĥǢD]\|\_s*\%(\_s*\|\_s*\|\_s*\|\_s*\|\_s*\)\|\_s*[ɥǥť¥]\|\_s*[ɤǤŤ¤]\|\_s*\|\_s*\_s*\|\_s*\|S\_s*a\_s*u\_s*r\_s*u\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\|C\_s*\%(u\|o\_s*p\_s*p\_s*e\_s*r\)\|\_s*ŷ\_s*\|Ʀ\_s*\|ǡ\_s*\|\_s*\|\_s*\|Ǵ\_s*\_s*\|\_s*\|\_s*\|\_s*[]\|\_s*\|\_s*\|Ƭ\_s*[]\|\_s*\|\_s*\|\_s*\|Ĵ\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*ã\|\_s*\|\_s*\|\_s*\_s*ã\_s*¿\|\_s*\%([˸]\|ʿ\_s*\|\_s*ŷ\_s*\|\_s*\%(\|\_s*\)\)\|ǵ\_s*[]\|\_s*\|\_s*\|\_s*\%(\_s*ʪ\|\_s*\_s*\_s*\_s*\_s*\_s*\)\|\_s*\_s*\_s*\_s*\|\_s*\%(\_s*\_s*\|\_s*\)\|\_s*\_s*\|\_s*\|\_s*\|ʸ\_s*\|\_s*\_s*\|ȯ\_s*\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\_s*\|\_s*\_s*\%(\|\_s*\)\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*ά\|\_s*\_s*\|d\_s*\%(b\_s*m\_s*s\|e\_s*c\_s*\%([ia]\|r\_s*e\_s*s\)\|o\_s*u\_s*b\_s*l\_s*e\_s* \_s*i\_s*n\_s*c\_s*o\_s*m\_s*e\_s*,\_s* \_s*n\_s*o\_s* \_s*k\_s*i\_s*d\_s*s\|i\_s*m\)\|\_s*\)', + \ 'E' : '\%([ٱ稰Զ콸ս֦ٻٱְܱױرݩΡ޼޽Ԩɲ᰸ާǢޱ޻ʥԤϱͱն۪߱ܳ۱ϱƱñȱԱűƱӱDZɱϱıʻ޲ͱ賨вóت̱¹槶΢ާѢмǦŧ㧳ݦŧ泌E]\|A\_s*\%([Ƚ]\|V\_s*\%(\_s*\|\_s*ͥ\)\|B\_s*\%(\|C\_s*\)\)\|\_s*\%([Ƚ]\|\_s*\%(\_s*\|\_s*ͥ\)\|\_s*\)\|\_s*\%(\|\_s*\)\|ɰ\_s*\_s*\|M\_s*\_s*\_s*\|\_s*\_s*\_s*\|\_s*˹\_s*\|\_s*ʪ\|\_s*\|˦\_s*\|\_s*\_s*\|Լ\_s*\|\_s*\|\_s*ϩ\|\_s*\|\_s*[Ի]\|\_s*ƺ\|\_s*\|\_s*\%(\_s*\_s*\|\_s*\_s*\_s*\)\|L\_s*\%(\_s*\_s*\|L\_s*\%(\_s*\_s*\|\_s*\)\)\|\_s*\%([ɲ]\|\_s*\)\|N\_s*\|\_s*\%([Ķ˶]\|\_s*\|\_s*\|\_s*\_s*\_s*\_s*\)\|\_s*\|\_s*\|\_s*\_s*\_s*\_s*\_s*\|S\_s*\%([]\|\_s*\_s*\|N\_s*\|F\_s*\_s*\)\|\_s*\%([Ȼʶ]\|\_s*\_s*\|\_s*\|\_s*\_s*\)\|\_s*[¿]\|\_s*\%([]\|\_s*\_s*\)\|X\_s*\%([]\|O\_s*\|\_s*\_s*\)\|\_s*ƻ\|\_s*Ʀ\|C\_s*\%(l\|h\_s*l\_s*o\_s*r\_s*i\_s*n\_s*e\)\|\_s*\%(Ϸ\|\_s*\)\|\_s*\_s*\_s*®\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\%(\|\_s*\)\|ݿ\_s*\%(\|\_s*\)\|\_s*\_s*\_s*\%(\_s*\_s*\|\_s*\)\|\_s*\%(\_s*\|\_s*\_s*\_s*\_s*\|\_s*\_s*\|\_s*\%(\|\_s*\|\_s*\|\_s*\%(\|\_s*\)\|\_s*\|\_s*\|\_s*\%(\|\_s*\)\|\_s*\%(\_s*\_s*\|\_s*\%(\_s*\|\_s*\_s*\)\)\|\_s*\_s*\_s*\|\_s*\)\)\|\_s*\|\_s*Ĵ\|\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\%(\_s*\|\_s*\)\|ȯ\_s*Ÿ\|ɾ\_s*\_s*\_s*\|\_s*\_s*\|ɴ\_s*\_s*\_s*ŵ\|\_s*\_s*\_s*\_s*\|\_s*\%(\|\_s*\%(\_s*\|\_s*\)\)\|\_s*\|\_s*ĥ\|\_s*\|\_s*ò\_s*\|\_s*\%([]\|\_s*\|\_s*\%([ޥ]\|\_s*\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*\|\_s*\|\_s*\)\)\|\_s*Ω\|e\_s*\%(x\_s*a\|\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\)\|\_s*\%([֥顼]\|\_s*\_s*\_s*\|\_s*\_s*\_s*[ȥ]\|\_s*\%(\_s*\|\_s*\_s*[]\)\|\_s*\_s*\_s*\|\_s*\_s*\_s*\%(\_s*[ȥ]\|\_s*\)\|\_s*\_s*\%(\|\_s*\)\|\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*\_s*\%(\_s*\_s*\|\_s*\_s*\_s*\)\|\_s*\|\_s*\%(\|\_s*\_s*\|\_s*\_s*\|\_s*\)\|\_s*\_s*\%(\_s*\|\_s*\)\|\_s*\%(\|\_s*\_s*\_s*\)\|\_s*\_s*\_s*\_s*\|\_s*[]\|\_s*\%(\_s*\%(\|\_s*\|\_s*\)\|\_s*\%(\|\_s*\|\_s*\)\|\_s*\)\)\|\_s*\%(\|\_s*\_s*\_s*\)\)', + \ 'F' : '\%([ϼвɮ߸˼ݵϰ˴ϴʻÿū߹ʷʵʸʯʭʶʲʱʬʴڸ޽ʥ޼⵺бƣ߬οʳزʰʧʨؿ礢ıǹ޴ʤʢʣʡԴн祹ƧϷ붸ʮҶۿտʫݤŴϢ٢޶ʩǵƢʦզ槶F]\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*ǹ\|\_s*\|\_s*\|E\_s*u\_s*p\_s*t\_s*e\_s*l\_s*e\_s*a\_s*c\_s*e\_s*a\_s*e\|\_s*\_s*\|\_s*\|\_s*\_s*\|\_s*\|\_s*\%(Ǥ\|\_s*[]\)\|Ƭ\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|M\_s*y\_s*r\_s*t\_s*a\_s*l\_s*e\_s*s\|\_s*[滳]\|\_s*\|B\_s*u\_s*d\_s*d\_s*l\_s*e\_s*j\_s*a\_s*c\_s*e\_s*a\_s*e\|\_s*\|G\_s*e\_s*r\_s*a\_s*n\_s*i\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|\_s*[ͤ]\|\_s*\|2\_s*\%([ͤ]\|\_s*\)\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\|\_s*\|\_s*Χ\_s*\|I\_s*r\_s*o\_s*n\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*\|\_s*\%(\_s*\_s*\|\_s*\|\_s*\%(\_s*\%(\_s*\|\_s*\)\|\_s*\_s*\%(\_s*\|\_s*\_s*\_s*\)\)\)\|\_s*\|\_s*ǽ\|\_s*\|\_s*\_s*\|\_s*\|\_s*\%(\|\_s*\_s*[]\)\|\_s*1\_s*\_s*\|\_s*\%(\_s*\_s*\_s*\_s*\|\_s*\)\|\_s*\|\_s*\%(\|\_s*\_s*\|\_s*\)\|\_s*\_s*\|\_s*\_s*\|\_s*\|f\_s*\%(e\_s*m\_s*t\_s*o\|o\_s*\%(n\_s*t\_s*-\_s*f\_s*a\_s*m\_s*i\_s*l\_s*y\|r\_s*t\_s*e\)\)\)', + \ 'G' : '\%([Ʊ亲޺иЯǡ¹ɹϿйӹijݶ޸Ķ˸߸˱۸5ѻ贸裵Ӫش೸幡椴֡ɷ޷߷ݱɧ븿ѷʸ¸˲Ʋ򲼽Ӥʵʹ¢̸襶鹶ʵܶ溷ֶȶ뿩۶ɤݵԷ֪۶̵ߤƸѧĶȶǶŹԵյۧĴѦ۷漷㦵뵾Եõµµڵີ嵽٦ȱⷸŹε״¦̳񷿷Ը걳ҳ޽Ż˳Ƭ޸̴ݢ޴ḵس̳۳ٳܳڳЩֽԶӱ⭳賩²ӨѼڲ߲þ̲ϲֶݥծ󢴢䤬Ǵ楬¦˦ϦҦͦѦʦΦɦȦ̦ŦĦצЦӦԦƦզ֦ǦإԦæG]\|\_s*\%(\_s*\|\_s*\|\_s*\|\_s*\|\_s*\)\|\_s*[]\|\_s*[]\|\_s*\|\_s*\|\_s*\_s*\|\_s*Ƭ\_s*\|\_s*\|\_s*\|P\_s*e\_s*r\_s*s\_s*o\_s*n\_s*a\_s*l\_s*e\_s*s\|\_s*\|\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*\|\_s*\%([ֱ]\|ŷ\_s*\)\|\_s*\_s*\|\_s*\%([Ÿо]\|\_s*\)\|Ʀ\_s*[]\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*[¯]\|\_s*[ǹ]\|\_s*\|\_s*\|\_s*\|\_s*\_s*\_s*\|\_s*\|\_s*[׹]\|\_s*ϡ\|\_s*\|\_s*\|\_s*\%([]\|\_s*\)\|\_s*\%([ˡƻ]\|\_s*\_s*\|ʹ\_s*\_s*ˡ\)\|A\_s*g\|S\_s*\%(c\_s*r\_s*o\_s*p\_s*h\_s*u\_s*l\_s*a\_s*r\_s*i\_s*a\_s*c\_s*e\_s*a\_s*e\|y\_s*m\_s*p\_s*e\_s*t\_s*a\_s*l\_s*a\_s*e\|i\_s*l\_s*v\_s*e\_s*r\)\|\_s*\|\_s*\_s*ë\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*̾\|T\_s*y\_s*p\_s*a\_s*l\_s*e\_s*s\|\_s*[]\|\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|g\_s*\%(i\_s*g\_s*a\|h\_s*o\_s*s\_s*t\_s*s\_s*c\_s*r\_s*i\_s*p\_s*t\)\|\_s*\|\_s*\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\|Ϣ\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\|\_s*\_s*\|\_s*\|\_s*\_s*\_s*\_s*\|\_s*\|\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\|\_s*\_s*\%(\_s*\_s*\_s*\|\_s*\_s*\)\|\_s*\|\_s*\%(\_s*\_s*\|\_s*\_s*\)\|\_s*\_s*\|\_s*\_s*\_s*\|\_s*\%(\_s*\%(\_s*\|\_s*\_s*\)\|\_s*\_s*\_s*\_s*\|\_s*\|\_s*\_s*\_s*\_s*\|\_s*\%(\_s*\|\_s*\%(\|\_s*\_s*\)\)\)\|\_s*\%(\|\_s*\_s*\)\|\_s*\%([른Υʥ]\|\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\|\_s*\%(\|\_s*\%(\|\_s*\_s*\_s*\)\)\|\_s*\%(\|\_s*\)\|\_s*\_s*\_s*\|\_s*\%(\|\_s*\_s*\_s*\)\|\_s*\%(\_s*\_s*\|\_s*\_s*\)\|\_s*\_s*\|\_s*\%(\_s*\|\_s*\_s*\_s*[˥]\|\_s*\_s*[˥]\|\_s*\%(\_s*\|\_s*\)\|\_s*\%(\|\_s*\_s*\)\|\_s*\%(\|\_s*\_s*\)\)\|\_s*\%(\|\_s*\%(\|\_s*\|\_s*\_s*[ĥ]\)\|\_s*\%(\|\_s*\_s*\_s*\)\|\_s*\_s*\)\|\_s*\|\_s*\%([]\|\_s*\_s*\|\_s*\%(\|\_s*\|\_s*\_s*\)\|\_s*\%(\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\)\)\|\_s*\%([եޥ]\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*\%(\_s*[ȥ]\|\_s*\%(\|\_s*\_s*\|\_s*\_s*\)\)\|\_s*\|\_s*\|\_s*\%([]\|\_s*\|\_s*\_s*\|\_s*\_s*\)\|\_s*\%(\|\_s*\%(\|\_s*[]\)\|\_s*\)\)\)\)', + \ 'H' : '\%([άмۭϯƶشǮ˴ꥷֹ١ڣþ̷ԼԵ篳ٸ׺êޤұƾ˲˯ˣ˱˩ˬˢ߰˥˨ˮ˰˦˭ˤڽھϾԾӬӮĦ˫ޱێ͸½Ш۳ֱ׭׬̦΢٨ղʽ֢ʾʻظͤ؎ϼвر߸˼ݵɾϰϴʻÿū߹ʷʵʸʯʭʶʲʱʬʴڸ޽ʥ޼бBƣ߬οʳزʰʩFʦʨյؿ乢ǹ޴ʤʣʡԴнڹƧٹ붸ʮҶۿտʫܤՎϷDzDZɢ򱽨ɨڻɡײɦگʶɳ߫ߪ̩ҷ蹱Ψɢʺɽźضѽñ¾Ʒ1ඡɩϾǼݱɧɴɪ粹ɲɱ桶ڲŸͨѽʹ͵עɤɯɭɥʹɫݤ̤ɮɬɶɷɿɺɻʼɼɾɸʿɽʡ֡ڡآ淥УɹҸɰȸ̥Ժ۬ഥզ좤Ҏʻȧ۽ˡȣүꤾ׼Ȧ׹߶¦ھൡá˵ȫƯȪIJԸʧȷȩƸСȰϳܥ˧˲ʢͪڼѶΥȹȸަɡڲչȤýҺ⢢ҹȢȡٰ®Ȼиɳ֯ݢڦ¬ԦѳĽ̷׿޸ȥȮϡȭ˪ȱˡȰȬȯڴԯأצɣԳޢ߯ȨźܹڵȼȽɺȾȿȺķ۱ҵûüŶǺʱĥԳƲıɿ㻫ԺŽϨȡաȥҥۥإH]\|\_s*[Ύ͎̎ˎ]\|\_s*[ۥإեҥ]\|\_s*[ۤؤդҤ]\|\_s*\|\_s*\|\_s*\|\_s*[󤱧]\|\_s*Ļ\|\_s*\|\_s*[п]\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*[]\|T\_s*r\_s*i\_s*u\_s*r\_s*i\_s*d\_s*a\_s*l\_s*e\_s*s\|\_s*\|\_s*ˡ\|\_s*λ\|\_s*\|\_s*\%(\|\_s*\)\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|h\_s*e\_s*c\_s*t\_s*o\|\_s*\|c\_s*l\_s*a\_s*u\_s*s\_s*t\_s*r\_s*o\_s*p\_s*h\_s*o\_s*b\_s*i\_s*a\|\_s*\|\_s*\|\_s*\|E\_s*\%(r\_s*i\_s*o\_s*c\_s*a\_s*u\_s*l\_s*a\_s*l\_s*e\_s*s\|u\_s*p\_s*t\_s*e\_s*l\_s*e\_s*a\_s*c\_s*e\_s*a\_s*e\)\|\_s*\%(\_s*\|\_s*\)\|\_s*\|Ƭ\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|f\_s*\%(o\_s*r\_s*t\_s*e\|e\_s*m\_s*t\_s*o\)\|\_s*[滳]\|\_s*\|\_s*\|G\_s*e\_s*r\_s*a\_s*n\_s*i\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\%(\|\_s*\_s*\)\|\_s*\|\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*\|\_s*[]\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\%([ͽ]\|\_s*\_s*\)\|\_s*\|\_s*\|\_s*\|\_s*ŷ\_s*\|\_s*[]\|\_s*\|\_s*[ȡ]\|\_s*\_s*\%(\|\_s*\)\|A\_s*\%(s\|r\_s*s\_s*e\_s*n\_s*i\_s*c\|n\_s*g\_s*i\_s*o\_s*s\_s*p\_s*e\_s*r\_s*m\_s*a\_s*e\)\|\_s*\_s*\|\_s*\_s*\|\_s*[]\|\_s*\|ľ\_s*[Ᵽ]\|\_s*Φ\|\_s*\_s*\|\_s*\|\_s*[˹]\|\_s*Ÿ\|\_s*\|\_s*ƻ\|\_s*\|\_s*\|\_s*\|̢\_s*\|\_s*\|\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*\%(\|\_s*\)\|\_s*\|ι\_s*\|N\_s*e\_s*l\_s*u\_s*m\_s*b\_s*o\_s*n\_s*a\_s*c\_s*e\_s*a\_s*e\|\_s*\_s*\|Ʊ\_s*˦\|\_s*\|\_s*[ȧ]\|\_s*[]\|\_s*[ǵ]\|\_s*\|\_s*\_s*\|\_s*\|\_s*\|Ĺ\_s*ë\|\_s*\_s*\|Ż\_s*Ƭ\|\_s*\|\_s*\|\_s*[]\|\_s*\%(\_s*\|\_s*\)\|ͦ\_s*[]\|ή\_s*\|\_s*\|\_s*\%([ͤ]\|\_s*[]\)\|2\_s*\%([ͤ]\|\_s*\|0\_s*\)\|ø\_s*\|8\_s*\|\_s*\|P\_s*\%(t\|o\_s*t\_s*a\_s*m\_s*o\_s*g\_s*e\_s*t\_s*o\_s*n\_s*a\_s*l\_s*e\_s*s\|l\_s*a\_s*t\_s*i\_s*n\_s*u\_s*m\)\|\_s*\%([]\|\_s*\_s*\|\_s*\)\|\_s*ή\|\_s*\|\_s*\|\_s*\|R\_s*S\_s*I\|M\_s*\%(y\_s*r\_s*t\_s*a\_s*l\_s*e\_s*s\|e\_s*r\_s*c\_s*u\_s*r\_s*y\)\|\_s*Ĵ\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*\%(\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\_s*\|\_s*\|\_s*\_s*\|\_s*\_s*\%(\|\_s*[ȥ]\)\)\|\_s*\|\_s*ϻ\_s*\_s*\|\_s*\|\_s*\|\_s*\%(\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*\)\|\_s*\%([顼]\|\_s*\|\_s*\|\_s*\_s*\_s*\_s*\|\_s*\%(\_s*\%(\|\_s*\)\|\_s*\)\|\_s*\|\_s*\_s*\|\_s*\_s*\_s*\)\|\_s*\%(\_s*\%(\|\_s*\_s*\)\|\_s*\_s*\|\_s*\|\_s*\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\|\_s*\%(\_s*\_s*\|\_s*\_s*\_s*\_s*\)\)\|\_s*\%(\_s*\|\_s*\_s*\|\_s*\%(\|\_s*\)\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*\%(\_s*\|\_s*\|\_s*\|\_s*\|\_s*\%(\_s*\|\_s*\)\|\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\_s*\)\|\_s*\|\_s*\|\_s*\)\|\_s*[ʿ]\)', + \ 'I' : '\%([Ǧߡ׵׶϶̴ߺ̤ӷŲݳͶưȵܵ述S׽ꭲڿĹǢ̿θŸ沵żϫĺ׻кغҮͦܡǮʰ˻ްϮסӱ©ĩ߱۱İս˻Сݫ׸ԩ۵ີ衰ݻյư׮вΰ𨱡ֱ޴۩ܰдذYŰ1㥴Ū٥Ӱ׳̰Ѧư׺عް۰ȰަͬصԱ߼ӰܾΨթͣް׵״бְҰٰݰǡ޻ڰ汶ԣϱΰȰڤɹۢ͢˰籥ɥڻI]\|E\_s*\_s*\_s*\|\_s*\|J\_s*u\_s*n\_s*c\_s*a\_s*l\_s*e\_s*s\|\_s*\|\_s*ë\|\_s*ʸ\_s*\|\_s*\|ɨ\_s*\|\_s*ϻ\_s*\|\_s*\|\_s*±\|\_s*\_s*\|\_s*ȷ\|β\_s*\|\_s*\_s*\|N\_s*a\_s*j\_s*a\_s*d\_s*a\_s*l\_s*e\_s*s\|\_s*ɨ\|\_s*\|\_s*\_s*ƣ\|5\_s*[]\|\_s*[]\|ب\_s*٦\|\_s*\|Ĭ\_s*\|\_s*\|\_s*Ӽ\|\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|ʸ\_s*\|Ϻ\_s*[]\|\_s*\|\_s*[]\|U\_s*r\_s*t\_s*i\_s*c\_s*a\_s*l\_s*e\_s*s\|\_s*[Ļ]\|P\_s*\%(o\_s*a\_s*l\_s*e\_s*s\|l\_s*u\_s*m\_s*b\_s*a\_s*g\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\)\|\_s*\|\_s*\|\_s*\%(\_s*\_s*\|\_s*\)\|\_s*\|\_s*\|\_s*[з]\|\_s*\|ݬ\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*¹\_s*\|G\_s*\%(r\_s*a\_s*m\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\|l\_s*u\_s*m\_s*i\_s*f\_s*l\_s*o\_s*r\_s*a\_s*e\|i\_s*n\_s*k\_s*g\_s*o\_s*p\_s*s\_s*i\_s*d\_s*a\)\|\_s*\|\_s*\|\_s*\_s*ή\|\_s*[]\|\_s*[]\|\_s*[ڻ]\|\_s*ɽ\|\_s*\_s*[ú]\|\_s*ӧ\|\_s*\|\_s*\%(\|\_s*\)\|\_s*\_s*\|\_s*\|D\_s*i\_s*a\_s*p\_s*e\_s*n\_s*s\_s*i\_s*a\_s*l\_s*e\_s*s\|\_s*[Ǻ]\|<\_s*=\_s*=\_s*>\|ɬ\_s*\_s*\_s*ʬ\_s*\_s*\|\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\%(\_s*\_s*\_s*\_s*\|ɸ\_s*\_s*\_s*\_s*\)\|\_s*Υ\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\|¨\_s*\_s*\|\_s*\_s*\|\_s*\|\_s*\_s*\|\_s*\_s*\_s*\|i\_s*\%(\_s*\_s*\|P\_s*o\_s*d\|\_s*\_s*\|M\_s*a\_s*c\|\_s*\_s*\)\|\_s*\_s*\|̵\_s*\%(\_s*\|\_s*\)\|\_s*Ǽ\_s*ˡ\|\_s*\_s*\|\_s*\%([ǡ­]\|\_s*ʬ\)\|\_s*\_s*\|\_s*\|Ƴ\_s*\|\_s*\|\_s*\|\_s*\%(\_s*\|\_s*\|\_s*\|\_s*\)\|\_s*\%(\|\_s*\%(\_s*\_s*\|\_s*\)\|\_s*\%(\_s*\_s*\_s*\_s*\%(\_s*\|\_s*\)\|\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\%(\_s*\|\_s*\_s*\_s*\_s*\)\)\)\)', + \ 'J' : '\%([ֺSȼټľ¿ߩ̭顿ױӿпԿҿؿѿտޮԽ쿫ٳа屽ġплЫǡ̼ž߾վڷطèǨ쨽۲ٽμѽƽŽȻޭ߱覽۽ڽ޽޼ߨ潿кߧ尽Ľ½ýƽŻ켢μŻ༤ϩμͻ֮߾ǻ߻Яб㫰ʻֵ˼ѻʼ緺ܿٵԼ뤸֧ʧקۧJ]\|\_s*\_s*\|\_s*\|\_s*\|G\_s*\%(\_s*\|\_s*\)\|Z\_s*\%(r\|i\_s*r\_s*c\_s*o\_s*n\_s*i\_s*u\_s*m\)\|D\_s*y\|\_s*\%(\_s*\|\_s*\)\|\_s*\|\_s*\|\_s*\_s*\%(\_s*\|\_s*\)\|\_s*\|2\_s*\|\_s*\|\_s*\_s*ʺ\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|k\_s*\$\_s*_\_s*{\_s*e\_s*f\_s*f\_s*}\_s*\$\|\_s*\%(\|\_s*\)\|\_s*\_s*\|\_s*\%(\|\_s*\)\|\_s*ī\|\_s*\|Ƚ\_s*\|ϳ\_s*\|\_s*\|\_s*\_s*\_s*\|Ĺ\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*Τ\|\_s*[ϴ崽]\|C\_s*a\_s*b\_s*o\_s*m\_s*b\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|\_s*\|\_s*\|\_s*\%(\|\_s*[ʷ]\|\_s*\|\_s*\|\_s*\)\|\_s*\|\_s*\|ɳ\_s*\|1\_s*\%(0\|1\_s*\|8\_s*\|2\_s*\)\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*̣\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*Ʊ\_s*\_s*\_s*\|j\_s*\%(T\_s*e\_s*X\|L\_s*a\_s*T\_s*e\_s*X\|B\_s*i\_s*b\_s*T\_s*e\_s*X\)\|\_s*\_s*\|\_s*\%(\_s*\|\_s*\|\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\)\|\_s*\%(\_s*\|\_s*\)\|\_s*\_s*\_s*\|\_s*\|\_s*Φ\_s*\_s*ü\_s*\%(\|\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\)\|\_s*\%(\_s*\|\_s*\_s*\_s*\_s*\)\|\_s*\|\_s*\%([˥ʡ]\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\%(\|\_s*\)\|\_s*\_s*\_s*\|\_s*[ӥ]\|\_s*\)\|\_s*\%(\_s*[]\|\_s*[]\)\|\_s*\_s*\|\_s*\%([ϥ]\|\_s*\_s*\|\_s*\%([]\|\_s*\_s*\|\_s*\_s*\_s*\)\|\_s*\%(\|\_s*\|\_s*\)\|\_s*\_s*\|\_s*[]\)\|\_s*\%(\_s*\%([ʥ]\|\_s*\%(\|\_s*\)\|\_s*\)\|\_s*\%(\|\_s*\%(\|\_s*\|\_s*\)\|\_s*\_s*\|\_s*\%(\|\_s*\_s*\)\)\)\|\_s*\%([]\|\_s*\|\_s*\|\_s*\%(\|\_s*\)\)\|\_s*\%([֥]\|\_s*\%(\|\_s*\)\|\_s*\|\_s*\%(\_s*\|\_s*\)\|\_s*\|\_s*\%(\|\_s*\)\|\_s*\%([ɥ]\|\_s*\|\_s*\)\|\_s*\|\_s*[ʥ]\)\)', + \ 'K' : '\%([²ǷӰťưЯ⸼ȽǼ㪸ۻ쮱ֿѺϹٹ󮺱Ѻ纯պ︾ȹ˶޳Ӭު⺤ʻӫޫص٫ȺҺۦ־ִṲӳָ̫٬޸ܺս͹̨ɹж๫ʹá乨ۥ⫹⩹۹չ̹˹عֹ骹¹ݹҹԹθĹӹëӭйĨӾ̼ܵѻƺݸջʴƻҸǻ䲹ƸžƸݾ檽۸Ÿ麮Ķ۶ŸɸкҸݰٽᾱʷЭۿٱݼտܷѭثҥկԡݾغش޲ի᫷𸳰̷ո丮򸬸Ǹҧڸ廷ҾºتϨꥷ찷Ʒ̷÷Ҧ׷ӽܮݮݬܱܯݫʵߪ÷ٷʤվ߷ţ賷ΦۻҮ·ذܷ򷬷ڶ˿ֲƺ̽ǰ̰鶰פ޺Ϳ߷ѦΦ庿ܸȷˮԢɦʭЦĸ¢ƶ깩家Ңϼ͹ȿҿݹڤӽ廸θ˨ž߷䷯ݡݢ뿸֨ɵɵǵ̵Ƶʡš򡢡꡻ᡥ󢥢졲󢣡᡿⢫ݡ顺𡯢ܡĢ¡ޡâޡࡤ墤̡뢦ˡ䧸顷Ժ޹ܶṹµϴߵʷߵ̸Ͷ۶ڢҶݸٶڶӶ϶׶նѶ۶ֶضکڡڪ䨱ӵҨдީ򰰶ɵַѬިٰعڶ亶ѿװзժ¶ⶴȶ߸ҳٶɶѾ󶩶жᶫŶö̾켰ܣ֩ŵָݱ͵ܵ׵ֵȷٵߵ޵۶泵ʹױڵڴ¶ҷȩ嵩벫ݺž뵰̶˵ة㶾øۮ޿ʴѥҼ۹ôﵮ̵Ȳ٣ݤֿ¿ֵ̧ԭҵݸɱİөֵڹɳ߳˹ȷ̢ư좿ƱʡܢᱵרӸǡˡԡơɡСҡȡѡաôجɳ϶Ѿʸܵȿּĵǣʶͽгϵع˵ۿٸǷͩΫ峻Ĵȱ١۫Ȧ滳Ҥٿ龹ôŽ޳ڳ³ư귰¦γ㡴̻റɵҳݹ޳˿ڸিԣϸ³ø֡סٷŭƬŬŨ״׳ŤҰɬŴܷ̳ڲųӾ筢Խڨƿӽdzӡ͡ڡΡۡϡ̳ȳijԳճʳ߱ڼ˳ͳȵҳֳѳרһТӼ߶ݥ袳ЪĻӳܴ߷ٳβ𳭳dz󳬲Ӳ٪۸٢ԬٺҰߵХĽᴮѴ޾˧ӳޱڿͻôÿȡȴݴ԰ݴ۴ڴʴԴա̴δ˴עӴӿٴƴŴִ״ɴشϴѴشԳҵȴճƶɳվײ˲ײޥϲӧ鴲ӻβٳϲݸӥ׷ҽԻٷ߲ѲβӼβȹŷѫȻ¥ϲݲľӾ۲Ҵ粽桲Ʒ¸򲿶ФڲԲּвزͤᨦ秷ʣ˥߶Ҧʥܦ֥K]\|\_s*[]\|\_s*[]\|\_s*[Ҥ]\|\_s*\|\_s*\|\_s*\_s*Ⱦ\|\_s*ë\|\_s*\|\_s*\_s*\|\_s*\|\_s*\|\_s*ϧ\|\_s*\|\_s*\|\_s*\|M\_s*e\_s*t\_s*a\_s*c\_s*h\_s*l\_s*a\_s*m\_s*y\_s*d\_s*e\_s*a\_s*e\|f\_s*o\_s*o\_s*t\_s* \_s*a\_s*n\_s*d\_s* \_s*m\_s*o\_s*u\_s*s\_s*e\_s* \_s*d\_s*i\_s*s\_s*e\_s*a\_s*s\_s*e\|\_s*Ϣ\_s*̣\|\_s*\|\_s*\|\_s*\|S\_s*i\|\_s*\|ɴ\_s*[߻]\|9\_s*[]\|\_s*\|\_s*\|\_s*\|\_s*\|ŵ\_s*\_s*\|L\_s*a\_s*u\_s*r\_s*\%(a\_s*c\_s*e\_s*a\_s*e\|o\_s*i\_s*d\_s*e\_s*a\_s*e\)\|õ\_s*\|\_s*\|c\_s*r\_s*e\_s*s\_s*c\|\_s*¢\_s*\|H\_s*e\_s*l\_s*l\_s*e\_s*b\_s*o\_s*r\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|J\_s*u\_s*g\_s*l\_s*a\_s*n\_s*d\_s*a\_s*l\_s*e\_s*s\|ϻ\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|k\_s*i\_s*l\_s*o\|\_s*[Ƿ]\|\_s*\|\_s*ɧ\|\_s*\|\_s*\_s*Ļ\|X\_s*e\|ǡ\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|G\_s*o\_s*l\_s*d\|A\_s*\%(u\|r\_s*c\_s*h\_s*i\_s*c\_s*h\_s*l\_s*a\_s*m\_s*y\_s*d\_s*e\_s*a\_s*e\|s\_s*t\_s*e\_s*r\_s*a\_s*l\_s*e\_s*s\|c\_s*a\_s*n\_s*t\_s*h\_s*a\_s*c\_s*e\_s*a\_s*e\)\|\_s*\_s*\|\_s*\|R\_s*\%(h\_s*\%(o\_s*e\_s*a\_s*d\_s*a\_s*l\_s*e\_s*s\|a\_s*m\_s*n\_s*a\_s*l\_s*e\_s*s\)\|u\_s*n\_s*u\_s*n\_s*c\_s*u\_s*l\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|a\_s*n\_s*\%(u\_s*n\_s*c\_s*u\_s*l\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|a\_s*l\_s*e\_s*s\)\)\|\_s*\|\_s*[©]\|\_s*[]\|\_s*[]\|\_s*\|\_s*\|\_s*\%([]\|̳\_s*\)\|\_s*\|\_s*\|\_s*\|\_s*ŵ\|\_s*\|\_s*\|\_s*\|\_s*\%(\_s*\|\_s*ƻ\)\|\_s*\|Υ\_s*\_s*Υ\_s*\|\_s*Ƭ\|\_s*\%(\|\_s*\)\|\_s*\|Ĺ\_s*[]\|\_s*\|ŷ\_s*\%(\|\_s*\)\|\_s*\|\_s*\_s*\|O\_s*x\_s*a\_s*l\_s*i\_s*d\_s*a\_s*c\_s*e\_s*a\_s*e\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*[]\|̱\_s*\|\_s*\|E\_s*\%(b\_s*e\_s*n\_s*a\_s*l\_s*e\_s*s\|l\_s*a\_s*n\_s*a\_s*l\_s*e\_s*s\)\|\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|Ϣ\_s*\|\_s*\|\_s*\_s*\|C\_s*\%([ormdaf]\|h\_s*r\_s*o\_s*m\_s*i\_s*u\_s*m\|i\_s*r\_s*c\_s*a\_s*e\_s*a\_s*s\_s*t\_s*e\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\|u\_s*r\_s*i\_s*u\_s*m\|e\_s*r\_s*c\_s*i\_s*d\_s*i\_s*p\_s*h\_s*y\_s*l\_s*l\_s*a\_s*c\_s*e\_s*a\_s*e\|y\_s*p\_s*e\_s*r\_s*a\_s*l\_s*e\_s*s\)\|\_s*\%(\|\_s*\)\|\_s*\|\_s*\|\_s*\%(\|Ϥ\_s*\)\|\_s*\|\_s*[]\|\_s*\%(\|\_s*\_s*Ω\_s*\_s*\_s*\_s*\_s*\_s*\)\|(\_s*\_s*)\|\_s*\|\_s*\_s*\|\_s*ʼ\|\_s*\|\_s*\%(\|\_s*\)\|\_s*\_s*\|\_s*\|\_s*\|\_s*[׿]\|\_s*\|ݣ\_s*\|T\_s*\%(h\_s*a\_s*l\_s*i\_s*c\_s*t\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|u\_s*b\_s*i\_s*f\_s*l\_s*o\_s*r\_s*a\_s*e\)\|\_s*\%([֥]\|\_s*\|\_s*\%([ȥ]\|\_s*\_s*\_s*\|\_s*\|\_s*\_s*\)\)\|\_s*\%(\_s*\%(\|\_s*\%(\_s*\_s*\|\_s*\_s*\)\)\|\_s*\_s*\|\_s*[եȥ]\)\|\_s*\%(\|\_s*\%(\|\_s*\_s*\_s*\)\)\|\_s*\%(\_s*\%(\_s*\|\_s*\)\|\_s*\_s*\)\|\_s*\%(\_s*\_s*\|\_s*\_s*\_s*\_s*\)\|\_s*\%(\|\_s*\_s*\_s*\|\_s*\|\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\)\|P\_s*\%(i\_s*p\_s*e\_s*r\_s*a\_s*\%(l\_s*e\_s*s\|c\_s*e\_s*a\_s*e\)\|a\_s*p\_s*a\_s*v\_s*e\_s*r\_s*a\_s*l\_s*e\_s*s\|o\_s*\%(d\_s*o\_s*s\_s*t\_s*e\_s*m\_s*o\_s*n\_s*a\_s*l\_s*e\_s*s\|t\_s*a\_s*s\_s*s\_s*i\_s*u\_s*m\)\)\)', + \ 'L' : '\%([㡲Тˢ̢Ϣ̢ʥ򧭦˧ݦL]\|\_s*[]\|\_s*[]\|\_s*[]\|\_s*\|\_s*\_s*2\_s*\_s*ˡ\|\.\_s*\.\_s*\.\|\_s*\|l\_s*-\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\|\_s*\|\_s*\|ݦ\_s*ݨ\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\%([֥ܥȥᥦ]\|\_s*\|\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*\%(\|\_s*\|\_s*\%(\_s*\|\_s*\)\)\|\_s*\|\_s*\_s*\%(\_s*\_s*\_s*\|\_s*\_s*\)\|\_s*\|\_s*\_s*\_s*\|\_s*\%([ƥȥ]\|\_s*\%(\_s*\|\_s*\)\|\_s*\)\|\_s*\_s*\%([ȥ]\|\_s*\_s*\)\|\_s*\_s*\|\_s*\|\_s*\_s*\|\_s*\%(\|\_s*\_s*\|\_s*\_s*\_s*\%(\|\_s*\)\|\_s*\|\_s*\_s*\|\_s*[ȥ]\)\|\_s*\|\_s*\%([]\|\_s*\%(\|\_s*\)\|\_s*\_s*\_s*\|\_s*\_s*\_s*\|\_s*[]\|\_s*\|\_s*\)\|\_s*\%(\_s*\|\_s*\|\_s*\|\_s*\|\_s*\%([]\|\_s*\)\)\)\|\\\_s*L\_s*a\_s*T\_s*e\_s*X\|\_s*\_s*\|\_s*\%([ݥޥʥΥ̥֥]\|\_s*\|\_s*\_s*\|\_s*\|\_s*\_s*\_s*\|\_s*\%(\_s*\|\_s*\)\|\_s*\_s*\|\_s*\%(\|\_s*\)\|\_s*[]\|\_s*[]\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\%(\_s*\|\_s*\)\|\_s*\%([]\|\_s*\|\_s*\_s*\_s*\)\|\_s*\_s*[륷]\|\_s*\_s*\|\_s*\%(\_s*\_s*\|\_s*\_s*\_s*\)\|\_s*\|\_s*\%([]\|\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\_s*\)\|\_s*\%(\_s*\_s*\|\_s*\)\|\_s*\%(\_s*\_s*\|\_s*[]\)\|\_s*\%(\_s*\_s*\|\_s*\|\_s*\_s*\_s*\_s*\)\|\_s*\_s*\|\_s*\%(\_s*\|\_s*\_s*\|\_s*\_s*\%(\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\)\)\|\_s*\%(\_s*\|\_s*\_s*\)\|\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\%([]\|\_s*\|\_s*\_s*\)\|\_s*\|\_s*\%([]\|\_s*\|\_s*\_s*\_s*\_s*\|\_s*\)\|\_s*\%([]\|\_s*\|\_s*\)\|\_s*\%([]\|\_s*\_s*\_s*\_s*\|\_s*\|\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\|\_s*\|\_s*\_s*\|\_s*\_s*\_s*\)\|\_s*\%(\|\_s*\_s*\_s*\)\|\_s*\%(\_s*\_s*\_s*\_s*\_s*\|\_s*\%(\_s*\_s*\|\_s*\_s*\_s*\)\)\|\_s*\%(\_s*\|\_s*\_s*\_s*\%(\|\_s*\_s*\)\|\_s*\_s*\|\_s*\_s*\_s*\)\|\_s*\%([ɥԥץ]\|\_s*\)\)\|\_s*\)', + \ 'M' : '\%([Ӵڬ߫ߪһսοὼʪʹأ᲼ЪǴܸʸݨۯۤ˴ϳ˾dzܾըոľѾճ˨تIJ˾޸Ϊ溵ʰ̺üӹɴϢ͸¼ߵٽﶻŷ̼ǫ䧿̸̷̵̴̻̹ϻ̶̳믵Ĺǥߺ֪Ьյ̮þ̬Ѱλûǣ켪ץŹ̨ºļۡۡٱ̰ǧʾƳϩƻм̯̾̿̽Ե㴳ﲸ̫Ĵ̩̪̲̱̥ܳ뷿׽ѸʿǴ̣λ潼̧̭̦ߎϸ߿ܵŪ¹׾׿ᵼžеȱμ㿮°Žɱ̸ƦԫѿǤʶŴٰü賹Į硦Ԥ롬ˡʱߴʣ󺵸ƻϨŻȨؤ̢̡罨Ϯ򾾶踭ͥβ̤˻۾ñ׿鼬Ϸ׻仵ŴԴ޸ࢿޡޢϢˢ榤̢͢ݢТܢʢ΢ߢߢ͢ݥ޺ǥߧ̥M]\|\_s*[ӎҎюЎ]\|\_s*[ߥ]\|\_s*[ߤ]\|\_s*[]\|\_s*\%([Ͽ]\|\_s*\|\_s*\)\|\_s*\|\_s*\_s*\%(\|ʸ\_s*\)\|ξ\_s*\%([ѿƿ]\|\_s*\)\|\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*\_s*\|O\_s*l\_s*e\_s*a\_s*l\_s*e\_s*s\|ر\_s*\|\_s*\_s*\|\_s*\|\_s*ĥ\|\_s*[]\|\_s*\_s*ӧ\|\_s*\|\_s*\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*\%([ͭ]\|\_s*ƻ\|\_s*\)\|\_s*\|\_s*\|6\_s*\|\_s*\|\_s*\|\_s*\|\_s*;\_s*\|\_s*\|B\_s*\%(e\_s*r\_s*b\_s*e\_s*r\_s*i\_s*d\_s*a\_s*c\_s*e\_s*a\_s*e\|i\_s*o\_s*r\_s*r\_s*a\_s*g\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\)\|\_s*\|©\_s*\|k\_s*\$\_s*_\_s*{\_s*i\_s*n\_s*f\_s*}\_s*\$\|\_s*\|A\_s*\%(b\_s*i\_s*e\_s*s\|p\_s*e\_s*t\_s*a\_s*l\_s*a\_s*e\|c\_s*r\_s*o\_s*s\_s*t\_s*i\_s*c\_s*h\_s*u\_s*m\)\|\_s*\|\_s*ȷ\|\_s*\|\_s*[]\|\_s*\|\_s*\|Φ\_s*\|\_s*[ҽԢ]\|\_s*[]\|3\_s*[]\|\_s*[ȱ]\|\_s*\|ȷ\_s*\|\_s*\|\_s*[۾˪]\|P\_s*o\_s*d\_s*o\_s*p\_s*h\_s*y\_s*l\_s*l\_s*a\_s*c\_s*e\_s*a\_s*e\|\_s*[ζε]\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|R\_s*u\_s*t\_s*a\_s*l\_s*e\_s*s\|\_s*\%(̣\|\_s*[ž]\)\|\_s*\_s*\_s*\_s*\_s*\|\_s*\|\_s*Ļ\|\_s*\|\_s*\|\_s*[Ҹ]\|\_s*\|ߴ\_s*\|\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*ã\|\_s*\|\_s*[̯]\|\_s*\|\_s*\|L\_s*o\_s*g\_s*a\_s*n\_s*i\_s*a\_s*c\_s*e\_s*a\_s*e\|Ю\_s*\|\_s*\|\_s*\|S\_s*\%(a\_s*p\_s*i\_s*n\_s*d\_s*a\_s*l\_s*e\_s*s\|c\_s*h\_s*i\_s*s\_s*a\_s*n\_s*d\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\)\|C\_s*\%(a\_s*s\_s*u\_s*a\_s*r\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\|e\_s*r\_s*a\_s*t\_s*o\_s*p\_s*y\_s*l\_s*l\_s*a\_s*c\_s*e\_s*a\_s*e\)\|\_s*\%(\_s*\|\_s*\)\|H\_s*a\_s*m\_s*a\_s*m\_s*e\_s*l\_s*i\_s*d\_s*a\_s*l\_s*e\_s*s\|\_s*[Ƿ]\|\_s*ɧ\|ʹ\_s*\|\_s*\|\_s*[§]\|\_s*\_s*ǯ\|\_s*\|¿\_s*\_s*\_s*\|\_s*-\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\|ñ\_s*\_s*\|\_s*\|\_s*\_s*[]\|\_s*\_s*\|\_s*\_s*Ǿ\|\_s*[]\|\_s*\|\_s*\%(\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\)\|m\_s*\%(u\_s*l\_s*t\_s*i\_s*l\_s*i\_s*n\_s*g\_s*u\_s*a\_s*l\_s*i\_s*z\_s*a\_s*t\_s*i\_s*o\_s*n\|i\_s*\%(c\_s*r\_s*o\|l\_s*l\_s*i\)\|e\_s*\%(g\_s*a\|z\_s*z\_s*o\_s* \_s*\%(f\_s*o\_s*r\_s*t\_s*e\|p\_s*i\_s*a\_s*n\_s*o\)\)\|a\_s*\%(k\_s*e\_s*\_s*\_s*\_s*\|d\_s*e\_s* \_s*i\_s*n\_s* \_s*J\_s*a\_s*p\_s*a\_s*n\)\)\|\_s*\_s*\|\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*Ū\_s*\_s*̣\|\_s*\_s*\%(\_s*\_s*\|\_s*̣\)\|\_s*\|\_s*\|\_s*\|\_s*\)', + \ 'N' : '\%([ɰ˽ھ翮Ǽ¡۩뭵˾̻ĵƭо۰ĪܹɫŸˡҶ§ůŵۨǹǿǾǽĽǻݻǷǶЫǸΎեݦ߿ǫդٹǭʿܡ̲ǮϫǬ̭ܬDzǰdzǯ޺DZǩϣǴǪ͎Բʾ迡۾ݹŧ޹dz˥ȴٶǨæ̎ٿô콭ʨ߳ƲؽǢѦ浶ǡǣաԢءٰѹլǿǦǥǧǤٶ֮ƨб2ðɻˎٸij֧ť鵵ͼ㳴÷òڳزּͱľؽǺޥϲ˿ܧƻ±ڽർͨƷȱįή¸ܩĹ޽Ⱦ棷мǵճǢDԶТ͢꾨ƽĵ㴷ѵӺ޸Ǽ̵ӭձ˴ٽʨ̾˥ͣ΢̡ʥ̥ΧߦͦN]\|\_s*[ɎȎǎƎ]\|\_s*[Υ̥ͥ˥]\|\_s*[Τ̤ͤˤ]\|Ģ\_s*\|\_s*\|\_s*\|\_s*ö\|\_s*\_s*ȿ\|\_s*\_s*\|ϵ\_s*[ݱ]\|\_s*\|\_s*\|\_s*[]\|\_s*[]\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*[]\|\_s*\|\_s*\|\_s*\_s*\|\_s*Ƿ\|\_s*\|ο\_s*\_s*\|\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*;\_s*\|\_s*\|\_s*\|I\_s*I\_s*\|\_s*ȭ\|\_s*\|\_s*\|M\_s*y\_s*r\_s*i\_s*s\_s*t\_s*i\_s*c\_s*a\_s*c\_s*e\_s*a\_s*e\|\_s*\|\_s*\%(\|\_s*\)\|\_s*\|\_s*\|\_s*ѵ\|\_s*[]\|L\_s*e\_s*a\_s*d\|P\_s*b\|\_s*[]\|C\_s*\%(e\_s*l\_s*a\_s*s\_s*t\_s*r\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|a\_s*r\_s*y\_s*o\_s*p\_s*h\_s*y\_s*l\_s*l\_s*a\_s*l\_s*e\_s*s\)\|\_s*\|\_s*\%(\_s*\|\_s*ʪ\)\|\_s*\_s*\|7\_s*[]\|\_s*\|\_s*\|ʿ\_s*\|\_s*\|\_s*\_s*\_s*\|T\_s*h\_s*e\_s* \_s*N\_s*e\_s*t\_s*w\_s*o\_s*r\_s*k\_s* \_s*I\_s*n\_s*f\_s*o\_s*r\_s*m\_s*a\_s*t\_s*i\_s*o\_s*n\_s* \_s*C\_s*e\_s*n\_s*t\_s*e\_s*r\|S\_s*o\_s*\%(l\_s*a\_s*n\_s*a\_s*l\_s*e\_s*s\|d\_s*i\_s*u\_s*m\)\|\_s*\%(\|\_s*\|\_s*\_s*\_s*\_s*\)\|ɳ\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\|\_s*\|\_s*\_s*\|n\_s*\%(\|a\_s*n\_s*o\|o\_s*t\_s* \_s*o\_s*r\)\|\_s*\|\_s*\|\_s*\|\_s*\)', + \ 'O' : '\%([߿Ůۯ۰Ÿ۲˻ŰҳسԸ䲮ɭܽڶڼᡳǦƼĹĽǼԲ£ҽԿ־ͳΦֲݣſ༫ʳˬʲ񤲷ǰ߰θۻɽ̶Ͷ笲ݶߴ޳صإ㿲۾ռ鲪ݯݳ²۷겣ݿ൴꾪Ʊٱ̱⳸͸Ȳϵ˲˱¿ʤDzݺڽﵯؾͦ谵ӰɰϯϺڨͺϷ˸Ľˤ¢˳ϡئϧO]\|\_s*\_s*\_s*\|\_s*\|\_s*\|\_s*Ȭ\_s*\|Ŵ\_s*\|\_s*ȱ\_s*\_s*\|\_s*\|\_s*\|\_s*̣\|\_s*\_s*\|\_s*ʴ\|\_s*\|\_s*\|\_s*\|\_s*[]\|\_s*\|ب\_s*\|˵\_s*[]\|\_s*[̼]\|\_s*[]\|\_s*[]\|թ\_s*\|\_s*\|\_s*\|D\_s*i\_s*l\_s*l\_s*e\_s*n\_s*i\_s*a\_s*l\_s*e\_s*s\|G\_s*u\_s*t\_s*t\_s*i\_s*f\_s*e\_s*r\_s*a\_s*l\_s*e\_s*s\|H\_s*y\_s*p\_s*e\_s*r\_s*i\_s*c\_s*a\_s*l\_s*e\_s*s\|\_s*\|\_s*\|\_s*[̼Ҳ]\|\_s*ǯ\_s*\|\_s*\_s*\|\_s*\|\_s*\|A\_s*l\_s*i\_s*s\_s*m\_s*a\_s*t\_s*a\_s*l\_s*e\_s*s\|\_s*\|\_s*\|\_s*\|C\_s*o\_s*p\_s*t\_s*i\_s*d\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|\_s*\_s*\_s*\%(\|\_s*\)\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*ʪ\|\_s*\_s*\_s*\|\_s*[]\|\_s*[]\|\_s*Υ\|ز\_s*\|\_s*\_s*\|\_s*\|\_s*[]\|\_s*\|\_s*[]\|\_s*\|\_s*\_s*[]\|\_s*[߳]\|\_s*\%(\|\_s*\_s*η\|\_s*ŷ\_s*\)\|\_s*Ƭ\|\_s*[]\|\_s*\_s*¾\|\_s*\_s*\_s*\_s*\_s*\_s*\.\|\_s*[ζ]\|t\_s*h\_s*e\_s* \_s*O\_s*b\_s*j\_s*e\_s*c\_s*t\_s* \_s*M\_s*a\_s*n\_s*a\_s*g\_s*e\_s*m\_s*e\_s*n\_s*t\_s* \_s*G\_s*r\_s*o\_s*u\_s*p\|Ω\_s*\_s*\_s*\|\_s*\|\_s*\|\_s*\%(\|\_s*\%(\|\_s*\)\|\_s*\_s*\_s*\)\|\_s*\|\_s*\%(\|\_s*\|\_s*\%([]\|\_s*\)\)\|\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\%(\_s*[ǯ]\|\_s*\)\|\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\|\_s*Ŭ\_s*\|\_s*\|\_s*\_s*\|\_s*\|\_s*\)', + \ 'P' : '\%([ˣˤˡܮޤʻġʬɤɼɶʿȯȢʢʧȬ˱ĥѱצԡޡܤצզ̨Сץǡˡʢߢ¥ڥѧХԧᦰP]\|\_s*\%(\_s*\|\_s*\|\_s*\|\_s*\|\_s*\)\|\_s*[ݥڥץԥ]\|\_s*[ݤڤפԤ]\|\_s*\|\_s*\_s*Į\|\_s*\|\_s*[Ϫϥ]\|\_s*\|\_s*\|\_s*ϥ\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\%(Τ\|\_s*\)\|S\_s*y\_s*n\_s*a\_s*n\_s*t\_s*h\_s*a\_s*e\|C\_s*y\_s*c\_s*l\_s*a\_s*n\_s*t\_s*h\_s*a\_s*l\_s*e\_s*s\|\_s*\|B\_s*r\_s*o\_s*m\_s*e\_s*l\_s*i\_s*a\_s*l\_s*e\_s*s\|L\_s*e\_s*a\_s*d\|\_s*[ļ]\|\_s*\%(\_s*\_s*\|\_s*\_s*\_s*\)\|\_s*\%(\_s*\|\_s*\%([]\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*\_s*\)\)\|+\_s*\|\_s*\%(\|\_s*\_s*\)\|\_s*\_s*\_s*\|\_s*\%(\|Χ\_s*\)\|\_s*\%(\_s*\_s*\_s*\|\_s*\%(\_s*\%(\|\_s*\_s*\)\|\_s*\_s*\_s*\)\|\_s*\_s*\_s*\|\_s*\%([Υ]\|\_s*\|\_s*\|\_s*\_s*\_s*\|\_s*\)\|\_s*\%(\|\_s*\|\_s*\%([]\|\_s*\_s*\)\|\_s*\%(\_s*\|\_s*\_s*[]\)\|\_s*[ĥ]\|\_s*\_s*\_s*\_s*\)\|\_s*\%([]\|\_s*\%(\_s*\_s*\|\_s*\)\|\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\|\_s*\%([]\|\_s*[ץ]\|\_s*\%(\|\_s*\)\)\)\|\_s*\%(\_s*\%([٥]\|\_s*\_s*\)\|\_s*\|\_s*\_s*\|\_s*\%(\|\_s*\_s*\|\_s*\|\_s*\)\|\_s*\%(\_s*\|\_s*\)\)\)\|\_s*\|\_s*\|\_s*\_s*\_s*\_s*\|\_s*\|\_s*³\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*³\|\_s*\_s*\_s*\|\_s*ƺ\_s*\|\_s*\_s*\|¿\_s*\_s*\|\_s*\_s*\_s*\|Ž\_s*\_s*\_s*\|\_s*ʸ\|\_s*\_s*[]\|\_s*\|p\_s*\%(T\_s*e\_s*X\|H\_s*\_s*\_s*\|e\_s*\%(t\_s*a\|r\_s*l\_s*\_s*\_s*\_s*\_s*\)\|i\_s*\%(c\_s*o\|a\_s*n\_s*\%(o\|i\_s*s\_s*s\_s*i\_s*\%(m\_s*o\|s\_s*s\_s*i\_s*m\_s*o\)\)\)\)\|\_s*\)', + \ 'Q' : '\%([ܮݮݬܱܯݫʵߪ緩ų÷ٷʤմɾ߷ţ賷ΦۻҮⰲطܴ뷭򷬷ڶ˿ֲƺ̽Ӱǰ̰鶰Ҽȱפ޺ޱͿ߷ѦΦ庿ܸ𷪶ǶʳˮԢɦʭӼЦաŴġ¢׶ȷƸ蹴깩家Ң׵Զ죹͹ȿҿݹܶڵ⎸ѡɡơǡȢQ]\|\_s*\|\_s*\|\_s*\|\_s*̼\|\_s*\|\_s*\|\_s*\|\_s*Ѵ\|ɴ\_s*[߻]\|\_s*\_s*\|\_s*ʪ\|\_s*\|Ĺ\_s*\|9\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\%(\|\_s*\)\|\_s*\|ŷ\_s*\_s*\|\_s*\|ŵ\_s*\_s*\|L\_s*a\_s*u\_s*r\_s*\%(a\_s*c\_s*e\_s*a\_s*e\|o\_s*i\_s*d\_s*e\_s*a\_s*e\)\|õ\_s*\|\_s*\|c\_s*r\_s*e\_s*s\_s*c\|\_s*[]\|\_s*\|\_s*¢\_s*\|K\_s*r\|H\_s*e\_s*l\_s*l\_s*e\_s*b\_s*o\_s*r\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|\_s*\%([ʸ]\|\_s*\)\|\_s*\|\_s*Ѥ\_s*\|J\_s*u\_s*g\_s*l\_s*a\_s*n\_s*d\_s*a\_s*l\_s*e\_s*s\|\_s*\|ϻ\_s*\|\_s*\|\_s*\|\_s*\|\_s*\_s*\|C\_s*\%(r\|h\_s*r\_s*o\_s*m\_s*i\_s*u\_s*m\)\|R\_s*h\_s*a\_s*m\_s*n\_s*a\_s*l\_s*e\_s*s\|\_s*\_s*ϯ\_s*\|\_s*\_s*\_s*\_s*\_s*\|\_s*\|\_s*\%(\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\)\|\_s*\_s*\|\_s*\%(\_s*\|\_s*\_s*\|\_s*\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\|\_s*\_s*\_s*[]\|\_s*\%(\_s*[]\|\_s*\%(\_s*\|\_s*\)\)\|\_s*\_s*[ॹ]\)\|\_s*\|\_s*\%(\|\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\%(\|\_s*\_s*\_s*\)\|\_s*\|\_s*\|\_s*\_s*\|\_s*\%(\|\_s*\)\)\)', + \ 'R' : '\%([α㳹ϾϼϽϿϮϱҩ߳ѤӤӯۭ۰ϺϭϴϲϹϸϰ϶ϵϳϯתϦȧݭϧߣϨްߺѶүӺ١㹵ݬݮ߲ҽݲϡϣڻϢϩޥﻼϬڶΫάΪΨ˷Χҭϻ٤Φ߱ųίβΰαΩγέδήܲשPاηκϤθоס̺ۢɩοεζνμλξιئ΢ΤΥΡߢΣ轤ϫϷԿպѰЬݣݳݴڰݪڧѴդ鱦اէ٧짹ۧקܧ觴ӧҧާߧϪ֧᧦ϥԧݧꧽ称ڧ槫آ庬ҥ꧲ѧ⦱R]\|\_s*[ێڎَ؎]\|\_s*[]\|\_s*[]\|\_s*\|\_s*[ͭ]\|\_s*[˦]\|\_s*̵\_s*\|6\_s*[]\|ݦ\_s*ݨ\|԰\_s*\|C\_s*\%(a\_s*l\_s*y\_s*c\_s*a\_s*n\_s*t\_s*h\_s*a\_s*c\_s*e\_s*a\_s*e\|h\_s*o\_s*r\_s*i\_s*p\_s*e\_s*t\_s*a\_s*l\_s*a\_s*e\)\|A\_s*\%(c\_s*t\_s*a\_s*e\_s*a\|p\_s*o\_s*p\_s*e\_s*t\_s*a\_s*l\_s*a\_s*e\)\|\_s*[]\|\_s*\%(\|\_s*\)\|V\_s*e\_s*r\_s*t\_s*i\_s*c\_s*i\_s*l\_s*l\_s*a\_s*t\_s*a\_s*e\|O\_s*r\_s*c\_s*h\_s*i\_s*d\_s*a\_s*l\_s*e\_s*s\|M\_s*i\_s*c\_s*r\_s*o\_s*s\_s*p\_s*e\_s*r\_s*m\_s*a\_s*e\|L\_s*\%([ruia]\|e\_s*i\_s*t\_s*n\_s*e\_s*r\_s*i\_s*a\_s*l\_s*e\_s*s\|A\_s*N\_s*\_s*\_s*\_s*\)\|\_s*\|G\_s*\%(e\_s*n\_s*t\_s*i\_s*a\_s*n\_s*a\_s*l\_s*e\_s*s\|y\_s*\%(n\_s*a\_s*n\_s*d\_s*r\_s*a\_s*e\|m\_s*n\_s*o\_s*s\_s*p\_s*e\_s*r\_s*m\_s*a\_s*e\)\)\|\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\%(\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\_s*\)\|\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*̿\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\|\_s*§\|\_s*\|r\_s*u\_s*b\_s*y\_s*\_s*\_s*\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*[]\|\_s*\|ȿ\_s*\_s*\|\_s*\%(\_s*ʸ\_s*\|\_s*\)\|\_s*ǽ\_s*\_s*\_s*\_s*\|\_s*\_s*Ū\|ǧ\_s*\|\_s*\_s*ɽ\_s*\|\_s*\_s*\)', + \ 'S' : '\%([Ъۼ˵ֵڰ޶˿ԽǨΨм©­¥«¦¬߶丳ײҫǬտ֥£̫ȢػٴݽҲϱçî¹½¸º»¶ȿȰɱ㯤ɯ˻ܦǶí޶ܸҪͼϴ·֣訰Ѣ޷ѩڱ߫ߪߥѡ٥Ѩڣ̻ګعṶ¿б¼ͥӳҰӵѱڿͤμʹƫǵ¨§ߵ̡ͷķ״ɿצߵŲ®ú϶ۡڽܡʢ͢Тߡޢ⦤̢ߢϢޢˢجحïͿ巿H۽ľٹضƩ߭ڧԱ颼ýƳħ󻼲١ٶĴ¢ֺߨߧ¼ȻοǦǧкӻϢ尷樦ȵԦܰǢܾнؼ鼮Ĭ߼𭼿ɨũмʻͿļĵϼٱ⬼բμ忼мܼڼѼм˼ּҰʵ༩ǿެոշܤܣƵ´ôʽȽͽܼ̿г⽫ܷ֭ܶӴ嵼ϸܽµ½Ѯآضӽؽܽ׽ٽ䣽սֽ֪꿾˿Ӣǿп¿Ŀ˿ӿ¿ɿǿä⿹üȿʿƿ謹ннٳر޵⾨پطգңֹϾӾԡѽءʡ˾Ѿء髾޾۾¾騾ľாܥƾϾɾ˾ƴҾݾξƾоȾþϾܾھ˾ʾ֤ԧῡ񳿤°濣ֻɦƵڴԮӡݻӻ͵ǻදԻ֬ڻʻ溡лܻǷǡʻ᪶ۿڻףһл̦򼡿ּ׶꼨ǻ徼㬻˻㫻ټ軭dz˸οͻٮӦͶ긼ۿܻ߷߽Ϋڼ޴ͺɾ참ֿ곡ָӯ˼λãDZ͡ůηҸ۸ΤܪǾ٩姻ӴܼƱݺ涭ոපߦڹĿĢջɻܢԻӻ3O彿ҼպȻޯ컯߻خ칹ʺѱ٣׺˺㷺ԺݺҺӼкںպƺغ׺ʺĺźͺԺۺкǺªӺ䩺ںԺغݯͶżӻɺ̬úú赺ͺͺհ٭亿޺Ի⤹Żꧺ맻źʸšɸĻں̢ơǨõӥæҦS]\|\_s*[]\|\_s*[]\|\_s*[]\|\_s*\|\_s*\%(ϩ\|Ϫ\_s*\)\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*[]\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*[]\|\_s*Ѥ\|\_s*\|U\_s*m\_s*b\_s*e\_s*l\_s*l\_s*i\_s*f\_s*l\_s*o\_s*r\_s*a\_s*e\|\_s*\|\_s*\|c\_s*e\_s*n\_s*t\_s*i\|\_s*[϶]\|\_s*\|\_s*̥\|\_s*\|ŵ\_s*\|\_s*ͺ\|\_s*\|ŷ\_s*[IJ]\|V\_s*i\_s*o\_s*l\_s*a\_s*l\_s*e\_s*s\|N\_s*y\_s*m\_s*p\_s*h\_s*a\_s*e\_s*\%(a\_s*c\_s*e\_s*a\_s*e\|o\_s*i\_s*d\_s*e\_s*a\_s*e\)\|\_s*\|\_s*ƻ\|\_s*\%(\|\_s*\)\|Ϸ\_s*\|˾\_s*Ĭ\|\_s*\|\_s*[Ǧ]\|L\_s*a\_s*\%(b\_s*i\_s*a\_s*t\_s*a\_s*e\|m\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\)\|\_s*\_s*\|ʾ\_s*\|\_s*\|\_s*\_s*\|\_s*\|\_s*\|\_s*\|ت\_s*ͺ\|\_s*\|\_s*\|I\_s*\%(s\_s*o\_s*p\_s*y\_s*r\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|l\_s*l\_s*i\_s*c\_s*i\_s*a\_s*c\_s*e\_s*a\_s*e\)\|W\_s*i\_s*n\_s*t\_s*e\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\|\_s*ʸ\|\_s*[ë]\|\_s*[]\|\_s*\%(\_s*\_s*\|\_s*\_s*\)\|\_s*\%([ظܻ]\|\_s*\)\|\_s*\|7\_s*\|\_s*[ʬ]\|4\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|͢\_s*[]\|Ȼ\_s*[ϯϺ]\|\_s*[]\|\_s*[]\|\_s*\|\_s*\|\_s*\|\_s*\%(\|\_s*\)\|Z\_s*i\_s*n\_s*g\_s*i\_s*b\_s*e\_s*r\_s*a\_s*l\_s*e\_s*s\|³\_s*\%(\_s*\_s*\%(\|\_s*\)\|\_s*\_s*\_s*\_s*\)\|ή\_s*[Υ]\|\_s*\|\_s*\|Һ\_s*ȭ\|\_s*\_s*\|C\_s*\%([es]\|y\_s*c\_s*a\_s*d\_s*\%(i\_s*d\_s*a\_s*e\|o\_s*\%(p\_s*s\_s*i\_s*d\_s*a\|f\_s*i\_s*l\_s*i\_s*c\_s*a\_s*l\_s*e\_s*s\)\)\|h\_s*l\_s*o\_s*r\_s*a\_s*n\_s*t\_s*h\_s*a\_s*c\_s*e\_s*a\_s*e\|\_s*\|D\_s*Ź\|\_s*\_s*\|a\_s*\%(s\_s*s\_s*y\_s*t\_s*h\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|c\_s*t\_s*a\_s*l\_s*e\_s*s\)\)\|\_s*\|\_s*[]\|\_s*\_s*Ʀ\|ۨ\_s*\|\_s*\|\_s*\_s*\%(\_s*[ǯ]\|\_s*[ǯ]\)\|\_s*\|ɴ\_s*\_s*\|\_s*¹\_s*\|\_s*ƣ\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\%(ˡ\|\_s*\_s*\)\|\_s*\|\_s*\|\_s*\|P\_s*\%(a\_s*r\_s*i\_s*e\_s*t\_s*a\_s*l\_s*e\_s*s\|t\_s*e\_s*r\_s*i\_s*d\_s*o\_s*s\_s*p\_s*e\_s*r\_s*m\_s*\%(a\_s*l\_s*e\_s*s\|i\_s*d\_s*a\_s*e\)\|r\_s*i\_s*m\_s*u\_s*l\_s*a\_s*l\_s*e\_s*s\)\|A\_s*\%(p\_s*i\_s*a\_s*l\_s*e\_s*s\|r\_s*a\_s*l\_s*e\_s*s\|n\_s*t\_s*i\_s*m\_s*o\_s*n\_s*y\)\|s\_s*f\_s*o\_s*r\_s*z\_s*a\_s*n\_s*d\_s*o\|\_s*[ŵ]\|B\_s*\%(r\|\_s*\_s*\)\|\_s*ĥ\_s*\|\_s*\_s*\|\_s*ʬ\|\_s*\|\_s*\_s*\_s*\_s*\|\_s*¤\_s*\|D\_s*o\_s*n\_s*a\_s*t\_s*i\_s*o\_s*n\_s* \_s*A\_s*l\_s*p\_s*h\_s*o\_s*n\_s*s\_s*e\_s* \_s*F\_s*r\_s*a\_s*n\_s*c\_s*o\_s*i\_s*s\_s* \_s*d\_s*e\_s* \_s*S\_s*a\_s*d\_s*e\|M\_s*\%(e\_s*r\_s*c\_s*u\_s*r\_s*y\|u\_s*s\_s*a\_s*l\_s*e\_s*s\|a\_s*r\_s*q\_s*u\_s*i\_s*s\_s* \_s*d\_s*e\_s* \_s*S\_s*a\_s*d\_s*e\)\|\_s*\%(Ƿ\|\_s*\%(\_s*\_s*\|\_s*̣\)\)\|T\_s*\%(e\_s*t\_s*r\_s*a\_s*c\_s*e\_s*n\_s*t\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\|i\_s*n\|h\_s*e\_s* \_s*S\_s*i\_s*m\_s*p\_s*l\_s*e\_s* \_s*A\_s*P\_s*I\_s* \_s*f\_s*o\_s*r\_s* \_s*e\_s*v\_s*e\_s*n\_s*t\_s*-\_s*b\_s*a\_s*s\_s*e\_s*d\_s* \_s*X\_s*M\_s*L\_s* \_s*p\_s*a\_s*r\_s*s\_s*i\_s*n\_s*g\)\|\_s*\_s*\|\_s*\|\_s*¬\_s*\_s*ư\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\%(\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\|\_s*\|\_s*\|\_s*\%([]\|\_s*\|\_s*\)\|\_s*\%([]\|\_s*\)\)\|\_s*̣\|\_s*\|\_s*\_s*\_s*\_s*\|\_s*\%(\|\_s*\|\_s*\%(\|\_s*\_s*\_s*\)\|\_s*\_s*\)\|\_s*\%(\|\_s*\%([]\|\_s*\_s*[]\)\|\_s*\_s*\_s*\|\_s*\%(\_s*\|\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\)\)\|β\_s*\|\_s*\)', + \ 'T' : '\%([˳ɼҸڽѲ۳ݽ꾲ﰬƾηض쨽ȼͧ۽ĹЧԥ㫽˺̭ǯӷֺܺڢκ˭ƿ¢ݥݹ۲ٵܪǼеܫƻ۶ƱڮƺܻѸ߮ƪֺƽ޹ơƦƭƤƣƫƥƹܳٻ긦뻼ͻϿֺαڿпŽϲ輹ѽæ㽳ԦȎӱ͹ʻԹ֥ųŭׯūڳũۡܡץšżſŶŻŸźŲŪůŨűŰŴܼܨձţšŢ޸׷ȤƎʾʼŵ̳ٽض۲ϸɴ̱սϪ·ٴܻܿѳ㪱γªڼָʴϸȺ鲶ڹ˷Ҿѣױ³ٽƿɸ̢Խϴ˵Ϻ¤ݶԯзˤض࿵ܦ׹Ƶѻ̻ҵͿΏڻϢդĎ״ۺ紺N㾹ĿٻٲŦȤܺҬĽļذ׬Ť׭߭ıġĵįŽƬĸķijĪĢĭƨĻĥĤĨȥħİĦĬĮĺĴģIJĶĩīЦѲɪدפ֢ϱɳղѡΡСϿɼȷ֮Իγڤֿ̯ڸȿˬܽîƢí̱좷нԻվιìλƧ٥Ʈáɾẹﴰ٦ɶݾŹêéڥçäޡܱͤɫ맰ܭζεɺݰľԶͣԳӬѹҵͺ׼ŬƵ«ԡýݽèã۹̴ƿֻ찶ƵǤϰ䶳ɳٹºյ빧δӸٿйþ߬ں߸ÿWöӷëóȿCò÷ýðôùøúûõñâ߷پŧ٧Ӷڤڭʿڬ­ҿпʲίӣ۴ï¾ص봮ĹԱȯ¿߱֫٣Ωη򤿧觸ŷ߷ڢᦨɽڥ覨ȥġžƩȥġüԧ䨼ӨT]\|\_s*[ĎΎ]\|\_s*[ȥƥĥ]\|\_s*[ȤƤĤ]\|\_s*\|\_s*\_s*\|\_s*[]\|\_s*\|\_s*\|\_s*\|\_s*Ϸ\|\_s*\|\_s*[]\|\_s*\|\_s*ľ\|\_s*\|\_s*\_s*\|\_s*[]\|\_s*[]\|͸\_s*\|\_s*\_s*\_s*\|\_s*\|H\_s*y\_s*d\_s*r\_s*o\_s*c\_s*h\_s*a\_s*r\_s*i\_s*t\_s*a\_s*l\_s*e\_s*s\|\_s*\|\_s*\|\_s*[ƻ]\|\_s*[]\|\_s*ǯ\_s*\|\_s*[׻]\|A\_s*c\_s*o\_s*n\_s*i\_s*t\_s*u\_s*m\|ƶ\_s*\|\_s*\|\_s*\|F\_s*e\|I\_s*r\_s*o\_s*n\|\_s*¼\|\_s*\|\_s*̼\|ɻ\_s*\|\_s*\_s*\|\_s*\|\_s*\%(\|ε\_s*\)\|\_s*[]\|\_s*\%(\|\_s*\)\|ɹ\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*[]\|B\_s*a\_s*l\_s*a\_s*n\_s*o\_s*p\_s*h\_s*o\_s*r\_s*a\_s*l\_s*e\_s*s\|\_s*\%(\|\_s*\)\|\_s*\|1\_s*\%(\|0\_s*\)\|\_s*\_s*\|E\_s*\%(u\_s*p\_s*h\_s*o\_s*r\_s*b\_s*i\_s*a\_s*l\_s*e\_s*s\|r\_s*i\_s*c\_s*a\_s*l\_s*e\_s*s\)\|\_s*\%(\|\_s*\)\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\%(Ϸ\_s*Ƭ\|\_s*\)\|\_s*\%([]\|\_s*\|ܥ\_s*\_s*\)\|\_s*\|\_s*\|\_s*\_s*\|\_s*[]\|\_s*\|\_s*\|\_s*\_s*\|\_s*\|\_s*\|\_s*ެ\|J\_s*i\_s*a\_s*n\_s*g\_s*s\_s*u\|\_s*\|\_s*\|\_s*[]\|\_s*ë\|\_s*\|\_s*Ϫ\_s*\|\_s*\|\_s*\|\_s*[]\|\_s*\|\_s*[]\|\_s*\_s*\|\_s*\_s*\|\_s*\%(\_s*\|Ϣ\_s*\_s*[]\)\|\_s*\%(\|\_s*˷\)\|\_s*Ƣ\|\_s*\|\_s*\|\_s*[ڳ]\|\_s*\|\_s*\%(ͼ\|\_s*\)\|\_s*\|\_s*\|ͱ\_s*Ю\|̵\_s*\|\_s*\%(\|\_s*\)\|\_s*\|\_s*\|P\_s*\%(\.\_s*S\_s*\.\|o\_s*l\_s*y\_s*\%(g\_s*o\_s*n\_s*a\_s*l\_s*e\_s*s\|c\_s*a\_s*r\_s*p\_s*i\_s*c\_s*a\_s*e\)\|a\_s*n\_s*d\_s*a\_s*n\_s*a\_s*l\_s*e\_s*s\)\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|ж\_s*\|Ʋ\_s*\|ǽ\_s*[ʸǷ]\|\_s*\|\_s*̱\|\_s*\|\_s*\_s*\|\_s*\|M\_s*\%(e\_s*n\_s*i\_s*s\_s*p\_s*e\_s*r\_s*m\_s*a\_s*c\_s*e\_s*a\_s*e\|o\_s*n\_s*o\_s*\%(p\_s*e\_s*t\_s*a\_s*l\_s*a\_s*e\|c\_s*\%(h\_s*l\_s*a\_s*m\_s*y\_s*d\_s*e\_s*a\_s*e\|o\_s*t\_s*y\_s*l\_s*e\_s*d\_s*o\_s*n\_s*e\_s*a\_s*e\)\)\)\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\|\_s*\%(\_s*[ȥ]\|\_s*\)\|\_s*\_s*\|\_s*[ॢ]\|\_s*\%(\|\_s*\|\_s*\%(\|\_s*\_s*\)\|\_s*\_s*\%(\|\_s*\)\)\|\_s*\%(\|\_s*\|\_s*\|\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*[ե]\)\|\_s*\%([]\|\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\|\_s*\%([ɥ]\|\_s*\|\_s*\_s*\|\_s*\_s*[]\|\_s*\)\|\_s*\_s*\_s*\|\_s*\%(\|\_s*\|\_s*\_s*\)\|\_s*\_s*\_s*\_s*\)\|\_s*\_s*\_s*\_s*\_s*\|\_s*\%(\_s*\|Ϣ\_s*ʸ\_s*\)\|\\\_s*T\_s*e\_s*X\|ʸ\_s*\_s*\|\_s*\_s*\|t\_s*e\_s*\%(r\_s*a\|m\_s*p\_s*o\_s*r\_s*a\_s*r\_s*y\)\|\_s*\|\_s*\%([]\|\_s*\_s*\_s*\_s*\_s*\)\)', + \ 'U' : '\%([Ⱥɶʷƶڰ뼿åѽִء۽¥ӹⱳư뭱辧žرΪŲر󨱲山䥿۲񱷸¹ϻݱڴ︽Ǽֶ̰̽Ѳⳤزﷵ庨΢ױӺ屯ĬΣݵ²±ڽͭв񱭱˼ޢͫ觼ǿվھӻƤƿ񻱧է奦ԧU]\|\_s*\|\_s*\|\_s*\|ϵ\_s*\|\_s*\_s*\|\_s*\|թ\_s*\_s*\|\_s*\|ͥ\_s*\%(\_s*[ɰ]\|\_s*\)\|\_s*\|\_s*²\|\_s*\|ˢ\_s*\|\_s*\_s*[Ƭ]\|\_s*\|\_s*\|\_s*Ǽ\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\_s*Ļ\_s*\|ø\_s*\%(\|\_s*\_s*\)\|\_s*\%(\|\_s*\)\|\_s*\|\_s*\|\_s*\%(\|\_s*\)\|\_s*\_s*\|̣\_s*\|\_s*\|A\_s*r\_s*i\_s*s\_s*t\_s*o\_s*l\_s*o\_s*c\_s*h\_s*i\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|\_s*\|\_s*\_s*\|\_s*\|\_s*Ϻ\|\_s*\|\_s*[]\|\_s*\%(\|\_s*\_s*\)\|C\_s*u\_s*c\_s*u\_s*r\_s*b\_s*i\_s*t\_s*a\_s*l\_s*e\_s*s\|\_s*\|\_s*\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*ǽ\|\_s*\%(\_s*\|ͭ\_s*\)\|\_s*\%([]\|\_s*\_s*\|\_s*\%(\_s*\_s*\|\_s*\_s*\_s*\|\_s*\)\|\_s*\_s*\_s*\_s*\_s*\|\_s*\|\_s*\%(\|\_s*\|\_s*\_s*\)\)\|ñ\_s*\%(\|\_s*\)\|\_s*\%([ˡ]\|\_s*\%(\_s*\|\_s*\_s*\)\|\_s*\%(\|\_s*\_s*\)\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*\%(\_s*\_s*\|\_s*\_s*\_s*\)\|\_s*\_s*\%(\_s*\|\_s*\)\)\)', + \ 'V' : '\%([֢ͣǧӢ˥V]\|\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*\_s*\|v\_s*e\_s*r\_s*s\_s*u\_s*s\|\_s*\_s*\|\_s*\| \_s*\_s*\_s*\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\%(\_s*\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\_s*\|\_s*\_s*\|\_s*\_s*\)\|\_s*\|\_s*\%(\_s*\_s*\_s*\|\_s*\_s*\|\_s*\%([ܥȥ]\|\_s*\%(\_s*\_s*\|\_s*[]\)\)\|\_s*\_s*\_s*\|\_s*\_s*\%(\|\_s*\_s*\|\_s*\_s*\)\|\_s*\|\_s*\_s*\|\_s*\%([ȥ]\|\_s*\|\_s*\_s*\%(\|\_s*\_s*\)\|\_s*\|\_s*\_s*\_s*\|\_s*\%(\|\_s*\_s*\)\)\|\_s*\_s*\_s*\_s*\|\_s*\%([ɥ]\|\_s*\_s*\|\_s*\_s*\)\)\|\_s*\_s*\|\_s*Ĺ\_s*\|\_s*ľ\|\_s*\%(\_s*\%(\|\_s*\_s*\)\|\_s*\%(\|\_s*\%(\|\_s*\)\)\|\_s*\_s*\_s*\_s*\)\|\_s*\%(\_s*\%(\_s*\_s*\_s*\_s*\|\_s*\%(\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\%(\|\_s*\)\)\)\|\_s*\%(\_s*\|\_s*\)\|\_s*\_s*\|\_s*\%(\_s*\|\_s*\_s*\)\|\_s*\%(\_s*\_s*\_s*\_s*\|\_s*\)\)\|\_s*\%([֥Х]\|\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\%(\_s*\|\_s*\)\|\_s*\%(\_s*\|\_s*\)\|\_s*\%(\|\_s*\)\|\_s*\_s*\|\_s*\%(\_s*\|\_s*\%(\|\_s*[]\)\)\|\_s*\%(\_s*\|\_s*\_s*\_s*\)\|\_s*\%([]\|\_s*\|\_s*\_s*\|\_s*\_s*\)\|\_s*\%(\_s*\|\_s*\_s*\_s*\)\|\_s*\%([]\|\_s*\_s*\)\|\_s*\|\_s*\_s*\_s*\_s*\|\_s*\%(\|\_s*\|\_s*\|\_s*\%(\|\_s*\_s*\)\|\_s*\_s*\%(\|\_s*\_s*\%(\|\_s*\_s*\_s*\_s*\)\)\)\|\_s*\|\_s*\|\_s*\%(\|\_s*\_s*\)\|\_s*\|\_s*\_s*\_s*\|\_s*\_s*\_s*\|\_s*\%(\|\_s*\|\_s*\|\_s*\)\)\|\_s*\%([]\|\_s*\_s*\|\_s*\_s*\|\_s*\%(\|\_s*\)\|\_s*\_s*\|\_s*\_s*\|\_s*\%([ȥ]\|\_s*\)\|\_s*\%(\|\_s*\)\|\_s*\_s*\%(\_s*\|\_s*\_s*\)\|\_s*\%([]\|\_s*\_s*\|\_s*\_s*\)\|\_s*\%(\|\_s*\_s*\|\_s*\|\_s*[]\)\|\_s*\%(\|\_s*\_s*\|\_s*\|\_s*\_s*\|\_s*\%(\_s*\|\_s*\)\|\_s*\_s*\)\|\_s*\|\_s*[䥢]\|\_s*\%(\_s*\_s*\|\_s*\|\_s*\_s*\|\_s*\_s*\)\)\|\_s*\%(\|\_s*\%(\|\_s*\)\|\_s*\_s*\_s*\)\|\_s*\%([]\|\_s*\%([֥]\|\_s*\|\_s*\%(\|\_s*\_s*\)\|\_s*\_s*\|\_s*\|\_s*\)\|\_s*\|\_s*\_s*\|\_s*\|\_s*\_s*\_s*\|\_s*\%(\_s*\|\_s*\_s*\)\|\_s*\|\_s*\%(\|\_s*\)\|\_s*\_s*\|\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\_s*\|\_s*\%(\|\_s*\_s*\_s*\_s*\|\_s*\|\_s*\%(\_s*\|\_s*\)\|\_s*\|\_s*\_s*\_s*\_s*\)\|\_s*\_s*\|\_s*\%(\|\_s*\)\|\_s*\%([顼]\|\_s*\|\_s*\|\_s*\%(\_s*\|\_s*\|\_s*\_s*\)\)\|\_s*\%([]\|\_s*\_s*\|\_s*\_s*\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*\_s*\_s*\|\_s*\|\_s*\%(\|\_s*\|\_s*\)\|\_s*\|\_s*\|\_s*\_s*\|\_s*\%(\_s*\_s*\|\_s*\_s*\_s*\_s*\)\)\|\_s*\%(\_s*\_s*\_s*\|\_s*\_s*\)\)\)', + \ 'W' : '\%([򲧽ﲴͺˤȺɶʦԷƶڰ뼿åѽء۽¥ӹⱳư뭱辧žرΪŲر󨱲山䥿۲񱷸¹ϻݱڴ︽Ǽֶ̰̽ѱزﷵ庨U΢׻᢬Ӻ屯ĬΣݵ²ڽͭв񱭱˼ޢͫ觼ǿվھӻƤƿ񻱧ܲıϴѴֲҺҶȵبభ˺оƸ޾׿׾бIJľƻʻ䷨ŲѯȽռ㰿ʨͰͯӻʬʱȣץW]\|\_s*[񎳥]\|\_s*[񥦥]\|\_s*[񤦤]\|\_s*\_s*\_s*\|\_s*\|\_s*\|\_s*\|ϵ\_s*\|\_s*\_s*\|\_s*\|թ\_s*\_s*\|\_s*\|ͥ\_s*\%(\_s*[ɰ]\|\_s*\)\|\_s*\|\_s*²\|\_s*\|ˢ\_s*\|\_s*\_s*[Ƭ]\|\_s*\|\_s*\|\_s*Ǽ\|\_s*\|\_s*\|\_s*\|\_s*\_s*Ļ\_s*\|ø\_s*\%(\|\_s*\_s*\)\|\_s*\%(\|\_s*\)\|\_s*\|\_s*\|\_s*\%(\|\_s*\)\|\_s*\_s*\|̣\_s*\|\_s*\|A\_s*r\_s*i\_s*s\_s*t\_s*o\_s*l\_s*o\_s*c\_s*h\_s*i\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|\_s*\|\_s*\_s*\|\_s*\|\_s*Ϻ\|\_s*\|\_s*[]\|\_s*\%(\|\_s*\_s*\)\|C\_s*u\_s*c\_s*u\_s*r\_s*b\_s*i\_s*t\_s*a\_s*l\_s*e\_s*s\|\_s*\|\_s*\|\_s*\|\_s*ͥ\|\_s*˺\_s*\|\_s*\|\_s*\_s*\|(\_s*\_s*)\|\_s*[]\|\_s*\|\_s*\|\_s*\|\_s*\%(\|\_s*\_s*\|\_s*\_s*\)\|Y\_s*\%(\|\_s*\_s*\|\_s*\_s*\)\|\_s*\_s*\|\_s*\_s*\|\_s*[ͳ]\|\_s*\|\_s*\|\_s*\_s*\_s*٥\_s*\|\_s*\%(\|ʿ\_s*\_s*\_s*\)\|ݿ\_s*\_s*\_s*٥\|\_s*\%(\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\)\|\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\|\_s*\%(\|\_s*\|\_s*\_s*\|\_s*\%(\_s*\|\_s*\_s*\)\)\|\_s*\%(\_s*\|\_s*\_s*\|\_s*\)\|\_s*\_s*\_s*\|\_s*\%(\_s*\%([ץ]\|\_s*\_s*\)\|\_s*\%([]\|\_s*\_s*\_s*\)\)\|\_s*\_s*\|\_s*\%([ࡼ]\|\_s*\_s*\|\_s*\%(\_s*\|\_s*\)\)\|\_s*\%(\_s*[]\|\_s*\|\_s*\%(\_s*\%(\|\_s*\)\|\_s*\%(\|\_s*\|\_s*\|\_s*\%(\_s*\|\_s*\)\)\)\|\_s*\%(\|\_s*[ȥ]\)\)\|\_s*\_s*\_s*\|w\_s*e\_s*b\_s*\_s*\%(\_s*\|\_s*\%(\|\_s*\)\)\|\_s*\|\_s*\_s*\_s*\|\_s*\%(\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\|\_s*\%([]\|\_s*\%(\|\_s*\_s*\)\)\|\_s*\%(\_s*\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\)\|\_s*\%(\_s*[]\|\_s*\_s*\_s*\|\_s*\|\_s*\%(\_s*\|\_s*\_s*\_s*\)\)\)\|T\_s*\%(h\_s*e\_s* \_s*W\_s*o\_s*r\_s*l\_s*d\_s* \_s*W\_s*i\_s*d\_s*e\_s* \_s*W\_s*e\_s*b\_s* \_s*C\_s*o\_s*n\_s*s\_s*o\_s*r\_s*t\_s*i\_s*u\_s*m\|u\_s*n\_s*g\_s*s\_s*t\_s*e\_s*n\)\|\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\)', + \ 'X' : '\%([ئΡߧ禮X]\|\_s*[]\|\_s*[]\|\_s*[]\|\_s*\_s*\%(\_s*\_s*\|\_s*\)\|\_s*\_s*\|\_s*\%(\_s*\_s*\|\_s*\%(\_s*\_s*\|\_s*\_s*\_s*\)\)\|\_s*\_s*\_s*\|\_s*\%(\|\_s*\_s*\)\|\_s*\%(\_s*\%(\|\_s*\|\_s*\_s*\_s*\)\|\_s*\_s*\|\_s*\_s*\%(\_s*\|\_s*\)\)\|E\_s*x\_s*t\_s*e\_s*n\_s*s\_s*i\_s*b\_s*l\_s*e\_s* \_s*M\_s*a\_s*r\_s*k\_s*u\_s*p\_s* \_s*L\_s*a\_s*n\_s*g\_s*u\_s*a\_s*g\_s*e\|\_s*\%(\_s*\|\_s*\_s*\_s*\_s*\|\_s*\%(\_s*\_s*\|\_s*\_s*\_s*\)\|\_s*\_s*\_s*\|\_s*\%(\|\_s*\%(\_s*\|\_s*\_s*\_s*\|\_s*\_s*\)\)\|\_s*\_s*\_s*\)\|\_s*\%(\_s*\|\_s*\_s*\)\)', + \ 'Y' : '\%([ֲغ˩շ޷ڡ崿ڳֻۻþӱٵ㷽İĽ˧ȵۡƫ׫խߡٹβžա䲣ڵЮͿ즷дͽ;ǽ鱻DzƱӽμдİ˭Ƿְ쪾஻ᾲ͸Ͳإ餲ͨͤͱͻ͹Ͱͯʹͼͩͪͧͺͫͭͮ͡ɵͷͳ·͢掲Ǧ׵׶϶̴ߺ̤ӷŲݳͶưȵܦɵ述ڿĹǢ̿θŸ沵żϫĺ׻кغҮͦܡǮʰ˻ްϮסӱ©ĩ߱۱İĽ˻Сݫ׸ԩ۵ີ衰ݻյư׮Iΰ𨱡ֱ޴۩ܰдذŰ1㥴Ū٥Ӱ׳̰Ѧư׺عް۰ȰަͬصԱ߼ܾΨթͣް˵״бְҰٰݰǡý޻ڰ汶ԣϱΰȰڤԧİøҲݰͻϦSϵͥ²۴Тݬٯֳ쮼༽̡ԡաҡӻšץ̰ǫ͵ٰ׵ٹݰǸ鲰Ȭë黦׽ܿߺ٧֧ߡרԧY]\|\_s*[֎Վ]\|\_s*[楤]\|\_s*[椤]\|ݿ\_s*\_s*\|\_s*\_s*\|\_s*\|\_s*Ƹ\|\_s*\|\_s*\|y\_s*o\_s*\%(t\_s*t\_s*a\|c\_s*t\_s*o\)\|4\_s*\%([]\|\_s*\|\_s*\)\|¾\_s*\|\_s*\|δ\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*[Ҹ]\|\_s*\|\_s*\|\_s*[]\|\_s*\|Ī\_s*[Ұ]\|\_s*\|\_s*\|8\_s*\|\_s*\|\_s*\%(\|\_s*\_s*\)\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|ɴ\_s*\|L\_s*i\_s*l\_s*i\_s*\%(o\_s*p\_s*s\_s*i\_s*d\_s*a\|a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\)\|\_s*\%(ͺ\|\_s*\)\|Ĺ\_s*\|\_s*\|\_s*\|\_s*\|E\_s*\%(u\|\_s*\_s*\)\|\_s*\|J\_s*u\_s*\%(l\_s*i\_s*a\_s*n\_s*i\_s*a\_s*l\_s*e\_s*s\|n\_s*c\_s*a\_s*l\_s*e\_s*s\)\|\_s*ë\|\_s*\|ɨ\_s*\|\_s*ϻ\_s*\|\_s*\|\_s*±\|\_s*\_s*\|\_s*ȷ\|β\_s*\|N\_s*a\_s*j\_s*a\_s*d\_s*a\_s*l\_s*e\_s*s\|\_s*ɨ\|\_s*\|\_s*\_s*ƣ\|5\_s*[]\|\_s*[]\|ب\_s*٦\|\_s*\|Ĭ\_s*\|\_s*\|\_s*Ӽ\|\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|ʸ\_s*\|Ϻ\_s*[]\|\_s*\|\_s*[]\|U\_s*\%(\|\_s*\_s*\|r\_s*t\_s*i\_s*c\_s*a\_s*l\_s*e\_s*s\)\|\_s*[Ļ]\|\_s*\|\_s*\%(\_s*\_s*\|\_s*\)\|\_s*[з]\|\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*¹\_s*\|G\_s*\%(r\_s*a\_s*m\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\|l\_s*u\_s*m\_s*i\_s*f\_s*l\_s*o\_s*r\_s*a\_s*e\|i\_s*n\_s*k\_s*g\_s*o\_s*p\_s*s\_s*i\_s*d\_s*a\)\|\_s*\|̵\_s*\_s*\|\_s*\|\_s*\_s*ή\|\_s*[]\|\_s*[]\|\_s*[ڻ]\|\_s*ɽ\|\_s*\_s*[ú]\|\_s*ӧ\|\_s*[]\|\_s*\%([]\|\_s*\)\|\_s*\_s*\|\_s*[ʱ]\|D\_s*i\_s*a\_s*p\_s*e\_s*n\_s*s\_s*i\_s*a\_s*l\_s*e\_s*s\|\_s*[ǡ]\|\_s*\|\_s*ζ\_s*\|ξ\_s*\|ή\_s*ŭ\_s*\|\_s*\|\_s*[]\|R\_s*a\_s*f\_s*f\_s*l\_s*e\_s*s\_s*i\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|\_s*\|\_s*\|\_s*\|ŷ\_s*\|\_s*\|\_s*\_s*\_s*º\|\_s*\|T\_s*\%(h\_s*e\_s*l\_s*i\_s*g\_s*o\_s*n\_s*a\_s*l\_s*e\_s*s\|r\_s*o\_s*c\_s*h\_s*o\_s*d\_s*e\_s*n\_s*d\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\)\|M\_s*y\_s*r\_s*i\_s*c\_s*a\_s*l\_s*e\_s*s\|\_s*\_s*\|\_s*¹\|P\_s*\%(o\_s*a\_s*l\_s*e\_s*s\|l\_s*u\_s*m\_s*b\_s*a\_s*g\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\|a\_s*l\_s*m\_s*a\_s*l\_s*e\_s*s\|r\_s*\%(o\_s*t\_s*e\_s*a\_s*l\_s*e\_s*s\|i\_s*n\_s*c\_s*i\_s*p\_s*e\_s*s\)\)\|A\_s*r\_s*a\_s*c\_s*a\_s*l\_s*e\_s*s\|\_s*\|\_s*[]\|\_s*\%(\_s*\|\_s*\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*\)\|\_s*\)', + \ 'Z' : '\%([»¸·«­֤±³²¯°¡£¤ȿźǹդظԦƬſݿפƦֺSȼټĶټܿľ㿬ߩ̭顿ױӿпԿҿؿѿտޮԽ쿫ٳа屽ġплЫǡ̼ž߾վڷطèǨ쨽۲ٽμѽƽŽȻޭ߱覽۽ڽ޽޼ߨ潿кߧ尽Ľ½ýƽŻ켢μż༤ϩμͻ֮߾ǻ߻Яб㫰ʻֵ˼ѻʼ緤߷ºֿ껯ܪȻﴻ̻쩻ϻ»߻ͺú޺߳кº鵺¢鶺úä좭اڥƧ٦Z]\|\_s*\%(\_s*\|\_s*\|\_s*\|\_s*\|\_s*\)\|\_s*[]\|\_s*[]\|\_s*\|\_s*\|\_s*\|\_s*[һ]\|\_s*\|z\_s*e\_s*\%(t\_s*t\_s*a\|p\_s*t\_s*o\)\|\_s*\_s*\|\_s*\|\_s*\|\_s*\|ȯ\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*ˡ\|\_s*\|Ĵ\_s*\|\_s*[᷺]\|\_s*\|\_s*\|F\_s*i\_s*g\_s*u\_s*r\_s*e\|\_s*\|G\_s*\%(\_s*\|\_s*\)\|D\_s*y\|\_s*\%(\_s*\|\_s*\)\|\_s*\|\_s*\|\_s*\|2\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|J\_s*\%(I\_s*S\_s*\_s*\_s*\|\_s*\_s*\|R\_s*\_s*\_s*\)\|\_s*\|\_s*\_s*ʺ\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|k\_s*\$\_s*_\_s*{\_s*e\_s*f\_s*f\_s*}\_s*\$\|\_s*\%(\|\_s*\)\|\_s*\_s*\|\_s*\%(\|\_s*\)\|\_s*ī\|\_s*\|Ƚ\_s*\|ϳ\_s*\|\_s*\|Ĺ\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*Τ\|\_s*[ϴ崽]\|C\_s*a\_s*b\_s*o\_s*m\_s*b\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|\_s*\%(\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\)\|\_s*\|\_s*\|\_s*\%(\|\_s*[ʷ]\|\_s*\|\_s*\|\_s*\)\|\_s*\|\_s*\|ɳ\_s*\|1\_s*\%(0\|1\_s*\|8\_s*\|2\_s*\)\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*\|\_s*\|\_s*\%(\_s*\|\_s*\_s*\_s*\_s*\|\_s*\_s*\)\|\_s*\%(\_s*\_s*\|\_s*\%(\|\_s*\%(\_s*\|\_s*\)\)\)\|\_s*\%(\_s*\%(\_s*\_s*\_s*\_s*\_s*\|\_s*\)\|\_s*\%(\_s*\|\_s*\_s*\_s*\|\_s*\_s*\_s*\)\|\_s*\%(\_s*\_s*\|\_s*\|\_s*\_s*\_s*\|\_s*\%(\_s*\_s*\|\_s*\_s*\_s*\)\|\_s*\_s*\_s*\)\)\|\_s*\%(\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\_s*\%(\|\_s*\)\|\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\_s*\)\)', + \ '[' : '[̡Ρء[]', + \ '\' : '[ˡ\\]', + \ ']' : '[ۡ١ϡ]]', + \ '_' : '[_]', + \ '`' : '[ȡơ`]', + \ 'a' : '\%([ԳȯϾտƭ޾ӡŤƬѫͷʷİͿøܶ쨽̵ᵽ驰нƪ鷹ѻˢǽ½֦½ΦؽǮȲ䰵ǴݯռмԹ޹׹Ϫɽ¹Юͽ㹻ɷŰ庾Ӻ̴ɵఽ;ŷֵϰ̣ðԪƴ갮ůμۭ浱ϯޫۦۥ˾ϾݷԼనʸۣ齶ϰ갥欷ǹ԰ްưɰȰīð­Ӽ밫Ƽǹ˽˰ķʻг㰭մ먰µͭްب˰کʡ&ܶϰ͢΢޸姸ơǢѦa]\|\_s*\|\_s*\|\_s*\|\_s*\|Z\_s*\%(n\|i\_s*n\_s*c\)\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*ŷ\_s*\|\_s*ŵ\|\_s*\|\_s*\|\_s*Ʀ\|\_s*\|\_s*\|\_s*̾\|\_s*̾\|\_s*\|\_s*\|\_s*[Ļ]\|\_s*\|\_s*\|\_s*\|L\_s*a\_s*r\_s*d\_s*i\_s*z\_s*a\_s*b\_s*a\_s*l\_s*a\_s*c\_s*e\_s*a\_s*e\|\_s*\|\_s*\%(\|¹\_s*\)\|\_s*\%(\|\_s*\_s*\_s*ʪ\_s*\)\|\_s*\_s*\|H\_s*a\_s*l\_s*o\_s*r\_s*a\_s*g\_s*a\_s*l\_s*e\_s*s\|ޱ\_s*\|\_s*\|Ʀ\_s*\|\_s*\_s*\_s*\|\_s*¿\|\_s*\|\_s*\|\_s*[ºǬ]\|\_s*\|\_s*[ɧ]\|\_s*\|\_s*\|\_s*\|Ҹ\_s*\|\_s*\%([]\|\_s*\|\_s*\)\|\_s*[ˡ]\|E\_s*\%(s\|i\_s*n\_s*s\_s*t\_s*e\_s*i\_s*n\_s*i\_s*u\_s*m\)\|\_s*\%(\_s*\_s*\|\_s*\%(\_s*\|\_s*\_s*\)\)\|I\_s*\%(r\_s*i\_s*d\_s*a\_s*l\_s*e\_s*s\|P\_s*\%(\_s*\|\_s*\_s*\_s*\)\|D\_s*\_s*\_s*\|C\_s*\%(\_s*\|\_s*\_s*\)\)\|\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*[ɿο]\|R\_s*u\_s*b\_s*i\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|\_s*\_s*\_s*\|\_s*\|\_s*\|\_s*[]\|M\_s*a\_s*l\_s*v\_s*a\_s*l\_s*e\_s*s\|\_s*\_s*\_s*\_s*A\| \_s*\_s*\_s*\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\|\_s*\|\_s*\|G\_s*o\_s*l\_s*d\|\_s*ư\_s*\%(\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\)\|°\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\|S\_s*\%(b\|i\_s*l\_s*v\_s*e\_s*r\)\|\_s*\_s*\_s*ǽ\|\_s*\_s*\_s*ǽ\|\_s*ˡ\|\_s*\_s*\_s*\|\_s*\%(\|\_s*\_s*\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\%(\_s*\_s*\|\_s*\%([]\|\_s*\%(\_s*\|\_s*\)\)\)\|\_s*\%([ȥ]\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\_s*\%(\|\_s*\)\|\_s*\_s*\|\_s*\%(\_s*\|\_s*\_s*\|\_s*\|\_s*\%(\_s*\|\_s*\_s*\)\)\|\_s*\_s*\|\_s*\%([]\|\_s*\_s*\)\|\_s*\_s*\%(\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\)\|\_s*\|\_s*\%(\_s*\_s*\|\_s*\_s*\)\|\_s*\_s*\_s*\_s*\_s*\|\_s*\)\)\|\_s*\|\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\|\_s*\|\_s*\_s*\%(\_s*\_s*\|\_s*ǽ\)\|\_s*\%(\_s*\_s*\|\_s*\|\_s*\_s*\)\|\_s*\_s*\_s*\_s*\_s*\|\_s*\%(\_s*\|\_s*\|\_s*\)\|A\_s*\%([tlrImc]\|u\_s*s\_s*t\_s*r\_s*o\_s*b\_s*a\_s*i\_s*l\_s*e\_s*y\_s*a\_s*c\_s*e\_s*a\_s*e\|n\_s*t\_s*i\_s*m\_s*o\_s*n\_s*y\|K\_s*C\_s*L\|S\_s*C\_s*I\_s*I\|s\_s*t\_s*a\_s*t\_s*i\_s*n\_s*e\|\_s*\_s*\|T\_s*O\_s*K\|N\_s*S\_s*I\|V\_s*\_s*\_s*\_s*\|L\_s*T\_s*\_s*\|\_s*\_s*\|E\_s*R\_s*A\|D\_s*S\_s*L\_s*\_s*\_s*\|\_s*\_s*\_s*\|d\_s*a\|M\_s*\_s*\_s*\|b\_s*s\_s*t\_s*r\_s*a\_s*c\_s*t\_s* \_s*C\_s*o\_s*n\_s*t\_s*r\_s*o\_s*l\_s* \_s*M\_s*o\_s*d\_s*e\_s*l\|\_s*\_s*\|\_s*\_s*\|C\_s*\_s*\_s*\_s*\)\|\_s*Ͽ\|\_s*\%([]\|\_s*\_s*\|\_s*\%(\|\_s*\_s*\_s*\)\|\_s*\_s*\|\_s*\_s*\|\_s*\%(\_s*\|\_s*\_s*\_s*\)\|\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\)\|\_s*\|\_s*\%([˥ᥢ]\|\_s*\|\_s*\%(\_s*\_s*\|\_s*\_s*\%(\|\_s*\_s*\)\|\_s*\)\|\_s*\|\_s*\_s*\|\_s*\|\_s*\_s*\)\)', + \ 'b' : '\%([߹ھڽ𰺱ѳ˦˲̶˳ر˸˹˻˶˺˴˾˵˿Ŵը˫Ħ˷沶ѹʽٷҡ۲˼ū޽ʥ޼޿ʪɲʹʸק̵زǿ⿡ʬԤ͹ɵɤޣֱؾݧɴ졪ǭɼ֢ʿ̤ջ߾׹Ȣ®Ӷȭ˪ƯȪȫʵüɡΥV̥ٶȵȶǢʢʧ㱸Ȥ˽ձ೭ȨؤȹȽȼ㩺ȲȴȳŽβĥͿ̤Уʩ첼ߡݡ¡áܥСϡΡѡХ֥ӦҦ¥b]\|\_s*\%(\_s*\|\_s*\|\_s*\|\_s*\|\_s*\)\|\_s*[ܥ٥֥ӥ]\|\_s*[ܤ٤֤Ӥ]\|\_s*\|\_s*\|\_s*\|P\_s*a\_s*e\_s*o\_s*n\_s*i\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*Ǥ\|\_s*\|\_s*[]\|\_s*\_s*ݰ\|F\_s*a\_s*g\_s*a\_s*l\_s*e\_s*s\|\_s*\|\_s*\|\_s*\%(\|\_s*\_s*\|\_s*\_s*\)\|\_s*\|\_s*\|\_s*\|˭\_s*[]\|\_s*\|ŷ\_s*\_s*\|\_s*[϶]\|׽\_s*˥\|\_s*[̡˥]\|\_s*Ҵ\|\_s*Ƭ\_s*\|\_s*\|\_s*\|S\_s*a\_s*n\_s*t\_s*a\_s*l\_s*a\_s*l\_s*e\_s*s\|\_s*\|ʼ\_s*[ˡ]\|\_s*[Ļ]\|ɽ\_s*\|\_s*\|ȯ\_s*\|\_s*\|\_s*\_s*\_s*\|\_s*\_s*\|R\_s*o\_s*s\_s*a\_s*l\_s*e\_s*s\|\_s*\|\_s*\|\_s*\%([ϫ]\|\_s*\_s*\)\|\_s*\|\_s*\|\_s*\|A\_s*n\_s*n\_s*o\_s*n\_s*a\_s*c\_s*e\_s*a\_s*e\|\_s*[]\|\_s*\|\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\_s*\|\_s*[]\|\_s*\_s*\_s*\_s*\|\_s*\|\_s*\|\_s*\%(\_s*\|\_s*\_s*\_s*\_s*\)\|\_s*\|\_s*\_s*\_s*\|\_s*\%([Ƚ鷿]\|\_s*˦\|\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\_s* \_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\)\|B\_s*\%([hȽ鷿kiae]\|C\_s*ʼ\_s*\|N\_s*F\_s*(\_s*B\_s*a\_s*c\_s*k\_s*u\_s*s\_s*-\_s*N\_s*a\_s*u\_s*r\_s* \_s*F\_s*o\_s*r\_s*m\_s*)\|B\_s*C\|\_s*\_s*\|u\_s*r\_s*k\_s*i\_s*n\_s*a\_s* \_s*F\_s*a\_s*s\_s*o\|\_s*\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|M\_s*P\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\|S\_s*\%(D\|\_s*\|\_s*\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\_s*\)\|O\_s*X\_s*\_s*\_s*\|I\_s*T\_s*N\_s*E\_s*T\|r\_s*o\_s*m\_s*i\_s*n\_s*e\|\_s*\_s*\|o\_s*\%(h\_s*r\_s*i\_s*u\_s*m\|v\_s*i\_s*n\_s*e\_s* \_s*S\_s*p\_s*o\_s*n\_s*g\_s*i\_s*f\_s*o\_s*r\_s*m\_s* \_s*E\_s*n\_s*c\_s*e\_s*p\_s*h\_s*a\_s*l\_s*o\_s*p\_s*a\_s*t\_s*h\_s*y\|o\_s*k\|r\_s*o\_s*n\)\)\|\_s*\|\_s*\_s*\)', + \ 'c' : '\%([²ݰťޢ°Я⸿ȽǼۻô㪸ۺ礷򼷻쮱޹ѺϹٹۺѺ縥պ︷ȹ޳Ӭު⺤ӫޫص٫ȺҺۦ־ִṲӳָ̫٬޸ܺս幡й䢹̨ɹж๫ʹá乨ۥ⫹⩹۶չ̹˹عֹ骹¹ݹҹԹθĹӹëӭصĨ̼ܵ٢޵ѻ۹ƺݸջʴڸǻ䲹žݸ檽۸ŵ麮Ķ۸ɸɯŶ˻ܦíӵ޶٣໦Ҫͼ·֣訰Ѣ޷ѩڱ߫ߥѡ٥Ѩڣ̻ګǺخعṶܮݮݬܱܯݫʵߪ÷ٷʤվ߷ţ賷ΦۻҮ·ط״򷬷ڶ˿ֲƺ̽ǰ̰鶰פ޺ޱͿ߸ѦΦ庿ܸȷˮԢʭЦġ궡ȷ㹩家Ң׵Դ񣹸͹ȶҿݹڵ⤯Ա颼ýƳħ󻼲١Ĵɸ¢ֺλߨߧ¼ȻοǦǧкϢ尷樦ȵԦܰǢܾؼ鼮Ĭ߼𭼿ɨũżʻ͸忬ļҺĵհռޯκٱ⬼բμ忼޼мܼѼ׼ͼм˼ּҰʵ༩ǿެոշܤܣƵýʽȽͽɽܼ̿н֭ܶӴ嵼ϸܽµ½Ѯآ߽ضӽؽ޴׽ٽ䣽ֽ߿֪꿾˿Ӣǿп¿Ŀ˿ӿ¿ǿä⿹üʿƿ謹ннؽ׼һ޵黪پطգңֹϾӾԡѽؾѾء髾޾۾騾ľ㾩ாܥ꾤Ͼɾ˾ƴҾ;ƾоȾþϾܾھ˾֤ԧῡ°濣ֻɦƵڴԮӡݻӻǻ߻දԻջ֬ڻϿŻ溡᡺ллǷǡʻ᪶ۿڻףһл̦򼡿ּ׶꼨ǻ徼㬻˻㫻ڹɳ߳˹ȷ̢ư񢿱ƱʡܢᱵʹǡˡԡơɡСҡȡѡաجɳ϶Ѿʸܵȿּĵǣʶͽгϵع˵ۿٸǷͩΫ峻KĴȱ١۫Ȧ滳Ҥٿ龹ôŽ޳ڳ³ư귰¦γǰ㡴姡റҳݲҳ˿ڸিԣϸ³ø֡סٷŭƬŬŨ״׳ŤҰɬŴܷ̳ڲųӾ筢Խڨƿӽdzӡ͡ڡΡۡϡ̳ȳijԳճʳ߱ڼ˳ͳȵҳֳѳרһТӼ߶ݥ袳ЪĻӳܴ߳ٳβ𳭳dz󳬲Ӳ٪۸٢ԬٺҰߵХĽ楼Ѵ޾˸˧ӳޱڿͻôÿȡȴݴ԰ݴ۴ڴԴա̴δ˴עӴӿٴƴŴִ״ɴشϴѴشԳҵȴճƶɳվײ˲ײޥϲӧ鴲ӻβٳϲʸӥ׷ҽԻٷ߲ѲβӼβȹŷѫȻ¥ϲݲľӾ۲Ҵ粽桲Ʒ²ФԲּвزͤ㡦ıĶƢ۲ø򧶧اۧէ٧ܧק⧿觵ӧ𧼧ߧҧާѧ֧᧱㧺秽䧰ڧݧԧ姫ߨƼ֦ҧݡ׶ܥc]\|\_s*[]\|\_s*[]\|\_s*[Ҥ]\|\_s*\|\_s*\_s*Ⱦ\|\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*ϧ\|\_s*\|\_s*\|\_s*\|f\_s*o\_s*o\_s*t\_s* \_s*a\_s*n\_s*d\_s* \_s*m\_s*o\_s*u\_s*s\_s*e\_s* \_s*d\_s*i\_s*s\_s*e\_s*a\_s*s\_s*e\|\_s*Ѥ\|\_s*\|A\_s*\%(r\_s*c\_s*h\_s*i\_s*c\_s*h\_s*l\_s*a\_s*m\_s*y\_s*d\_s*e\_s*a\_s*e\|p\_s*i\_s*a\_s*l\_s*e\_s*s\)\|U\_s*m\_s*b\_s*e\_s*l\_s*l\_s*i\_s*f\_s*l\_s*o\_s*r\_s*a\_s*e\|\_s*\|\_s*\|\_s*ˡ\|\_s*[ʺ]\|\_s*[϶]\|ѱ\_s*\|\_s*\|\_s*[̱ѡ]\|\_s*\|\_s*\|ɴ\_s*[߻]\|\_s*\|9\_s*[]\|\_s*\|\_s*\|\_s*\|\_s*\%(\|\_s*\)\|\_s*\|\_s*\|ŵ\_s*\_s*\|õ\_s*\|\_s*¢\_s*\|H\_s*e\_s*l\_s*l\_s*e\_s*b\_s*o\_s*r\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|\_s*\|J\_s*u\_s*g\_s*l\_s*a\_s*n\_s*d\_s*a\_s*l\_s*e\_s*s\|ϻ\_s*\|\_s*\|\_s*\|R\_s*h\_s*a\_s*m\_s*n\_s*a\_s*l\_s*e\_s*s\|Ϸ\_s*\|˾\_s*Ĭ\|\_s*[]\|\_s*Ϣ\|\_s*[Ǧ]\|\_s*\|L\_s*a\_s*\%(u\_s*r\_s*\%(a\_s*c\_s*e\_s*a\_s*e\|o\_s*i\_s*d\_s*e\_s*a\_s*e\)\|b\_s*i\_s*a\_s*t\_s*a\_s*e\|m\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\)\|\_s*\_s*\|ʾ\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*\|\_s*\|ت\_s*ͺ\|\_s*\|\_s*\|I\_s*\%(s\_s*o\_s*p\_s*y\_s*r\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|l\_s*l\_s*i\_s*c\_s*i\_s*a\_s*c\_s*e\_s*a\_s*e\)\|W\_s*i\_s*n\_s*t\_s*e\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\|\_s*ʸ\|\_s*[]\|\_s*\%([αֲ˼]\|\_s*\|Ǽ\_s*\|\_s*\)\|\_s*\%(\_s*\_s*\|\_s*\_s*\)\|\_s*\|7\_s*\|ʸ\_s*\|\_s*[ʬ]\|4\_s*\|\_s*\|\_s*\|\_s*\|\_s*[̰]\|\_s*\|\_s*\%(̣\|\_s*\)\|\_s*[]\|͢\_s*[]\|´\_s*\|B\_s*r\|Ȼ\_s*[ϯϺ]\|\_s*[]\|\_s*[]\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|M\_s*\%(e\_s*t\_s*a\_s*c\_s*h\_s*l\_s*a\_s*m\_s*y\_s*d\_s*e\_s*a\_s*e\|u\_s*s\_s*a\_s*l\_s*e\_s*s\)\|S\_s*\%([ge]\|p\_s*e\_s*r\_s*m\_s*a\_s*t\_s*o\_s*p\_s*h\_s*y\_s*t\_s*a\|c\_s*i\_s*t\_s*a\_s*m\_s*i\_s*n\_s*e\_s*a\_s*e\)\|Z\_s*i\_s*n\_s*g\_s*i\_s*b\_s*e\_s*r\_s*a\_s*l\_s*e\_s*s\|³\_s*\%(\_s*\_s*\%(\|\_s*\)\|\_s*\_s*\_s*\_s*\)\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\%(\_s*\|\_s*\|\_s*ƻ\)\|\_s*\|Υ\_s*\_s*Υ\_s*\|\_s*\|\_s*[]\|\_s*\|\_s*Ƭ\|\_s*\%(\|\_s*\)\|Ĺ\_s*[]\|\_s*\|ŷ\_s*\%(\|\_s*\)\|\_s*\|\_s*\_s*\|O\_s*x\_s*a\_s*l\_s*i\_s*d\_s*a\_s*c\_s*e\_s*a\_s*e\|\_s*[]\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*[]\|̱\_s*\|\_s*\|E\_s*\%(b\_s*e\_s*n\_s*a\_s*l\_s*e\_s*s\|l\_s*a\_s*n\_s*a\_s*l\_s*e\_s*s\)\|\_s*\_s*\|\_s*\|\_s*\|P\_s*\%(i\_s*p\_s*e\_s*r\_s*a\_s*\%(l\_s*e\_s*s\|c\_s*e\_s*a\_s*e\)\|t\_s*e\_s*r\_s*i\_s*d\_s*o\_s*s\_s*p\_s*e\_s*r\_s*m\_s*\%(a\_s*l\_s*e\_s*s\|i\_s*d\_s*a\_s*e\)\|o\_s*\%(t\_s*a\_s*s\_s*s\_s*i\_s*u\_s*m\|d\_s*o\_s*s\_s*t\_s*e\_s*m\_s*o\_s*n\_s*a\_s*l\_s*e\_s*s\)\)\|\_s*\|Ϣ\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*\%(\|\_s*\)\|\_s*\|\_s*\|\_s*\%(\|Ϥ\_s*\)\|\_s*\|\_s*[]\|\_s*\%([]\|\_s*\|\_s*\_s*Ω\_s*\_s*\_s*\_s*\_s*\_s*\)\|\_s*[]\|(\_s*\_s*)\|\_s*\_s*\|\_s*ʼ\|\_s*\|\_s*\%(\|\_s*\)\|\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|ݣ\_s*\|\_s*\|T\_s*\%(h\_s*a\_s*l\_s*i\_s*c\_s*t\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|u\_s*b\_s*i\_s*f\_s*l\_s*o\_s*r\_s*a\_s*e\)\|\_s*\_s*\_s*\_s*\_s*\|\_s*ƣ\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|ʬ\_s*\|\_s*\_s*\_s*\|\_s*\|\_s*\_s*\_s*\|\_s*[׾]\|ʣ\_s*\_s*̿\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\%(\_s*\_s*\_s*\|\_s*\|\_s*\%(\_s*\_s*\_s*\|\_s*\|\_s*\%([]\|\_s*\%(\|\_s*\)\)\|\_s*\%(\_s*\|\_s*\)\|\_s*\%(\|\_s*\_s*\_s*\%(\_s*\|\_s*\)\)\|\_s*\_s*\_s*\|\_s*\|\_s*\_s*\|\_s*\_s*\)\|\_s*\%(\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\|\_s*\%(\|\_s*\_s*\_s*\%(\_s*\_s*\|\_s*\_s*\_s*\_s*\)\)\|\_s*\%(\_s*\%(\_s*\|\_s*\_s*\%(\_s*\|\_s*\_s*\)\)\|\_s*\)\)\)\|\_s*\_s*\_s*\|\_s*\|\_s*\%([]\|\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*[]\|\_s*\_s*\_s*\|\_s*\%(\_s*\_s*\%(\|\_s*\)\|\_s*\_s*\_s*\)\|\_s*\%([֥ץ]\|\_s*\_s*\_s*\_s*\|\_s*\|\_s*\_s*\_s*\|\_s*\%(\|\_s*\_s*\_s*\)\|\_s*\_s*\|\_s*\)\|\_s*\%(\|\_s*\_s*\|\_s*\_s*\_s*\|\_s*\%(\|\_s*\)\)\|\_s*\%(\_s*\|\_s*\)\)\|\_s*\%(\_s*\_s*\|\_s*\_s*\|\_s*\|\_s*\%([]\|\_s*\|\_s*\%(\_s*\|\_s*\)\|\_s*\%(\|\_s*\)\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*\%(\|\_s*\|\_s*\|\_s*\_s*\_s*\)\)\|\_s*\%(\|\_s*\|\_s*\_s*\)\|\_s*\|\_s*\_s*\|\_s*\|\_s*\_s*\|\_s*\|\_s*\_s*\|\_s*\%([ɥѥ֥]\|\_s*\%(\|\_s*\_s*\)\|\_s*\%([]\|\_s*\%(\|\_s*\_s*\_s*\)\)\|\_s*\|\_s*\%(\_s*[]\|\_s*\)\|\_s*\|\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\%(\_s*\|\_s*\%(\|\_s*\_s*\)\)\|\_s*\%(\|\_s*\_s*\|\_s*\|\_s*\)\|\_s*\%(\|\_s*\_s*\)\|\_s*\%([ĥȥ]\|\_s*\|\_s*\|\_s*\%(\|\_s*\|\_s*\%(\|\_s*\)\)\)\|\_s*\%(\_s*\|\_s*\_s*\)\|\_s*\|\_s*\%(\|\_s*\|\_s*\)\|\_s*\_s*\_s*\|\_s*\%(\|\_s*\%(\|\_s*\)\)\|\_s*\%(\|\_s*\_s*\|\_s*\|\_s*\_s*[]\|\_s*\)\|\_s*\_s*\|\_s*\%([]\|\_s*\|\_s*\_s*\_s*\_s*\_s*\|\_s*\|\_s*\)\|\_s*\)\|\_s*\%(\|\_s*\|\_s*\_s*\)\)\|\_s*\|\_s*\%([ޥ]\|\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*\|\_s*\%([ץ]\|\_s*\_s*\|\_s*\_s*\)\|\_s*\%(\|\_s*\)\|\_s*\%(\_s*\_s*\|\_s*\_s*\_s*\_s*\)\|\_s*\%([եȥץ]\|\_s*\|\_s*\)\|\_s*\%([]\|\_s*\%(\|\_s*\)\|\_s*\%(\_s*\|\_s*\|\_s*\_s*\_s*\)\|\_s*\%(\|\_s*\|\_s*\_s*\|\_s*\)\|\_s*\%(\_s*\|\_s*\_s*\)\|\_s*\_s*\_s*\|\_s*\|\_s*\_s*\|\_s*\%([ȥ]\|\_s*\_s*\)\|\_s*\%([]\|\_s*\|\_s*\|\_s*\_s*\)\|\_s*\%(\|\_s*\|\_s*\)\)\|\_s*\%([եɥ󥳥ꥦ]\|\_s*\|\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\%(\|\_s*\)\|\_s*\|\_s*\%(\|\_s*\|\_s*\_s*\)\|\_s*\%([]\|\_s*\|\_s*\%(\_s*\|\_s*\)\)\|\_s*\%(\_s*[]\|\_s*\_s*\)\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*\|\_s*\%([ȥॸ]\|\_s*\|\_s*\%(\|\_s*\)\|\_s*\|\_s*\%([]\|\_s*\)\)\|\_s*\_s*\)\|\_s*\%([]\|\_s*\|\_s*\_s*\_s*\|\_s*\%(\|\_s*\|\_s*\|\_s*\_s*\)\|\_s*\|\_s*\%(\|\_s*\|\_s*\)\|\_s*\)\)\|\_s*ɸ\|\_s*\|\_s*\|\_s*\%(\|\_s*\_s*\_s*\)\|\_s*³\|C\_s*\%([srdfDeRoa]\|\_s*\|\_s*\_s*\|y\_s*p\_s*e\_s*r\_s*a\_s*l\_s*e\_s*s\|P\_s*\%(U\|S\_s*(\_s*C\_s*o\_s*n\_s*t\_s*i\_s*n\_s*u\_s*a\_s*t\_s*i\_s*o\_s*n\_s*-\_s*P\_s*a\_s*s\_s*s\_s*i\_s*n\_s*g\_s* \_s*S\_s*t\_s*y\_s*l\_s*e\_s*)\)\|u\_s*r\_s*i\_s*u\_s*m\|M\_s*\%(U\|\_s*\_s*\)\|\_s*\_s*\|T\_s*\%(\_s*\_s*\_s*\|R\_s*L\_s*\_s*\)\|\_s*\_s*\|S\_s*\%(V\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\_s*\)\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\_s*\|C\_s*\%(R\_s*(\_s*C\_s*r\_s*e\_s*e\_s*d\_s*e\_s*n\_s*c\_s*e\_s* \_s*C\_s*l\_s*e\_s*a\_s*r\_s*w\_s*a\_s*t\_s*e\_s*r\_s* \_s*R\_s*e\_s*v\_s*i\_s*v\_s*a\_s*l\_s*)\|D\_s*\_s*\_s*\)\|\_s*\_s*\_s*\|+\_s*+\|L\_s*\%(X\|O\_s*S\|I\_s*S\_s*P\)\|E\_s*S\_s*P\|A\_s*\%(D\|S\_s*[LE]\)\|\_s*\_s*\|I\_s*S\_s*C\|h\_s*\%(l\_s*o\_s*r\_s*\%(a\_s*n\_s*t\_s*h\_s*a\_s*c\_s*e\_s*a\_s*e\|i\_s*n\_s*e\)\|r\_s*o\_s*m\_s*i\_s*u\_s*m\|a\_s*S\_s*e\_s*n\)\|O\_s*\%(B\_s*O\_s*L\|N\_s*T\_s*R\_s*O\_s*L\_s*\_s*\)\)\|\_s*\%([]\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\|\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\|\_s*\|\_s*\_s*\|\_s*2\|\_s*\_s*\%(\|\_s*\_s*\_s*\)\|\_s*\)\|\_s*\%(\_s*\|\_s*\_s*\|\_s*\%(\|\_s*\_s*\|\_s*\)\)\|ú\_s*\)', + \ 'd' : '\%([ñӹɾǯĻЧγѪƺѯƫƯƣޡƷƴƼƵƳƸƲƶưƹƱƻȸαϿ׸ͻפɻǩťŮܬҴޡѣžȤǥɶʹ˶¤Դ͸ϢߵſťϼϤ¼êíݺǻïîԵ̺ë۴ֳٹէåæǶʿϡö׼ԥ̼ձټ۴ٽɿίʿѵ߱ΩѼĽФľЦ\.šġɡȢãȥɡզĥǢd]\|\_s*\%(\_s*\|\_s*\|\_s*\|\_s*\|\_s*\)\|\_s*[ɥǥť¥]\|\_s*[ɤǤŤ¤]\|\_s*\|\_s*\_s*\|\_s*\|S\_s*a\_s*u\_s*r\_s*u\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\|C\_s*\%(u\|o\_s*p\_s*p\_s*e\_s*r\)\|\_s*ŷ\_s*\|Ʀ\_s*\|ǡ\_s*\|\_s*\|\_s*\|Ǵ\_s*\_s*\|\_s*\|\_s*\|\_s*[]\|\_s*\|\_s*\|Ƭ\_s*[]\|\_s*\|\_s*\|\_s*\|Ĵ\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*ã\|\_s*\|\_s*\|\_s*\_s*ã\_s*¿\|\_s*\%([˸]\|ʿ\_s*\|\_s*ŷ\_s*\|\_s*\%(\|\_s*\)\)\|ǵ\_s*[]\|\_s*\|\_s*\|\_s*\%(\_s*ʪ\|\_s*\_s*\_s*\_s*\_s*\_s*\)\|\_s*\_s*\_s*\_s*\|\_s*\%(\_s*\_s*\|\_s*\)\|\_s*\_s*\|\_s*\|\_s*\|ʸ\_s*\|\_s*\_s*\|ȯ\_s*\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\_s*\|\_s*\_s*\%(\|\_s*\)\|\_s*\_s*\|\_s*\_s*\|\_s*\%(\|\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\)\|\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*ά\|\_s*\_s*\|\_s*\|D\_s*\%(b\|\_s*\_s*\|T\_s*\%(E\|P\_s*\_s*\_s*\|M\_s*\_s*\_s*\)\|M\_s*A\|\_s*\_s*\_s*\|\_s*\_s*\|C\_s*\%(\_s*\_s*\|\_s*\_s*\_s*\)\|u\_s*b\_s*n\_s*i\_s*u\_s*m\|B\_s*\%(M\_s*S\|\_s*\_s*\)\|H\_s*C\_s*P\_s*\%(\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\)\|y\_s*\%(s\_s*p\_s*r\_s*o\_s*s\_s*i\_s*u\_s*m\|l\_s*a\_s*n\)\|r\_s* \_s*P\_s*e\_s*p\_s*p\_s*e\_s*r\|\_s*\_s*\|V\_s*D\_s*\%(\_s*\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\|\_s*\_s*\%(\_s*\_s*\|\_s*\_s*\)\|\_s*\_s*\|\_s*\_s*\_s*\_s*\|\_s*\_s*\|\_s*\_s*\)\|O\_s*S\|o\_s*\%(c\_s*u\_s*m\_s*e\_s*n\_s*t\_s* \_s*\%(T\_s*y\_s*p\_s*e\_s* \_s*D\_s*e\_s*f\_s*i\_s*n\_s*i\_s*t\_s*i\_s*o\_s*n\|O\_s*b\_s*j\_s*e\_s*c\_s*t\_s* \_s*M\_s*o\_s*d\_s*e\_s*l\)\|C\_s*o\_s*M\_s*o\)\|e\_s*\%(g\_s*e\_s*n\_s*e\_s*r\_s*i\_s*a\_s*c\_s*e\_s*a\_s*e\|l\_s*a\_s*w\_s*a\_s*r\_s*e\)\|E\_s*\%(C\|L\_s*\_s*\)\|I\_s*\%(P\_s*\_s*\_s*\_s*\|S\_s*K\)\|i\_s*\%(r\_s*e\_s*c\_s*t\_s* \_s*M\_s*e\_s*m\_s*o\_s*r\_s*y\_s* \_s*A\_s*c\_s*c\_s*e\_s*s\_s*s\|s\_s*t\_s*r\_s*i\_s*c\_s*t\_s* \_s*o\_s*f\_s* \_s*C\_s*o\_s*l\_s*u\_s*m\_s*b\_s*i\_s*a\|g\_s*i\_s*t\_s*a\_s*l\)\)\)', + \ 'e' : '\%([ٱ稰Զ콸ս֦ٻٱְܱױرݩΡ޼޽Ԩɲ᰸ާǢޱ޻ʥԤϱͱն۪߱ܳ۱ϱƱñȱԱűƱӱDZɱϱıʻ޲ͱ賨вóت̱¹槶΢ާ姯ѢмǦ㧳ݦŧ泌e]\|A\_s*\%([Ƚ]\|V\_s*\%(\_s*\|\_s*ͥ\)\|B\_s*\%(\|C\_s*\)\)\|\_s*\%([Ƚ]\|\_s*\%(\_s*\|\_s*ͥ\)\|\_s*\)\|\_s*\%(\|\_s*\)\|ɰ\_s*\_s*\|M\_s*\_s*\_s*\|\_s*\_s*\_s*\|\_s*˹\_s*\|\_s*ʪ\|\_s*\|˦\_s*\|\_s*\_s*\|Լ\_s*\|\_s*\|\_s*ϩ\|\_s*\|\_s*[Ի]\|\_s*ƺ\|\_s*\|\_s*\%(\_s*\_s*\|\_s*\_s*\_s*\)\|L\_s*\%(\_s*\_s*\|L\_s*\%(\_s*\_s*\|\_s*\)\)\|\_s*\%([ɲ]\|\_s*\)\|N\_s*\|\_s*\%([Ķ˶]\|\_s*\|\_s*\|\_s*\_s*\_s*\_s*\)\|\_s*\|\_s*\|\_s*\_s*\_s*\_s*\_s*\|S\_s*\%([]\|\_s*\_s*\|N\_s*\|F\_s*\_s*\)\|\_s*\%([Ȼʶ]\|\_s*\_s*\|\_s*\|\_s*\_s*\)\|\_s*[¿]\|\_s*\%([]\|\_s*\_s*\)\|X\_s*\%([]\|O\_s*\|\_s*\_s*\)\|\_s*ƻ\|\_s*Ʀ\|C\_s*\%(l\|h\_s*l\_s*o\_s*r\_s*i\_s*n\_s*e\)\|\_s*\%(Ϸ\|\_s*\)\|\_s*\_s*\_s*®\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\%(\|\_s*\)\|ݿ\_s*\%(\|\_s*\)\|\_s*\_s*\_s*\%(\_s*\_s*\|\_s*\)\|\_s*\%(\_s*\|\_s*\_s*\_s*\_s*\|\_s*\_s*\|\_s*\%(\|\_s*\|\_s*\|\_s*\%(\|\_s*\)\|\_s*\|\_s*\|\_s*\%(\|\_s*\)\|\_s*\%(\_s*\_s*\|\_s*\%(\_s*\|\_s*\_s*\)\)\|\_s*\_s*\_s*\|\_s*\)\)\|\_s*\|\_s*Ĵ\|\_s*\_s*\_s*\%(\_s*\|\_s*\)\|ȯ\_s*Ÿ\|ɾ\_s*\_s*\_s*\|\_s*\_s*\|ɴ\_s*\_s*\_s*ŵ\|\_s*\_s*\_s*\_s*\|\_s*\%(\|\_s*\%(\_s*\|\_s*\)\)\|\_s*\|\_s*ĥ\|\_s*\|\_s*ò\_s*\|\_s*\%(\_s*\|\_s*\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\)\|\_s*\%([]\|\_s*\|\_s*\%([ޥ]\|\_s*\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*\|\_s*\|\_s*\)\)\|\_s*Ω\|E\_s*\%(r\|O\_s*F\|u\_s*\%(p\_s*o\_s*m\_s*a\_s*t\_s*i\_s*a\_s*c\_s*e\_s*a\_s*e\|r\_s*o\_s*p\_s*i\_s*u\_s*m\)\|U\_s*C\_s*\_s*\_s*\|P\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\|d\_s*i\_s*t\_s*i\_s*n\_s*g\_s* \_s*M\_s*A\_s*C\_s*r\_s*o\_s*S\|-\_s*m\_s*a\_s*i\_s*l\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\|N\_s*T\_s*E\_s*R\_s*\_s*\|\_s*\_s*\|i\_s*n\_s*s\_s*t\_s*e\_s*i\_s*n\_s*i\_s*u\_s*m\|S\_s*\%(P\|C\_s*\_s*\)\|l\_s*k\|m\_s*a\_s*c\_s*s\)\|\_s*\%([֥顼]\|\_s*\_s*\_s*\|\_s*\_s*\_s*[ȥ]\|\_s*\%(\_s*\|\_s*\_s*[]\)\|\_s*\_s*\_s*\|\_s*\_s*\_s*\%(\_s*[ȥ]\|\_s*\)\|\_s*\_s*\%(\|\_s*\)\|\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*\_s*\%(\_s*\_s*\|\_s*\_s*\_s*\)\|\_s*\|\_s*\%(\|\_s*\_s*\|\_s*\_s*\|\_s*\)\|\_s*\_s*\%(\_s*\|\_s*\)\|\_s*\%(\|\_s*\_s*\_s*\)\|\_s*\_s*\_s*\_s*\|\_s*[]\|\_s*\%(\_s*\%(\|\_s*\|\_s*\)\|\_s*\%(\|\_s*\|\_s*\)\|\_s*\)\)\|\_s*\%(\|\_s*\_s*\_s*\)\)', + \ 'f' : '\%([ϼвɮ߸˼ݵϰ˴ϴʻÿū߹ʷʵʸʯʭʶʲʱʬʴڸ޽ʥ޼⵺бƣ߬οʳزʰʧʨؿ礢ıǹ޴ʤʢʣʡԴн祹ƧϷ붸ʮҶۿտʫݤգŴϢ٢޶ʩǵʦզFf]\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*ǹ\|\_s*\|\_s*\|E\_s*u\_s*p\_s*t\_s*e\_s*l\_s*e\_s*a\_s*c\_s*e\_s*a\_s*e\|\_s*\_s*\|\_s*\|\_s*\_s*\|\_s*\|\_s*\%(Ǥ\|\_s*[]\)\|Ƭ\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|M\_s*y\_s*r\_s*t\_s*a\_s*l\_s*e\_s*s\|\_s*[滳]\|\_s*\|B\_s*u\_s*d\_s*d\_s*l\_s*e\_s*j\_s*a\_s*c\_s*e\_s*a\_s*e\|\_s*\|G\_s*e\_s*r\_s*a\_s*n\_s*i\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|\_s*[ͤ]\|\_s*\|2\_s*\%([ͤ]\|\_s*\)\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\|\_s*\|\_s*Χ\_s*\|I\_s*r\_s*o\_s*n\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*\|\_s*\%(\_s*\_s*\|\_s*\|\_s*\%(\_s*\%(\_s*\|\_s*\)\|\_s*\_s*\%(\_s*\|\_s*\_s*\_s*\)\)\)\|\_s*\|\_s*ǽ\|\_s*\|\_s*\_s*\|\_s*\|\_s*\%(\|\_s*\_s*[]\)\|\_s*1\_s*\_s*\|\_s*\%(\_s*\_s*\_s*\_s*\|\_s*\)\|\_s*\|\_s*\%(\|\_s*\_s*\|\_s*\)\|\_s*\_s*\|\_s*\%(\|\_s*\_s*\|\_s*\_s*\|\_s*\%(\|\_s*\)\|\_s*\_s*\_s*\_s*\)\|\_s*\_s*\|\_s*\)', + \ 'g' : '\%([Ʊ亲޺иЯǡ¹ɹϿйӹijݶ޸Ķ˸߸˱۸5ѻ贸裵Ӫش೸幡椴֡ɷ޷߷ݱɧ븿ѷʸ¸˲Ʋ򲼽Ӥʵʹ¢̸襶鹶ʵܶ溷ֶȶ뿩۶ɤݵԷ֪۶̵ߤƸѧĶȶǶŹԵյۧĴѦ۷漷㦵뵾Եõµµڵີ嵽٦ȱⷸŹε״¦̳񷿷Ը걳ҳ޽Ż˳Ƭ޸̴ݢ޴ḵس̳۳ٳܳڳЩֽԶӱ⭳賩²ӨѼڲ߲þ̲ϲֶݥծ󢴢䤬紤楬¦˦ϦҦͦѦʦΦɦȦ̦ŦĦצЦӦԦƦզ֦ǦإԦæg]\|\_s*\%(\_s*\|\_s*\|\_s*\|\_s*\|\_s*\)\|\_s*[]\|\_s*[]\|\_s*\|\_s*\|\_s*\_s*\|\_s*Ƭ\_s*\|\_s*\|\_s*\|P\_s*e\_s*r\_s*s\_s*o\_s*n\_s*a\_s*l\_s*e\_s*s\|\_s*\|\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*\|\_s*\%([ֱ]\|ŷ\_s*\)\|\_s*\_s*\|\_s*\%([Ÿо]\|\_s*\)\|Ʀ\_s*[]\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*[¯]\|\_s*[ǹ]\|\_s*\|\_s*\|\_s*\|\_s*\_s*\_s*\|\_s*\|\_s*[׹]\|\_s*ϡ\|\_s*\|\_s*\|\_s*\%([]\|\_s*\)\|\_s*\%([ˡƻ]\|\_s*\_s*\|ʹ\_s*\_s*ˡ\)\|A\_s*g\|S\_s*\%(c\_s*r\_s*o\_s*p\_s*h\_s*u\_s*l\_s*a\_s*r\_s*i\_s*a\_s*c\_s*e\_s*a\_s*e\|y\_s*m\_s*p\_s*e\_s*t\_s*a\_s*l\_s*a\_s*e\|i\_s*l\_s*v\_s*e\_s*r\)\|\_s*\|\_s*\_s*ë\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*̾\|T\_s*y\_s*p\_s*a\_s*l\_s*e\_s*s\|\_s*[]\|\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\%(\_s*\_s*\|\_s*\_s*\_s*\|\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\|\_s*\|\_s*\_s*\)\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\|Ϣ\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\|\_s*\_s*\|\_s*\|\_s*\_s*\_s*\_s*\|\_s*\|\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\|\_s*\_s*\%(\_s*\_s*\_s*\|\_s*\_s*\)\|\_s*\|G\_s*\%([dae]\|o\_s*m\_s*o\_s*r\_s*t\_s*e\_s*g\_s*a\_s*c\_s*e\_s*a\_s*e\|M\_s*\%(T\|D\_s*(\_s*G\_s*e\_s*r\_s*m\_s*a\_s*n\_s* \_s*N\_s*a\_s*t\_s*i\_s*o\_s*n\_s*a\_s*l\_s* \_s*R\_s*e\_s*s\_s*e\_s*a\_s*r\_s*c\_s*h\_s* \_s*C\_s*e\_s*n\_s*t\_s*e\_s*r\_s* \_s*f\_s*o\_s*r\_s* \_s*C\_s*o\_s*m\_s*p\_s*u\_s*t\_s*e\_s*r\_s* \_s*S\_s*c\_s*i\_s*e\_s*n\_s*c\_s*e\_s*)\)\|\_s*\|C\_s*L\|c\_s*c\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\|\_s*\|P\_s*L\|n\_s*u\_s*s\|I\_s*\%(N\_s*A\_s*(\_s*t\_s*h\_s*e\_s* \_s*G\_s*e\_s*n\_s*e\_s*r\_s*i\_s*c\_s* \_s*I\_s*n\_s*t\_s*e\_s*r\_s*a\_s*c\_s*t\_s*i\_s*v\_s*e\_s* \_s*A\_s*p\_s*p\_s*l\_s*i\_s*c\_s*a\_s*t\_s*i\_s*o\_s*n\_s*)\|F\_s*\%(\_s*\_s*\_s*\|\_s*\_s*\)\)\|U\_s*I\|N\_s*U\|O\_s*\_s*\_s*\|E\_s*T\_s*\_s*\_s*\_s*\)\|\_s*\%(\_s*\_s*\|\_s*\_s*\)\|\_s*\_s*\|\_s*\_s*\_s*\|\_s*\%(\_s*\%(\_s*\|\_s*\_s*\)\|\_s*\_s*\_s*\_s*\|\_s*\|\_s*\_s*\_s*\_s*\|\_s*\%(\_s*\|\_s*\%(\|\_s*\_s*\)\)\)\|\_s*\%(\|\_s*\_s*\)\|\_s*\%([른Υʥ]\|\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\|\_s*\%(\|\_s*\%(\|\_s*\_s*\_s*\)\)\|\_s*\%(\|\_s*\)\|\_s*\_s*\_s*\|\_s*\%(\|\_s*\_s*\_s*\)\|\_s*\%(\_s*\_s*\|\_s*\_s*\)\|\_s*\_s*\|\_s*\%(\_s*\|\_s*\_s*\_s*[˥]\|\_s*\_s*[˥]\|\_s*\%(\_s*\|\_s*\)\|\_s*\%(\|\_s*\_s*\)\|\_s*\%(\|\_s*\_s*\)\)\|\_s*\%(\|\_s*\%(\|\_s*\|\_s*\_s*[ĥ]\)\|\_s*\%(\|\_s*\_s*\_s*\)\|\_s*\_s*\)\|\_s*\|\_s*\%([]\|\_s*\_s*\|\_s*\%(\|\_s*\|\_s*\_s*\)\|\_s*\%(\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\)\)\|\_s*\%([եޥ]\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*\%(\_s*[ȥ]\|\_s*\%(\|\_s*\_s*\|\_s*\_s*\)\)\|\_s*\|\_s*\|\_s*\%([]\|\_s*\|\_s*\_s*\|\_s*\_s*\)\|\_s*\%(\|\_s*\%(\|\_s*[]\)\|\_s*\)\)\)\)', + \ 'h' : '\%([άмۭϯƶشǮ˴ꥷֹ١ڣþ̷ԼԵ篳ٸ׺êޤұƾ˲˯ˣ˱˩ˬˢ߰˥˨ˮ˰˦˭ˤڽھϾԾӬӮĦ˫ޱێ͸½Ш۳ֱ׭׬̦΢٨ղʽ֢ʾʻظͤ؎ϼвر߸˼ݵɾϰϴʻÿū߹ʷʵʸʯʭʶʲʱʬʴڸ޽ʥ޼бBƣ߬οʳزʰʩFʦʨյؿ乢ǹ޴ʤʣʡԴнڹƧٹ붸ʮҶۿտʫܤՎϷDzDZɢ򱽨ɨڻɡײɦگʶɳ߫ߪ̩ҷ蹱Ψɢʺɽźضѽñ¾Ʒ1ඡɩϾǼݱɧɴɪ粹ɲɱ桶ڲŸͨѽʹ͵עɤɯɭɥʹɫݤ̤ɮɬɶɷɿɺɻʼɼɾɸʿɽʡ֡ڡآ淥УɹҸɰȸ̥Ժ۬ഥզ좤Ҏʻȧ۽ˡȣүꤾ׼Ȧ׹߶¦ھൡá˵ȫƯȪIJԸʧȷȩƸСȰϳܥ˧˲ʢͪڼѶΥȹȸަɡڲչȤýҺ⢢ҹȢȡٰ®Ȼиɳ֯ݢڦ¬ԦѳĽ̷׿޸ȥȮϡȭ˪ȱˡȰȬȯڴԯأצɣԳޢ߯ȨźܹڵȼȽɺȾȿȺķ۱ҵûüŶǺʱĥԳƲıɿ㻫ԺŽϣ訬ȡաҥۥإh]\|\_s*[Ύ͎̎ˎ]\|\_s*[ۥإեҥ]\|\_s*[ۤؤդҤ]\|\_s*\|\_s*\|\_s*\|\_s*[󤱧]\|\_s*Ļ\|\_s*\|\_s*[п]\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*[]\|T\_s*r\_s*i\_s*u\_s*r\_s*i\_s*d\_s*a\_s*l\_s*e\_s*s\|\_s*\|\_s*ˡ\|\_s*λ\|\_s*\|\_s*\%(\|\_s*\)\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|c\_s*l\_s*a\_s*u\_s*s\_s*t\_s*r\_s*o\_s*p\_s*h\_s*o\_s*b\_s*i\_s*a\|\_s*\|\_s*\|\_s*\|E\_s*\%(r\_s*i\_s*o\_s*c\_s*a\_s*u\_s*l\_s*a\_s*l\_s*e\_s*s\|u\_s*p\_s*t\_s*e\_s*l\_s*e\_s*a\_s*c\_s*e\_s*a\_s*e\)\|\_s*\%(\_s*\|\_s*\)\|\_s*\|Ƭ\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|f\_s*\%(o\_s*r\_s*t\_s*e\|e\_s*m\_s*t\_s*o\)\|\_s*[滳]\|\_s*\|\_s*\|G\_s*e\_s*r\_s*a\_s*n\_s*i\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\%(\|\_s*\_s*\)\|\_s*\|\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*\|\_s*[]\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\%([ͽ]\|\_s*\_s*\)\|\_s*\|\_s*\|\_s*\|\_s*ŷ\_s*\|\_s*[]\|\_s*\|\_s*[ȡ]\|\_s*\_s*\%(\|\_s*\)\|A\_s*\%(s\|r\_s*s\_s*e\_s*n\_s*i\_s*c\|n\_s*g\_s*i\_s*o\_s*s\_s*p\_s*e\_s*r\_s*m\_s*a\_s*e\)\|\_s*\_s*\|\_s*\_s*\|\_s*[]\|\_s*\|ľ\_s*[Ᵽ]\|\_s*Φ\|\_s*\_s*\|\_s*\|\_s*[˹]\|\_s*Ÿ\|\_s*\|\_s*ƻ\|\_s*\|\_s*\|\_s*\|̢\_s*\|\_s*\|\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*\%(\|\_s*\)\|\_s*\|ι\_s*\|N\_s*e\_s*l\_s*u\_s*m\_s*b\_s*o\_s*n\_s*a\_s*c\_s*e\_s*a\_s*e\|\_s*\_s*\|Ʊ\_s*˦\|\_s*\|\_s*[ȧ]\|\_s*[]\|\_s*[ǵ]\|\_s*\|\_s*\_s*\|\_s*\|\_s*\|Ĺ\_s*ë\|\_s*\_s*\|Ż\_s*Ƭ\|\_s*\|\_s*\|\_s*[]\|\_s*\%(\_s*\|\_s*\)\|ͦ\_s*[]\|ή\_s*\|\_s*\|\_s*\%([ͤ]\|\_s*[]\)\|2\_s*\%([ͤ]\|\_s*\|0\_s*\)\|ø\_s*\|8\_s*\|\_s*\|P\_s*\%(t\|o\_s*t\_s*a\_s*m\_s*o\_s*g\_s*e\_s*t\_s*o\_s*n\_s*a\_s*l\_s*e\_s*s\|l\_s*a\_s*t\_s*i\_s*n\_s*u\_s*m\)\|\_s*\%([]\|\_s*\_s*\|\_s*\)\|\_s*ή\|\_s*\|\_s*\|\_s*\|R\_s*S\_s*I\|M\_s*\%(y\_s*r\_s*t\_s*a\_s*l\_s*e\_s*s\|e\_s*r\_s*c\_s*u\_s*r\_s*y\)\|\_s*Ĵ\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*\%(\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\_s*\|\_s*\|\_s*\_s*\|\_s*\_s*\%(\|\_s*[ȥ]\)\)\|\_s*\|\_s*ϻ\_s*\_s*\|\_s*\|\_s*\|\_s*\%(\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*\)\|\_s*\%(\|\_s*\_s*\|\_s*\_s*\_s*\_s*\|\_s*\%(\|\_s*\_s*\_s*\)\)\|\_s*\%([顼]\|\_s*\|\_s*\|\_s*\_s*\_s*\_s*\|\_s*\%(\_s*\%(\|\_s*\)\|\_s*\)\|\_s*\|\_s*\_s*\|\_s*\_s*\_s*\)\|\_s*\%(\_s*\%(\|\_s*\_s*\)\|\_s*\_s*\|\_s*\|\_s*\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\|\_s*\%(\_s*\_s*\|\_s*\_s*\_s*\_s*\)\)\|H\_s*\%([fsPeo]\|i\_s*m\_s*a\_s*n\_s*t\_s*a\_s*n\_s*d\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\|\_s*\_s*\|T\_s*\%(M\_s*L\_s*\_s*\_s*\_s*\|T\_s*P\_s*\_s*\_s*\)\|D\_s*D\_s*\_s*\_s*\_s*\_s*\|u\_s*r\_s*d\|a\_s*\%(s\_s*s\_s*i\_s*u\_s*m\|f\_s*n\_s*i\_s*u\_s*m\|w\_s*a\_s*i\_s*i\)\|y\_s*\%(p\_s*e\_s*r\_s* \_s*T\_s*e\_s*x\_s*t\_s* \_s*M\_s*a\_s*r\_s*k\_s*u\_s*p\_s* \_s*L\_s*a\_s*n\_s*g\_s*u\_s*a\_s*g\_s*e\|d\_s*\%(n\_s*o\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\|r\_s*\%(a\_s*s\_s*t\_s*i\_s*d\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|o\_s*\%(s\_s*t\_s*a\_s*c\_s*h\_s*y\_s*d\_s*a\_s*l\_s*e\_s*s\|g\_s*e\_s*n\)\)\)\)\)\|\_s*\%(\_s*\|\_s*\_s*\|\_s*\%(\|\_s*\)\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*\%(\_s*\|\_s*\|\_s*\|\_s*\|\_s*\%(\_s*\|\_s*\)\|\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\_s*\)\|\_s*\|\_s*\|\_s*\)\|\_s*[ʿ]\)', + \ 'i' : '\%([Ǧߡ׵׶϶̴ߺ̤ӷŲݳͶưȵܵ述S׽ꭲڿĹǢ̿θŸ沵żϫĺ׻кغҮͦܡǮʰ˻ްϮסӱ©ĩ߱۱İս˻Сݫ׸ԩ۵ີ衰ݻյư׮вΰ𨱡ֱ޴۩ܰдذYŰ1㥴Ū٥Ӱ׳̰Ѧư׺عް۰ȰަͬصԱ߼ӰܾΨթͣް׵״бְҰٰݰǡ޻ڰ汶ԣϱΰȰڤɹۢ͢ˣ籥ɥڻi]\|E\_s*\_s*\_s*\|\_s*\|J\_s*u\_s*n\_s*c\_s*a\_s*l\_s*e\_s*s\|\_s*\|\_s*ë\|\_s*ʸ\_s*\|\_s*\|ɨ\_s*\|\_s*ϻ\_s*\|\_s*\|\_s*±\|\_s*\_s*\|\_s*ȷ\|β\_s*\|\_s*\_s*\|N\_s*a\_s*j\_s*a\_s*d\_s*a\_s*l\_s*e\_s*s\|\_s*ɨ\|\_s*\|\_s*\_s*ƣ\|5\_s*[]\|\_s*[]\|ب\_s*٦\|\_s*\|Ĭ\_s*\|\_s*\|\_s*Ӽ\|\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|ʸ\_s*\|Ϻ\_s*[]\|\_s*\|\_s*[]\|U\_s*r\_s*t\_s*i\_s*c\_s*a\_s*l\_s*e\_s*s\|\_s*[Ļ]\|P\_s*\%(o\_s*a\_s*l\_s*e\_s*s\|l\_s*u\_s*m\_s*b\_s*a\_s*g\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\)\|\_s*\|\_s*\|\_s*\%(\_s*\_s*\|\_s*\)\|\_s*\|\_s*\|\_s*[з]\|\_s*\|ݬ\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*¹\_s*\|G\_s*\%(r\_s*a\_s*m\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\|l\_s*u\_s*m\_s*i\_s*f\_s*l\_s*o\_s*r\_s*a\_s*e\|i\_s*n\_s*k\_s*g\_s*o\_s*p\_s*s\_s*i\_s*d\_s*a\)\|\_s*\|\_s*\|\_s*\_s*ή\|\_s*[]\|\_s*[]\|\_s*[ڻ]\|\_s*ɽ\|\_s*\_s*[ú]\|\_s*ӧ\|\_s*\|\_s*\%(\|\_s*\)\|\_s*\_s*\|\_s*\|D\_s*i\_s*a\_s*p\_s*e\_s*n\_s*s\_s*i\_s*a\_s*l\_s*e\_s*s\|\_s*[Ǻ]\|<\_s*=\_s*=\_s*>\|ɬ\_s*\_s*\_s*ʬ\_s*\_s*\|\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\%(\_s*\_s*\_s*\_s*\|ɸ\_s*\_s*\_s*\_s*\)\|\_s*Υ\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\|¨\_s*\_s*\|\_s*\_s*\|\_s*\|\_s*\_s*\|\_s*\_s*\|̵\_s*\%(\_s*\|\_s*\)\|\_s*Ǽ\_s*ˡ\|\_s*\_s*\|\_s*\%([ǡ­]\|\_s*ʬ\)\|\_s*\_s*\|\_s*\|Ƴ\_s*\|\_s*\|\_s*\|I\_s*\%([rPn]\|R\_s*Q\|\_s*\_s*\|C\_s*\%(\_s*\|\_s*\_s*\|\_s*\_s*\)\|l\_s*l\_s*i\_s*n\_s*o\_s*i\_s*s\|S\_s*\%(O\|B\_s*N\_s*\%(\_s*\_s*\|\_s*\)\|A\_s*\_s*\)\|d\_s*a\_s*h\_s*o\|D\_s*\%(\_s*\_s*\|E\_s*\%(\_s*\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\)\)\|\_s*\_s*\|T\_s*\%(\_s*\_s*\_s*\|\_s*\_s*\)\|o\_s*\%(w\_s*a\|d\_s*i\_s*n\_s*e\)\)\|\_s*\%(\_s*\|\_s*\|\_s*\|\_s*\)\|\_s*\%(\|\_s*\%(\_s*\_s*\|\_s*\)\|\_s*\%(\_s*\_s*\_s*\_s*\%(\_s*\|\_s*\)\|\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\%(\_s*\|\_s*\_s*\_s*\_s*\)\)\)\)', + \ 'j' : '\%([ֺSȼټľ¿ߩ̭顿ױӿпԿҿؿѿտޮԽ쿫ٳа屽ġплЫǡ̼ž߾վڷطèǨ쨽۲ٽμѽƽŽȻޭ߱覽۽ڽ޽޼ߨ潿кߧ尽Ľ½ýƽŻ켢μŻ༤ϩμͻ֮߾ǻ߻Яб㫰ʻֵ˼ѻʼ緺ܿٵԼ뤸ꨭ֧𧧧קۧj]\|\_s*\_s*\|\_s*\|\_s*\|G\_s*\%(\_s*\|\_s*\)\|Z\_s*\%(r\|i\_s*r\_s*c\_s*o\_s*n\_s*i\_s*u\_s*m\)\|D\_s*y\|\_s*\%(\_s*\|\_s*\)\|\_s*\|\_s*\|\_s*\_s*\%(\_s*\|\_s*\)\|\_s*\|2\_s*\|\_s*\|\_s*\_s*ʺ\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|k\_s*\$\_s*_\_s*{\_s*e\_s*f\_s*f\_s*}\_s*\$\|\_s*\%(\|\_s*\)\|\_s*\_s*\|\_s*\%(\|\_s*\)\|\_s*ī\|\_s*\|Ƚ\_s*\|ϳ\_s*\|\_s*\|\_s*\_s*\_s*\|Ĺ\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*Τ\|\_s*[ϴ崽]\|C\_s*a\_s*b\_s*o\_s*m\_s*b\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|\_s*\|\_s*\|\_s*\%(\|\_s*[ʷ]\|\_s*\|\_s*\|\_s*\)\|\_s*\|\_s*\|ɳ\_s*\|1\_s*\%(0\|1\_s*\|8\_s*\|2\_s*\)\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*̣\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*Ʊ\_s*\_s*\_s*\|\_s*\_s*\|\_s*\%(\_s*\|\_s*\|\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\)\|\_s*\%(\_s*\|\_s*\)\|\_s*\_s*\_s*\|\_s*\|\_s*Φ\_s*\_s*ü\_s*\%(\|\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\)\|\_s*\%(\_s*\|\_s*\_s*\_s*\_s*\)\|\_s*\|\_s*\%([˥ʡ]\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\%(\|\_s*\)\|\_s*\_s*\_s*\|\_s*[ӥ]\|\_s*\)\|\_s*\%(\_s*[]\|\_s*[]\)\|J\_s*\%(R\_s*\_s*\_s*\|\.\_s*S\_s*\.\_s*\%(B\_s*a\_s*c\_s*h\|\_s*\_s*\)\|\_s*\_s*\|\_s*\_s*\|C\_s*B\_s*\_s*\_s*\|-\_s*P\_s*O\_s*P\|\_s*\_s*\|P\_s*\%(G\_s*\_s*\_s*\_s*\|E\_s*G\_s*\_s*\_s*\_s*\)\|I\_s*S\_s*\%(\_s*\_s*\|\_s*\_s*\)\|a\_s*p\_s*a\_s*n\_s* \_s*A\_s*d\_s*v\_s*a\_s*n\_s*c\_s*e\_s*d\_s* \_s*I\_s*n\_s*s\_s*t\_s*i\_s*t\_s*u\_s*t\_s*e\_s* \_s*o\_s*f\_s* \_s*S\_s*c\_s*i\_s*e\_s*n\_s*c\_s*e\_s* \_s*a\_s*n\_s*d\_s* \_s*T\_s*e\_s*c\_s*h\_s*n\_s*o\_s*l\_s*o\_s*g\_s*y\|A\_s*\%(I\_s*S\_s*T\|N\_s*\_s*\_s*\|V\_s*A\_s*\%(\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\)\)\|U\_s*N\_s*E\_s*T\)\|\_s*\_s*\|\_s*\%(\|\_s*\_s*\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\_s*\|\_s*\|\_s*\%(\|\_s*\_s*\)\)\|\_s*\%([ϥ]\|\_s*\_s*\|\_s*\%([]\|\_s*\_s*\|\_s*\_s*\_s*\)\|\_s*\%(\|\_s*\|\_s*\)\|\_s*\_s*\|\_s*[]\)\|\_s*\%(\_s*\%([ʥ]\|\_s*\%(\|\_s*\)\|\_s*\)\|\_s*\%(\|\_s*\%(\|\_s*\|\_s*\)\|\_s*\_s*\|\_s*\%(\|\_s*\_s*\)\)\)\|\_s*\%([]\|\_s*\|\_s*\|\_s*\%(\|\_s*\)\)\|\_s*\%([֥]\|\_s*\%(\|\_s*\)\|\_s*\|\_s*\%(\_s*\|\_s*\)\|\_s*\|\_s*\%(\|\_s*\)\|\_s*\%([ɥ]\|\_s*\|\_s*\)\|\_s*\|\_s*[ʥ]\)\)', + \ 'k' : '\%([²ǷӰťưЯ⸼ȽǼ㪸ۻ쮱ֿѺϹٹ󮺱Ѻ纯պ︾ȹ˶޳Ӭު⺤ʻӫޫص٫ȺҺۦ־ִṲӳָ̫٬޸ܺս͹̨ɹж๫ʹá乨ۥ⫹⩹۹չ̹˹عֹ骹¹ݹҹԹθĹӹëӭйĨӾ̼ܵѻƺݸջʴƻҸǻ䲹ƸžƸݾ檽۸Ÿ麮Ķ۶ŸɸкҸݰٽᾱʷЭۿٱݼտܷѭثҥկԡݾغش޲ի᫷𸳰̷ո丮򸬸Ǹҧڸ廷ҾºتϨꥷ찷Ʒ̷÷Ҧ׷ӽܮݮݬܱܯݫʵߪ÷ٷʤվ߷ţ賷ΦۻҮ·ذܷ򷬷ڶ˿ֲƺ̽ǰ̰鶰פ޺Ϳ߷ѦΦ庿ܸȷˮԢɦʭЦĸ¢ƶ깩家Ңϼ͹ȿҿݹڤӽ廸θ˨ž߷䷯ݡݢ뿸֨ɵɵǵ̵Ƶʡš򡢡꡻ᡥ󢥢졲󢣡᡿⢫ݡ顺𡯢ܡĢ¡ޡâޡࡤ墤̡뢦ˡ䧸顷Ժ޹ܶṹµϴߵʷߵ̸Ͷ۶ڢҶݸٶڶӶ϶׶նѶ۶ֶضکڡڪ䨱ӵҨдީ򰰶ɵַѬިٰعڶ亶ѿװзժ¶ⶴȶ߸ҳٶɶѾ󶩶жᶫŶö̾켰ܣ֩ŵָݱ͵ܵ׵ֵȷٵߵ޵۶泵ʹױڵڴ¶ҷȩ嵩벫ݺž뵰̶˵ة㶾øۮ޿ʴѥҼ۹ôﵮ̵Ȳ٣ݤֿ¿ֵ̧ԭҵݸɱİөֵڹɳ߳˹ȷ̢ư좿ƱʡܢᱵרӸǡˡԡơɡСҡȡѡաôجɳ϶Ѿʸܵȿּĵǣʶͽгϵع˵ۿٸǷͩΫ峻Ĵȱ١۫Ȧ滳Ҥٿ龹ôŽ޳ڳ³ư귰¦γ㡴̻റɵҳݹ޳˿ڸিԣϸ³ø֡סٷŭƬŬŨ״׳ŤҰɬŴܷ̳ڲųӾ筢Խڨƿӽdzӡ͡ڡΡۡϡ̳ȳijԳճʳ߱ڼ˳ͳȵҳֳѳרһТӼ߶ݥ袳ЪĻӳܴ߷ٳβ𳭳dz󳬲Ӳ٪۸٢ԬٺҰߵХĽᴮѴ޾˧ӳޱڿͻôÿȡȴݴ԰ݴ۴ڴʴԴա̴δ˴עӴӿٴƴŴִ״ɴشϴѴشԳҵȴճƶɳվײ˲ײޥϲӧ鴲ӻβٳϲݸӥ׷ҽԻٷ߲ѲβӼβȹŷѫȻ¥ϲݲľӾ۲Ҵ粽桲Ʒ¸򲿶ФڲԲּвزͤᨦ秷K߶Ҧʥܦ֥k]\|\_s*[]\|\_s*[]\|\_s*[Ҥ]\|\_s*\|\_s*\|\_s*\_s*Ⱦ\|\_s*ë\|\_s*\|\_s*\_s*\|\_s*\|\_s*\|\_s*ϧ\|\_s*\|\_s*\|\_s*\|M\_s*e\_s*t\_s*a\_s*c\_s*h\_s*l\_s*a\_s*m\_s*y\_s*d\_s*e\_s*a\_s*e\|f\_s*o\_s*o\_s*t\_s* \_s*a\_s*n\_s*d\_s* \_s*m\_s*o\_s*u\_s*s\_s*e\_s* \_s*d\_s*i\_s*s\_s*e\_s*a\_s*s\_s*e\|\_s*Ϣ\_s*̣\|\_s*\|\_s*\|\_s*\|S\_s*i\|\_s*\|ɴ\_s*[߻]\|9\_s*[]\|\_s*\|\_s*\|\_s*\|\_s*\|ŵ\_s*\_s*\|L\_s*a\_s*u\_s*r\_s*\%(a\_s*c\_s*e\_s*a\_s*e\|o\_s*i\_s*d\_s*e\_s*a\_s*e\)\|õ\_s*\|\_s*\|c\_s*r\_s*e\_s*s\_s*c\|\_s*¢\_s*\|H\_s*e\_s*l\_s*l\_s*e\_s*b\_s*o\_s*r\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|J\_s*u\_s*g\_s*l\_s*a\_s*n\_s*d\_s*a\_s*l\_s*e\_s*s\|ϻ\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*[Ƿ]\|\_s*\|\_s*ɧ\|\_s*\|\_s*\_s*Ļ\|X\_s*e\|ǡ\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|G\_s*o\_s*l\_s*d\|A\_s*\%(u\|r\_s*c\_s*h\_s*i\_s*c\_s*h\_s*l\_s*a\_s*m\_s*y\_s*d\_s*e\_s*a\_s*e\|s\_s*t\_s*e\_s*r\_s*a\_s*l\_s*e\_s*s\|c\_s*a\_s*n\_s*t\_s*h\_s*a\_s*c\_s*e\_s*a\_s*e\)\|\_s*\_s*\|\_s*\|R\_s*\%(h\_s*\%(o\_s*e\_s*a\_s*d\_s*a\_s*l\_s*e\_s*s\|a\_s*m\_s*n\_s*a\_s*l\_s*e\_s*s\)\|u\_s*n\_s*u\_s*n\_s*c\_s*u\_s*l\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|a\_s*n\_s*\%(u\_s*n\_s*c\_s*u\_s*l\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|a\_s*l\_s*e\_s*s\)\)\|\_s*\|\_s*[©]\|\_s*[]\|\_s*[]\|\_s*\|\_s*\|\_s*\%([]\|̳\_s*\)\|\_s*\|\_s*\|\_s*\|\_s*ŵ\|\_s*\|\_s*\|\_s*\|\_s*\%(\_s*\|\_s*ƻ\)\|\_s*\|Υ\_s*\_s*Υ\_s*\|\_s*Ƭ\|\_s*\%(\|\_s*\)\|\_s*\|Ĺ\_s*[]\|\_s*\|ŷ\_s*\%(\|\_s*\)\|\_s*\|\_s*\_s*\|O\_s*x\_s*a\_s*l\_s*i\_s*d\_s*a\_s*c\_s*e\_s*a\_s*e\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*[]\|̱\_s*\|\_s*\|E\_s*\%(b\_s*e\_s*n\_s*a\_s*l\_s*e\_s*s\|l\_s*a\_s*n\_s*a\_s*l\_s*e\_s*s\)\|\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|Ϣ\_s*\|\_s*\|\_s*\_s*\|C\_s*\%([ormdaf]\|h\_s*r\_s*o\_s*m\_s*i\_s*u\_s*m\|i\_s*r\_s*c\_s*a\_s*e\_s*a\_s*s\_s*t\_s*e\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\|u\_s*r\_s*i\_s*u\_s*m\|e\_s*r\_s*c\_s*i\_s*d\_s*i\_s*p\_s*h\_s*y\_s*l\_s*l\_s*a\_s*c\_s*e\_s*a\_s*e\|y\_s*p\_s*e\_s*r\_s*a\_s*l\_s*e\_s*s\)\|\_s*\%(\|\_s*\)\|\_s*\|\_s*\|\_s*\%(\|Ϥ\_s*\)\|\_s*\|\_s*[]\|\_s*\%(\|\_s*\_s*Ω\_s*\_s*\_s*\_s*\_s*\_s*\)\|(\_s*\_s*)\|\_s*\|\_s*\_s*\|\_s*ʼ\|\_s*\|\_s*\%(\|\_s*\)\|\_s*\_s*\|\_s*\|\_s*\|\_s*[׿]\|\_s*\|ݣ\_s*\|T\_s*\%(h\_s*a\_s*l\_s*i\_s*c\_s*t\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|u\_s*b\_s*i\_s*f\_s*l\_s*o\_s*r\_s*a\_s*e\)\|\_s*\%([֥]\|\_s*\|\_s*\%([ȥ]\|\_s*\_s*\_s*\|\_s*\|\_s*\_s*\)\)\|\_s*\%(\_s*\%(\|\_s*\%(\_s*\_s*\|\_s*\_s*\)\)\|\_s*\_s*\|\_s*[եȥ]\)\|\_s*\%(\|\_s*\%(\|\_s*\_s*\_s*\)\)\|\_s*\%(\_s*\%(\_s*\|\_s*\)\|\_s*\_s*\)\|\_s*\%(\_s*\_s*\|\_s*\_s*\_s*\_s*\)\|\_s*\%(\|\_s*\_s*\_s*\|\_s*\|\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\)\|\_s*\%([]\|\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\)\|P\_s*\%(i\_s*p\_s*e\_s*r\_s*a\_s*\%(l\_s*e\_s*s\|c\_s*e\_s*a\_s*e\)\|a\_s*p\_s*a\_s*v\_s*e\_s*r\_s*a\_s*l\_s*e\_s*s\|o\_s*\%(d\_s*o\_s*s\_s*t\_s*e\_s*m\_s*o\_s*n\_s*a\_s*l\_s*e\_s*s\|t\_s*a\_s*s\_s*s\_s*i\_s*u\_s*m\)\)\)', + \ 'l' : '\%([졲Тˢ̢Ϣʥ򧭦˧ݦl]\|\_s*[]\|\_s*[]\|\_s*[]\|\_s*\|\_s*\_s*2\_s*\_s*ˡ\|\.\_s*\.\_s*\.\|\_s*\|\_s*\|\_s*\|ݦ\_s*ݨ\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\%([֥ܥȥᥦ]\|\_s*\|\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*\%(\|\_s*\|\_s*\%(\_s*\|\_s*\)\)\|\_s*\|\_s*\_s*\%(\_s*\_s*\_s*\|\_s*\_s*\)\|\_s*\|\_s*\_s*\_s*\|\_s*\%([ƥȥ]\|\_s*\%(\_s*\|\_s*\)\|\_s*\)\|\_s*\_s*\%([ȥ]\|\_s*\_s*\)\|\_s*\_s*\|\_s*\|\_s*\_s*\|\_s*\%(\|\_s*\_s*\|\_s*\_s*\_s*\%(\|\_s*\)\|\_s*\|\_s*\_s*\|\_s*[ȥ]\)\|\_s*\|\_s*\%([]\|\_s*\%(\|\_s*\)\|\_s*\_s*\_s*\|\_s*\_s*\_s*\|\_s*[]\|\_s*\|\_s*\)\|\_s*\%(\_s*\|\_s*\|\_s*\|\_s*\|\_s*\%([]\|\_s*\)\)\)\|\\\_s*L\_s*a\_s*T\_s*e\_s*X\|\_s*\%(\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*\%(\_s*\|\_s*\%(\_s*\|\_s*\)\)\|\_s*\%(\_s*\|\_s*\|\_s*\)\|\_s*\_s*\|A\_s*\_s*E\_s*\|\_s*\%(\_s*\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\)\)\|L\_s*\%([DP]\|\_s*\_s*\|L\_s*\_s*\_s*\|u\_s*\%(t\_s*e\_s*t\_s*i\_s*u\_s*m\|c\_s*i\_s*d\)\|i\_s*\%(t\_s*h\_s*i\_s*u\_s*m\|s\_s*p\|n\_s*u\_s*x\)\|E\_s*D\_s*\_s*\_s*\|e\_s*m\_s*m\_s*a\|o\_s*\%(g\_s*i\_s*c\_s*a\_s*l\_s* \_s*U\_s*n\_s*i\_s*t\_s* \_s*N\_s*u\_s*m\_s*b\_s*e\_s*r\|u\_s*i\_s*s\_s*i\_s*a\_s*n\_s*a\)\|a\_s*\%(w\_s*r\_s*e\_s*n\_s*c\_s*i\_s*u\_s*m\|n\_s*t\_s*h\_s*a\_s*n\_s*u\_s*m\|T\_s*e\_s*X\)\|A\_s*N\)\|\_s*\_s*\|\_s*\%([ݥޥʥΥ̥֥]\|\_s*\|\_s*\_s*\|\_s*\|\_s*\_s*\_s*\|\_s*\%(\_s*\|\_s*\)\|\_s*\_s*\|\_s*\%(\|\_s*\)\|\_s*[]\|\_s*[]\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\%(\_s*\|\_s*\)\|\_s*\%([]\|\_s*\|\_s*\_s*\_s*\)\|\_s*\_s*[륷]\|\_s*\_s*\|\_s*\%(\_s*\_s*\|\_s*\_s*\_s*\)\|\_s*\|\_s*\%([]\|\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\_s*\)\|\_s*\%(\_s*\_s*\|\_s*\)\|\_s*\%(\_s*\_s*\|\_s*[]\)\|\_s*\%(\_s*\_s*\|\_s*\|\_s*\_s*\_s*\_s*\)\|\_s*\_s*\|\_s*\%(\_s*\|\_s*\_s*\|\_s*\_s*\%(\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\)\)\|\_s*\%(\_s*\|\_s*\_s*\)\|\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\%([]\|\_s*\|\_s*\_s*\)\|\_s*\|\_s*\%([]\|\_s*\|\_s*\_s*\_s*\_s*\|\_s*\)\|\_s*\%([]\|\_s*\|\_s*\)\|\_s*\%([]\|\_s*\_s*\_s*\_s*\|\_s*\|\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\|\_s*\|\_s*\_s*\|\_s*\_s*\_s*\)\|\_s*\%(\|\_s*\_s*\_s*\)\|\_s*\%(\_s*\_s*\_s*\_s*\_s*\|\_s*\%(\_s*\_s*\|\_s*\_s*\_s*\)\)\|\_s*\%(\_s*\|\_s*\_s*\_s*\%(\|\_s*\_s*\)\|\_s*\_s*\|\_s*\_s*\_s*\)\|\_s*\%([ɥԥץ]\|\_s*\)\)\|\_s*\)', + \ 'm' : '\%([Ӵڬ߫ߪһսοὼʪʹأ᲼ЪǴܸʸݨۯۤ˴ϳ˾dzܾըոľѾճ˨تIJ˾޸Ϊ溵ʰ̺üӹɴϢ͸¼ߵٽﶻŷ̼ǫ䧿̸̷̵̴̻̹ϻ̶̳믵Ĺǥߺ֪Ьյ̮þ̬Ѱλûǣ켪ץŹ̨ºļۡۡٱ̰ǧʾƳϩƻм̯̾̿̽Ե㴳ﲸ̫Ĵ̩̪̲̱̥ܳ뷿׽ѸʿǴ̣λ潼̧̭̦ߎϸ߿ܵŪ¹׾׿ᵼžеȱμ㿮°Žɱ̸ƦԫѿǤʶŴٰü賹Į硦Ԥ롬ˡʱߴʣ󺵸ƻϨŻȨؤ̢̡罨Ϯ򾾶踭ͥβ̤˻۾ñ׿鼬Ϸ׻仵ŴԴޣࢿޡޢϢˢ榤̢͢ݢТܢʢ΢ߢߢ⢩ݥ޺ǥߧ̥m]\|\_s*[ӎҎюЎ]\|\_s*[ߥ]\|\_s*[ߤ]\|\_s*[]\|\_s*\%([Ͽ]\|\_s*\|\_s*\)\|\_s*\|\_s*\_s*\%(\|ʸ\_s*\)\|ξ\_s*\%([ѿƿ]\|\_s*\)\|\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*\_s*\|O\_s*l\_s*e\_s*a\_s*l\_s*e\_s*s\|ر\_s*\|\_s*\_s*\|\_s*\|\_s*ĥ\|\_s*[]\|\_s*\_s*ӧ\|\_s*\|\_s*\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*\%([ͭ]\|\_s*ƻ\|\_s*\)\|\_s*\|\_s*\|6\_s*\|\_s*\|\_s*\|\_s*\|\_s*;\_s*\|\_s*\|B\_s*\%(e\_s*r\_s*b\_s*e\_s*r\_s*i\_s*d\_s*a\_s*c\_s*e\_s*a\_s*e\|i\_s*o\_s*r\_s*r\_s*a\_s*g\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\)\|\_s*\|©\_s*\|k\_s*\$\_s*_\_s*{\_s*i\_s*n\_s*f\_s*}\_s*\$\|\_s*\|A\_s*\%(b\_s*i\_s*e\_s*s\|p\_s*e\_s*t\_s*a\_s*l\_s*a\_s*e\|c\_s*r\_s*o\_s*s\_s*t\_s*i\_s*c\_s*h\_s*u\_s*m\)\|\_s*\|\_s*ȷ\|\_s*\|\_s*[]\|\_s*\|\_s*\|Φ\_s*\|\_s*[ҽԢ]\|\_s*[]\|3\_s*[]\|\_s*[ȱ]\|\_s*\|ȷ\_s*\|\_s*\|\_s*[۾˪]\|P\_s*o\_s*d\_s*o\_s*p\_s*h\_s*y\_s*l\_s*l\_s*a\_s*c\_s*e\_s*a\_s*e\|\_s*[ζε]\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|R\_s*u\_s*t\_s*a\_s*l\_s*e\_s*s\|\_s*\%(̣\|\_s*[ž]\)\|\_s*\_s*\_s*\_s*\_s*\|\_s*\|\_s*Ļ\|\_s*\|\_s*\|\_s*[Ҹ]\|\_s*\|ߴ\_s*\|\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*ã\|\_s*\|\_s*[̯]\|\_s*\|\_s*\|L\_s*o\_s*g\_s*a\_s*n\_s*i\_s*a\_s*c\_s*e\_s*a\_s*e\|Ю\_s*\|\_s*\|\_s*\|S\_s*\%(a\_s*p\_s*i\_s*n\_s*d\_s*a\_s*l\_s*e\_s*s\|c\_s*h\_s*i\_s*s\_s*a\_s*n\_s*d\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\)\|C\_s*\%(a\_s*s\_s*u\_s*a\_s*r\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\|e\_s*r\_s*a\_s*t\_s*o\_s*p\_s*y\_s*l\_s*l\_s*a\_s*c\_s*e\_s*a\_s*e\)\|\_s*\%(\_s*\|\_s*\)\|H\_s*a\_s*m\_s*a\_s*m\_s*e\_s*l\_s*i\_s*d\_s*a\_s*l\_s*e\_s*s\|\_s*[Ƿ]\|\_s*ɧ\|ʹ\_s*\|\_s*\|\_s*[§]\|\_s*\_s*ǯ\|\_s*\|¿\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\|ñ\_s*\_s*\|\_s*\|\_s*\_s*[]\|\_s*\_s*\|\_s*\_s*Ǿ\|\_s*[]\|\_s*\|\_s*\%(\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\)\|\_s*\%(\_s*\|\_s*\_s*\|\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\|\_s*\|\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\|\_s*\)\|\_s*\_s*\|\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*Ū\_s*\_s*̣\|\_s*\_s*\%(\_s*\_s*\|\_s*̣\)\|\_s*\|\_s*\|\_s*\|M\_s*\%([dgtnOo]\|X\_s*\_s*\_s*\|\_s*\_s*\|S\_s*-\_s*D\_s*O\_s*S\|L\_s*\_s*\_s*\|P\_s*3\_s*\_s*\_s*\%(\_s*\_s*\|\_s*\_s*\)\|D\_s*\%(\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\)\|c\_s*C\_s*a\_s*r\_s*t\_s*h\_s*y\|e\_s*\%(d\_s*u\_s*s\_s*a\_s*n\_s*d\_s*r\_s*a\_s*l\_s*e\_s*s\|i\_s*t\_s*n\_s*e\_s*r\_s*i\_s*u\_s*m\|t\_s*a\_s*F\_s*o\_s*n\_s*t\|n\_s*\%(y\_s*a\_s*n\_s*t\_s*h\_s*a\_s*l\_s*e\_s*s\|d\_s*e\_s*l\_s*e\_s*v\_s*i\_s*u\_s*m\)\|C\_s*a\_s*b\)\|u\_s*l\_s*e\|A\_s*C\_s*\_s*\_s*\_s*\|a\_s*\%(g\_s*n\_s*\%(o\_s*l\_s*i\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|e\_s*s\_s*i\_s*u\_s*m\)\|n\_s*\%(u\_s*\%(e\_s*d\|s\_s*c\_s*r\_s*i\_s*p\_s*t\_s* \_s*E\_s*d\_s*i\_s*t\_s*i\_s*n\_s*g\)\|g\_s*a\_s*n\_s*e\_s*s\_s*e\)\|r\_s*y\_s*l\_s*a\_s*n\_s*d\|i\_s*n\_s*e\|k\_s*e\_s*f\_s*i\_s*l\_s*e\|c\_s*\%(h\|i\_s*n\_s*t\_s*o\_s*s\_s*h\)\|s\_s*\%(s\_s*a\_s*c\_s*h\_s*u\_s*s\_s*e\_s*t\_s*t\_s*s\|t\_s*e\_s*r\_s*C\_s*a\_s*r\_s*d\)\)\|i\_s*\%(n\_s*n\_s*e\_s*s\_s*o\_s*t\_s*a\|s\_s*s\_s*\%(i\_s*s\_s*s\_s*i\_s*p\_s*p\_s*i\|o\_s*u\_s*r\_s*i\)\|c\_s*\%(r\_s*o\_s* \_s*S\_s*o\_s*f\_s*t\_s*w\_s*a\_s*r\_s*e\_s* \_s*A\_s*s\_s*s\_s*o\_s*c\_s*i\_s*a\_s*t\_s*e\_s*s\|h\_s*i\_s*g\_s*a\_s*n\)\)\|I\_s*\%(T\|P\_s*S\|M\_s*D\)\)\|\_s*\)', + \ 'n' : '\%([ݥɰ˽ھ翮Ǽ¡۩뭵˾̻ĵƭо۰ĪܹɫŸˡҶ§ůŵۨǹǿǾǽĽǻݻǷǶЫǸΎեݦ߿ǫդٹǭʿܡ̲ǮϫǬ̭ܬDzǰdzǯ޺DZǩϣǴǪ͎Բʾ迡۾ݹŧ޹dz˥ȴٶǨæ̎ٿô콭ʨ߳ƲؽǢѦ浶ǡǣաԢءٰѹլǿǦǥǧǤٶ֮ƨб2ðɻˎٸij֧ť鵵ͼ㳴÷òڳزּͱľؽǺޥϲ˿ܧƻ±ڽർͨƷȱįή¸ܩĹ޽Ⱦ棷мǵճǢDԶТ͢꾨ƽĵ㴷ѵӺ޸Ǽ̵ӭձ˴ٽʨ̾˥̡͢ʥ̥Χߦͦn]\|Ģ\_s*\|\_s*\|\_s*\|\_s*ö\|\_s*\_s*ȿ\|\_s*\_s*\|ϵ\_s*[ݱ]\|\_s*\|\_s*\|\_s*[]\|\_s*[]\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*[]\|\_s*\|\_s*\|\_s*\_s*\|\_s*Ƿ\|\_s*\|ο\_s*\_s*\|\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*;\_s*\|\_s*\|\_s*\|I\_s*I\_s*\|\_s*ȭ\|\_s*\|\_s*\|M\_s*y\_s*r\_s*i\_s*s\_s*t\_s*i\_s*c\_s*a\_s*c\_s*e\_s*a\_s*e\|\_s*\|\_s*\%(\|\_s*\)\|\_s*\|\_s*\|\_s*ѵ\|\_s*[]\|L\_s*e\_s*a\_s*d\|P\_s*b\|\_s*[]\|C\_s*\%(e\_s*l\_s*a\_s*s\_s*t\_s*r\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|a\_s*r\_s*y\_s*o\_s*p\_s*h\_s*y\_s*l\_s*l\_s*a\_s*l\_s*e\_s*s\)\|\_s*\|\_s*\%(\_s*\|\_s*ʪ\)\|\_s*\_s*\|7\_s*[]\|\_s*\|\_s*\|ʿ\_s*\|\_s*\|\_s*\_s*\_s*\|T\_s*h\_s*e\_s* \_s*N\_s*e\_s*t\_s*w\_s*o\_s*r\_s*k\_s* \_s*I\_s*n\_s*f\_s*o\_s*r\_s*m\_s*a\_s*t\_s*i\_s*o\_s*n\_s* \_s*C\_s*e\_s*n\_s*t\_s*e\_s*r\|S\_s*o\_s*\%(l\_s*a\_s*n\_s*a\_s*l\_s*e\_s*s\|d\_s*i\_s*u\_s*m\)\|ɳ\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\|\_s*\|\_s*\%([]\|\_s*\_s*\_s*\|\.\_s*\_s*\.\|\_s*\_s*\_s*\|\_s*\_s*\_s*\|\_s*\%(\_s*\|\_s*\_s*\_s*\)\|\_s*\%(\_s*\|\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\|\_s*\_s*\_s*\)\|\_s*\%(\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\)\|\_s*\%(\|\_s*\)\)\|\_s*\_s*\|\_s*\|\_s*\|\_s*\|N\_s*\%([dpbaeoi]\|R\_s*Z\_s*I\|-\_s*g\_s*r\_s*a\_s*m\|G\_s*\_s*\_s*\|H\_s*K\_s*\%(\_s*\_s*\|\_s*\_s*\)\|T\_s*T\|Y\_s*\_s*\|U\_s*L\_s*L\|A\_s*S\_s*A\|E\_s*\%(C\|p\_s*o\_s*c\_s*h\|m\_s*a\_s*c\_s*s\)\)\|\_s*\)', + \ 'o' : '\%([߿Ůۯ۰Ÿ۲˻ŰҳسԸ䲮ɭܽڶڼᡳǦƼĹĽǼԲ£ҽԿ־ͳΦֲݣſ༫ʳˬʲ񤲷ǰ߰θۻɽ̶Ͷ笲ݶߴ޳صإ㿲۾ռ鲪ݯݳ²۷겣ݿ൴꾪Ʊٱ̱⳸͸Ȳϵ˲˱¿ʤDzݺڽﵯؾͦ谵ӰɰϯϺڨͺϷ˸Ľˤ¢˳ئϧo]\|\_s*\_s*\_s*\|\_s*\|\_s*\|\_s*Ȭ\_s*\|Ŵ\_s*\|\_s*ȱ\_s*\_s*\|\_s*\|\_s*\|\_s*̣\|\_s*\_s*\|\_s*ʴ\|\_s*\|\_s*\|\_s*\|\_s*[]\|\_s*\|ب\_s*\|˵\_s*[]\|\_s*[̼]\|\_s*[]\|\_s*[]\|թ\_s*\|\_s*\|\_s*\|D\_s*i\_s*l\_s*l\_s*e\_s*n\_s*i\_s*a\_s*l\_s*e\_s*s\|G\_s*u\_s*t\_s*t\_s*i\_s*f\_s*e\_s*r\_s*a\_s*l\_s*e\_s*s\|H\_s*y\_s*p\_s*e\_s*r\_s*i\_s*c\_s*a\_s*l\_s*e\_s*s\|\_s*\|\_s*\|\_s*[̼Ҳ]\|\_s*ǯ\_s*\|\_s*\_s*\|\_s*\|\_s*\|A\_s*l\_s*i\_s*s\_s*m\_s*a\_s*t\_s*a\_s*l\_s*e\_s*s\|\_s*\|\_s*\|\_s*\|C\_s*o\_s*p\_s*t\_s*i\_s*d\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|\_s*\_s*\_s*\%(\|\_s*\)\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*ʪ\|\_s*\_s*\_s*\|\_s*[]\|\_s*[]\|\_s*Υ\|ز\_s*\|\_s*\_s*\|\_s*\|\_s*[]\|\_s*\|\_s*[]\|\_s*\|\_s*\_s*[]\|\_s*[߳]\|\_s*\%(\|\_s*\_s*η\|\_s*ŷ\_s*\)\|\_s*Ƭ\|\_s*[]\|\_s*\_s*¾\|\_s*\_s*\_s*\_s*\_s*\_s*\.\|\_s*[ζ]\|t\_s*h\_s*e\_s* \_s*O\_s*b\_s*j\_s*e\_s*c\_s*t\_s* \_s*M\_s*a\_s*n\_s*a\_s*g\_s*e\_s*m\_s*e\_s*n\_s*t\_s* \_s*G\_s*r\_s*o\_s*u\_s*p\|Ω\_s*\_s*\_s*\|\_s*\|\_s*\|\_s*\%(\|\_s*\%(\|\_s*\)\|\_s*\_s*\_s*\)\|\_s*\|\_s*\%(\|\_s*\|\_s*\%([]\|\_s*\)\)\|\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\%(\_s*[ǯ]\|\_s*\)\|\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\|\_s*Ŭ\_s*\|\_s*\%([ӷ]\|\_s*\|\.\_s*\_s*\.\|\_s*\|\_s*\_s*\|\_s*\_s*\_s*\%(\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\)\)\|\_s*\|\_s*\_s*\|\_s*\|\_s*\|O\_s*\%([sS]\|h\_s*i\_s*o\|k\_s*l\_s*a\_s*h\_s*o\_s*m\_s*a\|b\_s*j\_s*e\_s*c\_s*t\_s*-\_s*O\_s*r\_s*i\_s*e\_s*n\_s*t\_s*e\_s*d\|O\_s*\%(D\_s*L\|P\_s*L\)\|M\_s*R\_s*O\_s*N\|A\_s*\_s*\_s*\_s*\_s*\|C\_s*R\_s*\_s*\_s*\|r\_s*e\_s*g\_s*o\_s*n\|''\_s*R\_s*e\_s*i\_s*l\_s*l\_s*y\_s* \_s*J\_s*a\_s*p\_s*a\_s*n\|\_s*\_s*\|p\_s*e\_s*n\_s*W\_s*i\_s*n\_s*d\_s*o\_s*w\|x\_s*y\_s*g\_s*e\_s*n\)\)', + \ 'p' : '\%([ˣˤˡܮޤʻġʬɤɼɶʿȯȢʢʧȬ˱ĥѣצԡޡܤצզ̨󡥡ץǡˡʢߢ¥ڥѧХԧᦰp]\|\_s*\%(\_s*\|\_s*\|\_s*\|\_s*\|\_s*\)\|\_s*[ݥڥץԥ]\|\_s*[ݤڤפԤ]\|\_s*\|\_s*\_s*Į\|\_s*\|\_s*[Ϫϥ]\|\_s*\|\_s*\|\_s*ϥ\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\%(Τ\|\_s*\)\|S\_s*y\_s*n\_s*a\_s*n\_s*t\_s*h\_s*a\_s*e\|C\_s*y\_s*c\_s*l\_s*a\_s*n\_s*t\_s*h\_s*a\_s*l\_s*e\_s*s\|\_s*\|B\_s*r\_s*o\_s*m\_s*e\_s*l\_s*i\_s*a\_s*l\_s*e\_s*s\|L\_s*e\_s*a\_s*d\|\_s*[ļ]\|\_s*\%(\_s*\_s*\|\_s*\_s*\_s*\)\|\_s*\%(\_s*\|\_s*\%([]\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*\_s*\)\)\|+\_s*\|\_s*\%(\|\_s*\_s*\)\|\_s*\_s*\_s*\|\_s*\%(\|Χ\_s*\)\|\_s*\%(\_s*\_s*\_s*\|\_s*\%(\_s*\%(\|\_s*\_s*\)\|\_s*\_s*\_s*\)\|\_s*\_s*\_s*\|\_s*\%([Υ]\|\_s*\|\_s*\|\_s*\_s*\_s*\|\_s*\)\|\_s*\%(\|\_s*\|\_s*\%([]\|\_s*\_s*\)\|\_s*\%(\_s*\|\_s*\_s*[]\)\|\_s*[ĥ]\|\_s*\_s*\_s*\_s*\)\|\_s*\%([]\|\_s*\%(\_s*\_s*\|\_s*\)\|\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\|\_s*\%([]\|\_s*[ץ]\|\_s*\%(\|\_s*\)\)\)\|\_s*\%(\_s*\%([٥]\|\_s*\_s*\)\|\_s*\|\_s*\_s*\|\_s*\%(\|\_s*\_s*\|\_s*\|\_s*\)\|\_s*\%(\_s*\|\_s*\)\)\)\|\_s*\|\_s*\|\_s*\_s*\_s*\_s*\|\_s*\|\_s*³\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\%(\|\_s*ˡ\|\_s*\%(\_s*\_s*\|\_s*\|\_s*\_s*\)\|\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\|\_s*\_s*\|\_s*\_s*\_s*\_s*\|\_s*\_s*\%(\_s*\_s*\|\_s*\_s*\_s*\)\|\_s*\_s*\%(\|\_s*\_s*\)\)\|\_s*³\|\_s*\_s*\_s*\|\_s*ƺ\_s*\|\_s*\_s*\|¿\_s*\_s*\|\_s*\_s*\_s*\|Ž\_s*\_s*\_s*\|\_s*ʸ\|\_s*\_s*[]\|\_s*\|P\_s*\%([umdCaor]\|K\_s*\|D\_s*F\_s*\_s*\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|\.\_s*S\_s*\.\|S\_s*\%(\.\|Y\_s*\_s*S\)\|I\_s*C\_s*\_s*\_s*\_s*\|l\_s*\%(a\_s*t\_s*i\_s*n\_s*u\_s*m\|u\_s*t\_s*o\_s*n\_s*i\_s*u\_s*m\)\|E\_s*T\_s*\_s*\_s*\|O\_s*S\_s*\%(\_s*\_s*\_s*\|I\_s*X\|T\_s*\_s*\_s*\_s*\)\|e\_s*\%(r\_s*l\|n\_s*\%(t\_s*\%(o\_s*x\_s*y\_s*l\_s*i\_s*d\_s*a\_s*e\|i\_s*u\_s*m\)\|n\_s*s\_s*y\_s*l\_s*v\_s*a\_s*n\_s*i\_s*a\)\)\|h\_s*o\_s*s\_s*p\_s*h\_s*o\_s*r\_s*u\_s*s\)\|\_s*\)', + \ 'q' : '\%([ܮݮݬܱܯݫʵߪ緩ų÷ٷʤմɾ߷ţ賷ΦۻҮⰲطܴ뷭򷬷ڶ˿ֲƺ̽Ӱǰ̰鶰Ҽȱפ޺ޱͿ߷ѦΦ庿ܸ𷪶ǶʳˮԢɦʭӼЦաŴġ¢׶ȷƸ蹴깩家Ң׵Զ죹͹ȿҿݹܶڵ⎸ɡơǡȢq]\|\_s*\|\_s*\|\_s*\|\_s*̼\|\_s*\|\_s*\|\_s*\|\_s*Ѵ\|ɴ\_s*[߻]\|\_s*\_s*\|\_s*ʪ\|\_s*\|Ĺ\_s*\|9\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\%(\|\_s*\)\|\_s*\|ŷ\_s*\_s*\|\_s*\|ŵ\_s*\_s*\|L\_s*a\_s*u\_s*r\_s*\%(a\_s*c\_s*e\_s*a\_s*e\|o\_s*i\_s*d\_s*e\_s*a\_s*e\)\|õ\_s*\|\_s*\|c\_s*r\_s*e\_s*s\_s*c\|\_s*[]\|\_s*\|\_s*¢\_s*\|K\_s*r\|H\_s*e\_s*l\_s*l\_s*e\_s*b\_s*o\_s*r\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|\_s*\%([ʸ]\|\_s*\)\|\_s*\|\_s*Ѥ\_s*\|J\_s*u\_s*g\_s*l\_s*a\_s*n\_s*d\_s*a\_s*l\_s*e\_s*s\|\_s*\|ϻ\_s*\|\_s*\|\_s*\|\_s*\|\_s*\_s*\|C\_s*\%(r\|h\_s*r\_s*o\_s*m\_s*i\_s*u\_s*m\)\|R\_s*h\_s*a\_s*m\_s*n\_s*a\_s*l\_s*e\_s*s\|\_s*\_s*\|\_s*\_s*ϯ\_s*\|\_s*\_s*\_s*\_s*\_s*\|Q\_s*\%(I\_s*C\|R\_s*\_s*\_s*\|C\_s*\_s*\_s*\_s*\|U\_s*O\_s*\_s*\_s*\)\|\_s*\|\_s*\%(\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\)\|\_s*\_s*\|\_s*\%(\_s*\|\_s*\_s*\|\_s*\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\|\_s*\_s*\_s*[]\|\_s*\%(\_s*[]\|\_s*\%(\_s*\|\_s*\)\)\|\_s*\_s*[ॹ]\)\|\_s*\|\_s*\%(\|\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\%(\|\_s*\_s*\_s*\)\|\_s*\|\_s*\|\_s*\_s*\|\_s*\%(\|\_s*\)\)\)', + \ 'r' : '\%([α㳹ϾϼϽϿϮϱҩ߳ѤӤӯۭ۰ϺϭϴϲϹϸϰ϶ϵϳϯתϦȧݭϧߣϨްߺѶүӺ١㹵ݬݮ߲ҽݲϡϣڻϢϩޥﻼϬڶΫάΪΨ˷Χҭϻ٤Φ߱ųίβΰαΩγέδήܲשPاηκϤθоס̺ۢɩοεζνμλξιئ΢ΤΥΡߢΣ轤ϫϷԿպѰЬݣݳݴڰݪڧѴդ򱦢اէ٧짹ۧקܧ觴ӧҧާߧϪ֧᧦ϥԧݧꧽ称ڧ槫آ庬꧲ѧ⦱r]\|\_s*[ێڎَ؎]\|\_s*[]\|\_s*[]\|\_s*\|\_s*[ͭ]\|\_s*[˦]\|\_s*̵\_s*\|6\_s*[]\|ݦ\_s*ݨ\|԰\_s*\|C\_s*\%(a\_s*l\_s*y\_s*c\_s*a\_s*n\_s*t\_s*h\_s*a\_s*c\_s*e\_s*a\_s*e\|h\_s*o\_s*r\_s*i\_s*p\_s*e\_s*t\_s*a\_s*l\_s*a\_s*e\)\|A\_s*\%(c\_s*t\_s*a\_s*e\_s*a\|p\_s*o\_s*p\_s*e\_s*t\_s*a\_s*l\_s*a\_s*e\)\|\_s*[]\|\_s*\%(\|\_s*\)\|V\_s*e\_s*r\_s*t\_s*i\_s*c\_s*i\_s*l\_s*l\_s*a\_s*t\_s*a\_s*e\|O\_s*r\_s*c\_s*h\_s*i\_s*d\_s*a\_s*l\_s*e\_s*s\|M\_s*i\_s*c\_s*r\_s*o\_s*s\_s*p\_s*e\_s*r\_s*m\_s*a\_s*e\|L\_s*\%([ruia]\|e\_s*i\_s*t\_s*n\_s*e\_s*r\_s*i\_s*a\_s*l\_s*e\_s*s\|A\_s*N\_s*\_s*\_s*\_s*\)\|\_s*\|G\_s*\%(e\_s*n\_s*t\_s*i\_s*a\_s*n\_s*a\_s*l\_s*e\_s*s\|y\_s*\%(n\_s*a\_s*n\_s*d\_s*r\_s*a\_s*e\|m\_s*n\_s*o\_s*s\_s*p\_s*e\_s*r\_s*m\_s*a\_s*e\)\)\|\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\%(\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\_s*\)\|\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*̿\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\|\_s*§\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*[]\|\_s*\|ȿ\_s*\_s*\|\_s*\%(\_s*ʸ\_s*\|\_s*\)\|\_s*\%(\_s*\_s*\|\_s*\|\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\|\_s*\_s*\)\|\_s*ǽ\_s*\_s*\_s*\_s*\|\_s*\_s*Ū\|ǧ\_s*\|R\_s*\%([bnfeauh]\|i\_s*c\_s*h\_s*a\_s*r\_s*d\_s* \_s*M\_s*\.\_s* \_s*S\_s*t\_s*a\_s*l\_s*l\_s*m\_s*a\_s*n\|C\_s*S\|S\_s*S\_s*\_s*\_s*\|I\_s*S\_s*C\|A\_s*M\|O\_s*M\|E\_s*\%(M\_s*\_s*̲\|T\_s*U\_s*R\_s*N\_s*\_s*\|A\_s*D\_s*M\_s*E\)\)\|\_s*\_s*ɽ\_s*\|\_s*\_s*\)', + \ 's' : '\%([Ъۼ˵ֵڰ޶˿ԽǨΨм©­¥«¦¬߶丳ײҫǬտ֥£̫ȢػٴݽҲϱçî¹½¸º»¶ȿȰɱ㯤ɯ˻ܦǶí޶ܸҪͼϴ·֣訰Ѣ޷ѩڱ߫ߪߥѡ٥Ѩڣ̻ګعṶ¿б¼ͥӳҰӵѱڿͤμʹƫǵ¨§ߵ̡ͷķ״ɿצߵŲ®ú϶ۡڽܡʢ͢Тߡޢ⦤̢ߢϢޢˢجحïͿ巿H۽ľٹضƩ߭ڧԱ颼ýƳħ󻼲١ٶĴ¢ֺߨߧ¼ȻοǦǧкӻϢ尷樦ȵԦܰǢܾнؼ鼮Ĭ߼𭼿ɨũмʻͿļĵϼٱ⬼բμ忼мܼڼѼм˼ּҰʵ༩ǿެոշܤܣƵ´ôʽȽͽܼ̿г⽫ܷ֭ܶӴ嵼ϸܽµ½Ѯآضӽؽܽ׽ٽ䣽սֽ֪꿾˿Ӣǿп¿Ŀ˿ӿ¿ɿǿä⿹üȿʿƿ謹ннٳر޵⾨پطգңֹϾӾԡѽءʡ˾Ѿء髾޾۾¾騾ľாܥƾϾɾ˾ƴҾݾξƾоȾþϾܾھ˾ʾ֤ԧῡ񳿤°濣ֻɦƵڴԮӡݻӻ͵ǻදԻ֬ڻʻ溡лܻǷǡʻ᪶ۿڻףһл̦򼡿ּ׶꼨ǻ徼㬻˻㫻ټ軭dz˸οͻٮӦͶ긼ۿܻ߷߽Ϋڼ޴ͺɾ참ֿ곡ָӯ˼λãDZ͡ůηҸ۸ΤܪǾ٩姻ӴܼƱݺ涭ոපߦڹĿĢջɻܢԻӻ3O彿ҼպȻޯ컯߻خ칹ʺѱ٣׺˺㷺ԺݺҺӼкںպƺغ׺ʺĺźͺԺۺкǺªӺ䩺ںԺغݯͶżӻɺ̬úú赺ͺͺհ٭亿޺Ի⤹Żꧺ맻ź󢾢ʸšɸĻں̢ơǨõæҦs]\|\_s*[]\|\_s*[]\|\_s*[]\|\_s*\|\_s*\%(ϩ\|Ϫ\_s*\)\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*[]\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*[]\|\_s*Ѥ\|\_s*\|U\_s*m\_s*b\_s*e\_s*l\_s*l\_s*i\_s*f\_s*l\_s*o\_s*r\_s*a\_s*e\|\_s*\|\_s*\|c\_s*e\_s*n\_s*t\_s*i\|\_s*[϶]\|\_s*\|\_s*̥\|\_s*\|ŵ\_s*\|\_s*ͺ\|\_s*\|ŷ\_s*[IJ]\|V\_s*i\_s*o\_s*l\_s*a\_s*l\_s*e\_s*s\|N\_s*y\_s*m\_s*p\_s*h\_s*a\_s*e\_s*\%(a\_s*c\_s*e\_s*a\_s*e\|o\_s*i\_s*d\_s*e\_s*a\_s*e\)\|\_s*\|\_s*ƻ\|\_s*\%(\|\_s*\)\|Ϸ\_s*\|˾\_s*Ĭ\|\_s*\|\_s*[Ǧ]\|L\_s*a\_s*\%(b\_s*i\_s*a\_s*t\_s*a\_s*e\|m\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\)\|\_s*\_s*\|ʾ\_s*\|\_s*\|\_s*\_s*\|\_s*\|\_s*\|\_s*\|ت\_s*ͺ\|\_s*\|\_s*\|I\_s*\%(s\_s*o\_s*p\_s*y\_s*r\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|l\_s*l\_s*i\_s*c\_s*i\_s*a\_s*c\_s*e\_s*a\_s*e\)\|W\_s*i\_s*n\_s*t\_s*e\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\|\_s*ʸ\|\_s*[ë]\|\_s*[]\|\_s*\%(\_s*\_s*\|\_s*\_s*\)\|\_s*\%([ظܻ]\|\_s*\)\|\_s*\|7\_s*\|\_s*[ʬ]\|4\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|͢\_s*[]\|Ȼ\_s*[ϯϺ]\|\_s*[]\|\_s*[]\|\_s*\|\_s*\|\_s*\|\_s*\%(\|\_s*\)\|Z\_s*i\_s*n\_s*g\_s*i\_s*b\_s*e\_s*r\_s*a\_s*l\_s*e\_s*s\|³\_s*\%(\_s*\_s*\%(\|\_s*\)\|\_s*\_s*\_s*\_s*\)\|ή\_s*[Υ]\|\_s*\|\_s*\|Һ\_s*ȭ\|\_s*\_s*\|C\_s*\%([es]\|y\_s*c\_s*a\_s*d\_s*\%(i\_s*d\_s*a\_s*e\|o\_s*\%(p\_s*s\_s*i\_s*d\_s*a\|f\_s*i\_s*l\_s*i\_s*c\_s*a\_s*l\_s*e\_s*s\)\)\|h\_s*l\_s*o\_s*r\_s*a\_s*n\_s*t\_s*h\_s*a\_s*c\_s*e\_s*a\_s*e\|\_s*\|D\_s*Ź\|\_s*\_s*\|a\_s*\%(s\_s*s\_s*y\_s*t\_s*h\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|c\_s*t\_s*a\_s*l\_s*e\_s*s\)\)\|\_s*\|\_s*[]\|\_s*\_s*Ʀ\|ۨ\_s*\|\_s*\|\_s*\_s*\%(\_s*[ǯ]\|\_s*[ǯ]\)\|\_s*\|ɴ\_s*\_s*\|\_s*¹\_s*\|\_s*ƣ\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\%(ˡ\|\_s*\_s*\)\|\_s*\|\_s*\|\_s*\|P\_s*\%(a\_s*r\_s*i\_s*e\_s*t\_s*a\_s*l\_s*e\_s*s\|t\_s*e\_s*r\_s*i\_s*d\_s*o\_s*s\_s*p\_s*e\_s*r\_s*m\_s*\%(a\_s*l\_s*e\_s*s\|i\_s*d\_s*a\_s*e\)\|r\_s*i\_s*m\_s*u\_s*l\_s*a\_s*l\_s*e\_s*s\)\|A\_s*\%(p\_s*i\_s*a\_s*l\_s*e\_s*s\|r\_s*a\_s*l\_s*e\_s*s\|n\_s*t\_s*i\_s*m\_s*o\_s*n\_s*y\)\|\_s*[ŵ]\|B\_s*\%(r\|\_s*\_s*\)\|\_s*ĥ\_s*\|\_s*ʬ\|\_s*\|\_s*\_s*\_s*\_s*\|\_s*¤\_s*\|D\_s*o\_s*n\_s*a\_s*t\_s*i\_s*o\_s*n\_s* \_s*A\_s*l\_s*p\_s*h\_s*o\_s*n\_s*s\_s*e\_s* \_s*F\_s*r\_s*a\_s*n\_s*c\_s*o\_s*i\_s*s\_s* \_s*d\_s*e\_s* \_s*S\_s*a\_s*d\_s*e\|M\_s*\%(e\_s*r\_s*c\_s*u\_s*r\_s*y\|u\_s*s\_s*a\_s*l\_s*e\_s*s\|a\_s*r\_s*q\_s*u\_s*i\_s*s\_s* \_s*d\_s*e\_s* \_s*S\_s*a\_s*d\_s*e\)\|\_s*\%(Ƿ\|\_s*\%(\_s*\_s*\|\_s*̣\)\)\|T\_s*\%(e\_s*t\_s*r\_s*a\_s*c\_s*e\_s*n\_s*t\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\|i\_s*n\|h\_s*e\_s* \_s*S\_s*i\_s*m\_s*p\_s*l\_s*e\_s* \_s*A\_s*P\_s*I\_s* \_s*f\_s*o\_s*r\_s* \_s*e\_s*v\_s*e\_s*n\_s*t\_s*-\_s*b\_s*a\_s*s\_s*e\_s*d\_s* \_s*X\_s*M\_s*L\_s* \_s*p\_s*a\_s*r\_s*s\_s*i\_s*n\_s*g\)\|\_s*\_s*\|\_s*\|\_s*¬\_s*\_s*ư\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\%(\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\|\_s*\|\_s*\|\_s*\%([]\|\_s*\|\_s*\)\|\_s*\%([]\|\_s*\)\)\|\_s*̣\|\_s*\|\_s*\_s*\_s*\_s*\|\_s*\%(\|\_s*\|\_s*\%(\|\_s*\_s*\_s*\)\|\_s*\_s*\)\|\_s*\%(\|\_s*\%([]\|\_s*\_s*[]\)\|\_s*\_s*\_s*\|\_s*\%(\_s*\|\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\)\)\|\_s*\%([ʼ]\|\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\|\_s*\|\_s*\%(\|\_s*\_s*\_s*\_s*\_s*\_s*\_s*\)\|\_s*\_s*\_s*(\_s*S\_s*t\_s*r\_s*u\_s*c\_s*t\_s*u\_s*r\_s*e\_s* \_s*a\_s*n\_s*d\_s* \_s*I\_s*n\_s*t\_s*e\_s*r\_s*p\_s*r\_s*e\_s*t\_s*a\_s*t\_s*i\_s*o\_s*n\_s* \_s*o\_s*f\_s* \_s*C\_s*o\_s*m\_s*p\_s*u\_s*t\_s*e\_s*r\_s* \_s*P\_s*r\_s*o\_s*g\_s*r\_s*a\_s*m\_s*s\_s*)\|\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\_s* \_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\)\|β\_s*\|\_s*\|S\_s*\%([nrgmce]\|G\_s*M\_s*L\|\_s*\_s*\|S\_s*\_s*\_s*\|F\_s*\_s*\_s*\_s*\|Q\_s*U\_s*A\_s*R\_s*E\_s* \_s*E\_s*N\_s*I\_s*X\|K\_s*\%(K\|Y\_s* \_s*P\_s*e\_s*r\_s*f\_s*e\_s*c\_s*T\_s*V\_s*!\)\|a\_s*\%(r\_s*\%(r\_s*a\_s*c\_s*e\_s*n\_s*i\_s*a\_s*l\_s*e\_s*s\|g\_s*e\_s*n\_s*t\_s*o\_s*d\_s*o\_s*x\_s*a\_s*c\_s*e\_s*a\_s*e\)\|m\_s*a\_s*r\_s*i\_s*u\_s*m\)\|M\_s*\%(\_s*\_s*\|\_s*\_s*\)\|P\_s*\%(\_s*\_s*\_s*\|A\_s*C\_s*E\_s*\_s*\)\|p\_s*\%(l\_s*u\_s*s\|e\_s*\%(r\_s*m\_s*a\_s*t\_s*o\_s*p\_s*h\_s*y\_s*t\_s*a\|c\_s*a\_s*l\_s*i\_s*t\_s*y\_s* \_s*S\_s*t\_s*o\_s*r\_s*e\_s* \_s*R\_s*e\_s*t\_s*a\_s*i\_s*l\_s*e\_s*r\_s* \_s*o\_s*f\_s* \_s*P\_s*r\_s*i\_s*v\_s*a\_s*t\_s*e\_s* \_s*L\_s*a\_s*b\_s*e\_s*l\_s* \_s*A\_s*p\_s*p\_s*a\_s*r\_s*e\_s*l\)\|a\_s*\%(t\_s*h\_s*i\_s*f\_s*l\_s*o\_s*r\_s*a\_s*e\|r\_s*c\)\)\|H\_s*I\_s*F\_s*T\_s*\_s*\|C\_s*S\_s*I\|T\_s*\%(k\|A\_s*R\)\|h\_s*u\_s*g\_s*a\_s*r\_s*t\_s* \_s*A\_s*s\_s*s\_s*o\_s*c\_s*i\_s*a\_s*t\_s*e\_s*s\_s* \_s*S\_s*y\_s*s\_s*t\_s*e\_s*m\_s* \_s*I\_s*n\_s*t\_s*e\_s*r\_s*f\_s*a\_s*c\_s*e\|A\_s*\%(P\|S\_s*I\)\|i\_s*\%(m\_s*p\_s*l\_s*e\_s* \_s*K\_s*a\_s*n\_s*a\_s* \_s*t\_s*o\_s* \_s*K\_s*a\_s*n\_s*j\_s*i\_s* \_s*c\_s*o\_s*n\_s*v\_s*e\_s*r\_s*s\_s*i\_s*o\_s*n\_s* \_s*p\_s*r\_s*o\_s*g\_s*r\_s*a\_s*m\|l\_s*i\_s*c\_s*o\_s*n\)\|t\_s*r\_s*o\_s*n\_s*t\_s*i\_s*u\_s*m\|o\_s*\%(u\_s*t\_s*h\_s* \_s*\%(D\_s*a\_s*k\_s*o\_s*t\_s*a\|C\_s*a\_s*r\_s*o\_s*l\_s*i\_s*n\_s*a\)\|l\_s*a\_s*r\_s*i\_s*s\|f\_s*t\_s*w\_s*a\_s*r\_s*e\_s* \_s*R\_s*e\_s*s\_s*e\_s*a\_s*r\_s*c\_s*h\_s* \_s*A\_s*s\_s*s\_s*o\_s*c\_s*i\_s*a\_s*t\_s*e\_s*,\_s*I\_s*n\_s*c\_s*\.\)\|u\_s*\%(n\|l\_s*f\_s*u\_s*r\)\)\)', + \ 't' : '\%([˳ɼҸڽѲ۳ݽ꾲ﰬƾηض쨽ȼͧ۽ĹЧԥ㫽˺̭ǯӷֺܺڢκ˭ƿ¢ݥݹ۲ٵܪǼеܫƻ۶ƱڮƺܻѸ߮ƪֺƽ޹ơƦƭƤƣƫƥƹܳٻ긦뻼ͻϿֺαڿпŽϲ輹ѽæ㽳ԦȎӱ͹ʻԹ֥ųŭׯūڳũۡܡץšżſŶŻŸźŲŪůŨűŰŴܼܨձţšŢ޸׷ȤƎʾʼŵ̳ٽض۲ϸɴ̱սϪ·ٴܻܿѳ㪱γªڼָʴϸȺ鲶ڹ˷Ҿѣױ³ٽƿɸ̢Խϴ˵Ϻ¤ݶԯзˤض࿵ܦ׹Ƶѻ̻ҵͿΏڻϢդĎ״ۺ紺N㾹ĿٻٲŦȤܺҬĽļذ׬Ť׭߭ıġĵįŽƬĸķijĪĢĭƨĻĥĤĨȥħİĦĬĮĺĴģIJĶĩīЦѲɪدפ֢ϱɳղѡΡСϿɼȷ֮Իγڤֿ̯ڸȿˬܽîƢí̱좷нԻվιìλƧ٥Ʈáɾẹﴰ٦ɶݾŹêéڥçäޡܱͤɫ맰ܭζεɺݰľԶͣԳӬѹҵͺ׼ŬƵ«ԡýݽèã۹̴ƿֻ찶ƵǤϰ䶳ɳٹºյ빧δӸٿйþ߬ں߸ÿWöӷëóȿCò÷ýðôùøúûõñâ߷پŧ٧Ӷڤڭʿڬ­ҿпʲίӣ۴ï¾ص봮ĹԱȯ¿߱֫٣Ωη򤿣觸ŷ߷ڢᦨɽڥ覨ȥġžƩȥġü䨼Өt]\|\_s*[ĎΎ]\|\_s*[ȥƥĥ]\|\_s*[ȤƤĤ]\|\_s*\|\_s*\_s*\|\_s*[]\|\_s*\|\_s*\|\_s*\|\_s*Ϸ\|\_s*\|\_s*[]\|\_s*\|\_s*ľ\|\_s*\|\_s*\_s*\|\_s*[]\|\_s*[]\|͸\_s*\|\_s*\_s*\_s*\|\_s*\|H\_s*y\_s*d\_s*r\_s*o\_s*c\_s*h\_s*a\_s*r\_s*i\_s*t\_s*a\_s*l\_s*e\_s*s\|\_s*\|\_s*\|\_s*[ƻ]\|\_s*[]\|\_s*ǯ\_s*\|\_s*[׻]\|A\_s*c\_s*o\_s*n\_s*i\_s*t\_s*u\_s*m\|ƶ\_s*\|\_s*\|\_s*\|F\_s*e\|I\_s*r\_s*o\_s*n\|\_s*¼\|\_s*\|\_s*̼\|ɻ\_s*\|\_s*\_s*\|\_s*\|\_s*\%(\|ε\_s*\)\|\_s*[]\|\_s*\%(\|\_s*\)\|ɹ\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*[]\|B\_s*a\_s*l\_s*a\_s*n\_s*o\_s*p\_s*h\_s*o\_s*r\_s*a\_s*l\_s*e\_s*s\|\_s*\%(\|\_s*\)\|\_s*\|1\_s*\%(\|0\_s*\)\|\_s*\_s*\|E\_s*\%(u\_s*p\_s*h\_s*o\_s*r\_s*b\_s*i\_s*a\_s*l\_s*e\_s*s\|r\_s*i\_s*c\_s*a\_s*l\_s*e\_s*s\)\|\_s*\%(\|\_s*\)\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\%(Ϸ\_s*Ƭ\|\_s*\)\|\_s*\%([]\|\_s*\|ܥ\_s*\_s*\)\|\_s*\|\_s*\|\_s*\_s*\|\_s*[]\|\_s*\|\_s*\|\_s*\_s*\|\_s*\|\_s*\|\_s*ެ\|J\_s*i\_s*a\_s*n\_s*g\_s*s\_s*u\|\_s*\|\_s*\|\_s*[]\|\_s*ë\|\_s*\|\_s*Ϫ\_s*\|\_s*\|\_s*\|\_s*[]\|\_s*\|\_s*[]\|\_s*\_s*\|\_s*\_s*\|\_s*\%(\_s*\|Ϣ\_s*\_s*[]\)\|\_s*\%(\|\_s*˷\)\|\_s*Ƣ\|\_s*\|\_s*\|\_s*[ڳ]\|\_s*\|\_s*\%(ͼ\|\_s*\)\|\_s*\|\_s*\|ͱ\_s*Ю\|̵\_s*\|\_s*\%(\|\_s*\)\|\_s*\|\_s*\|P\_s*\%(\.\_s*S\_s*\.\|o\_s*l\_s*y\_s*\%(g\_s*o\_s*n\_s*a\_s*l\_s*e\_s*s\|c\_s*a\_s*r\_s*p\_s*i\_s*c\_s*a\_s*e\)\|a\_s*n\_s*d\_s*a\_s*n\_s*a\_s*l\_s*e\_s*s\)\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|ж\_s*\|Ʋ\_s*\|ǽ\_s*[ʸǷ]\|\_s*\|\_s*̱\|\_s*\|\_s*\_s*\|\_s*\|M\_s*\%(e\_s*n\_s*i\_s*s\_s*p\_s*e\_s*r\_s*m\_s*a\_s*c\_s*e\_s*a\_s*e\|o\_s*n\_s*o\_s*\%(p\_s*e\_s*t\_s*a\_s*l\_s*a\_s*e\|c\_s*\%(h\_s*l\_s*a\_s*m\_s*y\_s*d\_s*e\_s*a\_s*e\|o\_s*t\_s*y\_s*l\_s*e\_s*d\_s*o\_s*n\_s*e\_s*a\_s*e\)\)\)\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\|\_s*\%(\_s*[ȥ]\|\_s*\)\|\_s*\_s*\|\_s*[ॢ]\|\_s*\%(\|\_s*\|\_s*\%(\|\_s*\_s*\)\|\_s*\_s*\%(\|\_s*\)\)\|\_s*\%(\|\_s*\|\_s*\|\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*[ե]\)\|\_s*\%([]\|\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\|\_s*\%([ɥ]\|\_s*\|\_s*\_s*\|\_s*\_s*[]\|\_s*\)\|\_s*\_s*\_s*\|\_s*\%(\|\_s*\|\_s*\_s*\)\|\_s*\_s*\_s*\_s*\)\|\_s*\_s*\_s*\_s*\_s*\|\_s*\%(\_s*\|Ϣ\_s*ʸ\_s*\)\|\\\_s*T\_s*e\_s*X\|ʸ\_s*\_s*\|\_s*\_s*\|\_s*\|\_s*\%([]\|\_s*\_s*\_s*\_s*\_s*\)\|\_s*\%([]\|\_s*˦\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\%(\_s*\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\)\|\_s*\_s*\_s*\_s*\|\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\|E\_s*\|\_s*[أ]\)\|T\_s*\%([bcmliahe]\|r\_s*i\_s*m\_s*e\_s*n\_s*i\_s*a\_s*c\_s*e\_s*a\_s*e\|u\_s*n\_s*g\_s*s\_s*t\_s*e\_s*n\|\_s*\_s*\|X\_s*T\_s*\_s*\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|V\_s*\%(\_s*\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\)\|C\_s*P\|\_s*\_s*\|-\_s*C\_s*o\_s*d\_s*e\|O\_s*E\_s*I\_s*C\|A\_s*\%(C\|I\_s*N\_s*S\|B\_s*\_s*\)\|E\_s*L\)\)', + \ 'u' : '\%([Ⱥɶʷƶڰ뼿åѽִء۽¥ӹⱳư뭱辧žرΪŲر󨱲山䥿۲񱷸¹ϻݱڴ︽Ǽֶ̰̽Ѳⳤزﷵ庨΢ױӺ屯ĬΣݵ²±ڽͭв񱭱˼ޢͫ觼ǿվھӻƤƿ񻱧奦ԧUu]\|\_s*\|\_s*\|\_s*\|ϵ\_s*\|\_s*\_s*\|\_s*\|թ\_s*\_s*\|\_s*\|ͥ\_s*\%(\_s*[ɰ]\|\_s*\)\|\_s*\|\_s*²\|\_s*\|ˢ\_s*\|\_s*\_s*[Ƭ]\|\_s*\|\_s*\|\_s*Ǽ\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\_s*Ļ\_s*\|ø\_s*\%(\|\_s*\_s*\)\|\_s*\%(\|\_s*\)\|\_s*\|\_s*\|\_s*\%(\|\_s*\)\|\_s*\_s*\|̣\_s*\|\_s*\|A\_s*r\_s*i\_s*s\_s*t\_s*o\_s*l\_s*o\_s*c\_s*h\_s*i\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|\_s*\|\_s*\_s*\|\_s*\|\_s*Ϻ\|\_s*\|\_s*[]\|\_s*\%(\|\_s*\_s*\)\|C\_s*u\_s*c\_s*u\_s*r\_s*b\_s*i\_s*t\_s*a\_s*l\_s*e\_s*s\|\_s*\|\_s*\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*ǽ\|\_s*\%(\_s*\|ͭ\_s*\)\|\_s*\%([]\|\_s*\_s*\|\_s*\%(\_s*\_s*\|\_s*\_s*\_s*\|\_s*\)\|\_s*\_s*\_s*\_s*\_s*\|\_s*\|\_s*\%(\|\_s*\|\_s*\_s*\)\)\|ñ\_s*\%(\|\_s*\)\|\_s*\%(\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\%(\_s*\_s*\_s*\|\_s*\_s*\_s*\)\)\|\_s*\%([ˡ]\|\_s*\%(\_s*\|\_s*\_s*\)\|\_s*\%(\|\_s*\_s*\)\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*\%(\_s*\_s*\|\_s*\_s*\_s*\)\|\_s*\_s*\%(\_s*\|\_s*\)\)\)', + \ 'v' : '\%([͢ǧӢ˥v]\|\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*\| \_s*\_s*\_s*\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\%(\_s*\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\_s*\|\_s*\_s*\|\_s*\_s*\)\|\_s*\%(\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\_s*\)\|\_s*\|\_s*\%(\_s*\_s*\_s*\|\_s*\_s*\|\_s*\%([ܥȥ]\|\_s*\%(\_s*\_s*\|\_s*[]\)\)\|\_s*\_s*\_s*\|\_s*\_s*\%(\|\_s*\_s*\|\_s*\_s*\)\|\_s*\|\_s*\_s*\|\_s*\%([ȥ]\|\_s*\|\_s*\_s*\%(\|\_s*\_s*\)\|\_s*\|\_s*\_s*\_s*\|\_s*\%(\|\_s*\_s*\)\)\|\_s*\_s*\_s*\_s*\|\_s*\%([ɥ]\|\_s*\_s*\|\_s*\_s*\)\)\|\_s*\_s*\|\_s*Ĺ\_s*\|\_s*ľ\|\_s*\%(\_s*\%(\|\_s*\_s*\)\|\_s*\%(\|\_s*\%(\|\_s*\)\)\|\_s*\_s*\_s*\_s*\)\|\_s*\%(\_s*\%(\_s*\_s*\_s*\_s*\|\_s*\%(\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\%(\|\_s*\)\)\)\|\_s*\%(\_s*\|\_s*\)\|\_s*\_s*\|\_s*\%(\_s*\|\_s*\_s*\)\|\_s*\%(\_s*\_s*\_s*\_s*\|\_s*\)\)\|\_s*\%([֥Х]\|\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\%(\_s*\|\_s*\)\|\_s*\%(\_s*\|\_s*\)\|\_s*\%(\|\_s*\)\|\_s*\_s*\|\_s*\%(\_s*\|\_s*\%(\|\_s*[]\)\)\|\_s*\%(\_s*\|\_s*\_s*\_s*\)\|\_s*\%([]\|\_s*\|\_s*\_s*\|\_s*\_s*\)\|\_s*\%(\_s*\|\_s*\_s*\_s*\)\|\_s*\%([]\|\_s*\_s*\)\|\_s*\|\_s*\_s*\_s*\_s*\|\_s*\%(\|\_s*\|\_s*\|\_s*\%(\|\_s*\_s*\)\|\_s*\_s*\%(\|\_s*\_s*\%(\|\_s*\_s*\_s*\_s*\)\)\)\|\_s*\|\_s*\|\_s*\%(\|\_s*\_s*\)\|\_s*\|\_s*\_s*\_s*\|\_s*\_s*\_s*\|\_s*\%(\|\_s*\|\_s*\|\_s*\)\)\|\_s*\%([]\|\_s*\_s*\|\_s*\_s*\|\_s*\%(\|\_s*\)\|\_s*\_s*\|\_s*\_s*\|\_s*\%([ȥ]\|\_s*\)\|\_s*\%(\|\_s*\)\|\_s*\_s*\%(\_s*\|\_s*\_s*\)\|\_s*\%([]\|\_s*\_s*\|\_s*\_s*\)\|\_s*\%(\|\_s*\_s*\|\_s*\|\_s*[]\)\|\_s*\%(\|\_s*\_s*\|\_s*\|\_s*\_s*\|\_s*\%(\_s*\|\_s*\)\|\_s*\_s*\)\|\_s*\|\_s*[䥢]\|\_s*\%(\_s*\_s*\|\_s*\|\_s*\_s*\|\_s*\_s*\)\)\|V\_s*\%(H\_s*L\_s*L\_s*(\_s*V\_s*e\_s*r\_s*y\_s* \_s*H\_s*i\_s*g\_s*h\_s* \_s*L\_s*e\_s*v\_s*e\_s*l\_s* \_s*L\_s*a\_s*n\_s*g\_s*u\_s*a\_s*g\_s*e\_s*)\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|J\_s*E\_s*-\_s*\|\_s*\|\_s*\_s*\|I\_s*S\_s*A\_s*\_s*\_s*\|i\_s*r\_s*g\_s*i\_s*n\_s*i\_s*a\|A\_s*X\|e\_s*r\_s*\%(m\_s*o\_s*n\_s*t\|i\_s*S\_s*i\_s*g\_s*n\)\|a\_s*n\_s*a\_s*d\_s*i\_s*u\_s*m\)\|\_s*\%(\|\_s*\%(\|\_s*\)\|\_s*\_s*\_s*\)\|\_s*\%([]\|\_s*\%([֥]\|\_s*\|\_s*\%(\|\_s*\_s*\)\|\_s*\_s*\|\_s*\|\_s*\)\|\_s*\|\_s*\_s*\|\_s*\|\_s*\_s*\_s*\|\_s*\%(\_s*\|\_s*\_s*\)\|\_s*\|\_s*\%(\|\_s*\)\|\_s*\_s*\|\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\_s*\|\_s*\%(\|\_s*\_s*\_s*\_s*\|\_s*\|\_s*\%(\_s*\|\_s*\)\|\_s*\|\_s*\_s*\_s*\_s*\)\|\_s*\_s*\|\_s*\%(\|\_s*\)\|\_s*\%([顼]\|\_s*\|\_s*\|\_s*\%(\_s*\|\_s*\|\_s*\_s*\)\)\|\_s*\%([]\|\_s*\_s*\|\_s*\_s*\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*\_s*\_s*\|\_s*\|\_s*\%(\|\_s*\|\_s*\)\|\_s*\|\_s*\|\_s*\_s*\|\_s*\%(\_s*\_s*\|\_s*\_s*\_s*\_s*\)\)\|\_s*\%(\_s*\_s*\_s*\|\_s*\_s*\)\)\)', + \ 'w' : '\%([򲧽ﲴͺˤȺɶʦԷƶڰ뼿åѽء۽¥ӹⱳư뭱辧žرΪŲر󨱲山䥿۲񱷸¹ϻݱڴ︽Ǽֶ̰̽ѱزﷵ庨U΢׻᢬Ӻ屯ĬΣݵ²ڽͭв񱭱˼ޢͫ觼ǿվھӻƤƿ񻱧ܲıϴѴֲҺҶȵبభ˺оƸ޾׿׾бIJľƻʻ䷨ŲѯȽռ㰿ʨͰͯӻʬʱȥw]\|\_s*[񎳥]\|\_s*[񥦥]\|\_s*[񤦤]\|\_s*\_s*\_s*\|\_s*\|\_s*\|\_s*\|ϵ\_s*\|\_s*\_s*\|\_s*\|թ\_s*\_s*\|\_s*\|ͥ\_s*\%(\_s*[ɰ]\|\_s*\)\|\_s*\|\_s*²\|\_s*\|ˢ\_s*\|\_s*\_s*[Ƭ]\|\_s*\|\_s*\|\_s*Ǽ\|\_s*\|\_s*\|\_s*\|\_s*\_s*Ļ\_s*\|ø\_s*\%(\|\_s*\_s*\)\|\_s*\%(\|\_s*\)\|\_s*\|\_s*\|\_s*\%(\|\_s*\)\|\_s*\_s*\|̣\_s*\|\_s*\|A\_s*r\_s*i\_s*s\_s*t\_s*o\_s*l\_s*o\_s*c\_s*h\_s*i\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|\_s*\|\_s*\_s*\|\_s*\|\_s*Ϻ\|\_s*\|\_s*[]\|\_s*\%(\|\_s*\_s*\)\|C\_s*u\_s*c\_s*u\_s*r\_s*b\_s*i\_s*t\_s*a\_s*l\_s*e\_s*s\|\_s*\|\_s*\|\_s*\|\_s*ͥ\|\_s*˺\_s*\|\_s*\|\_s*\_s*\|(\_s*\_s*)\|\_s*[]\|\_s*\|\_s*\|\_s*\|\_s*\%(\|\_s*\_s*\|\_s*\_s*\)\|Y\_s*\%(\|\_s*\_s*\|\_s*\_s*\)\|\_s*\_s*\|\_s*\_s*\|\_s*[ͳ]\|\_s*\|\_s*\|\_s*\_s*\_s*٥\_s*\|\_s*\%(\|ʿ\_s*\_s*\_s*\)\|ݿ\_s*\_s*\_s*٥\|\_s*\%(\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\)\|\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\|\_s*\%(\|\_s*\|\_s*\_s*\|\_s*\%(\_s*\|\_s*\_s*\)\)\|\_s*\%(\_s*\|\_s*\_s*\|\_s*\)\|\_s*\_s*\_s*\|\_s*\%(\_s*\%([ץ]\|\_s*\_s*\)\|\_s*\%([]\|\_s*\_s*\_s*\)\)\|\_s*\_s*\|\_s*\%([ࡼ]\|\_s*\_s*\|\_s*\%(\_s*\|\_s*\)\)\|\_s*\%(\_s*[]\|\_s*\|\_s*\%(\_s*\%(\|\_s*\)\|\_s*\%(\|\_s*\|\_s*\|\_s*\%(\_s*\|\_s*\)\)\)\|\_s*\%(\|\_s*[ȥ]\)\)\|\_s*\_s*\_s*\|W\_s*\%(S\|N\_s*N\|y\_s*o\_s*m\_s*i\_s*n\_s*g\|O\_s*W\_s*O\_s*W\|I\_s*\%(D\_s*E\|N\_s*T\_s*E\_s*R\_s*P\_s*(\_s*W\_s*i\_s*d\_s*g\_s*e\_s*t\_s* \_s*I\_s*n\_s*t\_s*e\_s*r\_s*p\_s*r\_s*e\_s*t\_s*e\_s*r\_s*)\)\|i\_s*\%(s\_s*c\_s*o\_s*n\_s*s\_s*i\_s*n\|d\_s*g\_s*e\_s*t\|n\_s*d\_s*o\_s*w\_s*s\)\|h\_s*\%(y\_s* \_s*d\_s*o\_s*n\_s*e\_s* \_s*i\_s*t\_s*?\|o\_s* \_s*d\_s*o\_s*n\_s*e\_s* \_s*i\_s*t\_s*?\)\|E\_s*B\_s*\%(\_s*\_s*\_s*\|\_s*\_s*\_s*\)\|e\_s*\%(s\_s*t\_s* \_s*V\_s*i\_s*r\_s*g\_s*i\_s*n\_s*i\_s*a\|b\_s*\%(\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\|\_s*\%(\_s*\|\_s*\%(\|\_s*\)\)\|\_s*\_s*\)\)\|a\_s*s\_s*h\_s*i\_s*n\_s*g\_s*t\_s*o\_s*n\|A\_s*V\_s*\_s*\_s*\_s*\)\|\_s*\|\_s*\%(\|\_s*\|\_s*\_s*\|\_s*\_s*\)\|\_s*\_s*\_s*\|\_s*\%(\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\|\_s*\%([]\|\_s*\%(\|\_s*\_s*\)\)\|\_s*\%(\_s*\_s*\_s*\|\_s*\_s*\|\_s*\_s*\|\_s*\)\|\_s*\%(\_s*[]\|\_s*\_s*\_s*\|\_s*\|\_s*\%(\_s*\|\_s*\_s*\_s*\)\)\)\|T\_s*\%(h\_s*e\_s* \_s*W\_s*o\_s*r\_s*l\_s*d\_s* \_s*W\_s*i\_s*d\_s*e\_s* \_s*W\_s*e\_s*b\_s* \_s*C\_s*o\_s*n\_s*s\_s*o\_s*r\_s*t\_s*i\_s*u\_s*m\|u\_s*n\_s*g\_s*s\_s*t\_s*e\_s*n\)\|\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\)', + \ 'x' : '\%([Ρߧ禮x]\|\_s*[]\|\_s*[]\|\_s*[]\|\_s*\_s*\%(\_s*\_s*\|\_s*\)\|\_s*\%([]\|\_s*[]\|\_s*\_s*\_s*\|\_s*\_s*\_s*\|\_s*\%(\_s*\_s*\|\_s*\_s*\)\|\_s*\_s*\_s*\_s*\|ü\_s*\)\|X\_s*\%([]\|C\_s*o\_s*n\_s*s\_s*o\_s*r\_s*t\_s*i\_s*u\_s*m\|\_s*[]\|P\_s*S\_s*(\_s*e\_s*X\_s*p\_s*a\_s*n\_s*s\_s*i\_s*o\_s*n\_s* \_s*P\_s*a\_s*s\_s*s\_s*i\_s*n\_s*g\_s* \_s*S\_s*t\_s*y\_s*l\_s*e\_s*)\|S\_s*\_s*\_s*\|l\_s*i\_s*b\|L\_s*\%(i\_s*s\_s*p\|\_s*\_s*\)\|e\_s*n\_s*o\_s*n\)\|\_s*\_s*\|\_s*\%(\_s*\_s*\|\_s*\%(\_s*\_s*\|\_s*\_s*\_s*\)\)\|\_s*\_s*\_s*\|\_s*\%(\|\_s*\_s*\)\|\_s*\%(\_s*\%(\|\_s*\|\_s*\_s*\_s*\)\|\_s*\_s*\|\_s*\_s*\%(\_s*\|\_s*\)\)\|E\_s*x\_s*t\_s*e\_s*n\_s*s\_s*i\_s*b\_s*l\_s*e\_s* \_s*M\_s*a\_s*r\_s*k\_s*u\_s*p\_s* \_s*L\_s*a\_s*n\_s*g\_s*u\_s*a\_s*g\_s*e\|\_s*\%(\_s*\|\_s*\_s*\_s*\_s*\|\_s*\%(\_s*\_s*\|\_s*\_s*\_s*\)\|\_s*\_s*\_s*\|\_s*\%(\|\_s*\%(\_s*\|\_s*\_s*\_s*\|\_s*\_s*\)\)\|\_s*\_s*\_s*\)\|\_s*\%(\_s*\|\_s*\_s*\)\)', + \ 'y' : '\%([ֲغ˩շ޷ڡ崿ڳֻۻþӱٵ㷽İĽ˧ȵۡƫ׫խߡٹβžա䲣ڵЮͿ즷дͽ;ǽ鱻DzƱӽμдİ˭Ƿְ쪾஻ᾲ͸Ͳإ餲ͨͤͱͻ͹Ͱͯʹͼͩͪͧͺͫͭͮ͡ɵͷͳ·͢掲Ǧ׵׶϶̴ߺ̤ӷŲݳͶưȵܦɵ述ڿĹǢ̿θŸ沵żϫĺ׻кغҮͦܡǮʰ˻ްϮסӱ©ĩ߱۱İĽ˻Сݫ׸ԩ۵ີ衰ݻյư׮Iΰ𨱡ֱ޴۩ܰдذŰ1㥴Ū٥Ӱ׳̰Ѧư׺عް۰ȰަͬصԱ߼ܾΨթͣް˵״бְҰٰݰǡý޻ڰ汶ԣϱΰȰڤԧİøҲݰͻϦSϵͥ²۴Тݬٯֳ쮼༽̡ԡաҡӻšץ̰ǫ͵ٰ׵ٹݰǸ鲰Ȭë黦׽ܿߺ֧ߡרYԧy]\|\_s*[֎Վ]\|\_s*[楤]\|\_s*[椤]\|ݿ\_s*\_s*\|\_s*\_s*\|\_s*\|\_s*Ƹ\|\_s*\|\_s*\|4\_s*\%([]\|\_s*\|\_s*\)\|¾\_s*\|\_s*\|δ\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*[Ҹ]\|\_s*\|\_s*\|\_s*[]\|\_s*\|Ī\_s*[Ұ]\|\_s*\|\_s*\|8\_s*\|\_s*\|\_s*\%(\|\_s*\_s*\)\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|ɴ\_s*\|L\_s*i\_s*l\_s*i\_s*\%(o\_s*p\_s*s\_s*i\_s*d\_s*a\|a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\)\|\_s*\%(ͺ\|\_s*\)\|Ĺ\_s*\|\_s*\|\_s*\|\_s*\|E\_s*\%(u\|\_s*\_s*\)\|\_s*\|J\_s*u\_s*\%(l\_s*i\_s*a\_s*n\_s*i\_s*a\_s*l\_s*e\_s*s\|n\_s*c\_s*a\_s*l\_s*e\_s*s\)\|\_s*ë\|\_s*\|ɨ\_s*\|\_s*ϻ\_s*\|\_s*\|\_s*±\|\_s*\_s*\|\_s*ȷ\|β\_s*\|N\_s*a\_s*j\_s*a\_s*d\_s*a\_s*l\_s*e\_s*s\|\_s*ɨ\|\_s*\|\_s*\_s*ƣ\|5\_s*[]\|\_s*[]\|ب\_s*٦\|\_s*\|Ĭ\_s*\|\_s*\|\_s*Ӽ\|\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|ʸ\_s*\|Ϻ\_s*[]\|\_s*\|\_s*[]\|U\_s*\%(\|\_s*\_s*\|r\_s*t\_s*i\_s*c\_s*a\_s*l\_s*e\_s*s\)\|\_s*[Ļ]\|\_s*\|\_s*\%(\_s*\_s*\|\_s*\)\|\_s*[з]\|\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*¹\_s*\|G\_s*\%(r\_s*a\_s*m\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\|l\_s*u\_s*m\_s*i\_s*f\_s*l\_s*o\_s*r\_s*a\_s*e\|i\_s*n\_s*k\_s*g\_s*o\_s*p\_s*s\_s*i\_s*d\_s*a\)\|\_s*\|̵\_s*\_s*\|\_s*\|\_s*\_s*ή\|\_s*[]\|\_s*[]\|\_s*[ڻ]\|\_s*ɽ\|\_s*\_s*[ú]\|\_s*ӧ\|\_s*[]\|\_s*\%([]\|\_s*\)\|\_s*\_s*\|\_s*[ʱ]\|D\_s*i\_s*a\_s*p\_s*e\_s*n\_s*s\_s*i\_s*a\_s*l\_s*e\_s*s\|\_s*[ǡ]\|\_s*\|\_s*ζ\_s*\|ξ\_s*\|ή\_s*ŭ\_s*\|\_s*\|\_s*[]\|R\_s*a\_s*f\_s*f\_s*l\_s*e\_s*s\_s*i\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|\_s*\|\_s*\|\_s*\|ŷ\_s*\|\_s*\|\_s*\_s*\_s*º\|\_s*\|T\_s*\%(h\_s*e\_s*l\_s*i\_s*g\_s*o\_s*n\_s*a\_s*l\_s*e\_s*s\|r\_s*o\_s*c\_s*h\_s*o\_s*d\_s*e\_s*n\_s*d\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\)\|M\_s*y\_s*r\_s*i\_s*c\_s*a\_s*l\_s*e\_s*s\|\_s*\_s*\|\_s*¹\|P\_s*\%(o\_s*a\_s*l\_s*e\_s*s\|l\_s*u\_s*m\_s*b\_s*a\_s*g\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\|a\_s*l\_s*m\_s*a\_s*l\_s*e\_s*s\|r\_s*\%(o\_s*t\_s*e\_s*a\_s*l\_s*e\_s*s\|i\_s*n\_s*c\_s*i\_s*p\_s*e\_s*s\)\)\|A\_s*r\_s*a\_s*c\_s*a\_s*l\_s*e\_s*s\|\_s*\|\_s*[]\|\_s*\%([̼]\|\_s*\_s*\)\|\_s*\%(\_s*\|\_s*\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\|\_s*\)\|\_s*\)', + \ 'z' : '\%([»¸·«­֤±³²¯°¡£¤ȿźǹդظԦƬſݿפƦֺSȼټĶټܿľ㿬ߩ̭顿ױӿпԿҿؿѿտޮԽ쿫ٳа屽ġплЫǡ̼ž߾վڷطèǨ쨽۲ٽμѽƽŽȻޭ߱覽۽ڽ޽޼ߨ潿кߧ尽Ľ½ýƽŻ켢μż༤ϩμͻ֮߾ǻ߻Яб㫰ʻֵ˼ѻʼ緤߷ºֿ껯ܪȻﴻ̻쩻ϻ»߻ͺú޺߳кº鵺¢鶺úä좭اƧ٦z]\|\_s*\%(\_s*\|\_s*\|\_s*\|\_s*\|\_s*\)\|\_s*[]\|\_s*[]\|\_s*\|\_s*\|\_s*\|\_s*[һ]\|\_s*\|\_s*\_s*\|\_s*\|\_s*\|\_s*\|ȯ\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*ˡ\|\_s*\|Ĵ\_s*\|\_s*[᷺]\|\_s*\|\_s*\|F\_s*i\_s*g\_s*u\_s*r\_s*e\|\_s*\|G\_s*\%(\_s*\|\_s*\)\|D\_s*y\|\_s*\%(\_s*\|\_s*\)\|\_s*\|\_s*\|\_s*\|2\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|J\_s*\%(I\_s*S\_s*\_s*\_s*\|\_s*\_s*\|R\_s*\_s*\_s*\)\|\_s*\|\_s*\_s*ʺ\_s*\_s*\_s*\_s*\_s*\_s*\_s*\|k\_s*\$\_s*_\_s*{\_s*e\_s*f\_s*f\_s*}\_s*\$\|\_s*\%(\|\_s*\)\|\_s*\_s*\|\_s*\%(\|\_s*\)\|\_s*ī\|\_s*\|Ƚ\_s*\|ϳ\_s*\|\_s*\|Ĺ\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*\|\_s*\|\_s*\|\_s*Τ\|\_s*[ϴ崽]\|C\_s*a\_s*b\_s*o\_s*m\_s*b\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|\_s*\%(\_s*\_s*\|\_s*\_s*\|\_s*\_s*\_s*\)\|\_s*\|\_s*\|\_s*\%(\|\_s*[ʷ]\|\_s*\|\_s*\|\_s*\)\|\_s*\|\_s*\|ɳ\_s*\|1\_s*\%(0\|1\_s*\|8\_s*\|2\_s*\)\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\|\_s*\_s*\|\_s*\|\_s*\|\_s*\%(\_s*\|\_s*\_s*\_s*\_s*\|\_s*\_s*\)\|Z\_s*\%([r]\|i\_s*\%(r\_s*c\_s*o\_s*n\_s*i\_s*u\_s*m\|n\_s*c\)\|\_s*\_s*\_s*\|\_s*\_s*\_s*\|I\_s*P\_s*\_s*\_s*\_s*\)\|\_s*\%(\_s*\_s*\|\_s*\%(\|\_s*\%(\_s*\|\_s*\)\)\)\|\_s*\%([]\|\_s*\|\_s*\_s*\_s*\)\|\_s*\%(\_s*\%(\_s*\_s*\_s*\_s*\_s*\|\_s*\)\|\_s*\%(\_s*\|\_s*\_s*\_s*\|\_s*\_s*\_s*\)\|\_s*\%(\_s*\_s*\|\_s*\|\_s*\_s*\_s*\|\_s*\%(\_s*\_s*\|\_s*\_s*\_s*\)\|\_s*\_s*\_s*\)\)\|\_s*\%(\_s*\_s*\|\_s*\_s*\_s*\|\_s*\_s*\_s*\%(\|\_s*\)\|\_s*\_s*\_s*\_s*\_s*\|\_s*\_s*\_s*\_s*\_s*\_s*\_s*\)\)', + \ '{' : '[{]', + \ '|' : '[á¨|]', + \ '}' : '[}]', + \ '~' : '[̡~]', + \ } +endfunction diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/EasyMotion/migemo/utf8.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/EasyMotion/migemo/utf8.vim new file mode 100644 index 0000000..71b1f16 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/EasyMotion/migemo/utf8.vim @@ -0,0 +1,97 @@ +function! EasyMotion#migemo#utf8#load_dict() + return { + \ '!' : '\%([≠!!]\|感\_s*嘆\_s*符\)', + \ '"' : '[”″“〃"]', + \ '#' : '[##]', + \ '$' : '[$¢£\$]', + \ '%' : '\%([%‰%]\|パ\_s*ー\_s*セ\_s*ン\_s*ト\)', + \ '&' : '\%([&&]\|ア\_s*ン\_s*\%(ド\|パ\_s*サ\_s*ン\_s*ド\)\)', + \ "'" : '\%([ズ”″‘′´’'']\|ア\_s*ポ\_s*ス\_s*ト\_s*ロ\_s*フ\_s*ィ\)', + \ '(' : '[(〔【『[(]', + \ ')' : '[】』)])]', + \ '*' : '[*×※\*]', + \ '+' : '[±┿╋+┼╂+]', + \ ',' : '[,、,]', + \ '-' : '\%([ー┫┤÷―−━ー‐〜─-]\|マ\_s*イ\_s*ナ\_s*ス\| \_s*…\_s* \)', + \ '.' : '\%([‥。.・…\.]\|ド\_s*ッ\_s*ト\_s*\%(ネ\_s*ッ\_s*ト\|コ\_s*ム\)\)', + \ '/' : '\%([≠÷/\/]\|s\_s*l\_s*a\_s*s\_s*h\_s*d\_s*o\_s*t\|ス\_s*ラ\_s*\%(ド\|ッ\_s*シ\_s*ュ\_s*ド\_s*ッ\_s*ト\)\)', + \ '0' : '\%([〇0零0]\|ゼ\_s*ロ\|z\_s*e\_s*r\_s*o\)', + \ '1' : '\%([十百千GMKhYZEPTnμmcyzdafp壱弌壹一11]\|シ\_s*ッ\_s*ク\_s*ス\_s*テ\_s*ィ\_s*ー\_s*ン\|s\_s*\%(e\_s*v\_s*e\_s*n\_s*t\_s*e\_s*e\_s*n\|i\_s*x\_s*t\_s*e\_s*e\_s*n\)\|ト\_s*ウ\_s*ェ\_s*ル\_s*[ブヴ]\|イ\_s*レ\_s*\%(ブ\_s*ン\|ヴ\_s*ン\)\|ハ\_s*ン\_s*ド\_s*レ\_s*ッ\_s*ド\|サ\_s*\%(ー\_s*テ\_s*ィ\_s*ー\_s*ン\|ウ\_s*ザ\_s*ン\_s*ド\)\|g\_s*i\_s*g\_s*a\|ギ\_s*ガ\|メ\_s*ガ\|k\_s*i\_s*l\_s*o\|キ\_s*ロ\|ヘ\_s*ク\_s*ト\|e\_s*\%(i\_s*g\_s*h\_s*t\_s*e\_s*e\_s*n\|l\_s*e\_s*v\_s*e\_s*n\|x\_s*a\)\|エ\_s*\%(イ\_s*テ\_s*ィ\_s*ー\_s*ン\|ク\_s*サ\)\|ペ\_s*タ\|t\_s*\%(w\_s*e\_s*l\_s*v\_s*e\|h\_s*\%(i\_s*r\_s*t\_s*e\_s*e\_s*n\|o\_s*u\_s*s\_s*a\_s*n\_s*d\)\|e\_s*\%(n\|r\_s*a\)\)\|テ\_s*[ンラ]\|ナ\_s*\%(ノ\|イ\_s*ン\_s*テ\_s*ィ\_s*ー\_s*ン\)\|マ\_s*イ\_s*ク\_s*ロ\|ミ\_s*\%(リ\|ク\_s*ロ\)\|セ\_s*\%(ヴ\_s*ン\_s*テ\_s*ィ\_s*ー\_s*ン\|ブ\_s*ン\_s*テ\_s*ィ\_s*ー\_s*ン\|ン\_s*チ\)\|ヨ\_s*\%(タ\|ク\_s*ト\)\|ゼ\_s*\%(タ\|プ\_s*ト\)\|デ\_s*[カシ]\|ア\_s*ト\|ピ\_s*コ\|フ\_s*\%(ィ\_s*フ\_s*テ\_s*ィ\_s*ー\_s*ン\|ォ\_s*ー\_s*テ\_s*ィ\_s*ー\_s*ン\|ェ\_s*ム\_s*ト\|ァ\_s*ー\_s*ス\_s*ト\)\|ワ\_s*ン\|o\_s*n\_s*e\)', + \ '2' : '\%([弍2二2]\|ト\_s*ウ\_s*ェ\_s*ン\_s*テ\_s*ィ\|セ\_s*カ\_s*ン\_s*ド\|t\_s*w\_s*\%(o\|e\_s*n\_s*t\_s*y\)\|ツ\_s*ー\)', + \ '3' : '\%([三33]\|・\_s*・\_s*・\|★\_s* \_s*★\_s* \_s*★\|サ\_s*ー\_s*\%(ド\|テ\_s*ィ\)\|ス\_s*リ\_s*ー\|t\_s*h\_s*\%(i\_s*r\_s*t\_s*y\|r\_s*e\_s*e\)\)', + \ '4' : '\%([四44]\|f\_s*o\_s*u\_s*r\|フ\_s*ォ\_s*ー\)', + \ '5' : '\%([5五5]\|f\_s*i\_s*\%(f\_s*t\_s*y\|v\_s*e\)\|フ\_s*\%(ィ\_s*フ\_s*\%(ス\|テ\_s*ィ\)\|ァ\_s*イ\_s*ブ\)\)', + \ '6' : '\%([六66]\|s\_s*i\_s*x\|シ\_s*ッ\_s*ク\_s*ス\)', + \ '7' : '\%([7七7]\|セ\_s*ブ\_s*ン\|s\_s*e\_s*v\_s*e\_s*n\)', + \ '8' : '\%([8八8]\|エ\_s*イ\_s*\%([スト]\|テ\_s*ィ\)\|e\_s*i\_s*g\_s*h\_s*t\)', + \ '9' : '\%([九99]\|ナ\_s*イ\_s*ン\|n\_s*i\_s*n\_s*e\)', + \ ':' : '[≒÷…::]', + \ ';' : '[;;]', + \ '<' : '[<<]', + \ '=' : '[〒≒≠〓≡==]', + \ '>' : '[>>]', + \ '?' : '[??]', + \ '@' : '[@@]', + \ 'A' : '\%([ア餅母渉閔恤憐慌遽鰒蚫鮑袷淡∃主衽歩袵垤蟻麁凡塔蘭露著表霰非抗諍検革更改現競爭争洗殿鉱豫予粗嵐禮殺彪恠妖絢怪綺肖彩漢過謝謬誤礼操綾飴菴黯罨鱇鮟餡闇行按諳晏鞍暗鶩鬚鰓顎喘発肋豈嫂兄崇騰県購贖网罔與咫鼎中新邊邉辺恰頭価價値游遊畔畦堋杏梓与衵袙憬孔坑案侮窖強貴讎讐徒仇痣黶欺鮮糾字嘲薊姐姉曙炮焙炙蜚薹膏脂油危鐙虻泡蹟能痕踪跡東預輯蒐乢纂遏聚軋誂羹壓惇集陸敦暑淳篤熱扱暖温遖斡私圧焦汗央奥桜櫻媼奧塰蜑餘周遍普剰蔗余尼雨甘天押凹楝樗溢艶鰺庵網戯簣鯵味軛渥堊圷憧欠踵幄握芥齷厚蜊漁鯏蕣淺麻浅龝煥晢晰呆亮晄聡亨朖璋啓昜輝顯旭光陽洸鑑滉昿曠諦朗哲顕晶彬賈章商穐晃彰晧昭秋欸埃瞹阨穢噫姶文隘粟曖鮎藹饗靉挨間相哀葭趾晨朝愛跛蹇跫脚蘆葦芦桎鐐足赫淦燈赧紅旃朱茜藜銅赭曉閼暁垢皸皹證絳灯暴証赤扇呷黝榮碧葵蒼煽仰青穴併宛亞痾明逢吾悪婀在遭該飫褪浴荒揚編和會椏合襾安挙或當哇有開厭唖韲阿嗚当娃敢倦彼惡遇飽充上擧あ藍金@∧&∩論&∠銀会∀域空→←↓⇒↑⇔⌒後Ц亜米¨´`^’≒〜AÅаαАアΑA]\|厦\_s*門\|廈\_s*門\|沫\_s*雪\|食\_s*蟻\_s*獣\|H\_s*a\_s*l\_s*o\_s*r\_s*a\_s*g\_s*a\_s*l\_s*e\_s*s\|浣\_s*熊\|菖\_s*蒲\|豆\_s*汁\|蛙\_s*鳴\_s*蝉\_s*噪\|塩\_s*梅\|家\_s*鴨\|趺\_s*坐\|Z\_s*\%(n\|i\_s*n\_s*c\)\|浮\_s*子\|痘\_s*痕\|窪\_s*地\|醤\_s*蝦\|糠\_s*蝦\|信\_s*天\_s*翁\|左\_s*沢\|雅\_s*典\|校\_s*倉\|小\_s*豆\|四\_s*阿\|鴉\_s*\%(片\|鷺\_s*合\_s*戦\_s*物\_s*語\)\|綽\_s*名\|渾\_s*名\|化\_s*野\|翌\_s*檜\|飛\_s*[魚鳥]\|総\_s*角\|通\_s*草\|木\_s*通\|L\_s*a\_s*r\_s*d\_s*i\_s*z\_s*a\_s*b\_s*a\_s*l\_s*a\_s*c\_s*e\_s*a\_s*e\|花\_s*鶏\|我\_s*\%(妻\|孫\_s*子\)\|数\_s*多\|奄\_s*美\|灰\_s*汁\|a\_s*\%(t\_s*t\_s*o\|c\_s*c\_s*e\_s*n\_s*t\)\|胡\_s*[座坐床葱]\|日\_s*明\|碩\_s*宏\|祥\_s*[仁彦]\|蜻\_s*蛉\|E\_s*\%(s\|i\_s*n\_s*s\_s*t\_s*e\_s*i\_s*n\_s*i\_s*u\_s*m\)\|生\_s*憎\|匕\_s*首\|英\_s*\%([保田]\|虞\_s*湾\|賀\_s*保\)\|靄\_s*[靄々]\|I\_s*\%(P\_s*電\_s*話\|C\_s*\%(タ\_s*グ\|カ\_s*ー\_s*ド\)\)\|I\_s*\%(r\_s*i\_s*d\_s*a\_s*l\_s*e\_s*s\|P\_s*\%(電\_s*話\|ア\_s*ド\_s*レ\_s*ス\)\|D\_s*カ\_s*ー\_s*ド\|C\_s*\%(タ\_s*グ\|カ\_s*ー\_s*ド\)\)\|走\_s*目\|鹹\_s*草\|馬\_s*酔\_s*木\|海\_s*[豹女士人部驢]\|R\_s*u\_s*b\_s*i\_s*a\_s*\%(l\_s*e\_s*s\|c\_s*e\_s*a\_s*e\)\|褐\_s*毛\_s*和\_s*種\|石\_s*蓴\|白\_s*馬\|水\_s*[馬黽綿]\|M\_s*a\_s*l\_s*v\_s*a\_s*l\_s*e\_s*s\|ト\_s*リ\_s*プ\_s*ル\_s*A\| \_s*ア\_s*ク\_s*シ\_s*ア\_s*ム\|公\_s*理\|砒\_s*素\|ヒ\_s*素\|京\_s*都\_s*高\_s*度\_s*技\_s*術\_s*研\_s*究\_s*所\|代\_s*入\|遺\_s*産\|抽\_s*象\|G\_s*o\_s*l\_s*d\|自\_s*動\_s*\%(現\_s*金\_s*取\_s*り\_s*扱\_s*い\_s*機\|預\_s*貯\_s*金\_s*機\)\|属\_s*性\|何\_s*か\|か\_s*つ\|お\_s*よ\_s*び\|セ\_s*ン\_s*ト\_s*キ\_s*ッ\_s*ツ\_s*ネ\|S\_s*\%(b\|i\_s*l\_s*v\_s*e\_s*r\)\|利\_s*用\_s*可\_s*能\|使\_s*用\_s*可\_s*能\|算\_s*法\|割\_s*り\_s*当\_s*て\|オ\_s*\%(レ\|ギ\_s*ュ\_s*ス\_s*タ\_s*ン\|ド\_s*レ\_s*イ\|ン\_s*グ\_s*ス\_s*ト\_s*ロ\_s*ー\_s*ム\|ル\_s*\%(ト\_s*キ\_s*ー\|タ\_s*\%([ーナ]\|ネ\_s*\%(ー\_s*ト\|イ\_s*ト\)\)\)\|ー\_s*\%([クガサトラル]\|ニ\_s*ン\_s*グ\|キ\_s*シ\_s*ン\|ブ\_s*リ\_s*ー\|バ\_s*ー\_s*ド\|ベ\_s*ル\_s*ジ\_s*ュ\|ギ\_s*ュ\_s*ス\_s*\%(ト\|タ\_s*ン\)\|ゾ\_s*ン\_s*ヌ\|ス\_s*\%(チ\_s*ン\|テ\_s*ィ\_s*ン\|タ\_s*ー\|ト\_s*\%(リ\_s*ア\|ラ\_s*リ\_s*ア\)\)\|ド\_s*リ\_s*ー\|ジ\_s*\%([ェー]\|オ\_s*ロ\_s*ジ\)\|デ\_s*ィ\_s*\%(オ\|エ\_s*ン\_s*ス\|シ\_s*ョ\_s*ン\|ト\_s*リ\_s*ア\_s*ム\)\|タ\_s*ム\|ソ\_s*\%(リ\_s*テ\_s*ィ\|ラ\_s*イ\_s*ズ\)\|セ\_s*ン\_s*テ\_s*ィ\_s*ッ\_s*ク\|ロ\_s*ラ\)\)\|配\_s*列\|バ\_s*イ\_s*ト\|ハ\_s*ル\_s*マ\_s*ゲ\_s*ド\_s*ン\|引\_s*数\|人\_s*工\_s*\%(現\_s*実\_s*感\|知\_s*能\)\|イ\_s*\%(ー\_s*ジ\_s*ス\|オ\_s*ン\|ソ\_s*ッ\_s*プ\)\|マ\_s*ル\_s*ド\_s*ゥ\_s*ー\_s*ク\|紫\_s*\%(陽\_s*花\|水\_s*晶\|石\_s*英\)\|付\_s*録\|応\_s*用\|エ\_s*\%([ニメアーイ]\|ッ\_s*チ\|ン\_s*\%(ド\_s*ラ\_s*ン\|ジ\_s*ェ\_s*\%(ル\|リ\_s*ッ\_s*ク\)\|ゼ\_s*ル\)\|リ\_s*ア\|オ\_s*リ\_s*ア\|ス\_s*テ\|プ\_s*ロ\_s*ン\)\)', + \ 'B' : '\%([鯔鰡堀本凡盆煩梵骨凹歿鈕釦沒渤没睦穆樸目濮攵攴朴木僕墨卜牧星黽蠎髦罔袤鋩氓瑁虻卯茆貌謗网旄抱甍儚胞蟒肪旁鵬牟眸冐鉾蒡榜懋乏惘妨帽昴忙剖冒忘茅膀妄厖尨膨貿防紡滂茫望亡傍某謀乾牡掘姆保慕簿惚模戊墓拇菩謨暮呆干暈姥褒彫坊募誉母ぼ覓幎汨冖羃巾冪紅韈瞥鼈蔑塀汳采抃辯辧卞辨湎宀遍瓣辮眄冕勉娩弁可辺邉邊べ船房笛鞭渊斑淵縁渕樗椈太袋深蓋葢盖豚節勿佛物震勃蚋風鰤馼蚊聞文錻葡侮葺蒲憮舞撲撫廡毋無嘸誣悔奉吹蕪撃部伏打振武歩拭分不ぶ米謐人匹浸額鐚跛!広開繆別謬緡泯罎岷梹旻紊檳頻壜愍瓶鬢閔憫敏貧便闢百辟帛白杪緲猫票憑″鋲屏眇渺平錨苗秒描廟病琵弾未比眉毘尾靡瀰寐微糜媚備引麋美濔弭火枇縻嵋贔日糒び早速林針尿拂腹散払祓原幡悗蠻塙旛鑁旙鷭挽判棒絆版輓蕃板播礬阪坂磐番盤晩萬蛮万箱蠅芒挟伴桴鉢枹蜂撥働畑畠屎糞端花鼻離話V魅許秤拔魃罸筏閥走橋箸柱藐貘寞獏暴漠瀑麥縛博駁莫驀爆杯唄霾賣狽吠楳苺憊培煤黴貝焙賠買売陪倍梅媒跋伐末幕曝抜罰場貼馬刄芭化葉庭羽張這塲罵刃晴歯馳婆ば“仏■□⊥底下×−‖|\∵麦ボバ][}{BブビΒБбβベB]\|ッ\_s*\%(ホ\_s*゙\|ヘ\_s*゙\|フ\_s*゙\|ヒ\_s*゙\|ハ\_s*゙\)\|ッ\_s*[ボベブビバ]\|っ\_s*[ぼべぶびば]\|ホ\_s*゙\|小\_s*火\|襤\_s*褸\|孟\_s*買\|P\_s*a\_s*e\_s*o\_s*n\_s*i\_s*a\_s*\%(l\_s*e\_s*s\|c\_s*e\_s*a\_s*e\)\|南\_s*瓜\|耄\_s*耋\|孑\_s*孑\|包\_s*丁\|ヘ\_s*゙\|袂\_s*別\|箆\_s*棒\|篦\_s*棒\|胼\_s*胝\|フ\_s*゙\|補\_s*任\|毒\_s*島\|醜\_s*[女男]\|山\_s*毛\_s*欅\|F\_s*a\_s*g\_s*a\_s*l\_s*e\_s*s\|布\_s*団\|茯\_s*苓\|V\_s*\%(字\|ネ\_s*ッ\_s*ク\|シ\_s*ネ\_s*マ\)\|附\_s*子\|付\_s*子\|鞦\_s*韆\|豊\_s*[前後]\|ヒ\_s*゙\|魚\_s*[籠篭]\|b\_s*i\_s*o\_s*t\_s*o\_s*p\_s*e\|彌\_s*縫\|弥\_s*[漫縫]\|吃\_s*驚\|天\_s*鵞\_s*絨\|緬\_s*甸\|賓\_s*頭\_s*盧\|編\_s*木\|柏\_s*槙\|S\_s*a\_s*n\_s*t\_s*a\_s*l\_s*a\_s*l\_s*e\_s*s\|兵\_s*[衛法]\|拍\_s*[板子]\|表\_s*紙\|ハ\_s*゙\|囃\_s*子\|巴\_s*爾\_s*幹\|R\_s*o\_s*s\_s*a\_s*l\_s*e\_s*s\|薔\_s*薇\|蟠\_s*踞\|鈑\_s*金\|A\_s*n\_s*n\_s*o\_s*n\_s*a\_s*c\_s*e\_s*a\_s*e\|発\_s*条\|祖\_s*母\_s*さ\_s*ん\|梯\_s*子\|伯\_s*\%([林労楽]\|剌\_s*西\_s*爾\)\|莪\_s*原\|飛\_s*[車蝗]\|蝗\_s*虫\|掲\_s*示\_s*板\|プ\_s*ル\_s*コ\_s*ギ\|作\_s*業\_s*域\|オ\_s*ー\_s*ト\_s*バ\_s*イ\|基\_s*[礎底]\|フ\_s*ァ\_s*ゴ\_s*ッ\_s*ト\|背\_s*景\|北\_s*京\|ペ\_s*\%(キ\_s*ン\|テ\_s*ル\_s*ギ\_s*ウ\_s*ス\)\|臭\_s*素\|イ\_s*ギ\_s*リ\_s*ス\|硼\_s*素\|ホ\_s*ウ\_s*素\)', + \ 'C' : '\%([コ恐怖惟怺※米暦轉頃悃鶤獻艮鯤很袞坤壼琿狠建棍魂蒟菎滾梱溷献痕渾墾恨懇根杪王挙泥裔樸鞐熟枹醴蛩徑蹊径溢毀零錯苔拒亊箏斷判諺理断盡尽辞琴言異事今壽寿鯒冀希礫鯉拱齣狛細腓昆拳瘤鮗兄近谺応應答爰是凩惚榾兀忽輿甑腰拵拗鐺鏝桁杲磽絖昊耗闔狎靠冓汞湟塙慌嫦效頁礦冦淆遘仰昴誥鬨鴿鏗浤哮砿伉烋熕洽訌閧困鮫逅糠槹哽盍稾亙壙覯隍遑洸餃惶寇鵁皋黌椌扣晄矼肓頏蛤呷詬匣昿皐崗肱徨峇袷敲爻藁倥釦棡凰犒吭窖畊岡猴胱絋傚啌蚣缸紘湊搆閤峺羔鍠幌鱇扛肴恆紺鈩絳閘蒙冰氷郡蛟槁候楮媾溘后蝗酵嚆犢稿亢哄睾梗慷笄郊効岬肛項巷鑛洪佼狡叩昂勾喉晃滉糀晧剛曠宏控恍侯皓港膏耿皎坑煌向江膠虹巧鴻鉱興衡浩厚耕弘綱抗購講恒薨溝鋼航孝更校行肯光皇好荒高梏谷哭槲尅釛斛轂詰棘告刻酷穀踰懲蝴鴣袴觚虍粐乎沽餬胯菰瞽楜娘壺錮込葫⌒虚兒杞估冴漕痩虎冱倒戸呱媚粉夸詁木鈷捏濃故濾箍漉黄恋拠誇壷放転鼓股罟女己乕琥跨滬越古去糊滸扈瑚皷混怙弧辜戀蠱超児雇孤湖瓠蛄凅肥こセ芹鬩槧羶甎揃倩翦箋燹濺苫栫槫孱孅簽吮纖湶纎亘筌蟾磚荐茜斬綫箭舩喘錢專僊贍鐫仟旃痊涎銛饌僣韆沾刋擶薦舛牋阡濳癬筅殱殲闡賎餞羨顫甅竰糎陝銓踐閃∨潺遷銑栴剪煽譫僉瞻践栓跣疝詮銭穿尠戰腺繊僭泉嬋淺仙擅鮮専扇浅蘚船線撰宣洗選煎戦尖先忙伜倅逼狹狭蝉旋洩椄§卩渫絏鱈泄攝啜紲緤薛刹褻浙竊截窃殺説拙摂節切蹐績蹠蓆籍跡跖晰威螫迹瘠勣裼晢夕鶺雪寂∫∬碩惜析席隻情甥躋貰淒婿嘶醒睛擠撕牲萋菁犀韲瀞穽齏筬晟齊歳栖棲掣腥逝惺斉臍旌悽整凄靖製晴急世堰攻脊丗迫勢畆糶塞瀬畝せク配椪栩櫪檪椡椚箜櫟含纐婚糞癖潛潜鵠凹窪縊跟軛頚珞頸諄窟鞋履狐轡覆沓碎砕条降件頽崩屑釘莖茎陸杙杭掘崛倔鶏鐃藥擽薬楠誓梳串釧與与挫籖鯀鯨鬮籤隈熊艸嚔藾叢鏈腐鎖ξΞ茸菌楔草圀邦國国嗽漱吻劫刧腔φ粂皹勳熏裙醺桾皸崑燻訓勲葷君委钁企咥銜桑某暝峅眛昏冥鮓比闇位鞍藏暗倉廚厨涅〃仝ヽゞヾ々ゝ公曇雲蜘佝栗狂包胡俥梍枢畔鐵★玄黒玖供苦九枸鳩煦狗来徠吼工絎駒朽眩垢口窶区劬繰呉宮暮貢久嶇來奇9庫惧組衢紅句吁懼區桍孔怐瞿汲くシ埀謐Σσ蕋蘂蕊痺褥茵鵐蔀鷸鴫入責霑蔵嶌了縞嶋島凋搾澀澁渋縛暫屡柴荵凌鎬忍慕簧舖↓襪認从從.舌扱罔θ虐Θ粃秕椎椣貎尿肉臠猪衣榻黙蜆恵楙誠茂成繁鋪惻陣頻閾櫁樒汐鹽潮隰瑟嫉櫛蛭蟋疾隲悉漆躾膝失室沒鎭沈滴雫賤鎮靜静顰尓爾聢乍然併■□◇◆倖幸貭叱征質柵卯滋撓品鬼錣鍜錏凝痼而拉設垂萎栞襞吝咳什導汁徴験著記印☆〇銀城報調蝨虱白濕湿標七僕笞楚霜臀退斥後尻寫卸者炙冩柘舍砂#♯暹諜喋煮這西娑沙謝紗鯱奢赦洒捨鮭瀉炸抉決皙勺釋蜥爍鑠妁斫蹟刳昔芍酌爵折癪笏赤綽灼杓石尺赭写鷓積遮舎車射斜釈社蛛麈諏洙殳娶娵鬚侏銖繻菽叔俶戚蓿倏蹙肅淑夙粛宿縮珠殊趣恤蟀卆出繍楢葺溲泅酬逎遒緝岫螽萩鷲甃駲楸穐蹤讎售讐洲綉收驟囚舅姑蓚皺鞦銹脩輯醜習羞酋聚舟秀祝袖拾啾蒐収執衆愁就臭蹴週終褶州宗集秋椶棕朱撞種修周手酒首須儁皴悛濬惷蕣雋墫順蠢舜旬浚竣峻駿逡筍瞬俊嗔蓁縉蔘鷏忱甄鷆寢岑畛矧疹槙齔臻娠譛譖哂脣袗怎晉瀋箴軫榛秦襯診鉐津駸讖紳斟唇針呻蜃賑芯瞋振殿侵薪晨辰震宸森伸愼眞慎寝晋進審深親臣鍼申心宍信真新藷墅薯杵岨胥蜍黍渚砠處嶼狙苜苴曙背緒雎蔗庶処署所暑誚篠聲橡奬觴舂囁蛸懾燮厰錆獎枩稍甞韶炒淞陞顳咲腫井摺嶂橸浹愴星升鍬樅簫慯廂霎庠剿筱鬆秤鯖政訟廠樵鷦邵愀妝璋湫艢劭峭殤梢將敞醤青慫従逍倡竦爿薔笙樟装肖菖<≦湘誦聳檣稱声裳蒋蕉嘯慴盛精霄清鈔粧彰悚鏘悄蕭哨瀟焦憔匠鍾償鞘瘴漿頌詔妾沼請薑唱庄渉障奨牀娼床椒荘抄聖宵傷性生相召銷賞猩症昭燒猖昌少憧紹晶祥尚承證将焼笑照招消章詳証硝掌商昇小觸穡屬稷嗇禝寔稙昃謖軾矚拭属燭贖囑嘱織蝕式喰蜀殖初諸触埴植食職砥姉摯誣侈髭肆仔及岐址梔咫刺贄沚旨誌資豕鷙凍厮粢齒雌耜枝齎領篩四嗤貲諮巵止死強仕熾市師指厶妛諡祗閇姿駟嗜衰偲嗣趾此染締詞茲釶〆覗弛士徙至嘴駛屎占啻之揣如知錙糸絞孜尸獅瓷緊笥始泗咨觜只匙輜廝使敷恃思痴漬脂氏蚩時紫沁俟絲巳祉矢恣若賜次浸詩志識司弑笶翅謚示梓伺視緇自祠史試私痣滲茨肢歯幟祀施竢舐卮耆呰芝阯しカ癢糜粥痒麹輕骨業軽鰈鰔餉通龜瓶甕亀鳫獵鴈殯K猟雁釀鳬鳧髢氈鴨巛側躱廁厠磧瓦獺翡為皮裘→紮〜搦苧碓柄躯躰軆體身体鴉犂烏絡空唐榧茅澗鸛厂蒄啣卷淦扞杆骭歛瞰讙奐戡豢坎瀚皖稈鐶拑酣陷繝嫺驩篏樌莟勸捍撼澣盥羹嫻鑵寰丱康懽憾羮揀歡潤罕觀橄涵渙堪覡巫鉋随萱簪舘艱咸翰柬駻悍燗槓浣邯攷稽宦考棺潅閂煥鉗疳癇函凾鹹緘款桓箝諫諌轗坩旱侃鰥 館莞橇韓患灌勧菅奸刊柑肝看桿寒緩干嵌廣広竿貫巻敢漢環喊陥監喚甘間歓閑寛管慣完汗艦乾幹官観壁椛屍姓庇鞄芳蔓千鯑一勘蜻⊃影陰蔭景*棧梯筧庚辛柧門廉乞癩Κ川κ合’)《‘”{〈“}》〉囓柁鮖悴舵鰍梶錺餝飾篭籠歸孵卻皈還省顧楓槭却帰反返守帋督祇髮韮主裃雷髪紙鉦曲矩予鐘樺沫偏騙語潟刀象模仇固硬傍難容忝辱頑形旁方型肩風滓翳微幽掠緕纃綛絣擦糟鎹粕春戞猾曷剋黠瞎鞨恰∧濶蠍筈蝎羯喝轄餓蛞聒劼擔刮蘰鬘桂闊括嘗捷豁渇担滑松堅鰹功割戛活疽暈鵲瘡傘嵩重襲葛笠堵硴墻牆蠣蛎柿掲關罹抱踵嬶嚊拘関係顏貌郁薫顔母感釡罐窰鴎框叺喧竃竈窯釜缶蒲鎌數数槝栢膳傅畏賢橿姦樫爨炊圍喞託囲鈎「『鉤」』限鍵傾(禿蕪鏑頭齧被兜哉適敵必要称彜彝鬲鼎叶片哀愛悲鋺蛇鉄蜩神奏金楫裹磆餅徒褐粮糧茖椁覺幗槨貉擴壑隱愨寉殼癨嚇穫咯膕骼膈∠掴狢埆蠖覈霍礁恪擱匿撹攪喀廓較郭〕【[】]〔殻挌劃閣格隠覚矍革馘鶴攫核獲拡客隔角確廨囘隗嵬觧榿蠏匯徊迴壞褂獪丐械枴畍誨揩醢誡夬懈喙椢恠峡价櫂茴蛙瑰乖浬鰄傀糴柏街鳰懷蛔蠶蚕邂蟹潰壊恢腕芥垣楷會拐悔詼諧皆界疥魁偕改繪貝胛絵快甲灰槐晦懐介塊解廻回階戒開会怪海縢篝炬耀赫輝冠鑒鑑各屈鏡柯噛箇上苛暇蚊廈易嘩ヵ描苅枯佳彼兼哥缺霞藉架啝下渦踝堝闕華嗄荷馨刈假夥河科個蝸迦軻咼黴舸繋書賀夏萪支卦掛掻蝦痂謌渮歌過香禾狩買變家枷克駈花賈畫珂呵替代訶袈咬画顆貸價淅飼和ヶ果糅厦課可醸葭勝仮搗嘉墟嗅譌日斯禍換窩苟貨蝌価懸欠化罅伽賭翔靴且嚼訛何駆驅个嫁譁借跏戈稼寡涸耶崋鹿笳火茄菓遐舁か・…塩閉倶錫呼∩取籐加交ФГДАжБъйдзьЖНкёЗрЭцУТвСЮюЪЯЁЛИноыбВмМХЬЕэаепПКЩсШщяхЫштОРилгуЙф♪╂┼×╋┿◎○●銅∪χΧ子Чч株Ц珈、,色ク衝競構簡制≡変接カ┏┓└┌┛┘┗┐正コシセC℃¢C]\|ッ\_s*[コセクシカ]\|ッ\_s*[コセクシカ]\|っ\_s*[子こせくしか]\|焜\_s*炉\|嫡\_s*妻\|二\_s*合\_s*半\|牛\_s*尾\_s*魚\|巨\_s*勢\|独\_s*楽\|居\_s*士\|特\_s*牛\|粫\_s*門\|甦\_s*生\|f\_s*o\_s*o\_s*t\_s* \_s*a\_s*n\_s*d\_s* \_s*m\_s*o\_s*u\_s*s\_s*e\_s* \_s*d\_s*i\_s*s\_s*e\_s*a\_s*s\_s*e\|傴\_s*僂\|A\_s*\%(r\_s*c\_s*h\_s*i\_s*c\_s*h\_s*l\_s*a\_s*m\_s*y\_s*d\_s*e\_s*a\_s*e\|p\_s*i\_s*a\_s*l\_s*e\_s*s\)\|U\_s*m\_s*b\_s*e\_s*l\_s*l\_s*i\_s*f\_s*l\_s*o\_s*r\_s*a\_s*e\|台\_s*詞\|懺\_s*法\|前\_s*[妻栽]\|妹\_s*尾\|嘲\_s*笑\|儕\_s*輩\|斎\_s*次\|済\_s*[民済々]\|蒸\_s*[篭籠]\|救\_s*世\|莎\_s*草\|百\_s*[濟済]\|恭\_s*敬\|9\_s*[日月]\|秧\_s*鶏\|究\_s*竟\|釉\_s*掛\|典\_s*薬\_s*寮\|探\_s*湯\|球\_s*磨\|六\_s*合\|地\_s*祇\|都\_s*子\|群\_s*衆\|慈\_s*姑\|旧\_s*\%(訳\|唐\_s*書\)\|内\_s*蔵\_s*助\|H\_s*e\_s*l\_s*l\_s*e\_s*b\_s*o\_s*r\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|J\_s*u\_s*g\_s*l\_s*a\_s*n\_s*d\_s*a\_s*l\_s*e\_s*s\|R\_s*h\_s*a\_s*m\_s*n\_s*a\_s*l\_s*e\_s*s\|老\_s*舗\|望\_s*潮\|健\_s*か\|L\_s*a\_s*\%(u\_s*r\_s*\%(a\_s*c\_s*e\_s*a\_s*e\|o\_s*i\_s*d\_s*e\_s*a\_s*e\)\|m\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\|b\_s*i\_s*a\_s*t\_s*a\_s*e\)\|埋\_s*葬\_s*虫\|幣\_s*原\|卓\_s*袱\|桎\_s*梏\|柳\_s*葉\_s*魚\|汚\_s*点\|蠹\_s*魚\|惠\_s*雄\|舗\_s*石\|磯\_s*城\|W\_s*i\_s*n\_s*t\_s*e\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\|倭\_s*文\|云\_s*[云々]\|明\_s*\%(々\_s*後\_s*日\|明\_s*後\_s*日\)\|7\_s*月\|7\_s*月\|文\_s*月\|4\_s*[分月]\|4\_s*月\|竹\_s*[篦刀]\|羊\_s*[齒歯]\|爲\_s*\%([留難置果送極手兼合業]\|ん\_s*方\|來\_s*り\|納\_s*め\)\|I\_s*\%(l\_s*l\_s*i\_s*c\_s*i\_s*a\_s*c\_s*e\_s*a\_s*e\|s\_s*o\_s*p\_s*y\_s*r\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\)\|素\_s*[魚人面]\|不\_s*[忍知]\|注\_s*連\|軍\_s*鶏\|髑\_s*髏\|三\_s*\%(味\|鞭\_s*酒\)\|吃\_s*逆\|差\_s*[別異]\|叉\_s*手\|輸\_s*[出贏]\|卒\_s*去\|B\_s*r\|隼\_s*[朗郎]\|笋\_s*[干羹]\|参\_s*差\|財\_s*産\|枌\_s*所\|縦\_s*容\|睫\_s*毛\|M\_s*\%(e\_s*t\_s*a\_s*c\_s*h\_s*l\_s*a\_s*m\_s*y\_s*d\_s*e\_s*a\_s*e\|u\_s*s\_s*a\_s*l\_s*e\_s*s\)\|S\_s*\%([ge]\|p\_s*e\_s*r\_s*m\_s*a\_s*t\_s*o\_s*p\_s*h\_s*y\_s*t\_s*a\|c\_s*i\_s*t\_s*a\_s*m\_s*i\_s*n\_s*e\_s*a\_s*e\)\|Z\_s*i\_s*n\_s*g\_s*i\_s*b\_s*e\_s*r\_s*a\_s*l\_s*e\_s*s\|続\_s*\%(日\_s*本\_s*\%(紀\|後\_s*紀\)\|後\_s*撰\_s*和\_s*歌\_s*集\)\|離\_s*れ\_s*離\_s*れ\|掃\_s*部\|羚\_s*羊\|土\_s*器\|蝙\_s*蝠\|魚\_s*狗\|P\_s*\%(i\_s*p\_s*e\_s*r\_s*a\_s*\%(l\_s*e\_s*s\|c\_s*e\_s*a\_s*e\)\|t\_s*e\_s*r\_s*i\_s*d\_s*o\_s*s\_s*p\_s*e\_s*r\_s*m\_s*\%(a\_s*l\_s*e\_s*s\|i\_s*d\_s*a\_s*e\)\|o\_s*\%(t\_s*a\_s*s\_s*s\_s*i\_s*u\_s*m\|d\_s*o\_s*s\_s*t\_s*e\_s*m\_s*o\_s*n\_s*a\_s*l\_s*e\_s*s\)\)\|連\_s*枷\|枳\_s*殻\|機\_s*関\|落\_s*葉\_s*松\|凵\_s*繞\|檻\_s*車\|顴\_s*骨\|T\_s*\%(h\_s*a\_s*l\_s*i\_s*c\_s*t\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|u\_s*b\_s*i\_s*f\_s*l\_s*o\_s*r\_s*a\_s*e\)\|南\_s*瓜\|量\_s*子\|山\_s*\%(海\_s*経\|梔\_s*子\|陽\_s*道\)\|蜉\_s*蝣\|陽\_s*炎\|破\_s*片\|脚\_s*気\|旗\_s*魚\|鍛\_s*[治冶]\|挿\_s*頭\|駕\_s*\%(籠\|輿\_s*丁\)\|長\_s*[月官]\|剃\_s*刀\|天\_s*\%(牛\|鼠\_s*矢\)\|帷\_s*子\|酢\_s*漿\_s*草\|O\_s*x\_s*a\_s*l\_s*i\_s*d\_s*a\_s*c\_s*e\_s*a\_s*e\|飛\_s*[沫白]\|曽\_s*て\|曾\_s*て\|燕\_s*子\_s*花\|牡\_s*[蛎蠣]\|民\_s*部\|部\_s*曲\|E\_s*\%(b\_s*e\_s*n\_s*a\_s*l\_s*e\_s*s\|l\_s*a\_s*n\_s*a\_s*l\_s*e\_s*s\)\|案\_s*山\_s*子\|梭\_s*\%(魚\|子\_s*魚\)\|螳\_s*螂\|蟷\_s*螂\|瓜\_s*\%(田\|呂\_s*根\)\|拍\_s*手\|瑕\_s*[瑾疵]\|東\_s*\%([風雲]\|海\_s*林\|京\_s*都\_s*立\_s*科\_s*学\_s*技\_s*術\_s*大\_s*学\)\|気\_s*[質触]\|(\_s*株\_s*)\|贏\_s*ち\_s*得\|歩\_s*兵\|恁\_s*く\|杜\_s*\%(若\|父\_s*魚\)\|梅\_s*花\_s*皮\|頴\_s*田\|膾\_s*炙\|契\_s*経\|中\_s*央\_s*処\_s*理\_s*装\_s*置\|伊\_s*藤\_s*忠\_s*テ\_s*ク\_s*ノ\_s*サ\_s*イ\_s*エ\_s*ン\_s*ス\|分\_s*類\|ス\_s*リ\_s*ー\_s*ズ\|範\_s*疇\|ト\_s*ラ\_s*ン\_s*プ\|c\_s*\%(e\_s*n\_s*t\_s*i\|r\_s*e\_s*s\_s*c\)\|水\_s*[鶏母手夫晶]\|複\_s*雑\_s*命\_s*令\_s*セ\_s*ッ\_s*ト\_s*計\_s*算\_s*機\|サ\_s*\%(ン\_s*チ\_s*ー\_s*ム\|エ\_s*ラ\|イ\_s*\%(ト\_s*カ\_s*イ\_s*ン\|ラ\_s*ス\|ク\_s*\%([ルロ]\|リ\_s*\%(ン\|ッ\_s*ク\)\)\|ボ\_s*\%(ウ\_s*ズ\|ー\_s*グ\)\|バ\_s*\%(ー\|ネ\_s*テ\_s*ィ\_s*\%(ッ\_s*ク\|ク\_s*ス\)\)\|リ\_s*ュ\_s*ー\_s*ム\|ダ\_s*ー\|フ\_s*ァ\_s*ー\|ネ\_s*リ\_s*ア\)\|ー\_s*\%(テ\_s*ィ\_s*フ\_s*ィ\_s*ケ\_s*ー\_s*シ\_s*ョ\_s*ン\|ク\_s*ル\|カ\_s*\%(ス\|ム\_s*ス\_s*ク\_s*\%(ラ\_s*イ\_s*ブ\|リ\_s*プ\_s*シ\_s*ョ\_s*ン\)\)\|キ\_s*\%(ュ\_s*\%(ラ\_s*ー\|レ\_s*ー\_s*\%(タ\_s*ー\|シ\_s*ョ\_s*ン\)\)\|ッ\_s*ト\)\)\)\|マ\_s*ド\_s*ラ\_s*ス\|茶\_s*筅\|ケ\_s*\%([月アイ]\|フ\_s*ェ\_s*ウ\_s*ス\|プ\_s*ス\_s*ト\_s*ラ\_s*[ムル]\|チ\_s*ャ\_s*ッ\_s*プ\|ン\_s*\%(タ\_s*ウ\_s*\%(リ\|ロ\_s*ス\)\|ブ\_s*リ\_s*ッ\_s*ジ\)\|ー\_s*\%([キジブプスン]\|ク\_s*ウ\_s*ォ\_s*ー\_s*ク\|ソ\_s*ン\|タ\_s*リ\_s*ン\_s*グ\|パ\_s*\%(ー\|ビ\_s*リ\_s*テ\_s*ィ\)\|シ\_s*ン\_s*グ\|リ\_s*ー\)\|ル\_s*\%(ト\|ベ\_s*ロ\_s*ス\|テ\_s*ィ\_s*ッ\_s*ク\|ビ\_s*\%(ム\|ー\_s*ニ\)\)\|ミ\_s*\%(カ\_s*ル\|ス\_s*ト\)\)\|キ\_s*\%(ヤ\_s*ノ\_s*ン\|プ\_s*ロ\_s*ス\|ケ\_s*ロ\|ュ\_s*\%([イーア]\|ヴ\_s*ェ\|ビ\_s*\%(ズ\_s*ム\|ス\_s*ム\)\|ロ\_s*\%(ス\|ッ\_s*ト\)\|レ\_s*ー\_s*タ\_s*ー\|ラ\_s*ソ\_s*ー\|リ\_s*\%(ー\|ウ\_s*ム\|ア\_s*ス\|オ\_s*シ\_s*テ\_s*ィ\)\)\|ア\_s*\%(ラ\|ー\_s*ラ\|ン\_s*テ\_s*ィ\)\|チ\_s*ン\|ト\_s*サ\_s*ン\|メ\_s*ラ\|マ\_s*イ\_s*ラ\|ッ\_s*カ\|レ\_s*ー\_s*ト\|ャ\_s*\%([ドパスブンラ]\|デ\_s*\%(ィ\|ラ\_s*ッ\_s*ク\)\|ビ\_s*\%([アンネ]\|テ\_s*\%(ィ\|ー\_s*シ\_s*ョ\_s*ン\)\)\|ベ\_s*ツ\|バ\_s*\%(リ\_s*[エア]\|レ\_s*ー\)\|ト\_s*ル\|シ\_s*ー\|サ\_s*リ\_s*ン\|タ\_s*ピ\_s*ラ\|ピ\_s*\%(ト\_s*ル\|タ\_s*\%(ル\|リ\_s*ズ\_s*ム\)\)\|プ\_s*\%(ラ\|シ\_s*ョ\_s*ン\|テ\_s*ン\|チ\_s*ャ\)\|セ\_s*\%(イ\|ロ\_s*ー\_s*ル\)\|ッ\_s*\%([ツトチプ]\|サ\_s*バ\|ス\_s*ル\|シ\_s*\%(ュ\|ン\_s*グ\|ャ\_s*\%(ー\|ブ\_s*ル\)\)\)\|ニ\_s*\%(オ\_s*ン\|ス\_s*タ\_s*ー\)\|ナ\_s*ル\|ノ\_s*\%(ン\|ー\_s*ラ\|ピ\_s*ー\)\|ミ\_s*ソ\_s*ー\_s*ル\|メ\_s*\%(ル\|ロ\_s*\%(ン\|ッ\_s*ト\)\)\|ロ\_s*\%(ル\|ウ\_s*ェ\_s*イ\|リ\_s*ン\|ラ\_s*イ\_s*[ンナ]\|ッ\_s*ト\)\|レ\_s*ッ\_s*ト\|リ\_s*\%([コーア]\|バ\_s*ー\|ブ\_s*レ\_s*ー\_s*シ\_s*ョ\_s*ン\|ッ\_s*ジ\|ン\_s*グ\)\|ズ\_s*ム\)\|リ\_s*\%(コ\|ス\_s*ト\|シ\_s*タ\_s*ン\)\)\|総\_s*角\|チ\_s*\%([タリンマア]\|ワ\_s*ワ\|ラ\_s*ー\|ル\_s*ド\|ム\_s*ニ\_s*ー\|コ\_s*リ\|ッ\_s*\%([プク]\|テ\_s*リ\_s*オ\|タ\_s*ゴ\_s*ン\)\|キ\_s*\%(ン\|ー\_s*タ\)\|ュ\_s*\%(ア\_s*ブ\_s*ル\|ー\_s*イ\_s*ン\_s*ガ\_s*ム\)\|ー\_s*\%([フトプクズ]\|パ\_s*ー\|タ\_s*ー\)\|ェ\_s*\%([ロスカコアン]\|ザ\_s*\%(レ\|ー\_s*レ\)\|ル\_s*\%(ニ\_s*ー\|シ\_s*ー\|ノ\_s*ブ\_s*イ\_s*リ\)\|リ\_s*\%(ー\|ス\_s*ト\|ッ\_s*シ\_s*ュ\|モ\_s*ヤ\)\|レ\_s*\%(ス\_s*タ\|ン\_s*コ\_s*フ\)\|ビ\_s*チ\_s*ェ\_s*フ\|ダ\_s*ー\|チ\_s*ェ\_s*ン\|ッ\_s*\%([トクカ]\|キ\_s*ン\_s*グ\)\|イ\_s*\%([スン]\|ニ\_s*ー\|サ\_s*ー\|シ\_s*ン\_s*グ\)\|ー\_s*\%(ン\|ザ\_s*レ\|ホ\_s*フ\)\)\|ャ\_s*\%([オフドインコリウ]\|ツ\_s*ネ\|ク\_s*ラ\|プ\_s*タ\_s*ー\|パ\_s*テ\_s*ィ\|ペ\_s*\%(ル\|ッ\_s*ク\)\|チ\_s*ャ\|ネ\_s*\%(ル\|ラ\_s*ー\|リ\_s*ン\_s*グ\)\|ッ\_s*\%([クト]\|ピ\_s*ー\|プ\_s*\%(マ\_s*ン\|リ\_s*ン\)\)\|タ\_s*\%(レ\_s*[イー]\|リ\_s*ン\_s*グ\)\|ル\_s*マ\_s*ー\_s*ス\|レ\_s*ン\_s*ジ\|モ\_s*ロ\|ー\_s*\%([チタトムジ]\|ビ\_s*ル\|ミ\_s*\%(ー\|ン\_s*グ\)\|リ\_s*ー\|ル\_s*\%([ズス]\|ト\_s*ン\)\)\|ラ\_s*ン\_s*ゴ\)\|ョ\_s*\%([ンコ]\|イ\_s*ス\|ム\_s*ス\_s*キ\_s*ー\|ー\_s*\%(ク\|サ\_s*ー\|カ\_s*ー\|キ\_s*ン\_s*グ\)\|ゴ\_s*リ\|ッ\_s*\%(プ\|ピ\_s*ー\|パ\_s*ー\)\|リ\_s*ソ\)\)\|座\_s*標\|喜\_s*劇\|互\_s*換\|共\_s*\%(通\|産\_s*主\_s*義\_s*者\)\|継\_s*続\|ツ\_s*\%(ァ\_s*ー\|ィ\_s*リ\_s*ル\|ェ\_s*\%(ー\|ル\_s*ニ\_s*ー\|ラ\_s*ン\)\)\|炭\_s*素\)', + \ 'D' : '\%([共吃巴錚鑼鶏鳥響嫩緞丼呑曇貪鈍肭遠蚌溝隣鄰塢床処所年時鯲鰍鰌讀得徳獨髑毒読僮萄鐃耨嫐橈儂撓陶働ゞ桐通閙藤々恫瞳憧鬧≡⇔慟撞導仝〃洞堂瞠獰艟胴銅童動同道堵戸奴退取呶解怒土駑留努録何止度弩融孥ど瓰竕凸竍籵瓧禰泥捏溺寺棯甸黏沺佃鈿畋淀澱臀傳殿電照でヅ鶴辛強妻綱勤伝筒包做造作尽机月塚遣冢疲使連付突積吊詰漬津図釣づヂ中近力痔持地ぢ種棚倒彩濃逹畳諾゛濁默球玉魂騙谷点館舘竹嶽岳高凧蛸怛妲獺奪脱梯餒迺岱廼戴弟臺平内醍橙][題>≧第台代大鱈頼便誰懶樽怠斷椴灘黙旦煖彈暖談段断檀団團壇弾男柁舵駄雫娜橢拏朶蛇墮拿佗垂沱溜懦楕炊鴕陀儺唾騨澑建荼立田惰抱陏駝打兌妥堕出だ直◎,丶、.\.‥・…$”“↓†‡―┤達℃°独Dド÷◇◆ダジДдΔδデ∂D]\|ッ\_s*\%(ト\_s*゙\|テ\_s*゙\|ツ\_s*゙\|チ\_s*゙\|タ\_s*゙\)\|ッ\_s*[ドデヅヂダ]\|っ\_s*[どでづぢだ]\|ト\_s*゙\|都\_s*々\_s*逸\|褞\_s*袍\|S\_s*a\_s*u\_s*r\_s*u\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\|C\_s*\%(u\|o\_s*p\_s*p\_s*e\_s*r\)\|満\_s*天\_s*星\|豆\_s*腐\|如\_s*何\|テ\_s*゙\|刑\_s*事\|粘\_s*葉\_s*装\|手\_s*間\|木\_s*偶\|丁\_s*[稚抹]\|蝸\_s*牛\|ツ\_s*゙\|頭\_s*[腦痛]\|チ\_s*゙\|調\_s*子\|茶\_s*碗\|知\_s*恵\|忸\_s*怩\|タ\_s*゙\|忠\_s*幸\|壁\_s*蝨\|伊\_s*達\|山\_s*車\|韃\_s*靼\|提\_s*婆\_s*達\_s*多\|太\_s*\%([刀宰鼓]\|平\_s*広\|上\_s*天\_s*皇\|政\_s*\%(官\|大\_s*臣\)\)\|乃\_s*[公毅]\|体\_s*操\|葮\_s*竹\|演\_s*\%(し\_s*物\|繹\_s*デ\_s*ー\_s*タ\_s*ベ\_s*ー\_s*ス\)\|コ\_s*ロ\_s*ン\_s*ビ\_s*ア\|ズ\_s*\%(ロ\_s*ー\_s*ス\|ッ\_s*ク\)\|イ\_s*ル\_s*カ\|医\_s*者\|博\_s*士\|文\_s*書\|行\_s*列\_s*式\|発\_s*見\_s*す\_s*る\|ハ\_s*ー\_s*グ\|拒\_s*否\_s*さ\_s*れ\_s*た\|破\_s*壊\_s*\%(者\|す\_s*る\)\|消\_s*滅\_s*子\|記\_s*述\_s*子\|十\_s*進\_s*数\|ゼ\_s*ッ\_s*ケ\_s*ン\|復\_s*号\_s*化\|省\_s*略\|金\_s*剛\_s*石\|d\_s*\%(b\_s*m\_s*s\|e\_s*c\_s*\%([ia]\|r\_s*e\_s*s\)\|o\_s*u\_s*b\_s*l\_s*e\_s* \_s*i\_s*n\_s*c\_s*o\_s*m\_s*e\_s*,\_s* \_s*n\_s*o\_s* \_s*k\_s*i\_s*d\_s*s\|i\_s*m\)\|辞\_s*書\)', + \ 'E' : '\%([エ瘧腮偉鰓衿撰襟魘捐覃櫞湲檐薗篶¥渕鹽簷轅悁渊讌艷黶垣閼圜蜒爰掾媛鳶鴛焉宛嫣閻衍臙閹槐⌒援筵淹厭寃淵掩烟嚥圓沿宴蜿奄袁煙艶焔炎怨鉛園苑偃冤延婉遠堰燕演塩円縁刔刳抉猿狗描択鰕箙蛯蝦狄貊胡戎夷乢靨鉞戉粤咽噎桟悦閲謁亦繹伯懌掖蜴奕越役驛疫易益腋駅液咏瓔珱曵衡殪贏裔洩楹娃潁蠑瑩翳纓塋營頴瀛睿泳縊榮瑛暎曳盈郢影詠穎嬰鋭叡映営栄永枝会選衣依榎繪囘懷画絵衛會畫猥回恵獲惠慧衞荏重得餌江杖笑柄え━─┳┬┰┯┸┻┴┷фФ=≡⇔∋∈РрмМН→英∃式!ηΗEсСЛлεЭэエΕE]\|A\_s*\%([面判型級]\|V\_s*\%(機\_s*器\|女\_s*優\)\|B\_s*\%(型\|C\_s*順\)\)\|A\_s*\%([面判型級]\|V\_s*\%(機\_s*器\|女\_s*優\)\|B\_s*型\)\|M\_s*サ\_s*イ\_s*ズ\|M\_s*サ\_s*イ\_s*ズ\|豪\_s*物\|L\_s*\%(サ\_s*イ\_s*ズ\|L\_s*サ\_s*イ\_s*ズ\)\|L\_s*\%(サ\_s*イ\_s*ズ\|L\_s*\%(サ\_s*イ\_s*ズ\|教\_s*室\)\)\|羨\_s*道\|豌\_s*豆\|C\_s*\%(l\|h\_s*l\_s*o\_s*r\_s*i\_s*n\_s*e\)\|似\_s*\%(非\|而\_s*非\)\|桧\_s*原\_s*湖\|烏\_s*帽\_s*子\|吉\_s*方\|胞\_s*衣\|淮\_s*南\_s*子\|埃\_s*及\|干\_s*支\|岐\_s*路\|支\_s*繞\|壊\_s*[疽死]\|葡\_s*萄\|蛭\_s*子\|愛\_s*\%([莉理媛]\|知\_s*川\)\|N\_s*極\|N\_s*\%([個極響]\|次\_s*元\|角\_s*形\|H\_s*K\_s*ホ\_s*ー\_s*ル\)\|斉\_s*魚\|兄\_s*鼓\|ヱ\_s*ス\_s*ビ\_s*ー\_s*食\_s*品\|S\_s*\%([式極]\|サ\_s*イ\_s*ズ\|N\_s*比\|F\_s*小\_s*説\)\|S\_s*\%([波字席極]\|サ\_s*イ\_s*ズ\|N\_s*比\|F\_s*小\_s*説\)\|穢\_s*[多土]\|X\_s*\%([軸脚線]\|染\_s*色\_s*体\)\|X\_s*\%([軸脚]\|O\_s*醤\|染\_s*色\_s*体\)\|海\_s*\%(老\|鷂\_s*魚\)\|帝\_s*都\_s*高\_s*速\_s*度\_s*交\_s*通\_s*営\_s*団\|ワ\_s*ー\_s*ク\_s*ス\_s*テ\_s*ー\_s*シ\_s*ョ\_s*ン\|欧\_s*\%(州\|羅\_s*巴\)\|歐\_s*\%(州\|羅\_s*巴\)\|ヨ\_s*ー\_s*ロ\_s*\%(ピ\_s*ア\_s*ン\|ッ\_s*パ\)\|ユ\_s*\%(ア\_s*ン\|ウ\_s*ロ\_s*ピ\_s*ウ\_s*ム\|リ\_s*イ\_s*カ\|ー\_s*\%(ロ\|ノ\_s*ス\|ニ\_s*ス\|ジ\_s*\%(ン\|ー\_s*ン\)\|ド\_s*ラ\|レ\_s*カ\|ラ\_s*\%(ス\|シ\_s*ア\)\|フ\_s*\%(ラ\_s*テ\_s*ス\|ォ\_s*\%(リ\_s*ア\|ニ\_s*ア\_s*ム\)\)\|ク\_s*リ\_s*ッ\_s*ド\|カ\_s*リ\)\)\|編\_s*集\|強\_s*調\|e\_s*m\_s*a\_s*c\_s*s\|電\_s*子\_s*メ\_s*\%(ー\_s*ル\|イ\_s*ル\)\|発\_s*展\|評\_s*価\_s*す\_s*る\|符\_s*号\_s*化\|百\_s*科\_s*事\_s*典\|カ\_s*プ\_s*セ\_s*ル\_s*化\|オ\_s*\%(ー\|イ\_s*\%(ラ\_s*ー\|ゲ\_s*ン\)\)\|実\_s*行\|拡\_s*張\|例\_s*外\|感\_s*嘆\_s*符\|ア\_s*\%([ンイ]\|ニ\_s*ド\|ー\_s*\%([マスル]\|ウ\_s*ィ\_s*ン\|ラ\_s*ン\|ニ\_s*ー\|ネ\_s*ス\_s*ト\|ミ\_s*ン\|シ\_s*ー\|リ\_s*ー\)\)\|設\_s*立\|e\_s*\%(x\_s*a\|コ\_s*マ\_s*ー\_s*ス\|ラ\_s*ー\_s*ニ\_s*ン\_s*グ\)\|イ\_s*\%([ブヴアラー]\|ジ\_s*ェ\_s*ク\_s*ト\|フ\_s*ェ\_s*ク\_s*[トタ]\|コ\_s*\%(ー\_s*ル\|ラ\_s*イ\_s*[ズザ]\)\|プ\_s*シ\_s*ロ\_s*ン\|ミ\_s*ュ\_s*レ\_s*\%(ー\_s*[トタ]\|イ\_s*タ\)\|ベ\_s*ン\_s*\%(ト\|タ\_s*ー\)\|ノ\_s*ッ\_s*ク\|ネ\_s*ー\_s*ブ\_s*ル\|ギ\_s*リ\_s*ス\|ン\_s*グ\_s*\%(ラ\_s*ン\_s*ド\|リ\_s*ッ\_s*シ\_s*ュ\)\|ッ\_s*チ\|ヤ\_s*\%(ー\|リ\_s*ン\_s*グ\|フ\_s*ォ\_s*ン\|ホ\_s*ン\)\|グ\_s*ジ\_s*\%(ッ\_s*ト\|ス\_s*ト\)\|ク\_s*\%(ス\|ア\_s*リ\_s*テ\_s*ィ\)\|ス\_s*フ\_s*ァ\_s*ハ\_s*ン\|リ\_s*[アヤ]\|レ\_s*\%(ー\_s*\%(ス\|ザ\_s*ー\|サ\_s*ー\)\|イ\_s*\%(ン\|ザ\_s*ー\|サ\_s*ー\)\|ブ\_s*ン\)\)\|ウ\_s*\%(ー\|ジ\_s*ェ\_s*ー\_s*ヌ\)\)', + \ 'F' : '\%([麓梺冬′枌賁汾濆吩刎氛雰糞褌忿墳吻紛焚扮分粉揮旧舊顫故震篩奮隹古衾襖贅燻筆鰒絃総惣總房閼鬱塞鞴章郁史艦簡札耽吭鰾笛文罧節苳蕗淦舩艙舷舟船肥太懷懐≧≪≠≫<>≦渊淵渕縁葢盖再弍蓋双藤鯊潭蒸鱶楓殕瘋封諷黻祓拂怫髴彿恚慍憤二払沸拒防茯蔔愎輹蝠箙腓⊇⊃膨脹嚢梟袋含⊆⊂袱覆輻腹幅復馥服副複福経俘麸賦麩蜉坿父附訃婦誣仆經舗咐符臥膚斧冨腑更俛觝怖腐斑踏深趺降畉譜履葺觸老敷歩布赴狂殖振夫苻噴罘伏匐賻風柎不巫蹈孵拭普芙郛埠鋪鯆付吹阜拊生桴溥榑扶俯触践負増傅鮒孚府芬呎フ飜翻ふ鉄♀∀¶富⌒金仏佛偽誤F♭弗浮フΦфФφF]\|ッ\_s*フ\|ッ\_s*フ\|っ\_s*ふ\|鞦\_s*韆\|睾\_s*丸\|陰\_s*嚢\|乱\_s*吹\|相\_s*応\|E\_s*u\_s*p\_s*t\_s*e\_s*l\_s*e\_s*a\_s*c\_s*e\_s*a\_s*e\|回\_s*回\_s*教\|書\_s*司\|図\_s*書\_s*寮\|海\_s*蘿\|補\_s*\%(任\|陀\_s*[洛落]\)\|頭\_s*垢\|雲\_s*脂\|鳧\_s*鐘\|款\_s*冬\|菜\_s*蕗\|蒲\_s*団\|M\_s*y\_s*r\_s*t\_s*a\_s*l\_s*e\_s*s\|釜\_s*[中山]\|雙\_s*葉\|B\_s*u\_s*d\_s*d\_s*l\_s*e\_s*j\_s*a\_s*c\_s*e\_s*a\_s*e\|渓\_s*井\|G\_s*e\_s*r\_s*a\_s*n\_s*i\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|2\_s*[人つ日]\|宿\_s*酔\|2\_s*\%([人つ日]\|通\_s*り\)\|○\_s*○\_s*○\|□\_s*□\_s*□\|△\_s*△\_s*△\|×\_s*×\_s*×\|帛\_s*紗\|河\_s*豚\|比\_s*律\_s*賓\|I\_s*r\_s*o\_s*n\|極\_s*東\_s*放\_s*送\|論\_s*理\_s*式\|形\_s*式\|ホ\_s*\%(ワ\_s*イ\_s*エ\|イ\_s*ル\|ル\_s*\%(マ\_s*\%(ン\_s*ト\|リ\_s*ン\)\|ム\_s*ア\_s*\%(ミ\_s*ド\|ル\_s*デ\_s*ヒ\_s*ド\)\)\)\|一\_s*杯\|機\_s*能\|関\_s*数\|汎\_s*関\_s*数\|修\_s*正\|ヒ\_s*\%(レ\|ュ\_s*ー\_s*[ズム]\)\|第\_s*1\_s*要\_s*素\|1\_s*\%(/\_s*f\_s*ゆ\_s*ら\_s*ぎ\|s\_s*t\)\|失\_s*敗\|ハ\_s*\%(エ\|ン\_s*ブ\_s*ル\|ロ\_s*ン\)\|柔\_s*軟\_s*な\|周\_s*波\_s*数\|エ\_s*フ\|f\_s*\%(e\_s*m\_s*t\_s*o\|o\_s*\%(n\_s*t\_s*-\_s*f\_s*a\_s*m\_s*i\_s*l\_s*y\|r\_s*t\_s*e\)\)\)', + \ 'G' : '\%([頃殺米諢魂權艮勤権鮴好蓙応駒事琴亊若毎如鏝埖込塵氷声肥聲腰拵心戀恋石国獄刧盒熬軣嗷壕敖噛濠哈遨拷囂轟毫傲鼇郷劫≡号豪剛沍五瑚晤珸呉超児檎庫互娯吾午極越護5篌兒冴茣梧誤寤5碁醐伍子唔忤期炬齬牾悟蜈后後宕ご〓戟屐鬩隙郤檄闃鷁撃激劇貎黥皃麑倪霓囈猊迎鯨芸藝蘖囓齧彦軒痃愿呟广監芫舷眩源儼衒弦絃験言諺現限幻玄減原拐実觧偈睨夏解下蹴毛げ靴草腐種口薬糞癖胡萸茱串藕遇嵎宮寓隅偶黒栗鞍倉蔵位昏麕羣郡群軍苦周包車狂惧組虞具弘暮食壷愚狗倶颶壺禺麌ぐ衣君嫌裂際牛垠崟斤岑憖吟銀圉圄禦馭魚嶷閠玉漁曉痙繞澆尭御翹嶢堯蟯驍僥仰業暁凝行謔瘧虐逆祇気曦議伎僞巍祁羲決城切艤礒擬沂犠萓嶬誼偽蟻宜斬疑木妓義犧技魏着欺戯儀戲ぎ巛皮川革乾側通殻絡辛柄鴉烏嵒頷巖厳嚴貫阮鳫偐岸厂⊃贋龕強翫岩鴈丸雁玩癌元願眼巌含頑神上紙髮髪金鐘係皈歸肯帰返潟固方語刀難型形鰹歹垳顏顔蟇釜鎌窯蒲蟹笠重傘號垣樫頭月合斈諤鄂壑鍔齶樂學萼愕嶽咢鰐額岳顎楽学乂既崖崕磑亥葢剴礙垓劾漑愾盖啀涯睚艾駭皚該咳階孩芥碍害鎧街凱慨概蓋骸外訛我伽臥哦換変借駕駆鵝貸画衙替代畫呀牙蛾訝勝ヶ果賀書餓芽河雅峩狩莪買峨掛ケヵ娥鵞刈俄が≫>G瓦≧ガゴΨβλΣΕΖΗΚΘοΤσνΠρΑκξιΝθμΜΩεΧδΞψΔπατΒΙυΦΥζΡφΟχΛηωギグгγΓゲГG]\|ッ\_s*\%(コ\_s*゙\|ケ\_s*゙\|ク\_s*゙\|キ\_s*゙\|カ\_s*゙\)\|ッ\_s*[ゴゲグギガ]\|っ\_s*[ごげぐぎが]\|コ\_s*゙\|小\_s*屋\|蒙\_s*御\_s*免\|巨\_s*頭\_s*鯨\|欣\_s*求\|独\_s*楽\|P\_s*e\_s*r\_s*s\_s*o\_s*n\_s*a\_s*l\_s*e\_s*s\|瞽\_s*女\|歩\_s*行\_s*虫\|向\_s*拝\|皐\_s*月\|穀\_s*潰\|寄\_s*居\_s*虫\|降\_s*魔\|格\_s*\%([間縁]\|天\_s*井\)\|恒\_s*河\_s*沙\|江\_s*\%([津湖商州]\|談\_s*抄\)\|豆\_s*[油汁]\|ケ\_s*゙\|蚰\_s*蜒\|景\_s*色\|化\_s*粧\|鴃\_s*舌\|稽\_s*古\|懸\_s*魚\|還\_s*[向俗]\|拳\_s*[万固骨]\|喧\_s*嘩\|顕\_s*界\|ク\_s*゙\|救\_s*世\_s*菩\_s*薩\|工\_s*合\|供\_s*[奉祭香進]\|紅\_s*蓮\|キ\_s*゙\|毬\_s*杖\|岐\_s*\%([南阜]\|セ\_s*ン\)\|棋\_s*将\_s*谷\|求\_s*\%([法道肥]\|不\_s*得\_s*苦\|聞\_s*持\_s*法\)\|A\_s*g\|S\_s*\%(c\_s*r\_s*o\_s*p\_s*h\_s*u\_s*l\_s*a\_s*r\_s*i\_s*a\_s*c\_s*e\_s*a\_s*e\|y\_s*m\_s*p\_s*e\_s*t\_s*a\_s*l\_s*a\_s*e\|i\_s*l\_s*v\_s*e\_s*r\)\|希\_s*臘\|杏\_s*葉\|餃\_s*子\|刑\_s*部\|カ\_s*゙\|搦\_s*み\|鑑\_s*真\|仮\_s*名\|蝦\_s*[蟆蟇]\|T\_s*y\_s*p\_s*a\_s*l\_s*e\_s*s\|鉤\_s*状\_s*部\|菓\_s*子\|甲\_s*斐\|会\_s*社\|g\_s*\%(i\_s*g\_s*a\|h\_s*o\_s*s\_s*t\_s*s\_s*c\_s*r\_s*i\_s*p\_s*t\)\|ヌ\_s*ー\|g\_s*n\_s*u\_s*s\|ニ\_s*ュ\_s*ー\_s*ズ\|ノ\_s*ー\_s*ム\|総\_s*司\_s*令\_s*部\|連\_s*合\_s*国\_s*軍\_s*総\_s*司\_s*令\_s*部\|ヒ\_s*ル\|ク\_s*ッ\_s*パ\|硝\_s*子\|ハ\_s*ボ\_s*ロ\_s*ー\_s*ネ\|瞿\_s*曇\|ヨ\_s*ー\_s*テ\_s*ボ\_s*リ\|エ\_s*ー\_s*テ\_s*ボ\_s*リ\|イ\_s*ェ\_s*\%(ー\_s*テ\_s*ボ\_s*リ\|テ\_s*ボ\_s*リ\)\|得\_s*る\|ヘ\_s*\%(ラ\_s*ル\_s*ド\|ル\_s*マ\_s*ン\)\|ド\_s*イ\_s*ツ\|成\_s*吉\_s*思\_s*汗\|ゼ\_s*\%(ラ\_s*\%(チ\_s*ン\|ニ\_s*ウ\_s*ム\)\|ム\_s*ク\_s*リ\_s*ッ\_s*プ\|ノ\_s*ア\|ン\_s*ト\_s*ル\_s*マ\_s*ン\|ネ\_s*\%(コ\_s*ン\|ラ\_s*\%(ル\|リ\_s*ス\_s*ト\)\)\)\|大\_s*\%(蚊\|学\_s*院\_s*生\)\|ジ\_s*\%([ムルジグノナオンー]\|プ\_s*シ\_s*ー\|ア\_s*ン\|ッ\_s*ド\|イ\_s*ド\|タ\_s*ン\|ゼ\_s*ル\|リ\_s*ア\_s*ン\|レ\_s*ッ\_s*ト\|ゴ\_s*ロ\|ラ\_s*\%(フ\|ル\_s*\%(ド\|デ\_s*ィ\_s*ー\_s*ノ\)\)\|ロ\_s*\%(ー\|ン\_s*ド\)\|バ\_s*ン\_s*シ\_s*ー\|ブ\_s*\%(リ\|ラ\_s*ル\_s*タ\_s*ル\)\|ベ\_s*\%(ル\_s*ナ\_s*ウ\|レ\_s*リ\_s*ン\)\|ネ\_s*ッ\_s*ト\|ョ\_s*\%(ッ\_s*ト\|ヴ\_s*ァ\_s*ン\_s*[ニナ]\|バ\_s*ン\_s*[ニナ]\|コ\_s*\%(ー\_s*ソ\|ン\_s*ダ\)\|ル\_s*\%(ジ\|ダ\_s*ー\_s*ノ\)\|ー\_s*\%(ジ\|ゼ\_s*ッ\_s*ト\)\)\|ャ\_s*\%(ン\|イ\_s*\%(ロ\|ル\_s*ズ\|ア\_s*ン\_s*[ツト]\)\|コ\_s*\%(モ\|メ\_s*ッ\_s*テ\_s*ィ\)\|ー\_s*マ\_s*ン\)\|ニ\_s*ー\|ュ\_s*\%([レネ]\|ゼ\_s*ッ\_s*ペ\|リ\_s*\%(ア\|ー\_s*ニ\|エ\_s*ッ\_s*タ\)\|ヌ\_s*\%(ビ\_s*エ\_s*ー\_s*ブ\|ヴ\_s*ィ\_s*エ\_s*ー\_s*ヴ\)\)\|ェ\_s*\%([リルフムマネ]\|ス\_s*チ\_s*ャ\_s*ー\|ロ\_s*ニ\_s*モ\|ラ\_s*\%(ー\_s*[トルド]\|ル\_s*\%(ド\|デ\_s*ィ\_s*ン\|ダ\_s*イ\_s*ン\)\)\|ミ\_s*ニ\|ニ\_s*ー\|ノ\_s*\%([アバ]\|ヴ\_s*ァ\|ワ\_s*ー\_s*ズ\|サ\_s*イ\_s*ド\)\|ン\_s*\%(マ\|ト\_s*\%(ル\|リ\_s*[ィー]\)\|ダ\_s*ー\)\)\)\)', + \ 'H' : '\%([ホ洞亡袰滅幌濠壕畚笨略檣艢焔炎仄朖朗塊程施滸幾殆缶熱解屠榾螢蛍骨細本*※糒恣縦擅星戟戈桙綻祠誇埃鉾矛堀頬袍垉膀鞄抔磅峯堋弸皰舫篷麭怦呆蔀棚褓泙枋棒勹鴇朴峰豐苞葬琺寳炮鵬寶繃魴鋒髣逢朋烹鳳彗箒俸焙蓬烽幇抱崩訪泡澎彷縫捧萌萠彭包胞倣邦飽疱庖奉豊砲報硼宝攴攵瀑蹼樮北恍掘畝譽保穗賞埔餔咆惚穂葡抛哮耄堡脯哺襃黼捕彫褒欲吼舖輔葆浦逋誉ほヘ謙遜篦廰廳貶褊胼諞篇駢蝙翩變∂遍返騙編扁変丿暼諛諂隔凹臍巳蛇蔕蒂瓸竡粨躄闢癖甓璧劈碧壁聘餅箆坪竝嬖幤閇娉病塀蔽并陛屏炳斃瓶弊幣併敝閉並辺邉減屁圧歴邊折舳戸へフ麓梺冬♭′枌賁汾濆吩氛雰糞褌忿墳吻紛焚扮分粉揮旧舊顫故震篩奮隹古衾襖贅燻鰒陰絃総惣總房閼鬱塞章郁艦簡補札耽吭鰾笛芬呎文罧節苳蕗淦舩艙舷舟船蒲懷懐≧≪≫>≦渊淵渕縁葢盖弍蓋双B藤潭蒸鱶楓殕瘋封諷黻怫髴佛彿恚慍憤仏F弗沸Φφ拒防茯蔔愎輹蝠箙⊇⊃嚢梟袋含⊆⊂袱覆輻復馥副複福経俘麸賦麩蜉坿父附訃婦誣仆經舗咐符臥斧冨更俛觝怖腐踏深趺富降畉譜葺觸敷歩赴狂殖振夫苻噴罘伏匐賻風柎不巫蹈孵拭普芙郛埠鋪鯆付吹阜拊桴溥榑扶俯触践負増傅鮒孚府ふヒ鶸彬禀斌蘋嬪繽殯賓擯牝貧頻瀕稟品怯葫晝飜蒜蛭昼綬胙紐鰭∝衡片鮃閃鵯辟百媛姫仭擴絋仞展尋宥太拡拓拾祐恕紘煕泰熙寛啓弘宏洋裕浩廣広髟馮飃飆殍冰冫凭俵驫彪雹飄豹漂驃慓剽嫖兵憑票評標平表燧老撚拈捫捻歪籤籖柊旱魃秀跪膝蜩羆攣佗−低隙閑暇雛髯鬚髭¬蹄濳潜潛顰密窃鬻提瓠蠡瓢匏壽央恒廂尚寿久率蟆痙蟇丙丁孤女史獨独稘斎均倫準斉等≠單偏単他仁瞳人11柆蔆拉杓柄犇◇◆菱醢醤曾蘖彦酷浸漬鶲額聖肱肘熈芒光膕控皸皹響罅僻鰉蹕匹逼篳畢疋柩棺弼櫃謐坤未羊筆必襞養饑(<「【←『左緋罷引披惹轡丕卑碑彼昜痺砒鞁退匪否毘皮蜚干疲蓖氷比匕桧日梭曳牽費扉魅肥痞灯豼鞴斐狒碾秕杼冷贔俾挽索被貔暃避火朏菲裨秘髀轢乾臂泌庇批紕脾霏檜飛悲妣妃樋祕陳鄙譬ひハ布鱧釖鉤蝟梁鍼磔針肚禳腑腸孕原拂祓払遼温玄請腹陽悠遙東遥治春捷頓鮠鶻駿疾囃林隼畔磐泛鈑潘膰樊笵釆胖拌絆蟠氾坂范凡燔楾洪瘢翻板攀゜大伴煩槃斑袢判範藩繙蕃版搬叛班阪般販犯汎帆頒反侍鯊櫨祝?硲間烈激勵劇励速蝿蠅省飯彈勢外筈弭辱逸育毓齦浮難掵阻憚幅巾柞母翅幟側圃旌旙旛将傍働鰰機叩疥畠籏幡畑旗斜鴿再鳩開秦跣膚肌裸弾薑椒元弌壹哉壱甫一創馨始鋼芳剪夾鋏螯挾挟脛萩贐餞離塙英蕚萼衂衄縹譚咄放噺話洟甚鼻華花觜赱迸枦奔艀婢梯燥箸柱走橋箪匣凾□筐繁方運匚筥箱函佰珀魄陌亳狛柏愽栢岶蘗粕膊璞擘箔舶泊搏迫帛拍諮測企圖秤謀量計図儚捗袴伯博墓秡癶髮釟溌肇廿二初椀蓮♪8鉢蜂發髪服法半醗白薄八発擺旆盃珮湃坏碚琲睥霈埴牌拜裴孛吠入沛榛杯悖―廢腓徘誹稗癈俳肺憊輩背鷂胚廃排拝敗灰配蛤濱浜跳馳霸羞爆禿杷碆叭匍怕栄玻撥穿愧歯膨破恥晴巴生派暎端覇着帚刃填腫吐刷菷刎菠羽琶張這頗簸佩耻早映履慙坡榮果脹跛陂葉播笆葩矧霽食芭把刄捌垪剥爬掃帶齒嵌貼は━─┛┘┷┸┻┴┓┐┬┳┯┰┫┥┤┨╋┿┼╂波‐フ☆★非HヒホヘハH]\|ッ\_s*[ホヘフヒハ]\|ッ\_s*[ホヘフヒハ]\|っ\_s*[ほへふひは]\|寄\_s*生\|珠\_s*鶏\|混\_s*一\_s*色\|紅\_s*[幇中]\|T\_s*r\_s*i\_s*u\_s*r\_s*i\_s*d\_s*a\_s*l\_s*e\_s*s\|微\_s*[酔笑]\|子\_s*規\|蜀\_s*魂\|杜\_s*[鵑宇]\|時\_s*鳥\|上\_s*枝\|鬼\_s*灯\|酸\_s*漿\|叢\_s*祠\|和\_s*了\|鮑\_s*魚\|謗\_s*法\|黒\_s*子\|部\_s*屋\|竹\_s*\%(畚\|麦\_s*魚\)\|巻\_s*子\|綜\_s*麻\|下\_s*手\|糸\_s*瓜\|h\_s*e\_s*c\_s*t\_s*o\|霹\_s*靂\|c\_s*l\_s*a\_s*u\_s*s\_s*t\_s*r\_s*o\_s*p\_s*h\_s*o\_s*b\_s*i\_s*a\|鞦\_s*韆\|睾\_s*丸\|乱\_s*吹\|相\_s*応\|E\_s*\%(r\_s*i\_s*o\_s*c\_s*a\_s*u\_s*l\_s*a\_s*l\_s*e\_s*s\|u\_s*p\_s*t\_s*e\_s*l\_s*e\_s*a\_s*c\_s*e\_s*a\_s*e\)\|回\_s*\%(鍋\_s*肉\|回\_s*教\)\|書\_s*司\|頭\_s*垢\|鳧\_s*鐘\|款\_s*冬\|菜\_s*蕗\|f\_s*\%(o\_s*r\_s*t\_s*e\|e\_s*m\_s*t\_s*o\)\|釜\_s*[中山]\|雙\_s*葉\|渓\_s*井\|G\_s*e\_s*r\_s*a\_s*n\_s*i\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|宿\_s*酔\|○\_s*○\_s*○\|△\_s*△\_s*△\|×\_s*×\_s*×\|河\_s*\%(豚\|底\_s*撈\_s*魚\)\|神\_s*[庫籬]\|領\_s*巾\|肩\_s*巾\|素\_s*見\|曹\_s*白\_s*魚\|枚\_s*[田方]\|敬\_s*昌\|幸\_s*展\|容\_s*靖\|晃\_s*道\|宙\_s*子\|欧\_s*子\|祥\_s*加\|終\_s*日\|翡\_s*翠\|曽\_s*祖\_s*父\|豪\_s*将\|偉\_s*紀\|周\_s*[行男]\|茅\_s*蜩\|向\_s*日\_s*葵\|七\_s*宗\|桶\_s*坂\|永\_s*和\|蟾\_s*蜍\|抽\_s*\%([斗出]\|き\_s*出\_s*し\)\|告\_s*天\_s*子\|雲\_s*[脂雀]\|為\_s*人\|緊\_s*[と々]\|鎮\_s*火\_s*\%(祭\|の\_s*祭\)\|A\_s*\%(s\|r\_s*s\_s*e\_s*n\_s*i\_s*c\|n\_s*g\_s*i\_s*o\_s*s\_s*p\_s*e\_s*r\_s*m\_s*a\_s*e\)\|粃\_s*糠\_s*疹\|只\_s*管\|直\_s*[向走垂隠]\|常\_s*陸\|鹿\_s*尾\_s*菜\|撲\_s*り\_s*倒\|同\_s*胞\|赦\_s*い\|青\_s*春\|哈\_s*爾\_s*浜\|美\_s*佳\|流\_s*行\|勇\_s*[樹人]\|韓\_s*流\|漢\_s*堡\|汗\_s*国\|盤\_s*陀\|R\_s*S\_s*I\|蔓\_s*延\|沙\_s*魚\|蝦\_s*虎\_s*魚\|馬\_s*銜\|狭\_s*間\|南\_s*風\|延\_s*\%(縄\|い\_s*て\)\|義\_s*母\|旅\_s*籠\|N\_s*e\_s*l\_s*u\_s*m\_s*b\_s*o\_s*n\_s*a\_s*c\_s*e\_s*a\_s*e\|黄\_s*[酒櫨]\|土\_s*[方生師]\|嘔\_s*[吐気]\|支\_s*倉\|長\_s*谷\|接\_s*ぎ\_s*合\|纏\_s*頭\|煙\_s*火\|麻\_s*疹\|階\_s*[上子]\|嘴\_s*\%(細\_s*鴉\|太\_s*鴉\)\|学\_s*胤\|2\_s*\%([人つ日]\|0\_s*[歳日]\)\|2\_s*\%([人つ日]\|通\_s*り\|0\_s*日\)\|淡\_s*竹\|8\_s*月\|客\_s*家\|P\_s*\%(t\|o\_s*t\_s*a\_s*m\_s*o\_s*g\_s*e\_s*t\_s*o\_s*n\_s*a\_s*l\_s*e\_s*s\|l\_s*a\_s*t\_s*i\_s*n\_s*u\_s*m\)\|海\_s*\%([鞘永蘿星牙]\|拉\_s*爾\|底\_s*撈\_s*月\)\|M\_s*\%(y\_s*r\_s*t\_s*a\_s*l\_s*e\_s*s\|e\_s*r\_s*c\_s*u\_s*r\_s*y\)\|色\_s*調\|呼\_s*和\_s*浩\_s*特\|ウ\_s*ー\_s*ゴ\|ユ\_s*\%(ー\|ペ\_s*ー\_s*ル\|ベ\_s*ー\_s*ル\|イ\_s*ス\_s*マ\_s*ン\_s*ス\|ゴ\_s*ー\|グ\_s*ノ\_s*ー\|マ\_s*ニ\_s*\%(テ\|ス\_s*[トム]\)\)\|現\_s*代\|十\_s*六\_s*進\_s*数\|高\_s*さ\|香\_s*港\|イ\_s*\%(ダ\_s*ル\_s*ゴ\|ス\_s*パ\_s*ニ\_s*ア\|レ\_s*ー\_s*ル\|エ\_s*ロ\)\|オ\_s*\%([ラー]\|ナ\_s*ー\|ノ\_s*レ\|ン\_s*フ\_s*ル\_s*ー\_s*ル\|ネ\_s*\%(ス\_s*\%(ト\|テ\_s*ィ\)\|ゲ\_s*ル\)\|テ\_s*ル\|ル\_s*ガ\_s*ー\|マ\_s*ー\_s*ジ\_s*ュ\)\|ア\_s*\%(ン\_s*\%(リ\|ベ\_s*ー\_s*ル\)\|ネ\_s*ス\_s*ト\|ワ\_s*ー\|ダ\_s*マ\_s*ー\_s*ル\|シ\_s*ェ\_s*ッ\_s*ト\|ビ\_s*タ\_s*シ\_s*オ\_s*ン\|ー\_s*\%(ネ\_s*ス\_s*ト\|ノ\_s*ン\_s*ク\_s*ー\_s*ル\)\)\|エ\_s*\%(デ\_s*ィ\|ン\_s*リ\_s*ケ\|レ\_s*\%(ナ\|ー\_s*ヌ\)\|ロ\_s*イ\_s*ー\_s*ズ\|ク\_s*ト\_s*ル\|ル\_s*\%(ゲ\_s*ラ\|ヴ\_s*ェ\|メ\_s*ス\|マ\_s*ン\|ミ\_s*\%(ッ\_s*ト\|ー\_s*ト\)\|ブ\_s*ラ\_s*ン\|ナ\_s*ン\_s*デ\_s*ス\|キ\_s*ュ\_s*ー\_s*ル\)\|ノ\_s*ク\|イ\_s*チ\|ッ\_s*チ\)\|水\_s*[銀平素]\)', + \ 'I' : '\%([イηΗ賤鄙卑苟嫌弥薯妹芋藷夢艷鑪鈩彩鱗色鯆忽綺貸甍答応愈圦杁茵胤飮寅尹婬贇韵隱蚓氤酳霪蔭堙湮廴音飲慇韻咽淫殞姻隕院允隠殷陰窟巖巌頌祝鰮鰛鰯岩磐円¥鼾歪弋弑抱懐肬贅疣狗戌乾犬諱在坐未汝戒誡警縛今Εε曰禾稻員因蝗嘶鰍電引躄誘動≦忿鵤錨碇怒霆霹雷凧桴筏魚S菴庵彌雖家尿荊棘茨祈祷命豕猯古伍聿乙鎰鴪軼樹慈悼愴慯労格到至傷鼬頂戴病徒致鈑痛板柞沙砂聊些潔諍烈功諫勳勇勲漁諌憇=憩粹熱粋憤域閾勢勤忙急磯孰焉湶泉厳何弄苛≧鎔范啀毬訝燻息挑絲縷厭營営愛幼稚緒遑暇糸弌壹肆莓苺櫟著市碑鐓礎甃臀弩石牲犧犠池溢Y佚壱11鬻毓燠礇粥的戦戰軍郁幾育一稲否飯違居矮ゐ猪五煎彝醫斐逶貽善胆位萎可詑僞鑄熬活容依要斎行怡異衣逝猗胃洟好矣鋳揖椅去惟云懿熨痿射凍尉移将囗肄夷率囲姨慰頤忌唯緯逸噫挿鮪易偽苡彜莞往以韋遺炒謂李生威為維意倚良如彙已出淹言亥鰄井蔚痍圍幃渭堰饐医爲癒帷恚偉委詒畏い氷Йй→⇒⊂⊃▼▽伊印入∞吋∈∋∬∫∩IイИΙи私ιI]\|E\_s*メ\_s*ー\_s*ル\|灼\_s*然\|祖\_s*谷\|湯\_s*文\_s*字\|文\_s*身\|郎\_s*[女子]\|蕁\_s*麻\|刺\_s*[青草]\|U\_s*r\_s*t\_s*i\_s*c\_s*a\_s*l\_s*e\_s*s\|海\_s*[豚参]\|西\_s*表\|鸚\_s*哥\|影\_s*青\|況\_s*ん\_s*や\|所\_s*謂\|D\_s*i\_s*a\_s*p\_s*e\_s*n\_s*s\_s*i\_s*a\_s*l\_s*e\_s*s\|藺\_s*草\|J\_s*u\_s*n\_s*c\_s*a\_s*l\_s*e\_s*s\|田\_s*舎\|膝\_s*行\|十\_s*六\_s*夜\|寝\_s*穢\|英\_s*\%(蘭\|吉\_s*利\)\|斑\_s*鳩\|烏\_s*賊\|玉\_s*筋\_s*魚\|硫\_s*黄\|夜\_s*来\_s*香\|N\_s*a\_s*j\_s*a\_s*d\_s*a\_s*l\_s*e\_s*s\|牛\_s*膝\|稜\_s*威\|常\_s*春\_s*藤\|5\_s*[つ日]\|5\_s*[つ日]\|惡\_s*戲\|甚\_s*振\|潮\_s*来\|悪\_s*戯\|交\_s*喙\|細\_s*小\_s*魚\|小\_s*魚\|鯨\_s*魚\|鶏\_s*魚\|経\_s*緯\|礒\_s*[山田]\|P\_s*\%(o\_s*a\_s*l\_s*e\_s*s\|l\_s*u\_s*m\_s*b\_s*a\_s*g\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\)\|和\_s*泉\|気\_s*吹\|E\_s*\%(A\_s*S\_s*T\|V\_s*E\)\|指\_s*宿\|拠\_s*所\|従\_s*[弟妹姉兄]\|鴨\_s*脚\_s*樹\|公\_s*孫\_s*樹\|G\_s*\%(r\_s*a\_s*m\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\|l\_s*u\_s*m\_s*i\_s*f\_s*l\_s*o\_s*r\_s*a\_s*e\|i\_s*n\_s*k\_s*g\_s*o\_s*p\_s*s\_s*i\_s*d\_s*a\)\|銀\_s*杏\|鳶\_s*尾\|檪\_s*本\|巫\_s*子\|神\_s*巫\|睦\_s*月\|都\_s*方\_s*流\|縊\_s*[殺死首]\|蝟\_s*[集縮]\|埋\_s*け\_s*[火炭]\|許\_s*[嫁婚]\|<\_s*=\_s*=\_s*>\|必\_s*要\_s*十\_s*分\_s*条\_s*件\|ヤ\_s*ン\|日\_s*本\_s*ア\_s*イ\_s*・\_s*ビ\_s*ー\_s*・\_s*エ\_s*ム\_s*株\_s*式\_s*会\_s*社\|国\_s*際\_s*\%(基\_s*督\_s*教\_s*大\_s*学\|標\_s*準\_s*化\_s*機\_s*構\)\|逆\_s*離\_s*散\_s*フ\_s*ー\_s*リ\_s*エ\_s*変\_s*換\|識\_s*別\_s*子\|即\_s*興\_s*曲\|な\_s*ら\_s*ば\|項\_s*目\|逐\_s*次\_s*型\|i\_s*ノ\_s*ー\_s*ド\|i\_s*\%(ア\_s*プ\_s*リ\|P\_s*o\_s*d\|モ\_s*ー\_s*ド\|M\_s*a\_s*c\|ノ\_s*ー\_s*ド\)\|誤\_s*っ\_s*た\|無\_s*\%(花\_s*果\|効\_s*な\)\|帰\_s*納\_s*法\|字\_s*下\_s*げ\|不\_s*\%([可如足]\|充\_s*分\)\|具\_s*体\_s*化\|情\_s*報\|導\_s*入\|整\_s*数\|完\_s*全\|ヨ\_s*\%(ア\_s*ン\|シ\_s*フ\|ー\_s*ド\|ウ\_s*素\)\|ア\_s*\%(イ\|ー\_s*\%(ヴ\_s*ィ\_s*ン\|ビ\_s*ン\)\|ン\_s*\%(プ\_s*ロ\_s*ン\_s*プ\_s*\%(チ\_s*ュ\|テ\_s*ュ\)\|デ\_s*パ\_s*ン\_s*ダ\_s*ン\|フ\_s*ォ\_s*ル\_s*\%(メ\_s*ル\|マ\_s*テ\_s*ィ\_s*ー\_s*ク\)\)\)\)', + \ 'J' : '\%([塩嶋島嶌縞橲竺衂衄宍舳忸軸舌喰食直凝實昵実印尻侭仞刄臣恁儘潯贐稔進盡仭糂訊俥蕁迅刃靱荏甚靭燼櫁樒塵尽尋陣腎壬人敍莇茹杼洳敘汝蜍耡恕舒縟褥蓐辱溽所抒鋤徐絮序叙助帖穰疂聶疊驤襄淨讓繩禳絛蕘諚仗壌滌繞生靜蟐壤仍茸嬲疉塲乘遶星瀞拯釀躡孃如剩娘嬢錠静醸縄女尉饒丈成烝擾嫋穣丞盛場杖條条蒸貞状攘畳剰冗定浄乗情城上常譲懦愀鷲竪嬬戍得濡咒讐讎就聚笋篤盾徇凖楯詢隼筍蓴惇洵淳閏恂諄馴旬荀潤循醇巡遵順准殉純準襦誦需朮戌宿孰塾珠熟恤術述豎孺呪儒綬樹受授壽揉從澀狃中戎拾廿鞣从縱澁糅蹂神汁獸絨縦渋柔什充十従獣住銃重事迩爺滋除怩尓痔璽至児士寿茲孳染嗣柱寺磁仕死爾路而仁辞塒時岻粫持恃敷焦字只地轜侍瓷亊知辭餌冶邇弍似祀以子峙二史自畤兒示耳慈司蒔次珥膩醤鮭着鉐惹搦尺雀寂若弱邪戯者蛇麝闍じ┃│┝┣├┠┌┏.еЕ治яЯ日ЮюJЁёйЙジJ]\|ッ\_s*シ\_s*゙\|ッ\_s*ジ\|っ\_s*じ\|G\_s*\%(メ\_s*ン\|パ\_s*ン\)\|D\_s*y\|G\_s*\%(メ\_s*ン\|パ\_s*ン\)\|支\_s*度\|試\_s*合\|2\_s*乗\|2\_s*乗\|祖\_s*父\_s*\%(さ\_s*ん\|祖\_s*母\)\|獅\_s*子\|甲\_s*乙\_s*丙\_s*丁\_s*戊\_s*己\_s*庚\_s*辛\_s*壬\_s*癸\|k\_s*\$\_s*_\_s*{\_s*e\_s*f\_s*f\_s*}\_s*\$\|Z\_s*\%(r\|i\_s*r\_s*c\_s*o\_s*n\_s*i\_s*u\_s*m\)\|深\_s*\%(秘\|大\_s*寺\)\|秦\_s*泉\_s*寺\|沈\_s*\%(香\|丁\_s*花\)\|晨\_s*朝\|濁\_s*世\|判\_s*官\|諍\_s*論\|長\_s*夜\|漏\_s*斗\|↑\_s*↓\_s*←\_s*→\|焼\_s*酎\|鐘\_s*石\|橈\_s*脚\_s*類\|承\_s*久\|朱\_s*里\|C\_s*a\_s*b\_s*o\_s*m\_s*b\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|絢\_s*子\|頌\_s*偈\|数\_s*珠\|入\_s*[魂牢来洛院内水棺]\|霜\_s*月\|1\_s*\%(2\|6\_s*進\|0\_s*[進月]\|1\_s*月\|8\_s*禁\)\|師\_s*走\|極\_s*月\|紐\_s*帯\|1\_s*\%(0\|1\_s*月\|8\_s*禁\|2\_s*月\)\|シ\_s*゙\|爪\_s*哇\|射\_s*礼\|砂\_s*利\|謝\_s*花\|三\_s*味\_s*線\|雑\_s*魚\|著\_s*語\|杓\_s*子\|共\_s*同\_s*企\_s*業\_s*体\|j\_s*\%(T\_s*e\_s*X\|L\_s*a\_s*T\_s*e\_s*X\|B\_s*i\_s*b\_s*T\_s*e\_s*X\)\|ゼ\_s*リ\_s*ー\|エ\_s*\%(ホ\_s*バ\|リ\_s*コ\|レ\_s*ミ\_s*ヤ\|ル\_s*サ\_s*レ\_s*ム\|ッ\_s*サ\_s*イ\)\|ヘ\_s*\%(レ\_s*ス\|ス\_s*ス\)\|ヒ\_s*メ\_s*ネ\_s*ス\|チ\_s*ゲ\|北\_s*陸\_s*先\_s*端\_s*\%(大\|科\_s*学\_s*技\_s*術\_s*大\_s*学\_s*院\_s*大\_s*学\)\|ハ\_s*\%(イ\_s*メ\|ラ\_s*ペ\_s*ー\_s*ニ\_s*ョ\)\|碧\_s*玉\|ヤ\_s*\%([リンニナー]\|イ\_s*ル\|エ\_s*ル\|ル\_s*ノ\|レ\_s*ド\|ヌ\_s*\%(ス\|シ\_s*ュ\)\|ス\_s*パ\_s*ー\_s*ス\|コ\_s*[ビブ]\|ッ\_s*ケ\)\|フ\_s*\%(ァ\_s*[ンナ]\|リ\_s*[オア]\)\|ズ\_s*ボ\_s*ン\|ユ\_s*\%([ハリダノ]\|ル\_s*ゲ\_s*ン\|ー\_s*\%([リノ]\|ゲ\_s*ン\_s*ト\|デ\_s*ィ\_s*ッ\_s*ト\)\|ン\_s*\%(グ\|ケ\_s*ル\|カ\_s*ー\)\|ピ\_s*テ\_s*ル\|ッ\_s*[カシ]\)\|イ\_s*\%(エ\_s*\%([ナス]\|ン\_s*\%(ス\|セ\_s*ン\)\|ズ\_s*ス\)\|ェ\_s*\%(ナ\|ン\_s*\%(ス\|ゼ\_s*ン\|セ\_s*ン\)\|ー\_s*ガ\_s*ー\|ル\_s*\%(ク\|サ\_s*レ\_s*ム\)\)\)\|ホ\_s*\%([タセ]\|ル\_s*ヘ\|ホ\_s*バ\|ア\_s*\%(ン\|キ\_s*ン\)\)\|ヨ\_s*\%([ブナ]\|ル\_s*\%(グ\|ダ\_s*ン\)\|エ\_s*ル\|ア\_s*\%(キ\_s*ム\|ヒ\_s*ム\)\|ゼ\_s*フ\|シ\_s*\%(フ\|ュ\_s*ア\)\|ー\_s*\%([ドト]\|デ\_s*ル\|ゼ\_s*フ\)\|セ\_s*フ\|ハ\_s*[ナンネ]\)\)', + \ 'K' : '\%([コ怖之旃惟怺薦米暦轉殺悃鶤艮鯤很袞坤壼琿狠漿棍魂菎滾梱溷痕渾墾恨懇根梢杪王泥裔樸鞐熟枹醴聲声蛩凍溢零錯苔亊箏斷判諺理断盡悉尽辞詞殊事壽寿鯒礫鯉齣狛腓昆瘤鮗谺応應答爰茲是試志心凩笏惚榾兀輿甑腰拵拗鐺鏝衝杲磽絖昊耗闔狎靠冓汞湟塙慌嫦礦冦淆遘亘仰昴誥鬨鴿鏗浤哮砿鎬伉熕洽訌閧困縞鮫逅糠槹哽盍稾亙壙覯隍簧遑洸餃惶寇鵁皋黌椌扣晄倖矼肓頏蛤呷詬匣昿皐崗肱徨峇袷敲爻藁倥釦棡凰犒吭窖畊岡猴胱絋傚啌蚣缸紘湊搆閤峺羔鍠幌鱇扛肴恆紺鈩絳閘蒙冰氷郡蛟槁候楮媾溘蝗酵嚆犢稿亢哄睾慷郊岬肛項巷鑛洪佼狡叩昂勾喉晃滉糀晧剛曠宏控恍侯皓港膏耿皎坑江絞膠虹巧鴻鉱衡浩厚耕幸弘綱抗購攻講恒薨溝鋼航行肯光皇好荒高梏谷哭槲尅釛斛轂石告酷穀踰懲蝴鴣袴焦觚虍粐乎沽餬胯菰瞽請楜娘壺錮込葫痼兒估冴漕痩虎冱倒戸呱媚粉夸詁子鈷捏濃故濾箍漉恋呼誇壷放転仔鼓小股罟女乕琥跨滬越古糊滸扈瑚皷混怙弧辜戀蠱超児雇凝孤湖此瓠蛄凅肥こケ峻欅獸騫剱儉惓劵蜷謇鉉鵑綣幵娟險劒虔瞼俔顯臉圈釼歉權慊縣暄愃愆涓黔劔獻搴諠椦妍檢甄験慳捲倦遣羂嶮蹇鹸狷譴腱驗軒憲繭謙圏険硯倹献犬絢顕券劍剣見権拳研眷牽県建烟鑷言獣蓋涜吝削畩閲検貶健桁嗾竭訐亅碣杰譎偈抉厥蕨歇襭刔頡獗尻訣孑頁纈蹶桀穴傑結血憇夐彑勍攜迥冏檠絅蹊煢笄醯枅憬盻綮詣冂挈黥剄匸徑奚挂兮鮭瓊畦逕繼惠慧謦鷄系┻┣┠┨┝┴│┿┰╋━┛┬┥╂┤┸┯┼─┷├┏┳┫┃┓罫痙奎脛谿溪螢蛍渓閨憩圭携硅恵刑継勁珪計啓異毛蹴褻けク姑配椪栩櫪檪椡橡椚湫箜櫟含纐柵婚屎糞癖潛潜鵠凹窪縊跟軛頚珞頸首諄窟鞋履轡覆沓碎砕条降件頽崩屑釘莖茎陸杙杭掘崛倔鶏鐃藥擽薬樟楠梳櫛串釧與与挫籖鯀鯨籤隈熊艸嚔藾叢鏈腐鎖種ξΞ臭楔草圀邦國国髭嗽漱吻嘴脣唇梔腔φ粂皹勳熏裙醺桾皸崑燻訓勲葷委钁精詳鍬咥銜桑某暝峅眛昏罔冥鮓比闇位鞍藏暗倉廚厨涅曇蜘佝栗包俥車梍枢畔鐵玄蔵黒喰苦枸煦焼倶狗吼刳工絎駒眩垢口窶区劬繰呉暮貢嶇酌庫惧組衢紅食句吁懼區桍孔怐瞿くキ段痍疵絆紲傷築鱚稷嚴黍帛後碪砧絹萌兆刻椈鞫掬辟君牙檗蘗迄訖狐屹詰佶拮吃鞠橘菊喫‥\£、♀〇∵≡.&^‰▲‡`§¶′_〓☆;□↑↓・%■¢=/≒←− ̄★々≠♂〆ゝ◎―$¨♭+?ヽ…†♪‖@゜◆ヾ´。±|≪⌒≧○÷,≫<∞●◇∴≦△!℃゛▼♯¬°▽‐ー∽¥:∨>Ц#∝∫〃仝Å″〒ゞ煙蚶衣更細妃后楸蕈茸乙雉轢杵軋岸桔汚穢北樵際裂燦煌雲嫌胆竏粁瓩浄澄淳潔清雰錐蛬吉霧檮桐襟磬釁覲箘掀噤衿鈞檎瑾忻饉箟听芹衾釿懃斤蒟径窘擒巾菌公禽筋錦欣僅琴均禁謹緊欽近勤鉅秬擧渠踞據舉筥嘘苣慶倨距歔遽鋸醵拠拒去勗亟蕀洫跼旭局挙許居巨虚頃峽筴鍄陜卿竟筺僵狹竅洶誑羌抂炯烱劫經刧襁繦蕎篋況徼恊恟棘轎竸况廾荊亰姜梗孝亨跫敬筐梟饗矯挾矜挟校拱嬌響鞏杏向興匈嚮享警競喬怯兄彊僑兢狂供橋莢凶郷兇驕叫夾匡侠狭恐経疆協境胸強驚脅共恭今教玖赳鬮舊蚯逑恷歙貅扱樛9烋摎邱笈皀疚岌厳胡翕朽泣穹糺糾及躬汲窮灸弓臼宮久柩究給丘求鳩級球休救急旧吸九瞶來著喜旡决羈祈揮窺起聞弃伎燬憙毅綺麾基机棄希噐棋其尋祁熹奇肌跂稀覬暉企黄愾欹几稘城軌諱岐決詭極記猗喟槻竒季碕鰭悸切禧消己效朞淇驥揆麒嬉崎僖匱屓既毀杞危卉器貴徽癸虧畿忌耆曁伐紀晞畸饑酒碁樹生木覊聽剪截櫃熈嵜冀跪气愧煕期効斬訊飢妓箕祺圻熙餽来徠鬼譏羇馗着寄倚氣利幾汽欷姫饋聴唏剞鑽騏逵騎掎規幃棊きカ癢糜粥痒麹輕骨業軽鰈鰔餉通龜瓶甕亀鳫獵鴈殯猟雁釀鳬鳧髢鴨巛側躱廁厠磧瓦獺翡皮裘→紮搦苧碓柄枳躯躰軆體体鴉犂烏機絡空唐榧茅澗鸛厂蒄啣卷淦扞杆骭歛瞰讙奐戡豢坎瀚皖稈鐶拑酣陷繝嫺驩篏樌莟勸捍撼澣盥羹嫻鑵寰丱康懽憾羮揀歡潤罕觀橄涵渙凵堪覡巫鉋萱簪舘艱咸翰柬駻悍燗槓浣邯攷稽宦考棺潅閂煥鉗疳癇函凾鹹顴緘款桓箝諫諌轗坩旱侃鰥 館莞橇韓患灌勧菅簡奸刊柑肝看桿寒緩干嵌廣広竿貫巻敢漢環喊陥監喚甘間歓閑寛管慣完艦乾幹官観壁椛屍姓庇鞄芳蔓鯑一勘⊃影陰蔭景*棧梯筧庚辛┘┐柧┌門廉脚乞癩∪川合’)《‘”{〈“}》〉囓柁旗鮖悴舵鰍鍛梶錺餝飾篭籠歸孵卻皈還省顧楓却帰反返守帋督祇髮韮裃雷髪紙鉦曲矩予鐘樺沫偏騙語潟刀象模仇固硬傍難容忝辱頑形旁方型肩風滓翳微幽掠緕纃綛絣擦糟鎹粕戞猾曷剋黠瞎鞨恰∧濶∩蠍筈蝎羯喝轄餓蛞聒劼擔刮蘰鬘桂闊括嘗捷豁渇担滑堅鰹割戛活疽暈鵲瘡傘嵩重襲葛笠堵硴墻牆蠣蛎柿掲關罹抱踵嬶嚊拘関係顏貌郁薫顔母感釡罐窰鴎框叺構喧竃竈釜缶蒲鎌數数槝栢膳傅瑕畏賢橿姦樫爨炊圍喞託囲鈎「『鉤」』限鍵傾禿蕪鏑頭齧気被兜哉適敵必要彜彝鬲鼎叶片哀愛悲鋺蛇鉄蜩神奏楫裹磆餅徒褐粮糧茖椁覺幗槨貉擴壑隱愨寉殼癨嚇穫咯膕骼膈∠掴狢埆蠖覈霍礁恪擱匿撹攪喀廓較郭〕【[】]〔殻挌劃閣格隠覚矍革馘鶴攫核獲拡客隔角確廨囘隗嵬觧榿蠏匯徊迴壞褂獪丐械枴畍誨揩醢誡夬懈喙椢恠峡价櫂茴蛙瑰乖浬鰄傀糴柏街鳰懷蛔蠶蚕邂蟹潰壊恢腕芥垣楷會拐悔詼諧契皆界疥魁偕改繪貝胛絵快甲灰槐晦懐介塊解廻回階戒開会怪海縢篝炬耀赫輝冠鑒鑑各屈鏡柯噛箇上苛暇蚊廈易嘩ヵ描苅枯佳彼兼哥缺霞藉架啝下渦踝堝闕華嗄荷馨刈假夥河科珈個蝸迦軻咼黴舸繋書賀夏萪支卦掛掻蝦痂謌渮歌過香禾狩買變家枷克駈花賈畫珂呵替代訶袈咬画顆貸價淅飼和ヶ果糅厦課可醸葭勝仮搗嘉墟嗅譌日斯禍換窩苟貨蝌価懸欠化罅伽賭翔靴且嚼訛交何駆驅个嫁譁借加跏戈稼寡涸耶変崋鹿笳火茄菓遐舁か京節└┗※хХ忽コ汗〜功株(Kク×金窯κキΧカКΚкχケK]\|ッ\_s*[コケクキカ]\|ッ\_s*[コケクキカ]\|っ\_s*[子こけくきか]\|蟀\_s*谷\|焜\_s*炉\|前\_s*妻\|嫡\_s*妻\|二\_s*合\_s*半\|秋\_s*桜\|牛\_s*尾\_s*魚\|庶\_s*幾\|独\_s*楽\|特\_s*牛\|粫\_s*門\|甦\_s*生\|M\_s*e\_s*t\_s*a\_s*c\_s*h\_s*l\_s*a\_s*m\_s*y\_s*d\_s*e\_s*a\_s*e\|f\_s*o\_s*o\_s*t\_s* \_s*a\_s*n\_s*d\_s* \_s*m\_s*o\_s*u\_s*s\_s*e\_s* \_s*d\_s*i\_s*s\_s*e\_s*a\_s*s\_s*e\|外\_s*連\_s*味\|螻\_s*蛄\|罌\_s*粟\|滅\_s*紫\|S\_s*i\|莎\_s*草\|百\_s*[濟済]\|9\_s*[日月]\|秧\_s*鶏\|釉\_s*掛\|典\_s*薬\_s*寮\|L\_s*a\_s*u\_s*r\_s*\%(a\_s*c\_s*e\_s*a\_s*e\|o\_s*i\_s*d\_s*e\_s*a\_s*e\)\|探\_s*湯\|誓\_s*湯\|六\_s*合\|地\_s*祇\|都\_s*子\|州\_s*光\|群\_s*衆\|慈\_s*姑\|c\_s*r\_s*e\_s*s\_s*c\|内\_s*蔵\_s*助\|H\_s*e\_s*l\_s*l\_s*e\_s*b\_s*o\_s*r\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|J\_s*u\_s*g\_s*l\_s*a\_s*n\_s*d\_s*a\_s*l\_s*e\_s*s\|仁\_s*彦\|啄\_s*木\_s*鳥\|X\_s*e\|如\_s*月\|私\_s*市\|昨\_s*日\|素\_s*地\|布\_s*地\|欺\_s*罔\|k\_s*i\_s*l\_s*o\|聖\_s*[之子美]\|沈\_s*菜\|蟋\_s*蟀\|螽\_s*斯\|G\_s*o\_s*l\_s*d\|A\_s*\%(u\|r\_s*c\_s*h\_s*i\_s*c\_s*h\_s*l\_s*a\_s*m\_s*y\_s*d\_s*e\_s*a\_s*e\|s\_s*t\_s*e\_s*r\_s*a\_s*l\_s*e\_s*s\|c\_s*a\_s*n\_s*t\_s*h\_s*a\_s*c\_s*e\_s*a\_s*e\)\|菫\_s*青\_s*石\|槿\_s*花\|R\_s*\%(h\_s*\%(o\_s*e\_s*a\_s*d\_s*a\_s*l\_s*e\_s*s\|a\_s*m\_s*n\_s*a\_s*l\_s*e\_s*s\)\|u\_s*n\_s*u\_s*n\_s*c\_s*u\_s*l\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|a\_s*n\_s*\%(u\_s*n\_s*c\_s*u\_s*l\_s*a\_s*\%(l\_s*e\_s*s\|c\_s*e\_s*a\_s*e\)\|a\_s*l\_s*e\_s*s\)\)\|裾\_s*礁\|脇\_s*[侍息]\|姉\_s*[妹弟]\|頬\_s*[骨筋]\|毬\_s*果\|舅\_s*姑\|厩\_s*\%([肥舎]\|務\_s*員\)\|廐\_s*舎\|離\_s*れ\_s*離\_s*れ\|掃\_s*部\|羚\_s*羊\|氈\_s*瓜\|土\_s*器\|蝙\_s*蝠\|魚\_s*狗\|為\_s*替\|連\_s*枷\|身\_s*体\|落\_s*葉\_s*松\|随\_s*神\|檻\_s*車\|T\_s*\%(h\_s*a\_s*l\_s*i\_s*c\_s*t\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|u\_s*b\_s*i\_s*f\_s*l\_s*o\_s*r\_s*a\_s*e\)\|南\_s*瓜\|量\_s*子\|千\_s*典\|山\_s*\%(梔\_s*子\|陽\_s*道\)\|蜉\_s*蝣\|陽\_s*炎\|蜻\_s*蛉\|破\_s*片\|挿\_s*頭\|駕\_s*\%(籠\|輿\_s*丁\)\|槭\_s*樹\|長\_s*[月官]\|主\_s*[紀計神]\|剃\_s*刀\|天\_s*\%(牛\|鼠\_s*矢\)\|帷\_s*子\|酢\_s*漿\_s*草\|O\_s*x\_s*a\_s*l\_s*i\_s*d\_s*a\_s*c\_s*e\_s*a\_s*e\|飛\_s*白\|春\_s*日\|C\_s*\%([ormfda]\|h\_s*r\_s*o\_s*m\_s*i\_s*u\_s*m\|i\_s*r\_s*c\_s*a\_s*e\_s*a\_s*s\_s*t\_s*e\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\|u\_s*r\_s*i\_s*u\_s*m\|y\_s*p\_s*e\_s*r\_s*a\_s*l\_s*e\_s*s\|e\_s*r\_s*c\_s*i\_s*d\_s*i\_s*p\_s*h\_s*y\_s*l\_s*l\_s*a\_s*c\_s*e\_s*a\_s*e\)\|曽\_s*て\|曾\_s*て\|松\_s*魚\|燕\_s*子\_s*花\|牡\_s*[蛎蠣]\|民\_s*部\|部\_s*曲\|E\_s*\%(b\_s*e\_s*n\_s*a\_s*l\_s*e\_s*s\|l\_s*a\_s*n\_s*a\_s*l\_s*e\_s*s\)\|案\_s*山\_s*子\|梭\_s*\%(魚\|子\_s*魚\)\|螳\_s*螂\|蟷\_s*螂\|瓜\_s*\%(田\|呂\_s*根\)\|拍\_s*手\|水\_s*[鶏母手夫]\|東\_s*\%(風\|京\_s*都\_s*立\_s*科\_s*学\_s*技\_s*術\_s*大\_s*学\)\|(\_s*株\_s*)\|称\_s*子\|贏\_s*ち\_s*得\|歩\_s*兵\|恁\_s*く\|杜\_s*\%(若\|父\_s*魚\)\|梅\_s*花\_s*皮\|頴\_s*田\|膾\_s*炙\|ノ\_s*\%([ブウ]\|ー\_s*ン\|ッ\_s*\%([トク]\|テ\_s*ィ\_s*ン\_s*グ\|カ\_s*ー\|キ\_s*ン\_s*グ\)\)\|ナ\_s*\%(ッ\_s*\%(ク\|プ\_s*\%(サ\_s*ッ\_s*ク\|ザ\_s*ッ\_s*ク\)\)\|レ\_s*ッ\_s*ジ\|イ\_s*[フトツ]\)\|ニ\_s*\%(ー\|ッ\_s*\%(ト\|テ\_s*ィ\_s*ン\_s*グ\)\)\|ホ\_s*\%(ー\_s*\%(ミ\_s*ー\|メ\_s*イ\)\|メ\_s*イ\_s*ニ\)\|フ\_s*\%(ビ\_s*ラ\_s*イ\|ル\_s*シ\_s*チ\_s*ョ\_s*フ\)\|ハ\_s*\%(ン\|ラ\_s*シ\_s*ョ\_s*ー\|ー\_s*ン\|バ\_s*ロ\_s*フ\_s*ス\_s*ク\|ル\_s*ツ\_s*ー\_s*ム\|チ\_s*ャ\_s*ト\_s*ゥ\_s*リ\_s*ア\_s*ン\)\|P\_s*\%(i\_s*p\_s*e\_s*r\_s*a\_s*\%(l\_s*e\_s*s\|c\_s*e\_s*a\_s*e\)\|a\_s*p\_s*a\_s*v\_s*e\_s*r\_s*a\_s*l\_s*e\_s*s\|o\_s*\%(d\_s*o\_s*s\_s*t\_s*e\_s*m\_s*o\_s*n\_s*a\_s*l\_s*e\_s*s\|t\_s*a\_s*s\_s*s\_s*i\_s*u\_s*m\)\)\)', + \ 'L' : '\%([ォォぉェェぇゥゥぅィィぃァァぁ<≪_ ̄≦李左←∃∨¬∀⊃ルL∧レラ£ЛλлΛL]\|ッ\_s*[ォェゥィァ]\|ッ\_s*[ォェゥィァ]\|っ\_s*[ぉぇぅぃぁ]\|液\_s*晶\|最\_s*小\_s*2\_s*乗\_s*法\|\.\_s*\.\_s*\.\|拉\_s*薩\|l\_s*-\_s*メ\_s*ン\_s*ト\_s*ー\_s*ル\|l\_s*i\_s*s\_s*p\_s*e\_s*r\|聯\_s*想\|補\_s*題\|檸\_s*檬\|手\_s*紙\|学\_s*習\|施\_s*錠\|局\_s*所\|論\_s*理\|ロ\_s*\%([キイアロリブボトメウスコゴグー]\|ペ\_s*ス\|ワ\_s*ー\_s*ル\|エ\_s*ベ\|ヨ\_s*ラ\|フ\_s*ト\|ル\_s*カ\|ベ\_s*リ\_s*ア\|ビ\_s*\%(ー\|ン\_s*グ\|イ\_s*\%(ス\_s*ト\|ン\_s*グ\)\)\|テ\_s*ィ\|サ\_s*ン\_s*\%(ジ\_s*ェ\_s*ル\_s*ス\|ゼ\_s*ル\_s*ス\)\|ニ\_s*ー\|ク\_s*リ\_s*ア\_s*ン\|ッ\_s*\%([ジタテトク]\|キ\_s*\%(ン\_s*グ\|ー\_s*ド\)\|カ\_s*ー\)\|ケ\_s*ー\_s*\%([トタル]\|シ\_s*ョ\_s*ン\)\|カ\_s*ー\_s*ル\|ガ\_s*ー\|ギ\_s*ン\_s*グ\|ジ\_s*\%(ー\|テ\_s*ッ\_s*ク\|ス\_s*テ\_s*ィ\_s*\%(ク\|ッ\_s*ク\)\|カ\_s*ル\|ク\_s*ー\_s*ル\|ッ\_s*[トク]\)\|ラ\_s*ン\|ン\_s*\%([ゴグダ]\|ボ\_s*\%(ク\|ッ\_s*ク\)\|バ\_s*ル\_s*デ\_s*ィ\|ズ\_s*デ\_s*ー\_s*ル\|リ\_s*[ーィ]\|ジ\_s*ン\|ド\_s*ン\)\|レ\_s*\%(ア\_s*ル\|ッ\_s*タ\|ー\_s*ヌ\|イ\_s*ン\|ン\_s*\%([ソス]\|ツ\_s*ォ\)\)\)\|\\\_s*L\_s*a\_s*T\_s*e\_s*X\|研\_s*究\_s*室\|リ\_s*\%([ィセズザサスダポルラリマナノンヌブアー]\|ャ\_s*マ\|ヤ\_s*ド\_s*ロ\|ヨ\_s*ン\|ゾ\_s*チ\_s*ー\_s*ム\|コ\_s*\%(リ\_s*ス\|ピ\_s*ン\)\|ク\_s*ー\_s*ド\|カ\_s*\%(ー\|オ\_s*ン\)\|ジ\_s*[ンー]\|デ\_s*[ィル]\|ド\_s*カ\_s*イ\_s*ン\|プ\_s*ト\_s*ン\|パ\_s*ー\_s*ゼ\|グ\_s*\%(ニ\_s*ン\|ナ\_s*ン\)\|フ\_s*\%([エト]\|タ\_s*ー\|テ\_s*ィ\_s*ン\_s*グ\)\|テ\_s*ラ\_s*[ルシ]\|チ\_s*ウ\_s*ム\|ソ\_s*\%(ソ\_s*ー\_s*ム\|グ\_s*ラ\_s*フ\_s*ィ\)\|タ\_s*ー\|ト\_s*\%([レル]\|マ\_s*ス\|ア\_s*ニ\_s*ア\|グ\_s*ラ\_s*フ\|バ\_s*ル\_s*ス\_s*キ\_s*ー\)\|オ\_s*\%(タ\_s*ー\_s*ル\|ネ\_s*ル\)\|ミ\_s*\%(テ\_s*ッ\_s*ド\|ッ\_s*[タト]\)\|モ\_s*\%(ー\_s*ジ\_s*ュ\|ネ\_s*ン\|ン\_s*チ\_s*ェ\_s*ッ\_s*ロ\)\|ム\_s*ジ\_s*ン\|キ\_s*\%(ッ\_s*ド\|ュ\_s*ー\_s*ル\|テ\_s*ン\_s*\%(シ\_s*ュ\_s*タ\_s*イ\_s*ン\|ス\_s*タ\_s*イ\_s*ン\)\)\|エ\_s*\%(ゾ\_s*ン\|ー\_s*ジ\_s*ュ\)\|ヒ\_s*テ\_s*ン\_s*シ\_s*ュ\_s*タ\_s*イ\_s*ン\|ネ\_s*\%([アン]\|ッ\_s*ト\|ー\_s*ジ\_s*ュ\)\|ニ\_s*ア\|ベ\_s*\%([ロラ]\|リ\_s*ア\|レ\_s*ー\_s*シ\_s*ョ\_s*ン\|ル\_s*テ\)\|ビ\_s*\%([アー]\|ド\_s*ー\|ン\_s*グ\)\|ュ\_s*\%([スー]\|ブ\_s*リ\_s*ャ\_s*ー\_s*ナ\|リ\_s*ュ\|ド\_s*ミ\_s*ラ\|ク\_s*サ\_s*ン\_s*ブ\_s*ー\_s*ル\|ッ\_s*ク\|シ\_s*ア\_s*ン\|ミ\_s*エ\_s*ー\_s*ル\)\|ロ\_s*\%(イ\|ン\_s*グ\_s*ウ\_s*ェ\)\|ヴ\_s*\%(ィ\_s*ン\_s*グ\_s*ス\_s*ト\_s*ン\|ァ\_s*\%(プ\_s*ー\_s*ル\|イ\_s*ア\_s*サ\_s*ン\)\)\|バ\_s*\%(テ\_s*ィ\|タ\_s*リ\_s*ア\_s*\%(ン\|ニ\_s*ズ\_s*ム\)\|プ\_s*ー\_s*ル\|イ\_s*ア\_s*サ\_s*ン\)\|ッ\_s*\%([ドピプタクチト]\|ス\_s*ン\)\)\|エ\_s*ル\)', + \ 'M' : '\%([モ脆醪師諸催靄舫腿銛杜森捫聞匁紋問玩翫擡齎靠凭鵙鴃縺悶樅籾椛楓蛻濳潛艾潜殯黐餠用糯餅桃者懶專専物尤勿畚許故悖旧戻下乖求礎素基本元綟捩文默沐杢黙芒网莽檬罔耗耄朦魍艨矇濛曚亡蒙毛孟猛網漏裳望喪揉持母燃若藻以摸楙貰洩姆保茂模糢もメ麪緜眄緬麺門棉綿面蓍珎珍♀娶貭粧妾牝瞽盲娚暈繞萌惠慈恵萠溟暝滅謎姪瞑盟酩銘鳴芽睨召奴瑪碼賞減雌女めム羣榁室簇屯邨連邑叢村紫梅葎宜憤葮毳槿椋酬報尨骸躯旨難睦酷麥麦邀対百迎昔虚空鞅宗棟胸掬娘結笞鞭徒蝕蠧蠹蟲席莚蓆寧筵虫毟貉狢豸貪壻聟婿无謀霧矛毋無鵡夢梦剥六群牟務蒸噎武向咽むミ渠霙溝妊澪薨岑嶺峰峯亂紊婬淫妄濫猥乱◇※■*簔穣簑蓑醜儖慘短惨幹研耳壥廛店操陵鶚崎岬巫尊敕勅詔>」砌頻汀→】』右翠碧緑認幣蹊径倫導途通路道瞠髻鬟湖自蹼蛟瑞癸禊晦漲源鏖港湊南櫁瞶謐水調貢密甕帝蜜覩幸脉脈韮韭竓粍瓱榠螟茗名妙命冥都宮罠閔皆眠明民魅深觀身實彌観己診看味美盈三御充稔視壬巳靡弥箕みマ毬鞠紕蝮麿転稀賓客檀繭黛眉囘巡周防衛衞護守荳菽豆槫・圓.◯°゜。)(丸鬘謾幡縵懣鰻幔蹣蔓瞞卍饅漫滿慢迄笆貧幻瞼蔟疎眩回廻設申儲招繚統纒的蟶孫彎弯籬擬免猿亮純信実委罷壗侭圸飯儘継随髷任蒭芻耙紛鮪見猯塗斈學眥眦眼俎愛学斑枡斗鱒舛升桝萬蠱呪薪槙槇牧窗惑悗円窓甼襠区街町前複亦俣叉跨全瞬木胯股又鍖枕膜幕參眛参瑁詣妹哩迷枚米賄賂埋昧邁毎秣靺抹沫枩奉祀纏祭睫末大秀太勝柾弄優成盛將松匡鉞賢征誠昌希将政正仁雅媽万俟茉満目先麼未卷散磨枉眞益真増負蒔坐交馬捲舞嘛雑在放墹痲撒待播間摩敗巻混曲魔ま光月♪♭♯ム⊃∴≦∞÷≫≧≪⌒±∈∀⊂∬∫∝∨∽Δ¬⇒⊥∃∠∧⊆⇔∵≡∩×⊇∂∋≠√∪∇≒♂曼麻◎〇○●モM〒′−マ最ミМΜμメM]\|ッ\_s*[モメムミマ]\|ッ\_s*[モメムミマ]\|っ\_s*[もめむみま]\|双\_s*\%([手墨親]\|向\_s*き\|差\_s*し\)\|蜀\_s*黍\|唐\_s*土\_s*\%(書\|文\_s*字\)\|両\_s*\%([角親刃]\|差\_s*し\)\|楊\_s*梅\_s*皮\|主\_s*水\|旺\_s*角\|紅\_s*[絹染葉]\|強\_s*請\|虎\_s*落\|痘\_s*瘡\|莫\_s*斯\_s*科\|固\_s*よ\_s*り\|一\_s*徳\|O\_s*l\_s*e\_s*a\_s*l\_s*e\_s*s\|惘\_s*然\|乙\_s*張\|赤\_s*目\_s*魚\|針\_s*孔\|妻\_s*[君合沼]\|墨\_s*西\_s*哥\|鍍\_s*金\|繍\_s*眼\_s*児\|夫\_s*婦\|乳\_s*母\|布\_s*の\_s*子\|没\_s*\%([薬後入却有]\|義\_s*道\|食\_s*子\)\|B\_s*\%(e\_s*r\_s*b\_s*e\_s*r\_s*i\_s*d\_s*a\_s*c\_s*e\_s*a\_s*e\|i\_s*o\_s*r\_s*r\_s*a\_s*g\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\)\|浮\_s*腫\|6\_s*日\|6\_s*日\|崇\_s*田\|刀\_s*背\|襁\_s*褓\|零\_s*余\_s*子\|蜈\_s*蚣\|産\_s*霊\|息\_s*子\|k\_s*\$\_s*_\_s*{\_s*i\_s*n\_s*f\_s*}\_s*\$\|蚯\_s*蚓\|A\_s*\%(b\_s*i\_s*e\_s*s\|p\_s*e\_s*t\_s*a\_s*l\_s*a\_s*e\|c\_s*r\_s*o\_s*s\_s*t\_s*i\_s*c\_s*h\_s*u\_s*m\)\|山\_s*陵\|雎\_s*鳩\|親\_s*王\|嬰\_s*児\|亨\_s*治\|陸\_s*奥\|皇\_s*[子女國]\|3\_s*[つ日]\|3\_s*[つ日]\|角\_s*[鴟子髪]\|七\_s*寸\|鳩\_s*尾\|鷦\_s*鷯\|孤\_s*児\|凝\_s*視\|兎\_s*唇\|R\_s*u\_s*t\_s*a\_s*l\_s*e\_s*s\|神\_s*[子輿酒]\|苗\_s*字\|海\_s*[雲蘊藻布蜂松山]\|P\_s*o\_s*d\_s*o\_s*p\_s*h\_s*y\_s*l\_s*l\_s*a\_s*c\_s*e\_s*a\_s*e\|土\_s*[龍竜産]\|京\_s*都\|横\_s*浜\_s*マ\_s*リ\_s*ノ\_s*ス\|忠\_s*実\|肉\_s*刺\|翻\_s*\%(筋\_s*斗\|車\_s*魚\)\|H\_s*a\_s*m\_s*a\_s*m\_s*e\_s*l\_s*i\_s*d\_s*a\_s*l\_s*e\_s*s\|不\_s*\%(味\|見\_s*[転点]\)\|兇\_s*々\|凶\_s*鳥\|澗\_s*潟\|勾\_s*玉\|禍\_s*[々禍言事]\|況\_s*し\|澳\_s*門\|苧\_s*麻\|茅\_s*台\_s*酒\|丈\_s*夫\|倍\_s*達\|微\_s*[塵妙睡]\|燐\_s*寸\|驀\_s*地\|L\_s*o\_s*g\_s*a\_s*n\_s*i\_s*a\_s*c\_s*e\_s*a\_s*e\|豫\_s*て\|陪\_s*臣\|売\_s*僧\|C\_s*\%(a\_s*s\_s*u\_s*a\_s*r\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\|e\_s*r\_s*a\_s*t\_s*o\_s*p\_s*y\_s*l\_s*l\_s*a\_s*c\_s*e\_s*a\_s*e\)\|S\_s*\%(a\_s*p\_s*i\_s*n\_s*d\_s*a\_s*l\_s*e\_s*s\|c\_s*h\_s*i\_s*s\_s*a\_s*n\_s*d\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\)\|理\_s*[之元]\|允\_s*彦\|祐\_s*史\|晶\_s*子\|公\_s*[美則輝]\|斉\_s*加\_s*年\|方\_s*夫\|多\_s*言\_s*語\_s*化\|m\_s*-\_s*R\_s*N\_s*A\|ニ\_s*ー\_s*モ\_s*ニ\_s*ッ\_s*ク\|単\_s*量\_s*体\|会\_s*議\|和\_s*布\_s*[刈蕪]\|中\_s*間\_s*子\|薄\_s*荷\_s*脳\|行\_s*[幸列]\|写\_s*像\|日\_s*\%(米\_s*相\_s*互\_s*防\_s*衛\_s*援\_s*助\_s*協\_s*定\|本\_s*製\)\|m\_s*\%(u\_s*l\_s*t\_s*i\_s*l\_s*i\_s*n\_s*g\_s*u\_s*a\_s*l\_s*i\_s*z\_s*a\_s*t\_s*i\_s*o\_s*n\|i\_s*\%(c\_s*r\_s*o\|l\_s*l\_s*i\)\|e\_s*\%(g\_s*a\|z\_s*z\_s*o\_s* \_s*\%(f\_s*o\_s*r\_s*t\_s*e\|p\_s*i\_s*a\_s*n\_s*o\)\)\|a\_s*\%(k\_s*e\_s*フ\_s*ァ\_s*イ\_s*ル\|d\_s*e\_s* \_s*i\_s*n\_s* \_s*J\_s*a\_s*p\_s*a\_s*n\)\)\|計\_s*算\_s*機\|手\_s*紙\|ザ\_s*ッ\_s*ヘ\_s*ル\_s*=\_s*マ\_s*ゾ\_s*ッ\_s*ホ\|嗜\_s*虐\_s*的\_s*趣\_s*味\|被\_s*虐\_s*\%(淫\_s*乱\_s*症\|趣\_s*味\)\|修\_s*士\|仮\_s*面\|移\_s*送\|エ\_s*ム\)', + \ 'N' : '\%([ノ麕咒燧烽詛呪悳孔伯朔弼雅教糊矩憲規哲宜紀範典惟亘修允攵展順暢信則法後罵吭咽喉鑿蚤々湾宣曰臨覘稀望覗遺殘残鋸芒禾騰幟昇登上簷檐軒遁逸衲瑙碯曩王皇腦嚢膿能脳農野伸嚥−陳除濃熨飲退飮延載之呑廼乘乗述埜のネ塒姉聹侫檸嚀濘寧佞鼡鼠拗猫嫉妬希願捏熱犒労葱狙閨睡棔眠然稔棯懇拈撚燃念年根寝音涅子捻禰袮練値錬粘捩祢寢嶺煉ねヌ絖饅垈帛幣鵺主蛻拭温布沼盜偸窃盗抽擢緯糠額縫抜貫拔怒奴塗濡脱ぬニ楡蒻潦鷄鶏瀑庭繞獰女尿韭眈薤睨韮儿刄姙葫蒜刃忍∀妊認任人乳擔蜷担濁賑握俄鳰臭匂沸錵贄偐僞贋偽柔靤如苦膠霓滲虹躙廿》《◎∬『』悪憎兄螺鯡鰊錦西入新肉‖岻仁逃似邇弍荷貳弐2二尼迩煮2丹貮児迯にナ靡抔嫐嬲鯆屶釶鉈泥薺詰若慨歎嘆抛擲撲毆殴慰治癒等猶直泪波辺邉邊鍋浪某棘棗懷懐夏擦梨情懶譌艶訛鉛鯰癜鮠膾鱠韲憖怠鈍腥捺准準擬凖謎涙洋宥傾灘詠霖眺痼乍存流轅永和梛椥渚長莫毋勿半・媒仲中7斜七蔑乃尚内繩畷縄苗滑鞣惱悩就哉也斉形業徳娚垂喃∵楠爾尓汝男軟難何倣肄双枹均列柞→⇒⊃楢習嘗投爲綯啾啼熟那鳴泣慣生為儺舐菜奈涕並納痿嚶撫茄凪無哭做狎南萎竝魚娜薙亡馴拿失な┘┛│┃┨┫┤┥┣┝├┠╋┿╂┼成#∋∇名┗└日≒ニネN¬〜≠ナヌノнνΝНN]\|ッ\_s*[ノネヌニナ]\|ッ\_s*[ノネヌニナ]\|っ\_s*[のねぬにな]\|帳\_s*面\|狼\_s*[烟煙]\|惚\_s*気\|暖\_s*[簾気]\|礼\_s*江\|功\_s*晶\|賀\_s*子\|訓\_s*子\|祈\_s*子\|式\_s*部\_s*省\|記\_s*代\|倫\_s*[明子宗]\|敬\_s*之\|賭\_s*弓\|誠\_s*也\|敦\_s*子\|悦\_s*旦\|祝\_s*[女詞]\|仰\_s*け\_s*反\|盧\_s*泰\_s*愚\|逆\_s*上\|凌\_s*霄\_s*花\|姐\_s*さ\_s*ん\|杜\_s*松\|強\_s*請\|合\_s*歓\|微\_s*温\|零\_s*余\_s*子\|酸\_s*漿\|鐃\_s*鉢\|鰾\_s*膠\|I\_s*I\_s*部\|耳\_s*根\|面\_s*皰\|M\_s*y\_s*r\_s*i\_s*s\_s*t\_s*i\_s*c\_s*a\_s*c\_s*e\_s*a\_s*e\|莞\_s*爾\|L\_s*e\_s*a\_s*d\|P\_s*b\|海\_s*[苔鼠]\|C\_s*\%(e\_s*l\_s*a\_s*s\_s*t\_s*r\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|a\_s*r\_s*y\_s*o\_s*p\_s*h\_s*y\_s*l\_s*l\_s*a\_s*l\_s*e\_s*s\)\|雪\_s*崩\|竹\_s*節\_s*虫\|7\_s*[日個]\|地\_s*震\|行\_s*[木方]\|大\_s*\%(蒜\|理\_s*石\)\|蛞\_s*蝓\|弱\_s*竹\|追\_s*儺\|済\_s*\%(し\_s*崩\|り\_s*物\)\|可\_s*成\|平\_s*城\|不\_s*成\|空\_s*リ\_s*ス\_s*ト\|T\_s*h\_s*e\_s* \_s*N\_s*e\_s*t\_s*w\_s*o\_s*r\_s*k\_s* \_s*I\_s*n\_s*f\_s*o\_s*r\_s*m\_s*a\_s*t\_s*i\_s*o\_s*n\_s* \_s*C\_s*e\_s*n\_s*t\_s*e\_s*r\|S\_s*o\_s*\%(l\_s*a\_s*n\_s*a\_s*l\_s*e\_s*s\|d\_s*i\_s*u\_s*m\)\|n\_s*\%(個\|次\_s*元\|e\_s*m\_s*a\_s*c\_s*s\)\|紐\_s*育\|フ\_s*ォ\_s*ン\_s*・\_s*ノ\_s*イ\_s*マ\_s*ン\|ヤ\_s*ー\_s*ノ\_s*ッ\_s*シ\_s*ュ\_s*・\_s*フ\_s*ォ\_s*ン\_s*・\_s*ノ\_s*イ\_s*マ\_s*ン\|オ\_s*ラ\_s*ン\_s*ダ\|ア\_s*メ\_s*リ\_s*カ\_s*ネ\_s*ッ\_s*ト\_s*ワ\_s*ー\_s*ク\|番\_s*号\|節\_s*点\|夜\_s*想\_s*曲\|n\_s*\%(次\|a\_s*n\_s*o\|o\_s*t\_s* \_s*o\_s*r\)\|諾\_s*威\|正\_s*常\|エ\_s*ヌ\|窒\_s*素\)', + \ 'O' : '\%([オ俺游泳指妖畢在澱檻氈拇親愚疎颪卸念錘惟慮赴徐趣俤羈主想表重面瘟隱園Å怨♀妾温恩悍鈍臣覺溺朦朧思覚榲現朮桶威嚇踴戯縅棘駭愕驚躍踊傲奢驕嚴厳痴遣瘧怒行怠蒹補荻懼惧獺虞怐畏恐襲甥笈及綬葹ヽゞ〃仝ゝヾ々同唖繦襁鴛鴦教几忍筬收兎抑稚長幼理収治修遲檍納後遅饋賻諡贈送憶袵臆拜拝峻侵奇冒犯崗阜陵岳女陸丘岡欄斧自己各戦鬼衰劣囮頤訪貶乙漢♂音弟阿脅怯首夥誘屋膃億穩穏煽熈煕熾燠諚掟興隠沖翁鴬澳嚶毆泓浤惶罌瓮泱閘蓊墺悒凰殃徃奧秧襖枉姶鸚懊媼嫗鴎怏鏖謳旺凹櫻鴨樗欒楝殴朷甌汪横往鞅歐嘔陷陥遠果応掩蔽應夛奄蓋概欧公邑麋薤被仰扇皇狼弁鵬鴻鳳黄奥多衽覆粱凡鰲頁王穂怖桜壓緒居起降落墮将帶麻央小牡勇捺圧措唹織追悪苧汚下御置帯生折朗於負郎擱押推雄塢老男夫逐墜尾惜嗚乎堕終淤お大◎∞和∝♪∪∨開O○ωΟОオΩοоO]\|濠\_s*太\_s*剌\_s*利\|父\_s*[娘子]\|母\_s*[娘子屋]\|万\_s*年\_s*青\|本\_s*懸\_s*魚\|玩\_s*具\|沢\_s*瀉\|A\_s*l\_s*i\_s*s\_s*m\_s*a\_s*t\_s*a\_s*l\_s*e\_s*s\|厭\_s*離\|乳\_s*母\_s*日\_s*傘\|陰\_s*[陽地]\|飲\_s*[食酒]\|慍\_s*色\|婦\_s*系\_s*図\|手\_s*術\|螻\_s*蛄\|十\_s*八\_s*番\|鉄\_s*漿\|海\_s*髪\_s*海\_s*苔\|虎\_s*魚\|花\_s*魁\|美\_s*味\|含\_s*羞\_s*草\|白\_s*粉\|渡\_s*島\|訳\_s*語\|通\_s*事\|晩\_s*[稲生]\|可\_s*笑\|惡\_s*寒\|傍\_s*[目惚見]\|叔\_s*[父母]\|伯\_s*[父母]\|姨\_s*捨\|少\_s*女\|侠\_s*気\|D\_s*i\_s*l\_s*l\_s*e\_s*n\_s*i\_s*a\_s*l\_s*e\_s*s\|G\_s*u\_s*t\_s*t\_s*i\_s*f\_s*e\_s*r\_s*a\_s*l\_s*e\_s*s\|H\_s*y\_s*p\_s*e\_s*r\_s*i\_s*c\_s*a\_s*l\_s*e\_s*s\|霊\_s*屋\|蝌\_s*蚪\|飫\_s*肥\|佩\_s*物\|良\_s*人\|纓\_s*田\|C\_s*o\_s*p\_s*t\_s*i\_s*d\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|鷹\_s*揚\|椀\_s*飯\_s*振\_s*\%(舞\|る\_s*舞\)\|相\_s*知\|鶯\_s*語\|近\_s*江\|零\_s*落\|越\_s*[生訴智知度]\|彼\_s*方\|祖\_s*[神父母]\|車\_s*前\|従\_s*祖\_s*[母父]\|青\_s*[梅海木]\|太\_s*\%(田\|安\_s*万\_s*侶\|上\_s*天\_s*皇\)\|巨\_s*頭\|逢\_s*[魔瀬隈坂]\|そ\_s*の\_s*他\|承\_s*知\_s*し\_s*ま\_s*し\_s*た\_s*\.\|烏\_s*[滸龍]\|t\_s*h\_s*e\_s* \_s*O\_s*b\_s*j\_s*e\_s*c\_s*t\_s* \_s*M\_s*a\_s*n\_s*a\_s*g\_s*e\_s*m\_s*e\_s*n\_s*t\_s* \_s*G\_s*r\_s*o\_s*u\_s*p\|立\_s*石\_s*電\_s*機\|職\_s*業\|楕\_s*円\|ウ\_s*\%(ィ\|ー\_s*\%(ズ\|ロ\_s*ン\)\|ロ\_s*ボ\_s*ロ\_s*ス\)\|出\_s*力\|ア\_s*\%(ワ\|ザ\_s*ー\|ウ\_s*\%([チト]\|タ\_s*ー\)\)\|基\_s*本\_s*ソ\_s*フ\_s*ト\_s*ウ\_s*ェ\_s*ア\|一\_s*\%(昨\_s*[年日]\|対\_s*一\)\|ワ\_s*ン\|ま\_s*た\_s*は\|論\_s*理\_s*和\|聖\_s*譚\_s*曲\|水\_s*中\_s*酸\_s*素\_s*破\_s*壊\_s*剤\|蛋\_s*白\_s*石\|最\_s*適\_s*化\|歌\_s*劇\|演\_s*算\_s*子\|操\_s*作\|酸\_s*素\)', + \ 'P' : '\%([本磅椪烹方砲報法舖歩舗ぽ併蔽閇閉×邊編片邉辺遍篇屁ぺ幅服風分布符腐泌匹憑票俵品筒平日版幇搬板犯腹払発發走箱朴駮博拍泊愽包放敗杯盃配牌八播波破羽張ぱ鉛ψΨぴ±+ぷφΦ┣├∝北┴‰P.%£〒点・プポ頁)(∂¶‖ペパПπピпΠ燐P]\|ッ\_s*\%(ホ\_s*゚\|ヘ\_s*゚\|フ\_s*゚\|ヒ\_s*゚\|ハ\_s*゚\)\|ッ\_s*[ポペプピパ]\|っ\_s*[ぽぺぷぴぱ]\|ホ\_s*゚\|先\_s*斗\_s*町\|ヘ\_s*゚\|祕\_s*[露魯]\|フ\_s*゚\|釜\_s*山\|普\_s*魯\_s*西\|ヒ\_s*゚\|皮\_s*蛋\|光\_s*一\|ハ\_s*゚\|麺\_s*麭\|巴\_s*\%(里\|奈\_s*馬\)\|S\_s*y\_s*n\_s*a\_s*n\_s*t\_s*h\_s*a\_s*e\|C\_s*y\_s*c\_s*l\_s*a\_s*n\_s*t\_s*h\_s*a\_s*l\_s*e\_s*s\|排\_s*骨\|B\_s*r\_s*o\_s*m\_s*e\_s*l\_s*i\_s*a\_s*l\_s*e\_s*s\|L\_s*e\_s*a\_s*d\|白\_s*[板酒金]\|シ\_s*\%(ュ\_s*ー\_s*ド\|ロ\_s*シ\_s*ビ\_s*ン\)\|サ\_s*\%(ー\_s*ム\|イ\_s*\%([ズクケコ]\|ロ\_s*シ\_s*ビ\_s*ン\|リ\_s*ウ\_s*ム\|キ\_s*ッ\_s*ク\)\)\|+\_s*α\|ホ\_s*\%(ン\|ス\_s*ゲ\_s*ン\)\|ヒ\_s*ロ\_s*ポ\_s*ン\|比\_s*\%(布\|律\_s*賓\)\|フ\_s*\%(リ\_s*ジ\_s*ア\_s*ン\|レ\_s*\%(ー\_s*\%(ズ\|ジ\_s*ン\_s*グ\)\|イ\_s*ジ\_s*ン\_s*グ\)\|タ\_s*レ\_s*イ\_s*ン\|ォ\_s*\%([ーンノト]\|ボ\_s*ス\|ビ\_s*ア\|ス\_s*フ\_s*ァ\_s*ー\|ニ\_s*ー\)\|ァ\_s*\%(イ\|ラ\_s*オ\|ー\_s*\%([ジマ]\|ミ\_s*ン\_s*グ\)\|ン\_s*\%(ト\_s*ム\|タ\_s*ズ\_s*[ムマ]\)\|ル\_s*[ツス]\|レ\_s*ノ\_s*プ\_s*シ\_s*ス\)\|ィ\_s*\%([ロル]\|ジ\_s*\%(ッ\_s*ク\_s*ス\|カ\_s*ル\)\|ー\_s*ビ\_s*ー\|ッ\_s*シ\_s*ン\_s*グ\|レ\_s*モ\_s*ン\|ラ\_s*デ\_s*ル\_s*フ\_s*ィ\_s*ア\|リ\_s*\%([スーアパ]\|ッ\_s*[プパ]\|ピ\_s*\%(ン\|ー\_s*ヌ\)\)\)\|ェ\_s*\%(ー\_s*\%([ベズ]\|ジ\_s*ン\_s*グ\)\|イ\_s*ズ\|ロ\_s*モ\_s*ン\|ニ\_s*\%(ル\|ッ\_s*ク\_s*ス\|キ\_s*ア\|ー\_s*ル\)\|ノ\_s*\%(キ\_s*シ\|ー\_s*ル\)\)\)\|述\_s*語\|証\_s*明\|タ\_s*ン\_s*パ\_s*ク\_s*質\|処\_s*理\|手\_s*続\_s*き\|進\_s*行\|算\_s*譜\|利\_s*潤\|南\_s*瓜\|公\_s*告\|宣\_s*伝\|真\_s*珠\|永\_s*続\|カ\_s*リ\_s*ウ\_s*ム\|葡\_s*萄\_s*牙\|重\_s*合\_s*体\|多\_s*相\_s*型\|バ\_s*テ\_s*レ\_s*ン\|貼\_s*り\_s*付\_s*け\|論\_s*文\|偏\_s*執\_s*[狂病]\|引\_s*数\|p\_s*\%(T\_s*e\_s*X\|H\_s*メ\_s*ー\_s*タ\|e\_s*\%(t\_s*a\|r\_s*l\_s*ス\_s*ク\_s*リ\_s*プ\_s*ト\)\|i\_s*\%(c\_s*o\|a\_s*n\_s*\%(o\|i\_s*s\_s*s\_s*i\_s*\%(m\_s*o\|s\_s*s\_s*i\_s*m\_s*o\)\)\)\)\|リ\_s*ン\)', + \ 'Q' : '\%([配椪栩櫪椢檪椡橡椚湫櫟含纐柵婚屎糞癖潛潜鵠裹凹窪馘括縊踵跟軛頚珞頸首諄窟鞋履寛狐轡覆靴沓碎砕管条降件頽崩屑葛釘莖茎陸杙株杭掘崛倔鶏鐃藥擽薬樟楠酒髪梳櫛串釧與与挫籖鯀鯨鬮籤隈熊艸嚔藾叢鏈腐鎖種ξΞ臭日茸菌楔草圀邦國国髭嗽漱吻喙嘴脣唇蛇梔劫刧腔φ 空粂皹勳熏裙醺桾皸下薫燻訓勲葷君委钁精詳企鍬加咥銜桑塊某暝競峅眛昏晦罔冥鮓比較闇位鞍藏暗倉廚厨涅〃仝ヽゞヾ々ゝ曇雲蜘栗狂包俥車廓曲郭梍枢踝畔鉄鐵★●■玄蔵黒玖柧供喰苦九枸鳩煦悔焼功倶狗来拘徠吼刳工絎駒朽眩垢口屈窶駈区劬繰呉宮暮貢久嶇來矩奇鉤9酌庫惧躯組衢紅食句吁懼區桍孔驅駆怐瞿汲クくQ”‘’“♪ケ?ク¶Q]\|ッ\_s*ク\|ッ\_s*ク\|っ\_s*く\|姑\_s*娘\|箜\_s*篌\|救\_s*世\|莎\_s*草\|傀\_s*儡\|被\_s*下\_s*度\|百\_s*[濟済]\|果\_s*物\|恭\_s*敬\|長\_s*月\|9\_s*月\|秧\_s*鶏\|究\_s*竟\|釉\_s*掛\|典\_s*薬\_s*寮\|天\_s*鼠\_s*矢\|L\_s*a\_s*u\_s*r\_s*\%(a\_s*c\_s*e\_s*a\_s*e\|o\_s*i\_s*d\_s*e\_s*a\_s*e\)\|探\_s*湯\|誓\_s*湯\|球\_s*磨\|六\_s*合\|地\_s*祇\|都\_s*子\|州\_s*光\|山\_s*梔\_s*子\|崑\_s*央\|群\_s*衆\|慈\_s*姑\|旧\_s*\%(訳\|唐\_s*書\)\|c\_s*r\_s*e\_s*s\_s*c\|水\_s*[鶏母]\|海\_s*月\|内\_s*蔵\_s*助\|K\_s*r\|H\_s*e\_s*l\_s*l\_s*e\_s*b\_s*o\_s*r\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|公\_s*\%([家方卿界美事文]\|出\_s*挙\)\|佝\_s*僂\_s*病\|J\_s*u\_s*g\_s*l\_s*a\_s*n\_s*d\_s*a\_s*l\_s*e\_s*s\|胡\_s*桃\|C\_s*\%(r\|h\_s*r\_s*o\_s*m\_s*i\_s*u\_s*m\)\|R\_s*h\_s*a\_s*m\_s*n\_s*a\_s*l\_s*e\_s*s\|珠\_s*穆\_s*朗\_s*瑪\|チ\_s*ョ\_s*モ\_s*ラ\_s*ン\_s*マ\|『\_s*』\|コ\_s*\%(ー\_s*ラ\_s*ン\|ン\_s*テ\_s*ィ\_s*フ\_s*ァ\_s*イ\_s*ア\)\|問\_s*合\_s*せ\|カ\_s*\%(ザ\_s*ン\|タ\_s*ー\_s*ル\|ス\_s*バ\|ー\_s*ヌ\_s*ー\_s*ン\|ナ\_s*ー\_s*ト\|ダ\_s*フ\_s*ィ\|リ\_s*テ\|ド\_s*リ\_s*ー\_s*[ユル]\|ル\_s*\%(チ\_s*[ェエ]\|テ\_s*\%(ィ\_s*エ\|ッ\_s*ト\)\)\|ン\_s*タ\_s*[ムスン]\)\|質\_s*問\|キ\_s*\%(ト\|ブ\_s*ラ\|ホ\_s*ー\_s*テ\|ハ\_s*ー\_s*ダ\|ル\_s*\%(ト\|テ\_s*ィ\_s*ン\_s*グ\)\|ー\_s*ン\|ノ\_s*ン\|ッ\_s*シ\_s*ュ\|ュ\_s*\%(ー\|エ\_s*リ\)\)\)', + \ 'R' : '\%([ロ侖崙崘堽栄論祿漉轆碌肋勒麓禄鹿6録弄榔薐勞琅實樓焜瓏潦簍僂咾鑞柆螂臈槞瑯哢隴朖蘢螻滝朧壟撈臘郎瘻廊牢浪蝋癆聾楼篭籠狼漏朗轤瀘廬櫓櫨艪顱驢蕗鷺鹵蘆枦櫚炉輅艫滷臚爐賂髏ろレ洌澪蛉儷犁勵鴒齢苓綟砺囹糲唳聆〇蛎齡蠡黎羚戻禮祈隸茘麗玲隷伶癘励零冷例冽劣烈裂列靂檪癧轣鬲櫪瀝礫轢歴濂戀匳嗹奩斂鏈瀲漣鎌縺輦簾櫺∧聨憐恋蓮煉錬攣練聯廉連れル♪路盧縲泪壘瘰誄涙羸塁累類縷璢鏤屡褸婁陋るリ犂篥葎率慄栗勠淕六戮陸律擽畧暦掠略澑苙嶐瀏鏐瑠窿餾鉚旒瘤畄霤嚠笠榴溜硫琉留立柳粒劉隆流躪藺醂痳棆懍鄰菻躙鈴廩麟P淪厘凜霖琳悋綸淋禀稟凛鱗倫吝隣林燐臨絽踉侶梠膂虜呂慮仂力緑魎粮獵靈粱裲倆怜輌鷯繆廖凉鬣椋楞崚嶺暸兩鐐蓼輛燎瞭聊陵令梁糧諒霊遼凌龍漁亮寮⇔涼撩繚綾療竜量菱僚領了寥稜喨両料閭旅璃籬履釐悧裏梨俚里離浬莅驪痢李哩罹俐漓吏利裡詈理莉りラΛλ婪儖繿纜嬾覧瀾臠亂檻欒欖攬籃襴巒覽襤懶爛藍鸞卵濫闌嵐欄乱蘭労剌溂老埓埒猟辣薤喇珞樂犖絡駱酪烙楽落洛徠醴罍櫑耒賚蕾籟擂儡莱磊癩來礼雷頼来螺拉裸們良蘿騾等邏鑼ら右→ДжАГБФдзъЧйёЗкНЖьЭцТУСвюЮЁЯЪЛВбХМмЦоынИэа露епЕЬКПЩсчщя魯ШглушЫхОитфЙ輪√根羅ロ々RラルレリРρрΡR]\|ッ\_s*[ロレルリラ]\|ッ\_s*[ロレルリラ]\|っ\_s*[ろれるりら]\|鱸\_s*魚\|芦\_s*[有花]\|濾\_s*[胞過紙]\|水\_s*無\_s*月\|6\_s*[時月]\|檸\_s*檬\|坩\_s*堝\|C\_s*\%(a\_s*l\_s*y\_s*c\_s*a\_s*n\_s*t\_s*h\_s*a\_s*c\_s*e\_s*a\_s*e\|h\_s*o\_s*r\_s*i\_s*p\_s*e\_s*t\_s*a\_s*l\_s*a\_s*e\)\|A\_s*\%(c\_s*t\_s*a\_s*e\_s*a\|p\_s*o\_s*p\_s*e\_s*t\_s*a\_s*l\_s*a\_s*e\)\|鯉\_s*[魚城]\|二\_s*\%(索\|翻\_s*縛\)\|V\_s*e\_s*r\_s*t\_s*i\_s*c\_s*i\_s*l\_s*l\_s*a\_s*t\_s*a\_s*e\|O\_s*r\_s*c\_s*h\_s*i\_s*d\_s*a\_s*l\_s*e\_s*s\|M\_s*i\_s*c\_s*r\_s*o\_s*s\_s*p\_s*e\_s*r\_s*m\_s*a\_s*e\|L\_s*\%([ruia]\|e\_s*i\_s*t\_s*n\_s*e\_s*r\_s*i\_s*a\_s*l\_s*e\_s*s\|A\_s*N\_s*ケ\_s*ー\_s*ブ\_s*ル\)\|海\_s*獺\|G\_s*\%(e\_s*n\_s*t\_s*i\_s*a\_s*n\_s*a\_s*l\_s*e\_s*s\|y\_s*\%(n\_s*a\_s*n\_s*d\_s*r\_s*a\_s*e\|m\_s*n\_s*o\_s*s\_s*p\_s*e\_s*r\_s*m\_s*a\_s*e\)\)\|関\_s*係\_s*デ\_s*ー\_s*タ\_s*ベ\_s*ー\_s*ス\|数\_s*理\_s*解\_s*析\_s*研\_s*究\_s*所\|京\_s*都\_s*大\_s*学\_s*数\_s*理\_s*解\_s*析\_s*研\_s*究\_s*所\|東\_s*北\_s*大\_s*\%(通\_s*研\|学\_s*電\_s*気\_s*通\_s*信\_s*研\_s*究\_s*所\)\|電\_s*気\_s*通\_s*信\_s*研\_s*究\_s*所\|限\_s*定\_s*命\_s*令\_s*セ\_s*ッ\_s*ト\_s*計\_s*算\_s*機\|範\_s*囲\|規\_s*則\|紅\_s*玉\|r\_s*u\_s*b\_s*y\_s*ス\_s*ク\_s*リ\_s*プ\_s*ト\|要\_s*求\|検\_s*索\|復\_s*帰\|返\_s*[信事]\|拒\_s*否\|反\_s*射\_s*鏡\|参\_s*\%(考\_s*文\_s*献\|照\_s*型\)\|機\_s*能\_s*回\_s*復\_s*訓\_s*練\|再\_s*帰\_s*的\|認\_s*識\|正\_s*規\_s*表\_s*現\|ア\_s*ー\_s*ル\)', + \ 'S' : '\%([ソ似杣灌傍峙毓育具供備害底苑薗園儲貮酘妬埆埣譏讒詆誹謗濡外猝率喞熄仄息足促束測側赱澡鯵嗾掫筝竃裝弉髞瀧勦輳嗽搶蔟爭偬瘡窗菷葱剏梍壯竈譟崢蚤笊嫂薮雙帚叟諍屮滝槽贈湊箱艘愡甑箒艚抓燥樔奘懆歃孀窓踪匝噪遭艙爪糟莊倉怱曹匆淙繰宋漕簇槍躁鎗箏綜痩喪藻艸葬壮操掻掃奏蹌滄争草層創蒼叢僧走惣送叛乖抑諳某橇轌艝拵噂巽邨鱒忖蹲樽孫遜存尊損噌其反踈組粗租胙俎礎爼詛麁囎蔬姐塑甦疎副措訴愬疽酥逸鼡沮蘓徂沿阻齟疏祖鼠咀想祚そセ芹鬩槧羶甎揃倩翦箋燹濺苫栫槫孱孅簽吮纖湶纎亘筌蟾磚荐茜綫箭舩喘錢專僊贍鐫仟旃痊涎巛銛饌僣氈韆籤沾刋擶舛牋阡濳籖癬潛筅殱殲闡釧賎餞羨顫甅竰糎¢陝銓踐閃潺遷銑栴川剪煽譫僉瞻践栓跣疝詮銭穿戰腺繊僭泉嬋淺擅鮮専潜扇浅蘚船線撰宣洗煎戦千忙伜倅逼蝉旋洩椄卩屑絏鱈泄攝紲緤薛褻浙竊℃窃拙摂接節楔淅蹐績蹠蓆籍磧跡跖關藉晰威迹瘠勣裼晢夕鶺潟碩惜析関席隻情甥躋貰淒婿嘶睛擠撕牲萋菁韲瀞穽齏筬晟掣腥逝惺旌蜻整靖誓制晴競急世堰攻脊丗勢畆糶瀬畝せス鯣鋭坐座李既已昴術辷全滑皇脛臑裾双英村選優営寸漱薦啌勸雪濯啜勧芒薄煤賺鼈捩筋頗丞輔佑亮甫祐介助蘇裔陶曽乃曾即則淳漁凉鑾篶漫硯雀涼鱸鮓鮨遊椙犂犁耒篦隙尽末眇縋管菅頽廢廃窘救掬寡尠糘粭菫速純鈴炭角墨隅】【鄒數菘陬雛芻嵩崇趨樞∝∫∠∞≫∧∋÷⇒∬∃∂∴±∩≒Δ¬∇×∀∈⌒≪≧≠∨∵⇔枢翆榱陲悴隹粹瘁帥騅萃邃錘捶忰誰醉遂膵燧彗綏錐穂炊翠⊥H吹粋推水酔睡掏鋤總巣直簾拗耡醋棲総過饐剃澄籔空透磨壽澂寿統梳喫栖棄据吸擂剥住好漉シ埀謐蕋蘂蕊痺褥茵鵐蔀鷸鴫入霑蔵嶌縞嶋島凋澀沫澁渋縛暫屡荵凌鎬忍慕簧舖↓襪健認随从啝從.舌扱罔θ虐Θ粃秕椎椣卓貎尿肉臠猪榻黙蜆楙誠茂成繁重鋪惻陣頻閾櫁樒汐鹽潮隰瑟嫉櫛蛭蟋疾隲漆躾膝失室沒鎭沈滴雫賤鎮靜顰尓爾確聢併◇◆鹿貭叱征質卯滋撓科品鬼錣鍜錏凝痼而拉設萎栞襞吝咳爲什導怪汁徴験著記印〇○』銀城代『報調蝨濕湿七僕笞楚霜臀退斥尻寫卸者炙冩柘舍暹諜喋煮這謝鯱奢赦捨瀉嚼抉決皙勺釋蜥爍鑠妁斫蹟刳昔芍酌爵折癪笏赤綽灼石尺借赭写鷓積舎車斜釈社蛛株麈諏洙殳娶娵鬚侏銖繻卒菽粥叔俶戚蓿倏蹙槭肅淑夙粛縮取珠殊趣恤蟀卆出鰍繍楢葺溲泅嗅楫酬逎遒緝岫螽萩鷲甃駲楸穐蹤讎售讐洲綉收驟囚舅姑蓚鞦脩輯醜習羞酋聚舟秀祝袖拾啾蒐収執衆襲愁就臭蹴週終褶州宗椶棕守朱撞種修周手首狩須儁皴悛惷蕣雋墫順蠢舜旬竣峻駿逡筍春瞬俊嗔蓁縉蔘鷏忱簪甄鷆寢岑畛矧疹槙齔臻娠譛譖哂脣袗怎晉瀋箴軫榛秦襯診鉐津駸讖紳斟唇針呻蜃賑芯瞋振殿侵辛薪晨辰震宸森伸愼眞慎寝晋身進審深親臣鍼心宍信神藷墅薯杵岨胥蜍黍渚砠處嶼且狙苜苴曙背塩緒枌雎蔗庶処所書暑誚聲橡奬觴舂蛸懾燮厰姓獎枩稍甞韶炒淞陞顳腫井摺嶂橸浹愴星升鍬樅嘗簫慯廂霎庠剿筱鬆秤政訟廠樵鷦礁邵餉愀妝璋湫艢劭峭殤梢將敞醤慫従逍倡竦爿牆墻薔笙樟装肖菖<≦湘誦聳檣稱声裳()蒋蕉嘯慴精霄鈔粧彰悚鏘悄蕭哨瀟焦憔匠鍾償瘴漿頌詔妾沼請衝薑唱庄渉奨牀娼床椒鉦荘翔抄宵傷踵召銷賞猩症昭燒猖昌少憧松捷紹晶尚象承證正将称焼笑照勝招消章詳証鐘硝掌省商昇穡屬稷嗇禝寔稙昃謖軾矚拭餝属燭贖色飾囑嘱織蝕式喰蜀殖初諸埴植食職砥姉摯誣侈髭肆仔及岐址梔咫贄沚旨誌資豕鷙凍厮粢齒雌耜枝齎領篩四祇嗤貲諮巵死強紙熾市師厶妛飼諡祗閇姿駟嗣趾此染締詞茲釶柿覗弛徙至屍嘴斯駛屎占啻之揣如閉錙糸絞孜尸滓獅瓷緊笥始泗咨觜只輜廝使敷恃思帋痴漬脂氏蚩時紫沁俟絲巳祉矢恣若賜次浸詩志識司弑笶翅謚示梓伺視緇自祠史試子痣滲茨肢歯幟祀施竢舐卮耆呰為芝阯しサ杓雨寤鮫清鞘莢觸騷触椹鰆爽騒澤沢濬掠新攫渫杷浚更士桾申白素汕纉潸餐蒜衫讚粲芟爨鑚蠶戔嶄跚驂慘攅斬彡杉秋桑…≡簒纂鯢燦珊繖棧刪卅參蚕鑽算傘3▼▽贊3参賛O散惨産酸嘸摩遉樣彷碍妨様山漣貶蔑垂鮭叫仙鏥寞寥皺淋生鯆虱鯖捌偖扨偵宿禎貞定哘誘蝎蠍授皿祥桟匙簓障囁私篠支捧笹逧迫讃鐸蛹宛真碕嵜尖前崎魁遮峺哢囀候侍核実説俚了達逹暁叡聰敏諭慧哲知訓郷恵聡智悟理杆里小棹竿箚扎刹紮皐撮搜寒捜相主盛盞柧觚杯盃榮栄倒肴魚界阪堺境酒泝逆賢坂榊猿麾挟鷺拶撒擦颯先数察薩刷札綵衰縡偲腮樶責哉殺霽崔淬顋寨切洒纔碎晒犲濟凄砦灑釵靫悽摧倖豺呵苛幸猜塞蔡栽儕采齊財臍截載孥宰済齋犀際災柴賽菜砕採斉斎祭妻債催才細鰓裁歳最埼捉辟柞縒咋簀筰齪筴窄册槊酢嘖朔柵遡溯鑿索搾昨炸冊策錯櫻桜裟提砂乍去射狭狹紗刺唆曝柤蓑裂捺做梭磋褪銹荒插醒挫差莎削止冷早避些槎嵳嵯嗟沙娑然再渣蹉扠詐割咲注覚嗄茶螫簑瑣下左搓瑳冴寂鎖挿叉査佐作覺点冱錆さ√錫す/仕指製西 ┓┐〆□■шШ上#♯щЩ添∪日⊂⊆⊃⊇文静★☆*標嗜青三聖土彩△▲悉署〜∽‘’┌┏集\探§″性セサSシソス秒σΣСсS]\|ッ\_s*[ソセスシサ]\|ッ\_s*[ソセスシサ]\|っ\_s*[そせすしさ]\|遽\_s*走\|蕎\_s*麦\|内\_s*障\|彼\_s*杵\|諷\_s*歌\|幾\_s*許\|錚\_s*[錚々]\|十\_s*\%(路\|露\_s*盤\)\|冬\_s*青\|微\_s*風\|虚\_s*言\|宙\_s*組\|夫\_s*[々夫]\|返\_s*田\|傴\_s*僂\|U\_s*m\_s*b\_s*e\_s*l\_s*l\_s*i\_s*f\_s*l\_s*o\_s*r\_s*a\_s*e\|台\_s*詞\|c\_s*e\_s*n\_s*t\_s*i\|妹\_s*尾\|嘲\_s*笑\|海\_s*象\|蒸\_s*[篭籠]\|魑\_s*魅\|凡\_s*て\|典\_s*侍\|季\_s*雄\|天\_s*[皇蛾]\|蘿\_s*蔔\|V\_s*i\_s*o\_s*l\_s*a\_s*l\_s*e\_s*s\|N\_s*y\_s*m\_s*p\_s*h\_s*a\_s*e\_s*\%(a\_s*c\_s*e\_s*a\_s*e\|o\_s*i\_s*d\_s*e\_s*a\_s*e\)\|夊\_s*繞\|隧\_s*道\|C\_s*\%(型\|言\_s*語\)\|老\_s*舗\|望\_s*潮\|飛\_s*沫\|L\_s*a\_s*\%(m\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\|b\_s*i\_s*a\_s*t\_s*a\_s*e\)\|埋\_s*葬\_s*虫\|幣\_s*原\|桎\_s*梏\|柳\_s*葉\_s*魚\|衣\_s*魚\|汚\_s*点\|蠹\_s*魚\|惠\_s*雄\|舗\_s*石\|磯\_s*城\|W\_s*i\_s*n\_s*t\_s*e\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\|倭\_s*文\|閑\_s*[谷か]\|云\_s*[云々]\|明\_s*\%(々\_s*後\_s*日\|明\_s*後\_s*日\)\|7\_s*月\|7\_s*月\|4\_s*[分月]\|4\_s*月\|羊\_s*[齒歯]\|I\_s*\%(l\_s*l\_s*i\_s*c\_s*i\_s*a\_s*c\_s*e\_s*a\_s*e\|s\_s*o\_s*p\_s*y\_s*r\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\)\|不\_s*[忍知]\|後\_s*\%([輪口志目]\|込\_s*み\)\|軍\_s*鶏\|香\_s*菜\|吃\_s*逆\|蝦\_s*蛄\|輸\_s*[出贏]\|隼\_s*[朗郎]\|笋\_s*[干羹]\|縦\_s*容\|睫\_s*毛\|翡\_s*翠\|東\_s*\%(雲\|海\_s*林\)\|Z\_s*i\_s*n\_s*g\_s*i\_s*b\_s*e\_s*r\_s*a\_s*l\_s*e\_s*s\|続\_s*\%(日\_s*本\_s*\%(紀\|後\_s*紀\)\|後\_s*撰\_s*和\_s*歌\_s*集\)\|髑\_s*髏\|匣\_s*鉢\|復\_s*習\|百\_s*日\_s*紅\|胡\_s*孫\_s*眼\|←\_s*→\|霰\_s*弾\|弥\_s*生\|懺\_s*\%(法\|悔\_s*懺\_s*悔\)\|流\_s*[離石]\|蠑\_s*螺\|覇\_s*王\_s*樹\|C\_s*\%([es]\|y\_s*c\_s*a\_s*d\_s*\%(i\_s*d\_s*a\_s*e\|o\_s*\%(p\_s*s\_s*i\_s*d\_s*a\|f\_s*i\_s*l\_s*i\_s*c\_s*a\_s*l\_s*e\_s*s\)\)\|h\_s*l\_s*o\_s*r\_s*a\_s*n\_s*t\_s*h\_s*a\_s*c\_s*e\_s*a\_s*e\|言\_s*語\|D\_s*店\|型\_s*肝\_s*炎\|a\_s*\%(s\_s*s\_s*y\_s*t\_s*h\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|c\_s*t\_s*a\_s*l\_s*e\_s*s\)\)\|竹\_s*[篦刀筒]\|大\_s*角\_s*豆\|防\_s*人\|曩\_s*に\|向\_s*坂\|一\_s*昨\_s*\%(昨\_s*[年日]\|々\_s*[年日]\)\|實\_s*藤\|甘\_s*藷\|五\_s*月\|月\_s*代\|匂\_s*坂\|税\_s*所\|雑\_s*賀\|骰\_s*子\|P\_s*\%(a\_s*r\_s*i\_s*e\_s*t\_s*a\_s*l\_s*e\_s*s\|t\_s*e\_s*r\_s*i\_s*d\_s*o\_s*s\_s*p\_s*e\_s*r\_s*m\_s*\%(a\_s*l\_s*e\_s*s\|i\_s*d\_s*a\_s*e\)\|r\_s*i\_s*m\_s*u\_s*l\_s*a\_s*l\_s*e\_s*s\)\|A\_s*\%(p\_s*i\_s*a\_s*l\_s*e\_s*s\|r\_s*a\_s*l\_s*e\_s*s\|n\_s*t\_s*i\_s*m\_s*o\_s*n\_s*y\)\|s\_s*f\_s*o\_s*r\_s*z\_s*a\_s*n\_s*d\_s*o\|瑞\_s*[典西]\|B\_s*\%(r\|シ\_s*ェ\_s*ル\)\|拡\_s*張\_s*子\|s\_s*u\_s*n\|部\_s*分\|置\_s*換\|ア\_s*ン\_s*チ\_s*モ\_s*ン\|構\_s*造\_s*体\|D\_s*o\_s*n\_s*a\_s*t\_s*i\_s*o\_s*n\_s* \_s*A\_s*l\_s*p\_s*h\_s*o\_s*n\_s*s\_s*e\_s* \_s*F\_s*r\_s*a\_s*n\_s*c\_s*o\_s*i\_s*s\_s* \_s*d\_s*e\_s* \_s*S\_s*a\_s*d\_s*e\|M\_s*\%(e\_s*r\_s*c\_s*u\_s*r\_s*y\|u\_s*s\_s*a\_s*l\_s*e\_s*s\|a\_s*r\_s*q\_s*u\_s*i\_s*s\_s* \_s*d\_s*e\_s* \_s*S\_s*a\_s*d\_s*e\)\|加\_s*\%(之\|虐\_s*\%(淫\_s*乱\_s*症\|趣\_s*味\)\)\|T\_s*\%(e\_s*t\_s*r\_s*a\_s*c\_s*e\_s*n\_s*t\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\|i\_s*n\|h\_s*e\_s* \_s*S\_s*i\_s*m\_s*p\_s*l\_s*e\_s* \_s*A\_s*P\_s*I\_s* \_s*f\_s*o\_s*r\_s* \_s*e\_s*v\_s*e\_s*n\_s*t\_s*-\_s*b\_s*a\_s*s\_s*e\_s*d\_s* \_s*X\_s*M\_s*L\_s* \_s*p\_s*a\_s*r\_s*s\_s*i\_s*n\_s*g\)\|ケ\_s*イ\_s*素\|珪\_s*素\|計\_s*測\_s*自\_s*動\_s*制\_s*御\_s*学\_s*会\|ネ\_s*ッ\_s*ト\_s*サ\_s*ー\_s*ビ\_s*ス\|ザ\_s*\%(ッ\_s*ク\|ク\_s*セ\_s*ン\|ビ\_s*ー\_s*ネ\|ウ\_s*バ\_s*ー\|ワ\_s*ー\_s*ク\_s*ラ\_s*ウ\_s*ト\|ム\_s*ザ\|ル\_s*ツ\|イ\_s*\%([ルン]\|ラ\_s*ー\|デ\_s*ル\)\|ー\_s*\%([ルラ]\|メ\_s*ン\)\)\|意\_s*味\|ゼ\_s*ミ\|ナ\_s*ト\_s*リ\_s*ウ\_s*ム\|ゾ\_s*\%(ル\|ン\_s*デ\|ー\_s*\%(ム\|リ\_s*ン\_s*ゲ\_s*ン\)\|フ\_s*ィ\_s*ー\)\|ジ\_s*\%(ム\|ー\_s*\%([グク]\|メ\_s*ン\_s*[ズス]\)\|グ\_s*ム\_s*ン\_s*ト\|ン\_s*\%(メ\_s*ル\|グ\_s*シ\_s*ュ\_s*ピ\_s*ー\_s*ル\|テ\_s*ー\_s*ゼ\)\)\|硫\_s*黄\|エ\_s*ス\)', + \ 'T' : '\%([ト乕囚寅虎瀞侶舮靹供纜燭艫朋倶鞆輩讎讐伴共友巴沌惇丼飩團暾団遯燉遁豚鷄禽酉砦塞俘擒虜豐恍惚枢乏塒迚科咎篷笘攴苫鶏伽唱稱鄰隣朿棘刺整鎖處処所床享鴟鵄扉鳶嫁訥晨穐秋刻鴇鬨斎頓幄幃帷柮杤栃閼軣轟屆届咄吶凸世暁祀駿壽繁稔寿豊歳俊利敏年慝牘悳黷犢匿督徳涜∃得特磴稻鞜剳宕滕鬥纛櫂讀盜綯橦叨桶盪竇抖縢礑荅閙塘罩帑棹兜檮納亠嶋棠搨档嶝溏鞳夲蘯道黨酘陦榻樋梼沓涛朸淌篤吋擣萄釖鬧籘諮迯儻潼鐙嶌逗螳蟷稲■幢滔鼕掏當峠読饕疼淘濤籐董悼棟搭痘套=豆燈桃韜遠統騰橈冬討骰祷藤灯島橙凍刀陶糖謄唐答投等桐兎砿外富止礪研閇觧疾莵梳穫融録問砥採飛杜賭翔留冨図熔人途登菟畄蠧泊戸跿荼蠹十蚪砺盗屠渡解取執溶睹兔脱妬鍍磨説摂覩鎔堵秉獲汢塗肚圖とテ瑛晃輝衒寺靦囀躔忝、鷆鷏碾巓,槙沾殄霑腆壥諂廛轉‥.:輾填甜奠顛纒癲恬殿纏覘展篆添梃輦輟鐡耋咥餮垤跌屮銕姪迭俶逖荻鏑狄糴廸笛覿擲迪滴轍的哲敵撤剔徹鐵鉄酲眤碵羝觝幀嚔嚏渟柢酊掟睇楴詆棣汀騁鵜叮遉釘弟碇剃蹄邸締梯悌訂程底偵廷遞逓抵牴呈艇鄭涕啼庭定低弖照てツ模幹劈聾列辛貫面液汁露冷錘舶紡系艷艶絃鉉寉橡剱劒釼劍劔剣弦蔓敦鶴幣兵鉗噤鶫償桓恆典恒常夙務勉努勤拙拐倹抓嬬撮詳審爪褄妻募角晦螺瞑円呟礫具粒辻辟罪捉捕閊把曹阜丘元首寮司官柄仕掴遣攫搏疲使窄莟蕾局壷壺坪綱繋壌蝪培霾戊己伝傳鐔翅翼鍔燕唾續約皷鼓続葛綴番栂槌縋弊費序潰終墜遂鎚椎追做殱殲捏繕傍旁創造作熟机佃蹲拒欟坏鴾槻月裹砲障躑榴謹慎筒愼恙包堤痛椄衝告點附撞繼津搗継嗣支突積尾漬詰尽通憑浸次盡攣連就接付つチ吃釁岐巷衢粽粡因杠契鵆児交腟帙膣些蟄N窒斉秩父捷矗筑築逐盟税力親邇誓迩近苣尖縮鏤塵朕珎趁抻鎭碪狆亭跛闖鴆砧椿枕鎮陳珍沈賃杖找摘茶嫡着潴儲豬箸紵竚躇瀦墸杼苧緒樗楮⊥陟飭敕捗稙躅猪勅著悵髫廳樢微聽鵈楪齠甼漲佻膓吊鼎趙迢萇誂廰澂脹疔輙昶糶蔦窕晁鬯塚輒雕挺凋帖掉停諜跳眺貼鐇澄提喋頭銚ー蝶暢帳丁牒重逃鳥張弔懲肇嘲徴兆釣聴彫潮町頂調庁貂腸超挑朝丶黜寵儔冑肘蟲惆鍮晝紬綢廚籌※冢丑胄稠酎紐鑄冲沖偸宙虫}[{]厨誅鋳紂仲註駐柱衷注籀昼抽中躓蜘踟褫魑夊黐笞黹池値夂輊治耻千薙家血岻痴散地稚遲知茅恥置穉緻致智遅乳禿癡馳ちタ便党屯椽榱架樽弛膤鰔蕩鱈盥戯俵袂保躊為樣様爲啗猯擔疸餤湍覃彖亶鄲靼綻站潭憺酖殫膽襌賺毯摶袒檀褝槫緞椴憚攤壇慱湯澹‡†蛋耽W旦痰啖坦眈反C嘆歎誕胆箪譚担淡鍛單短探貪単覊栲妙戲訊攜携尋訪比畴疇類民髱娯樂恃頼愉楽喩例譬激滾斃仆嵶垰殕倒嫋旅貍狸讃称賛敲蹈踏祟湛鬪戰斗戦闘彳佇叩疊疂疉畳箍鏨違互畉耕畊掌店棚到炭辿燵撻斬韃闥巽辰佐扶+援相佑輔弼助襷髻椨誑胤種塔龍竜糜糺爛漂維伊理貞是直禎忠惟匡徒唯只窘嗜慥確鮹鱆胝凧蛸嶽哮誥茸英豪威毅猛笋筍酣雄健丈斌武靈彈珪承賚珠霊魂卵偶適環弾球玉丹謀莨束縱|盾鬣奉楯蓼縦竪質城達館忽橘舘瀑薪滝瀧峪溪渓谿谷尭亨臣任集宇昂楼小剛恭岳洪喬嵩孚尚尊敬孝崇隆貴鷹竹篁簟寶財高寳宝但濯綰鐸倬澤拆柝擢柘戳啅擇鈬魄畜企啄磔匠巧択沢逞琢蓄度宅託卓謫托拓躰隶殆抬靆黛紿替滯體碓帶軆平駘擡逮腿当怠玳諦岱鯛對颱袋戴堆頽態苔滞待代帝貸隊褪胎帯体退泰大対足手斷垂佗闌経炊撓焚矯溜躱經咤食發朶薫詫誰他詑耐太強蛇起逹貯給堪長揉閉埀発断勃多澑岔截絶田立裁汰点夛侘建它賜たцЦ〜天時×型火土→吐都東上噸瓲┃│台表第木スジ∴Θθザ正ツ¨転透▲△▼▽トチ…・試端タTт┝Τ┯┰┣┷┸┤┬┥┴┻┠τ┫┳├〒Т┨テT]\|ッ\_s*[トテツチタ]\|ッ\_s*[トテツチタ]\|っ\_s*[とてつちた]\|門\_s*渡\_s*り\|薯\_s*蕷\|船\_s*尾\_s*座\|公\_s*[明暁]\|倫\_s*[子明]\|邑\_s*中\|蜻\_s*蛉\|A\_s*c\_s*o\_s*n\_s*i\_s*t\_s*u\_s*m\|蜷\_s*局\|跡\_s*[絶切]\|蜥\_s*蜴\|舎\_s*人\|馴\_s*鹿\|野\_s*老\|瓊\_s*脂\|永\_s*[遠久]\|宿\_s*直\|朱\_s*鷺\|左\_s*見\_s*右\_s*見\|朽\_s*木\|H\_s*y\_s*d\_s*r\_s*o\_s*c\_s*h\_s*a\_s*r\_s*i\_s*t\_s*a\_s*l\_s*e\_s*s\|独\_s*鈷\|季\_s*[衣道栄]\|聡\_s*[明徳]\|祈\_s*年\_s*祭\|淑\_s*[夫子]\|洞\_s*爺\|光\_s*男\|晧\_s*史\|紅\_s*娘\|瓢\_s*虫\|F\_s*e\|I\_s*r\_s*o\_s*n\|劇\_s*村\|滌\_s*除\|2\_s*×\_s*4\|悪\_s*阻\|石\_s*\%(蕗\|竜\_s*子\)\|心\_s*[太算]\|自\_s*\%(摸\|模\_s*和\)\|氷\_s*柱\|倩\_s*々\|黴\_s*雨\|入\_s*梅\|梅\_s*雨\|再\_s*見\|悉\_s*に\|備\_s*に\|旋\_s*[風毛]\|B\_s*a\_s*l\_s*a\_s*n\_s*o\_s*p\_s*h\_s*o\_s*r\_s*a\_s*l\_s*e\_s*s\|1\_s*\%(日\|0\_s*日\)\|朔\_s*日\|1\_s*\%(日\|0\_s*日\)\|美\_s*人\_s*局\|E\_s*\%(u\_s*p\_s*h\_s*o\_s*r\_s*b\_s*i\_s*a\_s*l\_s*e\_s*s\|r\_s*i\_s*c\_s*a\_s*l\_s*e\_s*s\)\|字\_s*\%(牌\|一\_s*色\)\|少\_s*と\|義\_s*父\|主\_s*[殿税]\|周\_s*夫\|睦\_s*子\|渠\_s*睦\_s*子\|萵\_s*苣\|身\_s*柱\|似\_s*指\|清\_s*\%(老\_s*頭\|一\_s*色\)\|青\_s*\%([幇島]\|梗\_s*菜\|椒\_s*肉\_s*絲\)\|全\_s*帯\|昌\_s*洙\|J\_s*i\_s*a\_s*n\_s*g\_s*s\_s*u\|江\_s*蘇\|焼\_s*豚\|叉\_s*焼\|察\_s*哈\_s*爾\|餃\_s*子\|雑\_s*砕\|炒\_s*[麺飯]\|北\_s*谷\|甘\_s*露\_s*子\|錯\_s*和\|総\_s*角\|一\_s*[日寸]\|植\_s*字\|魚\_s*[屋蝨]\|金\_s*魚\_s*蝨\|草\_s*石\_s*蚕\|春\_s*\%(麗\|宮\_s*坊\)\|九\_s*\%(十\_s*九\|連\_s*宝\_s*[灯燈]\)\|揺\_s*蕩\|容\_s*易\|白\_s*痴\|猶\_s*豫\|蜑\_s*民\|段\_s*銭\|蒲\_s*公\_s*英\|騨\_s*州\|M\_s*\%(e\_s*n\_s*i\_s*s\_s*p\_s*e\_s*r\_s*m\_s*a\_s*c\_s*e\_s*a\_s*e\|o\_s*n\_s*o\_s*\%(p\_s*e\_s*t\_s*a\_s*l\_s*a\_s*e\|c\_s*\%(h\_s*l\_s*a\_s*m\_s*y\_s*d\_s*e\_s*a\_s*e\|o\_s*t\_s*y\_s*l\_s*e\_s*d\_s*o\_s*n\_s*e\_s*a\_s*e\)\)\)\|仮\_s*令\|打\_s*[擲坐]\|七\_s*\%(夕\|対\_s*子\)\|活\_s*計\|方\_s*便\|無\_s*料\|黄\_s*\%(昏\|蜀\_s*葵\)\|章\_s*魚\|胼\_s*胝\|P\_s*\%(\.\_s*S\_s*\.\|o\_s*l\_s*y\_s*\%(g\_s*o\_s*n\_s*a\_s*l\_s*e\_s*s\|c\_s*a\_s*r\_s*p\_s*i\_s*c\_s*a\_s*e\)\|a\_s*n\_s*d\_s*a\_s*n\_s*a\_s*l\_s*e\_s*s\)\|壮\_s*聡\|煙\_s*草\|殺\_s*陣\|賢\_s*明\|性\_s*質\|怱\_s*ち\|亢\_s*ぶ\|堂\_s*子\|学\_s*聡\|能\_s*[文之]\|内\_s*匠\|松\_s*明\|奈\_s*子\|幇\_s*間\|切\_s*符\|デ\_s*ィ\_s*ス\|3\_s*r\_s*d\|閾\_s*値\|ソ\_s*\%(ー\_s*[トンプ]\|ロ\_s*ー\)\|ヘ\_s*ー\_s*グ\|ゼ\_s*[インムア]\|セ\_s*\%(オ\|ル\_s*マ\|ロ\_s*\%(ン\|ニ\_s*ア\_s*ス\)\|ラ\_s*ピ\_s*\%(ー\|ス\_s*ト\)\)\|シ\_s*\%(ン\|ッ\_s*ク\|ス\_s*ル\|ア\_s*タ\_s*ー\|ソ\_s*ー\_s*ラ\_s*ス\|オ\_s*ド\_s*ア\|ー\_s*[フタ]\)\|サ\_s*\%([イム]\|ミ\_s*ン\_s*グ\|ウ\_s*ザ\_s*ン\_s*ド\|ラ\_s*ブ\_s*レ\_s*ッ\_s*ド\|ー\_s*\%([ドモ]\|テ\_s*ィ\|ス\_s*ト\_s*ン\|ズ\_s*デ\_s*[イィー]\|マ\_s*ル\)\|ッ\_s*チ\_s*ャ\_s*ー\|ン\_s*\%(ク\|ダ\_s*ー\|キ\_s*ュ\_s*ー\)\|リ\_s*ド\_s*マ\_s*イ\_s*ド\)\|ポ\_s*リ\_s*ペ\_s*プ\_s*チ\_s*ド\|三\_s*\%(和\_s*土\|連\_s*文\_s*字\)\|\\\_s*T\_s*e\_s*X\|文\_s*字\_s*列\|教\_s*科\_s*書\|t\_s*e\_s*\%(r\_s*a\|m\_s*p\_s*o\_s*r\_s*a\_s*r\_s*y\)\|用\_s*語\|電\_s*\%([視話]\|気\_s*通\_s*信\_s*研\_s*究\_s*所\)\)', + \ 'U' : '\%([ウ孳蛤礼敬恭洞鱗愛潤煩騒粳漆閏患慯悄恙騷愁呻楳梅嫐釉噂褞吽曇紜耘黄云繧慍蘊薀暈運錙怏麗羨卦憾怨恨占卜末嬉心裏浦糶瓜汝己畦疇畆畴畝疎踈宜諾奪姥腕莵兔驢鑿穿嗽魘唸促令項頷訴鷽獺嘯嘘蠢蠕動覘窺伺海萼台詠謌唱唄宴讌転詩謠謳謡疑歌葎鯏鴬鶯ヱゑゐヰ鶉疼堆踞蹲渦舂臼碓羅薄筌食槽朮肯凵魚巧茨廏廐厩鰻午甘秣孫餞馬旨蔚寫暎冩遷噐器移慈俯映写現虚美笂靭靱靫空鰾萍初蛆雲氏上後喪艮丑潮牛裡鬱欝中袿梁家内紆嫗羽打禹請浮攴得雨有飢熟于埋倦鵜迂生賣挧受撃泛傴憂茹射膿売撲菟盂搏齲右胡承卯攵績産芋討夘兎植饂宇享失烏う¨↑∪UуウΥυУU]\|武\_s*漢\|狼\_s*狽\|夏\_s*枯\_s*草\|蟒\_s*蛇\|蠎\_s*蛇\|譫\_s*言\|琅\_s*珠\|温\_s*[麺気州]\|C\_s*u\_s*c\_s*u\_s*r\_s*b\_s*i\_s*t\_s*a\_s*l\_s*e\_s*s\|自\_s*惚\|采\_s*女\|乳\_s*母\|姨\_s*捨\_s*山\|独\_s*活\|優\_s*\%(婆\_s*[塞夷]\|曇\_s*華\)\|合\_s*格\|親\_s*族\|斥\_s*候\|泡\_s*沫\|雅\_s*楽\_s*[頭寮]\|楽\_s*官\|干\_s*莉\|維\_s*納\|太\_s*秦\|護\_s*田\_s*鳥\_s*尾\|淡\_s*\%(青\|口\_s*醤\_s*油\)\|五\_s*\%(加\|月\_s*蝿\)\|稲\_s*魂\|誓\_s*約\|石\_s*\%(女\|斑\_s*魚\)\|不\_s*生\_s*女\|味\_s*酒\|苜\_s*蓿\|A\_s*r\_s*i\_s*s\_s*t\_s*o\_s*l\_s*o\_s*c\_s*h\_s*i\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|伝\_s*染\|呆\_s*気\_s*者\|茴\_s*香\|外\_s*郎\|餓\_s*\%(死\|え\_s*死\_s*に\)\|裲\_s*襠\|団\_s*扇\|イ\_s*ギ\_s*リ\_s*ス\|オ\_s*マ\_s*ル\|識\_s*別\_s*不\_s*能\|共\_s*\%(用\_s*体\|有\_s*体\)\|ア\_s*\%([スン]\|グ\_s*リ\_s*ー\|ー\_s*\%(シ\_s*ュ\_s*ラ\|ジ\_s*ェ\_s*ン\_s*ト\|バ\_s*ン\)\|ル\_s*テ\_s*ィ\_s*メ\_s*ッ\_s*ト\|ポ\_s*ン\|ッ\_s*\%(プ\|パ\_s*ー\|シ\_s*ャ\_s*ー\)\)\|単\_s*\%(位\|一\_s*化\)\|ユ\_s*\%([タニー]\|ト\_s*\%(リ\_s*ロ\|レ\_s*ヒ\_s*ト\)\|リ\_s*\%(ア\|シ\_s*ー\_s*ズ\)\|プ\_s*シ\_s*ロ\_s*ン\|ネ\_s*ス\_s*コ\|ナ\_s*\%(カ\_s*イ\_s*ト\|イ\_s*テ\_s*ッ\_s*ド\)\|ビ\_s*キ\_s*\%(タ\_s*ス\|ノ\_s*ン\)\)\)', + \ 'V' : '\%([:├値V⊥版в↓В∨ヴV]\|ッ\_s*ウ\_s*゙\|ッ\_s*ヴ\|っ\_s*ヴ\|ウ\_s*゙\|v\_s*s\_s*.\|v\_s*e\_s*r\_s*s\_s*u\_s*s\|チ\_s*ェ\_s*ロ\|ヰ\_s*タ\| \_s*ビ\_s*ク\_s*ト\_s*ー\_s*ル\|視\_s*覚\|仮\_s*想\|ニ\_s*ス\|変\_s*数\|恒\_s*真\|ワ\_s*\%(デ\_s*ィ\_s*ム\|ギ\_s*ナ\|ニ\_s*ス\|セ\_s*リ\_s*ン\|ク\_s*チ\_s*ン\|ル\_s*キ\_s*ュ\_s*ー\_s*レ\|レ\_s*リ\_s*ー\|ー\_s*ニ\_s*ャ\)\|語\_s*彙\|ボ\_s*\%(ス\_s*ト\_s*ー\_s*ク\|ン\_s*ゴ\_s*レ\|ル\_s*\%([ガボトタ]\|テ\_s*\%(ッ\_s*ク\_s*ス\|ー\_s*[ジル]\)\)\|リ\_s*ュ\_s*ー\_s*ム\|ラ\_s*ン\_s*\%(チ\|テ\_s*ィ\_s*ア\|タ\_s*リ\_s*ー\)\|レ\_s*ー\|コ\_s*ー\_s*ダ\|ー\_s*\%([ントグ]\|ル\_s*ト\|ド\_s*ビ\_s*\%(ル\|リ\_s*ア\_s*ン\)\|パ\_s*ル\|ダ\_s*フ\_s*ォ\_s*ン\|カ\_s*\%(ル\|リ\_s*ス\_s*ト\)\)\|キ\_s*ャ\_s*ブ\_s*ラ\_s*リ\|イ\_s*\%([ドス]\|ジ\_s*ャ\_s*ー\|シ\_s*ン\_s*グ\)\)\|ヘ\_s*ッ\_s*ト\|冗\_s*長\_s*な\|垂\_s*直\|フ\_s*\%(ァ\_s*\%(ン\|ド\_s*ー\_s*ツ\)\|ォ\_s*\%(ン\|ル\_s*\%(ク\|カ\_s*ー\)\)\|ェ\_s*ル\_s*メ\_s*ー\_s*ル\)\|ウ\_s*\%(ラ\_s*\%(デ\_s*ィ\_s*ミ\_s*ー\_s*ル\|ジ\_s*\%(ー\_s*ミ\_s*ル\|ミ\_s*ー\_s*ル\|オ\_s*ス\_s*ト\_s*\%(ク\|ッ\_s*ク\)\)\)\|ィ\_s*\%(ン\_s*ナ\|ル\_s*ス\)\|ォ\_s*ッ\_s*カ\|イ\_s*\%(ル\_s*ス\|ン\_s*ナ\_s*ー\)\|ェ\_s*\%(ル\_s*ギ\_s*リ\_s*ウ\_s*ス\|ヌ\_s*ス\)\)\|ビ\_s*\%([アラブバスザ]\|ガ\_s*ー\|ハ\_s*ー\_s*ラ\|タ\_s*ミ\_s*ン\|レ\_s*\%(ッ\_s*ジ\|ロ\_s*イ\)\|ビ\_s*\%(ア\_s*ン\|ッ\_s*ド\)\|ッ\_s*\%(ク\|キ\_s*ー\)\|セ\_s*ン\_s*テ\|ク\_s*\%(タ\_s*ー\|ト\_s*\%(ル\|リ\_s*[ーア]\)\)\|シ\_s*\%(ャ\_s*ス\|ソ\_s*ワ\_s*ー\_s*ズ\)\|ン\_s*\%([チス]\|ソ\_s*ン\|テ\_s*ー\_s*ジ\|セ\_s*ン\_s*ト\)\|ネ\_s*\%(ガ\_s*ー\|グ\_s*レ\_s*ッ\_s*ト\)\|ニ\_s*\%([ール]\|リ\_s*デ\_s*ン\)\|ュ\_s*ー\|エ\_s*ン\_s*チ\_s*ャ\_s*ン\|ジ\_s*\%(ャ\|ッ\_s*ト\|タ\_s*ー\|ョ\_s*\%(ン\|ナ\_s*リ\_s*ー\)\|ュ\_s*ア\_s*\%(ル\|ラ\_s*イ\_s*\%(ズ\|ゼ\_s*ー\_s*シ\_s*ョ\_s*ン\)\)\)\|ダ\_s*ル\|デ\_s*オ\|ル\_s*\%(ゴ\|ヌ\_s*ー\_s*ブ\)\|オ\_s*ラ\|リ\_s*ジ\_s*ア\_s*ン\|ィ\_s*ー\_s*ナ\_s*ス\|ー\_s*\%(ボ\|ル\_s*ス\|ク\_s*ル\|ナ\_s*ス\)\)\|ベ\_s*\%([ガラン]\|ト\_s*ナ\_s*ム\|イ\_s*ダ\_s*ー\|ー\_s*\%(ル\|ダ\_s*ー\)\|テ\_s*ラ\_s*ン\|ッ\_s*セ\_s*ル\|ス\_s*\%([トタパ]\|ビ\_s*オ\)\|ク\_s*\%(タ\|ト\_s*ル\)\|ジ\_s*タ\_s*\%(ブ\_s*ル\|リ\_s*ア\_s*ン\)\|リ\_s*\%([ィー]\|フ\_s*ァ\_s*イ\|サ\_s*イ\_s*ン\)\|ロ\_s*\%(ナ\|シ\_s*テ\_s*ィ\|ー\_s*ナ\|ニ\_s*[カク]\)\|ル\_s*\%(デ\|ベ\_s*ッ\_s*ト\|ダ\_s*ン\|レ\_s*ー\_s*ヌ\|サ\_s*\%(ー\_s*チ\|イ\_s*ユ\)\|モ\_s*ッ\_s*ト\)\|ノ\_s*ム\|ニ\_s*[スヤア]\|ネ\_s*\%(シ\_s*ャ\_s*ン\|チ\_s*ア\|ツ\_s*ィ\_s*ア\|ズ\_s*エ\_s*ラ\)\)\|ブ\_s*\%(イ\|ラ\_s*\%(ド\|ッ\_s*ド\)\|ー\_s*ド\_s*ゥ\_s*ー\)\|バ\_s*\%([ルン]\|イ\_s*\%([アブンオ]\|パ\_s*ー\|タ\_s*\%(ル\|リ\_s*テ\_s*ィ\)\|キ\_s*ン\_s*グ\|ザ\_s*ー\|シ\_s*ャ\)\|ッ\_s*ト\|チ\_s*カ\_s*ン\|ギ\_s*ナ\|ガ\_s*ボ\_s*ン\_s*ド\|ラ\_s*\%(ナ\_s*シ\|エ\_s*テ\_s*ィ\)\|サ\_s*ロ\|ス\_s*\%(コ\|ケ\_s*ス\)\|カ\_s*ン\_s*ス\|ケ\_s*ー\_s*シ\_s*ョ\_s*ン\|キ\_s*ュ\_s*ー\_s*ム\|ウ\_s*チ\_s*ャ\_s*ー\|リ\_s*\%(ン\|エ\_s*ー\_s*シ\_s*ョ\_s*ン\|ュ\_s*ー\|ア\_s*\%(ブ\_s*ル\|ン\_s*ト\)\|ッ\_s*ド\|デ\_s*ー\_s*シ\_s*ョ\_s*ン\)\|ヌ\_s*ア\_s*ツ\|ニ\_s*\%(ラ\|ー\_s*ユ\)\|レ\_s*\%([ラー]\|ロ\_s*ン\|リ\_s*ー\|ン\_s*\%(シ\_s*ア\|チ\_s*ノ\|タ\_s*イ\_s*ン\)\)\|ー\_s*\%([ゴグ]\|チ\_s*ャ\_s*ル\|リ\_s*ト\_s*ゥ\_s*ー\_s*ド\|バ\_s*ル\|ボ\_s*ス\|ベ\_s*ナ\|テ\_s*ィ\_s*カ\_s*ル\|サ\_s*ス\|ジ\_s*\%(ン\|ニ\_s*ア\|ョ\_s*ン\)\|ノ\_s*ン\|ニ\_s*ア\|モ\_s*ン\_s*ト\|ミ\_s*\%(リ\_s*オ\_s*ン\|キ\_s*ュ\_s*ラ\_s*イ\_s*ト\)\)\|ナ\_s*\%(キ\_s*ュ\_s*ラ\_s*ー\|ジ\_s*ウ\_s*ム\)\)\)', + \ 'W' : '\%([ヲヲ女翁緒牡小雄汚惜尾男をウ孳蛤礼敬恭洞鱗愛潤騒粳漆閏慯悄恙騷愁呻楳梅嫐釉噂褞吽曇紜耘云繧慍蘊薀暈運錙怏麗羨U卦憾怨恨占卜末嬉心裏浦糶瓜汝己Υυ畦疇畆畴畝疎踈宜諾奪姥莵兔驢鑿穿嗽魘唸促令項頷訴鷽獺嘯嘘蠢蠕動覘窺伺萼台詠謌唱唄宴讌転詩謠謳謡疑歌葎鯏鴬鶯ヱゑ鶉疼堆踞蹲渦舂臼碓羅薄筌食槽朮肯凵魚巧茨廏廐厩鰻午甘秣孫餞馬旨蔚寫暎冩遷噐器移慈俯映写現虚美笂靭靱靫空鰾萍初蛆氏↑上後喪艮丑潮牛裡鬱欝中袿梁家内紆嫗打禹請浮攴得雨有飢熟于埋倦鵜迂生賣挧受撃泛傴憂茹射膿売撲菟盂搏齲右胡承卯攵績産芋討夘兎植饂宇享失烏うヰ居ゐワ叫喚惡÷悪原稿嗤妾蕨童藁鞋笑灣綰萬豌万弯彎椀雲腕碗湾横黄皇往羂罠毫纔微僅患煩伎術厄禍災態業技佗王鰐忘掖弁腋譯腸緜渉亙道航弥亘棉渡綿私隈薈賄淮脇矮猥歪轍海蟠儂∪解頒觧判訣別稚若或枠惑鷲沸詫輪和涌湧我吾把話侘杷訳破萵啝割倭環分琶羽わ幅水∧波WウワW]\|ッ\_s*[ヲヱウヰワ]\|ッ\_s*[ヲヱウヰワ]\|っ\_s*[をゑうゐわ]\|乎\_s*古\_s*止\_s*点\|武\_s*漢\|狼\_s*狽\|夏\_s*枯\_s*草\|蟒\_s*蛇\|蠎\_s*蛇\|譫\_s*言\|琅\_s*珠\|温\_s*[麺気州]\|C\_s*u\_s*c\_s*u\_s*r\_s*b\_s*i\_s*t\_s*a\_s*l\_s*e\_s*s\|自\_s*惚\|采\_s*女\|乳\_s*母\|姨\_s*捨\_s*山\|独\_s*活\|優\_s*\%(婆\_s*[塞夷]\|曇\_s*華\)\|合\_s*格\|親\_s*族\|斥\_s*候\|泡\_s*沫\|雅\_s*楽\_s*[頭寮]\|楽\_s*官\|干\_s*莉\|維\_s*納\|護\_s*田\_s*鳥\_s*尾\|淡\_s*\%(青\|口\_s*醤\_s*油\)\|五\_s*\%(加\|月\_s*蝿\)\|稲\_s*魂\|誓\_s*約\|石\_s*\%(女\|斑\_s*魚\)\|不\_s*生\_s*女\|味\_s*酒\|苜\_s*蓿\|A\_s*r\_s*i\_s*s\_s*t\_s*o\_s*l\_s*o\_s*c\_s*h\_s*i\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|伝\_s*染\|呆\_s*気\_s*者\|茴\_s*香\|外\_s*郎\|餓\_s*\%(死\|え\_s*死\_s*に\)\|裲\_s*襠\|団\_s*扇\|草\_s*鞋\|(\_s*笑\_s*)\|(\_s*笑\_s*)\|戦\_s*慄\|俳\_s*優\|勿\_s*忘\_s*草\|早\_s*[生稲]\|山\_s*葵\|戯\_s*奴\|度\_s*会\|Y\_s*\%(軸\|シ\_s*ャ\_s*ツ\|染\_s*色\_s*体\)\|Y\_s*\%(軸\|シ\_s*ャ\_s*ツ\|染\_s*色\_s*体\)\|華\_s*盛\_s*頓\|裙\_s*蔕\_s*菜\|理\_s*[由解]\|公\_s*魚\|病\_s*葉\|大\_s*東\_s*亜\_s*戰\_s*爭\|太\_s*\%(秦\|平\_s*洋\_s*戦\_s*争\)\|歐\_s*州\_s*大\_s*戰\|第\_s*\%(二\_s*次\_s*世\_s*界\_s*大\_s*戦\|一\_s*次\_s*世\_s*界\_s*大\_s*戦\)\|ブ\_s*ル\_s*ツ\_s*ブ\_s*ル\_s*ク\|ロ\_s*ン\_s*グ\|レ\_s*\%(ン\|イ\_s*ス\|ッ\_s*カ\_s*ー\|ス\_s*\%(ラ\_s*ー\|リ\_s*ン\_s*グ\)\)\|リ\_s*\%(ー\_s*ス\|ン\_s*ク\_s*ル\|ス\_s*ト\)\|書\_s*き\_s*込\_s*み\|ラ\_s*\%(ッ\_s*\%([プパ]\|ピ\_s*ン\_s*グ\)\|イ\_s*\%([タト]\|テ\_s*ィ\_s*ン\_s*グ\)\)\|ボ\_s*ル\_s*フ\|フ\_s*\%([ムー]\|ァ\_s*イ\_s*ル\|ィ\_s*\%(ー\_s*ト\|ッ\_s*チ\)\)\|ホ\_s*\%(エ\_s*[ーイア]\|ー\_s*ル\|イ\_s*\%(ー\_s*\%(ル\|ラ\_s*ー\)\|ッ\_s*\%(プ\|ス\_s*ル\|パ\_s*ー\|ト\_s*\%(ニ\_s*ー\|マ\_s*ン\)\)\)\|ワ\_s*\%(イ\|ッ\_s*[トツ]\)\)\|ベ\_s*ル\_s*ナ\_s*ー\|w\_s*e\_s*b\_s*サ\_s*\%(イ\_s*ト\|ー\_s*\%(バ\|ビ\_s*ス\)\)\|警\_s*告\|バ\_s*ル\_s*タ\_s*ー\|ヴ\_s*\%(ュ\_s*ル\_s*ツ\_s*ブ\_s*ル\_s*ク\|ォ\_s*ル\_s*フ\|ィ\_s*\%([ーム]\|ル\_s*\%(ム\|ヘ\_s*ル\_s*ム\)\)\|ェ\_s*\%(ン\_s*ダ\_s*ー\_s*ス\|ル\_s*ナ\_s*ー\|ー\_s*バ\_s*ー\|イ\_s*ユ\)\|ァ\_s*\%(イ\_s*[ンス]\|ー\_s*グ\_s*ナ\_s*ー\|ン\_s*ダ\|ル\_s*\%(タ\_s*ー\|キ\_s*ュ\_s*ー\_s*レ\)\)\)\|T\_s*\%(h\_s*e\_s* \_s*W\_s*o\_s*r\_s*l\_s*d\_s* \_s*W\_s*i\_s*d\_s*e\_s* \_s*W\_s*e\_s*b\_s* \_s*C\_s*o\_s*n\_s*s\_s*o\_s*r\_s*t\_s*i\_s*u\_s*m\|u\_s*n\_s*g\_s*s\_s*t\_s*e\_s*n\)\|ダ\_s*ブ\_s*リ\_s*ュ\_s*ー\|タ\_s*ン\_s*グ\_s*ス\_s*テ\_s*ン\)', + \ 'X' : '\%([ォォぉェェぇゥゥぅィィぃァァぁXξ×ХхΞX]\|ッ\_s*[ォェゥィァ]\|ッ\_s*[ォェゥィァ]\|っ\_s*[ぉぇぅぃぁ]\|シ\_s*ロ\_s*\%(フ\_s*ォ\_s*ン\|ホ\_s*ン\)\|ジ\_s*オ\_s*ン\|ゼ\_s*\%(ビ\_s*ウ\_s*ス\|ロ\_s*\%(ッ\_s*ク\_s*ス\|グ\_s*ラ\_s*フ\_s*ィ\)\)\|ハ\_s*ビ\_s*エ\_s*ル\|ザ\_s*\%(ン\|ビ\_s*エ\_s*ル\)\|キ\_s*\%(シ\_s*\%(ロ\|レ\_s*ン\|リ\_s*ト\_s*ー\_s*ル\)\|セ\_s*ノ\_s*ン\|サ\_s*ン\_s*\%(チ\_s*ン\|タ\_s*ン\)\)\|E\_s*x\_s*t\_s*e\_s*n\_s*s\_s*i\_s*b\_s*l\_s*e\_s* \_s*M\_s*a\_s*r\_s*k\_s*u\_s*p\_s* \_s*L\_s*a\_s*n\_s*g\_s*u\_s*a\_s*g\_s*e\|ク\_s*\%(シ\_s*ー\|ロ\_s*ス\_s*ポ\_s*ス\_s*ト\|セ\_s*\%(ナ\_s*キ\_s*ス\|ノ\_s*フ\_s*ォ\_s*ン\)\|ザ\_s*ヴ\_s*ィ\_s*エ\|サ\_s*\%(イ\|ン\_s*\%(ト\_s*ス\|テ\_s*ィ\_s*ッ\_s*ペ\|チ\_s*ッ\_s*ペ\)\)\|リ\_s*ス\_s*マ\_s*ス\)\|エ\_s*\%(ク\_s*ス\|ッ\_s*ク\_s*ス\)\)', + \ 'Y' : '\%([ヨ艾蒿蓬娵嫁齡齢據頼弱歓憙鎧万萬過便婚汚涎捩峪杙翊緘慾欲翌翼抑米比裝粧装澱淀縦誼祥葭悦宜克純圭禎葦慶淑禧美喜芳吉義癰穃慂踴遙榕幺怏曄陶甬瀁燿珱踊暘廱樣蓉恙慵泱姚雍癢瑶昜瘍痒孕窰謠漾鷹瓔煬邀遥拗擁瑤窯徭膺窈殀耀曜庸夭揚葉蛹腰羊熔杳沃壅様妖溶用佯謡陽洋嘉宵蘇甦蘓奸辟横攀豫世与酔縒輿読讀訓預與喚予醉誉余憑能4舁蕷四譱畭譽餘撚呼詠除選飫歟丗代避よユ潤赦緩弛聴岼閖梦努纈∴故濯檠穰豐豊倖志裄之幸雪趾梼讓譲牀紫縁浴床攸犹黝俑邑熊猷悒酉蝣蚰囿莠尢蕕佳尤佑〒右郵涌祐侑游猶湧融宥夕幽悠釉友雄憂有楡油諭瘉汰徃柚逾揺弓踰諛愉瑜臾渝遊結覦腴由兪喩揃蝓淘揄輸茹征搖ゆイηΗ賤鄙卑苟嫌妹湯芋藷夢艷鑪鈩彩鱗色鯆忽綺貸甍答応愈圦杁茵胤飮寅尹婬贇韵隱蚓氤酳霪蔭堙湮吋廴I音慇韻咽淫殞姻隕院允隠殷陰窟巖巌頌祝鰮鰛鰯岩磐鼾歪弋弑抱懐肬贅疣狗戌乾犬諱在坐未汝戒誡警縛今Εε曰禾稻員因蝗印嘶鰍電引躄誘動≦忿鵤錨碇怒霆霹雷凧桴筏Ιι魚菴庵雖尿荊棘茨祈祷命豕猯古伍聿乙鎰鴪軼樹慈悼愴慯労格到至傷鼬頂戴徒致鈑痛板柞沙砂聊些潔諍烈功諫勳勇勲漁諌憇=憩粹熱粋憤域閾勢勤忙急磯孰焉湶泉厳何弄苛≧鎔范啀毬訝燻息指挑拠絲縷厭營営愛幼緒遑暇糸I弌壹肆莓苺櫟著市碑鐓礎甃臀弩石牲犧犠池溢佚壱11鬻毓燠礇粥的戦戰軍郁幾一稲許否飯違居矮ゐ猪五煎彝醫斐逶貽善胆位萎可詑僞鑄熬活容依要斎行怡異衣入逝猗胃洟好矣鋳揖椅去惟云懿熨痿射凍移将囗肄夷率囲姨慰頤忌唯緯逸噫挿鮪伊偽苡彜莞往以韋遺炒謂李生威為維意倚良如彙出淹言亥鰄井蔚痍圍幃渭堰饐医爲癒帷恚偉委詒畏いヤ稚稍飲鎗鑓槍孀寡鰥Я碼傭雇闇敗吝藪薮殕脂寄宿櫓軈軅簗梁S漸鋏刃灸軟柔和窶鱧奴僕萢優柳喧宅館舘輩族鏃鑰≒籥繹譯葯蜴檪藥龠扼益厄疫躍約役訳薬疾岾疚楊谺邪薯豺犲《》〈〉山邸壥廛豢養社鑢育尉寧廉裕恭泰易休康保安靖妬已瘠弥辭埜辞家輻矢痩屋灼笶八罷冶焼破夜爺谷也殺⇒病耶演⇔野燒遣彌熄椰止哉揶やYеЕ円¥→↑↓←Ёё─━ユヤヨыイЙΥυЫйY]\|ッ\_s*[ヨユイヤ]\|ッ\_s*[ヨユイヤ]\|っ\_s*[よゆいや]\|歐\_s*羅\_s*巴\|欧\_s*羅\_s*巴\|尸\_s*童\|蹌\_s*踉\|蹣\_s*跚\|終\_s*夜\|4\_s*\%([項者つ日]\|番\_s*目\|種\_s*類\)\|y\_s*o\_s*\%(t\_s*t\_s*a\|c\_s*t\_s*o\)\|他\_s*所\|仁\_s*史\|隆\_s*克\|尚\_s*武\|孝\_s*高\|悌\_s*也\|彬\_s*伯\|賀\_s*[子悟]\|栄\_s*伸\|新\_s*生\|昌\_s*[美男]\|宗\_s*生\|暢\_s*[子一]\|永\_s*沈\|8\_s*日\|8\_s*日\|黄\_s*泉\|左\_s*手\|百\_s*合\|L\_s*i\_s*l\_s*i\_s*\%(o\_s*p\_s*s\_s*i\_s*d\_s*a\|a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\)\|U\_s*\%(字\|タ\_s*ー\_s*ン\)\|鞦\_s*韆\|強\_s*請\|梅\_s*桃\|桜\_s*桃\|靫\_s*負\|宙\_s*美\|礼\_s*暁\|温\_s*\%(雄\|泉\_s*津\)\|長\_s*庚\|昨\_s*夜\|又\_s*木\|木\_s*綿\|E\_s*\%(u\|メ\_s*ー\_s*ル\)\|祖\_s*谷\|文\_s*身\|郎\_s*[女子]\|蕁\_s*麻\|刺\_s*[青草]\|U\_s*\%(字\|タ\_s*ー\_s*ン\|r\_s*t\_s*i\_s*c\_s*a\_s*l\_s*e\_s*s\)\|海\_s*[豚参]\|西\_s*表\|鸚\_s*哥\|影\_s*[向青]\|況\_s*ん\_s*や\|所\_s*[以縁謂]\|D\_s*i\_s*a\_s*p\_s*e\_s*n\_s*s\_s*i\_s*a\_s*l\_s*e\_s*s\|藺\_s*草\|J\_s*u\_s*\%(l\_s*i\_s*a\_s*n\_s*i\_s*a\_s*l\_s*e\_s*s\|n\_s*c\_s*a\_s*l\_s*e\_s*s\)\|田\_s*舎\|膝\_s*行\|十\_s*六\_s*夜\|寝\_s*穢\|英\_s*\%([一桃蘭]\|吉\_s*利\)\|斑\_s*鳩\|烏\_s*賊\|玉\_s*筋\_s*魚\|硫\_s*黄\|N\_s*a\_s*j\_s*a\_s*d\_s*a\_s*l\_s*e\_s*s\|牛\_s*膝\|稜\_s*威\|常\_s*春\_s*藤\|5\_s*[つ日]\|5\_s*[つ日]\|惡\_s*戲\|甚\_s*振\|潮\_s*来\|悪\_s*戯\|交\_s*喙\|細\_s*小\_s*魚\|小\_s*魚\|鯨\_s*魚\|鶏\_s*魚\|経\_s*緯\|礒\_s*[山田]\|気\_s*吹\|E\_s*\%(A\_s*S\_s*T\|V\_s*E\)\|従\_s*[弟妹姉兄]\|鴨\_s*脚\_s*樹\|公\_s*孫\_s*樹\|G\_s*\%(r\_s*a\_s*m\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\|l\_s*u\_s*m\_s*i\_s*f\_s*l\_s*o\_s*r\_s*a\_s*e\|i\_s*n\_s*k\_s*g\_s*o\_s*p\_s*s\_s*i\_s*d\_s*a\)\|銀\_s*杏\|鳶\_s*尾\|巫\_s*子\|神\_s*巫\|無\_s*花\_s*果\|睦\_s*月\|都\_s*方\_s*流\|縊\_s*[殺死首]\|蝟\_s*[集縮]\|埋\_s*け\_s*[火炭]\|不\_s*[可如]\|守\_s*宮\|燕\_s*龍\_s*茶\|両\_s*班\|流\_s*鏑\_s*馬\|柵\_s*原\|箭\_s*[田内]\|R\_s*a\_s*f\_s*f\_s*l\_s*e\_s*s\_s*i\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|自\_s*棄\|火\_s*傷\|徐\_s*ら\|M\_s*y\_s*r\_s*i\_s*c\_s*a\_s*l\_s*e\_s*s\|天\_s*蚕\|倭\_s*絵\|日\_s*本\_s*武\_s*尊\|大\_s*和\|T\_s*\%(h\_s*e\_s*l\_s*i\_s*g\_s*o\_s*n\_s*a\_s*l\_s*e\_s*s\|r\_s*o\_s*c\_s*h\_s*o\_s*d\_s*e\_s*n\_s*d\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\)\|香\_s*具\_s*師\|玄\_s*孫\|P\_s*\%(o\_s*a\_s*l\_s*e\_s*s\|l\_s*u\_s*m\_s*b\_s*a\_s*g\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\|a\_s*l\_s*m\_s*a\_s*l\_s*e\_s*s\|r\_s*\%(o\_s*t\_s*e\_s*a\_s*l\_s*e\_s*s\|i\_s*n\_s*c\_s*i\_s*p\_s*e\_s*s\)\)\|A\_s*r\_s*a\_s*c\_s*a\_s*l\_s*e\_s*s\|妥\_s*子\|寿\_s*[詞男]\|エ\_s*\%(ホ\_s*バ\|フ\_s*ゲ\_s*ニ\_s*ー\|レ\_s*ヴ\_s*ァ\_s*ン\|ニ\_s*セ\_s*イ\|ー\_s*ル\)\|ワ\_s*イ\)', + \ 'Z' : '\%([空損存揃園薗底續束足屬∈∋賊続粟族俗属慥僧梍臧噌賍臟贓憎像臓贈象増造曾初沿曽反添ぞ譱然繕禪苒薇千蠕∀髯禅善漸冉前全關関蝉膳錢銭絶噬説勢筮贅脆税攻是責ぜ狡詰桷寸喘鮨附◆惴蘂膸蕋髓蕊隧隋隨瑞髄随厨付圖頭刷鶴津酢逗図廚豆好ず塩嶋島嶌縞橲竺衂衄宍舳忸軸舌祖喰食直凝日實昵印者闍鮭邪蛇麝着鉐惹搦尺雀寂若弱尻侭仞刄臣恁儘潯贐稔進盡仭糂訊俥蕁迅刃靱荏甚靭燼櫁樒塵尽尋陣腎壬人敍莇茹杼洳敘汝蜍耡恕舒縟褥蓐辱溽所抒鋤徐絮序叙助帖穰疂聶疊驤襄淨讓繩禳絛蕘諚仗壌滌繞生靜蟐壤仍茸嬲疉塲乘遶星瀞拯釀躡孃如醤剩娘嬢錠静醸縄女尉饒丈成烝擾嫋穣丞場杖條条蒸貞状攘畳剰冗定浄乗情城上常譲懦愀鷲竪嬬戍得濡咒讐讎就聚笋篤盾徇凖楯詢隼筍蓴惇洵淳閏恂諄馴旬荀潤循醇巡遵順准殉純準襦誦需朮戌宿孰塾珠熟恤術述豎孺呪儒綬樹受授壽揉從澀狃中戎拾廿鞣从縱澁糅蹂神汁獸絨縦渋柔什充十従獣住銃重事迩爺滋除怩尓痔璽至児士寿茲孳染嗣柱寺磁仕治死爾路而仁辞塒時岻粫持恃敷焦字只地轜侍瓷亊知辭餌冶邇弍似祀以子峙二史自畤兒示耳慈司蒔次珥膩じ騒澤沢猿笊晒皿曝鮫参算懴慘竄鏨山殘塹巉懺嶄讒惨暫慚慙斬残実笹酒坂盛三嵜崎桜榴襍雜棹竿雑斉濟西才済劑戝剤材財罪在覚座咲戯冴坐蔵左裂冷藏差醒挫ざ→↑ЪЬьъ↓←жЖズゾ零〇〒ザZジζЗゼзΖZ]\|ッ\_s*\%(ソ\_s*゙\|セ\_s*゙\|ス\_s*゙\|シ\_s*゙\|サ\_s*゙\)\|ッ\_s*[ゾゼズジザ]\|っ\_s*[ぞぜずじざ]\|ソ\_s*゙\|簇\_s*生\|双\_s*紙\|草\_s*[履子紙]\|セ\_s*゙\|台\_s*詞\|0\_s*次\|撥\_s*条\|発\_s*条\|發\_s*条\|z\_s*e\_s*\%(t\_s*t\_s*a\|p\_s*t\_s*o\)\|世\_s*阿\_s*弥\|ス\_s*゙\|相\_s*撲\|木\_s*菟\|修\_s*法\|杜\_s*撰\|調\_s*所\|徒\_s*[罪刑]\|螟\_s*虫\|芋\_s*茎\|F\_s*i\_s*g\_s*u\_s*r\_s*e\|シ\_s*゙\|G\_s*\%(メ\_s*ン\|パ\_s*ン\)\|D\_s*y\|G\_s*\%(メ\_s*ン\|パ\_s*ン\)\|支\_s*度\|試\_s*合\|2\_s*乗\|2\_s*乗\|J\_s*\%(I\_s*S\_s*コ\_s*ー\_s*ド\|ポ\_s*ッ\_s*プ\|R\_s*東\_s*日\_s*本\)\|獅\_s*子\|甲\_s*乙\_s*丙\_s*丁\_s*戊\_s*己\_s*庚\_s*辛\_s*壬\_s*癸\|k\_s*\$\_s*_\_s*{\_s*e\_s*f\_s*f\_s*}\_s*\$\|爪\_s*哇\|射\_s*礼\|砂\_s*利\|謝\_s*花\|著\_s*語\|杓\_s*子\|深\_s*\%(秘\|大\_s*寺\)\|秦\_s*泉\_s*寺\|沈\_s*\%(香\|丁\_s*花\)\|晨\_s*朝\|濁\_s*世\|判\_s*官\|諍\_s*論\|長\_s*夜\|漏\_s*斗\|焼\_s*酎\|鐘\_s*石\|橈\_s*脚\_s*類\|承\_s*久\|朱\_s*里\|C\_s*a\_s*b\_s*o\_s*m\_s*b\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|J\_s*\%(リ\_s*ー\_s*グ\|ポ\_s*ッ\_s*プ\|U\_s*N\_s*K\_s*O\)\|絢\_s*子\|頌\_s*偈\|数\_s*珠\|入\_s*[魂牢来洛院内水棺]\|霜\_s*月\|1\_s*\%(2\|6\_s*進\|0\_s*[進月]\|1\_s*月\|8\_s*禁\)\|師\_s*走\|極\_s*月\|紐\_s*帯\|1\_s*\%(0\|1\_s*月\|8\_s*禁\|2\_s*月\)\|サ\_s*゙\|搾\_s*菜\|蜊\_s*蛄\|粗\_s*目\|槧\_s*本\|散\_s*切\_s*り\|沙\_s*汰\|柘\_s*榴\|石\_s*榴\|細\_s*工\|亜\_s*鉛\|サ\_s*\%(モ\_s*ラ\|ン\_s*ポ\_s*ー\_s*ニ\_s*ャ\|ラ\_s*ゴ\_s*サ\)\|シ\_s*\%(タ\_s*ー\_s*ル\|オ\_s*\%(ン\|ニ\_s*\%(ス\_s*ト\|ズ\_s*ム\)\)\)\|ツ\_s*\%(ァ\_s*\%(ラ\_s*ト\_s*ゥ\_s*ス\_s*ト\_s*ラ\|イ\_s*ト\)\|ェ\_s*\%(ナ\_s*ー\|ッ\_s*ペ\_s*リ\_s*ン\|ル\_s*マ\_s*ッ\_s*ト\)\|ィ\_s*\%(ク\_s*ル\_s*ス\|タ\_s*ー\|ー\_s*グ\_s*ラ\_s*ー\|ン\_s*\%(バ\_s*ロ\_s*ン\|マ\_s*ー\_s*マ\_s*ン\)\|ゴ\_s*イ\_s*ネ\_s*ル\)\)\|チ\_s*\%(ク\_s*ル\_s*ス\|ア\_s*ノ\_s*ー\_s*ゼ\|ュ\_s*ー\_s*リ\_s*\%(ヒ\|ッ\_s*ヒ\)\|ャ\_s*ル\_s*ダ\_s*ッ\_s*シ\_s*ュ\|ゴ\_s*イ\_s*ネ\_s*ル\_s*ワ\_s*イ\_s*ゼ\_s*ン\)\)', + \ '[' : '[□〔[『【[]', + \ '\' : '[∨\¥\\]', + \ ']' : '[】』]〕]]', + \ '_' : '[ __]', + \ '`' : '[“‘``]', + \ 'a' : '\%([ア餅母渉閔恤憐慌遽鰒蚫鮑袷淡∃主衽歩袵垤蟻麁凡塔蘭露著表霰非抗諍検革更改現競爭争洗殿鉱豫予粗嵐禮殺彪恠妖絢怪綺肖彩漢過謝謬誤礼操綾飴菴黯罨鱇鮟餡闇行按諳晏鞍暗鶩鬚鰓顎喘発肋豈嫂兄崇騰県購贖网罔與咫鼎中新邊邉辺恰頭価價値游遊畔畦堋杏梓与衵袙憬孔坑案侮窖強貴讎讐徒仇痣黶欺鮮糾字嘲薊姐姉曙炮焙炙蜚薹膏脂油危鐙虻泡蹟能痕踪跡東預輯蒐乢纂遏聚軋誂羹壓惇集陸敦暑淳篤熱扱暖温遖斡私圧焦汗央奥桜櫻媼奧塰蜑餘周遍普剰蔗余尼雨甘天押凹楝樗溢艶鰺庵網戯簣鯵味軛渥堊圷憧欠踵幄握芥齷厚蜊漁鯏蕣淺麻浅龝煥晢晰呆亮晄聡亨朖璋啓昜輝顯旭光陽洸鑑滉昿曠諦朗哲顕晶彬賈章商穐晃彰晧昭秋欸埃瞹阨穢噫姶文隘粟曖鮎藹饗靉挨間相哀葭趾晨朝愛跛蹇跫脚蘆葦芦桎鐐足赫淦燈赧紅旃朱茜藜銅赭曉閼暁垢皸皹證絳灯暴証赤扇呷黝榮碧葵蒼煽仰青穴併宛亞痾明逢吾悪婀在遭該飫褪浴荒揚編和會椏合襾安挙或當哇有開厭唖韲阿嗚当娃敢倦彼惡遇飽充上擧あa藍金@∧&∩論&∠銀会∀域空→←↓⇒↑⇔⌒後Ц亜米¨´`^’≒〜ÅаαАアΑa]\|厦\_s*門\|廈\_s*門\|沫\_s*雪\|食\_s*蟻\_s*獣\|H\_s*a\_s*l\_s*o\_s*r\_s*a\_s*g\_s*a\_s*l\_s*e\_s*s\|浣\_s*熊\|菖\_s*蒲\|豆\_s*汁\|蛙\_s*鳴\_s*蝉\_s*噪\|塩\_s*梅\|家\_s*鴨\|趺\_s*坐\|Z\_s*\%(n\|i\_s*n\_s*c\)\|浮\_s*子\|痘\_s*痕\|窪\_s*地\|醤\_s*蝦\|糠\_s*蝦\|信\_s*天\_s*翁\|左\_s*沢\|雅\_s*典\|校\_s*倉\|小\_s*豆\|四\_s*阿\|鴉\_s*\%(片\|鷺\_s*合\_s*戦\_s*物\_s*語\)\|綽\_s*名\|渾\_s*名\|化\_s*野\|翌\_s*檜\|飛\_s*[魚鳥]\|総\_s*角\|通\_s*草\|木\_s*通\|L\_s*a\_s*r\_s*d\_s*i\_s*z\_s*a\_s*b\_s*a\_s*l\_s*a\_s*c\_s*e\_s*a\_s*e\|花\_s*鶏\|我\_s*\%(妻\|孫\_s*子\)\|数\_s*多\|奄\_s*美\|灰\_s*汁\|胡\_s*[座坐床葱]\|日\_s*明\|碩\_s*宏\|祥\_s*[仁彦]\|蜻\_s*蛉\|E\_s*\%(s\|i\_s*n\_s*s\_s*t\_s*e\_s*i\_s*n\_s*i\_s*u\_s*m\)\|生\_s*憎\|匕\_s*首\|英\_s*\%([保田]\|虞\_s*湾\|賀\_s*保\)\|靄\_s*[靄々]\|I\_s*\%(P\_s*電\_s*話\|C\_s*\%(タ\_s*グ\|カ\_s*ー\_s*ド\)\)\|I\_s*\%(r\_s*i\_s*d\_s*a\_s*l\_s*e\_s*s\|P\_s*\%(電\_s*話\|ア\_s*ド\_s*レ\_s*ス\)\|D\_s*カ\_s*ー\_s*ド\|C\_s*\%(タ\_s*グ\|カ\_s*ー\_s*ド\)\)\|走\_s*目\|鹹\_s*草\|馬\_s*酔\_s*木\|海\_s*[豹女士人部驢]\|R\_s*u\_s*b\_s*i\_s*a\_s*\%(l\_s*e\_s*s\|c\_s*e\_s*a\_s*e\)\|褐\_s*毛\_s*和\_s*種\|石\_s*蓴\|白\_s*馬\|水\_s*[馬黽綿]\|M\_s*a\_s*l\_s*v\_s*a\_s*l\_s*e\_s*s\|ト\_s*リ\_s*プ\_s*ル\_s*A\| \_s*ア\_s*ク\_s*シ\_s*ア\_s*ム\|公\_s*理\|砒\_s*素\|ヒ\_s*素\|京\_s*都\_s*高\_s*度\_s*技\_s*術\_s*研\_s*究\_s*所\|代\_s*入\|遺\_s*産\|抽\_s*象\|G\_s*o\_s*l\_s*d\|自\_s*動\_s*\%(現\_s*金\_s*取\_s*り\_s*扱\_s*い\_s*機\|預\_s*貯\_s*金\_s*機\)\|属\_s*性\|何\_s*か\|か\_s*つ\|お\_s*よ\_s*び\|セ\_s*ン\_s*ト\_s*キ\_s*ッ\_s*ツ\_s*ネ\|S\_s*\%(b\|i\_s*l\_s*v\_s*e\_s*r\)\|利\_s*用\_s*可\_s*能\|使\_s*用\_s*可\_s*能\|算\_s*法\|割\_s*り\_s*当\_s*て\|オ\_s*\%(レ\|ギ\_s*ュ\_s*ス\_s*タ\_s*ン\|ド\_s*レ\_s*イ\|ン\_s*グ\_s*ス\_s*ト\_s*ロ\_s*ー\_s*ム\|ル\_s*\%(ト\_s*キ\_s*ー\|タ\_s*\%([ーナ]\|ネ\_s*\%(ー\_s*ト\|イ\_s*ト\)\)\)\|ー\_s*\%([クガサトラル]\|ニ\_s*ン\_s*グ\|キ\_s*シ\_s*ン\|ブ\_s*リ\_s*ー\|バ\_s*ー\_s*ド\|ベ\_s*ル\_s*ジ\_s*ュ\|ギ\_s*ュ\_s*ス\_s*\%(ト\|タ\_s*ン\)\|ゾ\_s*ン\_s*ヌ\|ス\_s*\%(チ\_s*ン\|テ\_s*ィ\_s*ン\|タ\_s*ー\|ト\_s*\%(リ\_s*ア\|ラ\_s*リ\_s*ア\)\)\|ド\_s*リ\_s*ー\|ジ\_s*\%([ェー]\|オ\_s*ロ\_s*ジ\)\|デ\_s*ィ\_s*\%(オ\|エ\_s*ン\_s*ス\|シ\_s*ョ\_s*ン\|ト\_s*リ\_s*ア\_s*ム\)\|タ\_s*ム\|ソ\_s*\%(リ\_s*テ\_s*ィ\|ラ\_s*イ\_s*ズ\)\|セ\_s*ン\_s*テ\_s*ィ\_s*ッ\_s*ク\|ロ\_s*ラ\)\)\|配\_s*列\|バ\_s*イ\_s*ト\|ハ\_s*ル\_s*マ\_s*ゲ\_s*ド\_s*ン\|引\_s*数\|人\_s*工\_s*\%(現\_s*実\_s*感\|知\_s*能\)\|イ\_s*\%(ー\_s*ジ\_s*ス\|オ\_s*ン\|ソ\_s*ッ\_s*プ\)\|マ\_s*ル\_s*ド\_s*ゥ\_s*ー\_s*ク\|紫\_s*\%(陽\_s*花\|水\_s*晶\|石\_s*英\)\|A\_s*\%([tlrImc]\|n\_s*t\_s*i\_s*m\_s*o\_s*n\_s*y\|u\_s*s\_s*t\_s*r\_s*o\_s*b\_s*a\_s*i\_s*l\_s*e\_s*y\_s*a\_s*c\_s*e\_s*a\_s*e\|K\_s*C\_s*L\|S\_s*C\_s*I\_s*I\|s\_s*t\_s*a\_s*t\_s*i\_s*n\_s*e\|タ\_s*イ\_s*プ\|T\_s*O\_s*K\|N\_s*S\_s*I\|V\_s*シ\_s*ス\_s*テ\_s*ム\|L\_s*T\_s*キ\_s*ー\|ラ\_s*ン\_s*ク\|E\_s*R\_s*A\|D\_s*S\_s*L\_s*モ\_s*デ\_s*ム\|ド\_s*ラ\_s*イ\_s*ブ\|d\_s*a\|M\_s*ラ\_s*ジ\_s*オ\|b\_s*s\_s*t\_s*r\_s*a\_s*c\_s*t\_s* \_s*C\_s*o\_s*n\_s*t\_s*r\_s*o\_s*l\_s* \_s*M\_s*o\_s*d\_s*e\_s*l\|カ\_s*ッ\_s*プ\|ク\_s*ラ\_s*ス\|C\_s*ア\_s*ダ\_s*プ\_s*タ\)\|付\_s*録\|A\_s*\%([4型面]\|x\_s*o\_s*n\|B\_s*\%(型\|r\_s*o\_s*a\_s*d\)\|タ\_s*イ\_s*プ\|T\_s*&\_s*T\|t\_s*\%(o\_s*k\|h\_s*e\_s*n\_s*a\)\|ラ\_s*ン\_s*ク\|I\_s*エ\_s*キ\_s*ス\_s*パ\_s*ー\_s*ト\|/\_s*D\_s*コ\_s*ン\_s*バ\_s*ー\_s*タ\|ド\_s*ラ\_s*イ\_s*ブ\|d\_s*o\_s*b\_s*e\|カ\_s*ッ\_s*プ\|ク\_s*ラ\_s*ス\|p\_s*p\_s*l\_s*e\)\|応\_s*用\|エ\_s*\%([ニメアーイ]\|ッ\_s*チ\|ン\_s*\%(ド\_s*ラ\_s*ン\|ジ\_s*ェ\_s*\%(ル\|リ\_s*ッ\_s*ク\)\|ゼ\_s*ル\)\|リ\_s*ア\|オ\_s*リ\_s*ア\|ス\_s*テ\|プ\_s*ロ\_s*ン\)\)', + \ 'b' : '\%([鯔鰡堀本凡盆煩梵骨凹歿鈕釦沒渤没睦穆樸目濮攵攴朴木僕墨卜牧星黽蠎髦罔袤鋩氓瑁虻卯茆貌謗网旄抱甍儚胞蟒肪旁鵬牟眸冐鉾蒡榜懋乏惘妨帽昴忙剖冒忘茅膀妄厖尨膨貿防紡滂茫望亡傍某謀乾牡掘姆保慕簿惚模戊墓拇菩謨暮呆干暈姥褒彫坊募誉母ぼ覓幎汨冖羃巾冪紅韈瞥鼈蔑塀汳采抃辯辧卞辨湎宀遍瓣辮眄冕勉娩弁可辺邉邊べ船房笛鞭渊斑淵縁渕樗椈太袋深蓋葢盖豚節勿佛物震勃蚋風鰤馼蚊聞文錻葡侮葺蒲憮舞撲撫廡毋無嘸誣悔奉吹蕪撃部伏打振武歩拭分不ぶ米謐人匹浸額鐚跛!広開繆別謬緡泯罎岷梹旻紊檳頻壜愍瓶鬢閔憫敏貧便闢百辟帛白杪緲猫票憑″鋲屏眇渺平錨苗秒描廟病琵弾未比眉毘尾靡瀰寐微糜媚備引麋美濔弭火枇縻嵋贔日糒び早速林針尿拂腹散払祓原幡悗蠻塙旛鑁旙鷭挽判棒絆版輓蕃板播礬阪坂磐番盤晩萬蛮万箱蠅芒挟伴桴鉢枹蜂撥働畑畠屎糞端花鼻離話V魅許秤拔魃罸筏閥走橋箸柱藐貘寞獏暴漠瀑麥縛博駁莫驀爆杯唄霾賣狽吠楳苺憊培煤黴貝焙賠買売陪倍梅媒跋伐末幕曝抜罰場貼馬刄芭化葉庭羽張這塲罵刃晴歯馳婆ばb“仏■□⊥底下×−‖|\∵麦ボバ][}{ブビΒБбβベb]\|ッ\_s*\%(ホ\_s*゙\|ヘ\_s*゙\|フ\_s*゙\|ヒ\_s*゙\|ハ\_s*゙\)\|ッ\_s*[ボベブビバ]\|っ\_s*[ぼべぶびば]\|ホ\_s*゙\|小\_s*火\|襤\_s*褸\|孟\_s*買\|P\_s*a\_s*e\_s*o\_s*n\_s*i\_s*a\_s*\%(l\_s*e\_s*s\|c\_s*e\_s*a\_s*e\)\|南\_s*瓜\|耄\_s*耋\|孑\_s*孑\|包\_s*丁\|ヘ\_s*゙\|袂\_s*別\|箆\_s*棒\|篦\_s*棒\|胼\_s*胝\|フ\_s*゙\|補\_s*任\|毒\_s*島\|醜\_s*[女男]\|山\_s*毛\_s*欅\|F\_s*a\_s*g\_s*a\_s*l\_s*e\_s*s\|布\_s*団\|茯\_s*苓\|V\_s*\%(字\|ネ\_s*ッ\_s*ク\|シ\_s*ネ\_s*マ\)\|附\_s*子\|付\_s*子\|鞦\_s*韆\|豊\_s*[前後]\|ヒ\_s*゙\|魚\_s*[籠篭]\|彌\_s*縫\|弥\_s*[漫縫]\|吃\_s*驚\|天\_s*鵞\_s*絨\|緬\_s*甸\|賓\_s*頭\_s*盧\|編\_s*木\|柏\_s*槙\|S\_s*a\_s*n\_s*t\_s*a\_s*l\_s*a\_s*l\_s*e\_s*s\|兵\_s*[衛法]\|拍\_s*[板子]\|表\_s*紙\|ハ\_s*゙\|囃\_s*子\|巴\_s*爾\_s*幹\|R\_s*o\_s*s\_s*a\_s*l\_s*e\_s*s\|薔\_s*薇\|蟠\_s*踞\|鈑\_s*金\|A\_s*n\_s*n\_s*o\_s*n\_s*a\_s*c\_s*e\_s*a\_s*e\|発\_s*条\|祖\_s*母\_s*さ\_s*ん\|梯\_s*子\|伯\_s*\%([林労楽]\|剌\_s*西\_s*爾\)\|莪\_s*原\|飛\_s*[車蝗]\|蝗\_s*虫\|掲\_s*示\_s*板\|プ\_s*ル\_s*コ\_s*ギ\|作\_s*業\_s*域\|オ\_s*ー\_s*ト\_s*バ\_s*イ\|基\_s*[礎底]\|フ\_s*ァ\_s*ゴ\_s*ッ\_s*ト\|背\_s*景\|北\_s*京\|ペ\_s*\%(キ\_s*ン\|テ\_s*ル\_s*ギ\_s*ウ\_s*ス\)\|臭\_s*素\|イ\_s*ギ\_s*リ\_s*ス\|B\_s*\%([面判級型y]\|細\_s*胞\|タ\_s*イ\_s*プ\|ド\_s*ラ\_s*イ\_s*ブ\|カ\_s*ッ\_s*プ\|ク\_s*ラ\_s*ス\|−\_s*ス\_s*プ\_s*ラ\_s*イ\_s*ン\|l\_s*u\_s*e\_s*N\_s*o\_s*t\_s*e\|u\_s*s\_s* \_s*E\_s*r\_s*r\_s*o\_s*r\|a\_s*c\_s*h\|e\_s*l\_s*l\_s*研\|ラ\_s*ン\_s*ク\)\|B\_s*\%([h面判級型kiae]\|C\_s*兵\_s*器\|N\_s*F\_s*(\_s*B\_s*a\_s*c\_s*k\_s*u\_s*s\_s*-\_s*N\_s*a\_s*u\_s*r\_s* \_s*F\_s*o\_s*r\_s*m\_s*)\|B\_s*C\|タ\_s*イ\_s*プ\|u\_s*r\_s*k\_s*i\_s*n\_s*a\_s* \_s*F\_s*a\_s*s\_s*o\|フ\_s*レ\_s*ッ\_s*ツ\|ド\_s*ラ\_s*イ\_s*ブ\|カ\_s*ッ\_s*プ\|ク\_s*ラ\_s*ス\|M\_s*P\_s*フ\_s*ァ\_s*イ\_s*ル\|ス\_s*プ\_s*ラ\_s*イ\_s*ン\|S\_s*\%(D\|キ\_s*ー\|チ\_s*ュ\_s*ー\_s*ナ\|ア\_s*ン\_s*テ\_s*ナ\|デ\_s*ジ\_s*タ\_s*ル\)\|O\_s*X\_s*セ\_s*ッ\_s*ト\|I\_s*T\_s*N\_s*E\_s*T\|r\_s*o\_s*m\_s*i\_s*n\_s*e\|ラ\_s*ン\_s*ク\|o\_s*\%(h\_s*r\_s*i\_s*u\_s*m\|v\_s*i\_s*n\_s*e\_s* \_s*S\_s*p\_s*o\_s*n\_s*g\_s*i\_s*f\_s*o\_s*r\_s*m\_s* \_s*E\_s*n\_s*c\_s*e\_s*p\_s*h\_s*a\_s*l\_s*o\_s*p\_s*a\_s*t\_s*h\_s*y\|o\_s*k\|r\_s*o\_s*n\)\)\|硼\_s*素\|ホ\_s*ウ\_s*素\)', + \ 'c' : '\%([コ恐怖惟怺※米暦轉頃悃鶤獻艮鯤很袞坤壼琿狠建棍魂蒟菎滾梱溷献痕渾墾恨懇根杪王挙泥裔樸鞐熟枹醴蛩徑蹊径溢毀零錯苔拒亊箏斷判諺理断盡尽辞琴言異事今壽寿鯒冀希礫鯉拱齣狛細腓昆拳瘤鮗兄近谺応應答爰是凩惚榾兀忽輿甑腰拵拗鐺鏝桁杲磽絖昊耗闔狎靠冓汞湟塙慌嫦效頁礦冦淆遘仰昴誥鬨鴿鏗浤哮砿伉烋熕洽訌閧困鮫逅糠槹哽盍稾亙壙覯隍遑洸餃惶寇鵁皋黌椌扣晄矼肓頏蛤呷詬匣昿皐崗肱徨峇袷敲爻藁倥釦棡凰犒吭窖畊岡猴胱絋傚啌蚣缸紘湊搆閤峺羔鍠幌鱇扛肴恆紺鈩絳閘蒙冰氷郡蛟槁候楮媾溘后蝗酵嚆犢稿亢哄睾梗慷笄郊効岬肛項巷鑛洪佼狡叩昂勾喉晃滉糀晧剛曠宏控恍侯皓港膏耿皎坑煌向江膠虹巧鴻鉱興衡浩厚耕弘綱抗購講恒薨溝鋼航孝更校行肯光皇好荒高梏谷哭槲尅釛斛轂詰棘告刻酷穀踰懲蝴鴣袴觚虍粐乎沽餬胯菰瞽楜娘壺錮込葫⌒虚兒杞估冴漕痩虎冱倒戸呱媚粉夸詁木鈷捏濃故濾箍漉黄恋拠誇壷放転鼓股罟女己乕琥跨滬越古去糊滸扈瑚皷混怙弧辜戀蠱超児雇孤湖瓠蛄凅肥こセ芹鬩槧羶甎揃倩翦箋燹濺苫栫槫孱孅簽吮纖湶纎亘筌蟾磚荐茜斬綫箭舩喘錢專僊贍鐫仟旃痊涎銛饌僣韆沾刋擶薦舛牋阡濳癬筅殱殲闡賎餞羨顫甅竰糎陝銓踐閃∨潺遷銑栴剪煽譫僉瞻践栓跣疝詮銭穿尠戰腺繊僭泉嬋淺仙擅鮮専扇浅蘚船線撰宣洗選煎戦尖先忙伜倅逼狹狭蝉旋洩椄§卩渫絏鱈泄攝啜紲緤薛刹褻浙竊截窃殺説拙摂節切蹐績蹠蓆籍跡跖晰威螫迹瘠勣裼晢夕鶺雪寂∫∬碩惜析席隻情甥躋貰淒婿嘶醒睛擠撕牲萋菁犀韲瀞穽齏筬晟齊歳栖棲掣腥逝惺斉臍旌悽整凄靖製晴急世堰攻脊丗迫勢畆糶塞瀬畝せク配椪栩櫪檪椡椚箜櫟含纐婚糞癖潛潜鵠凹窪縊跟軛頚珞頸諄窟鞋履狐轡覆沓碎砕条降件頽崩屑釘莖茎陸杙杭掘崛倔鶏鐃藥擽薬楠誓梳串釧與与挫籖鯀鯨鬮籤隈熊艸嚔藾叢鏈腐鎖ξΞ茸菌楔草圀邦國国嗽漱吻劫刧腔φ粂皹勳熏裙醺桾皸崑燻訓勲葷君委钁企咥銜桑某暝峅眛昏冥鮓比闇位鞍藏暗倉廚厨涅〃仝ヽゞヾ々ゝ公曇雲蜘佝栗狂包胡俥梍枢畔鐵★玄黒玖供苦九枸鳩煦狗来徠吼工絎駒朽眩垢口窶区劬繰呉宮暮貢久嶇來奇9庫惧組衢紅句吁懼區桍孔怐瞿汲くシ埀謐Σσ蕋蘂蕊痺褥茵鵐蔀鷸鴫入責霑蔵嶌了縞嶋島凋搾澀澁渋縛暫屡柴荵凌鎬忍慕簧舖↓襪認从從.舌扱罔θ虐Θ粃秕椎椣貎尿肉臠猪衣榻黙蜆恵楙誠茂成繁鋪惻陣頻閾櫁樒汐鹽潮隰瑟嫉櫛蛭蟋疾隲悉漆躾膝失室沒鎭沈滴雫賤鎮靜静顰尓爾聢乍然併■□◇◆倖幸貭叱征質柵卯滋撓品鬼錣鍜錏凝痼而拉設垂萎栞襞吝咳什導汁徴験著記印☆〇銀城報調蝨虱白濕湿標七僕笞楚霜臀退斥後尻寫卸者炙冩柘舍砂#♯暹諜喋煮這西娑沙謝紗鯱奢赦洒捨鮭瀉炸抉決皙勺釋蜥爍鑠妁斫蹟刳昔芍酌爵折癪笏赤綽灼杓石尺赭写鷓積遮舎車射斜釈社蛛麈諏洙殳娶娵鬚侏銖繻菽叔俶戚蓿倏蹙肅淑夙粛宿縮珠殊趣恤蟀卆出繍楢葺溲泅酬逎遒緝岫螽萩鷲甃駲楸穐蹤讎售讐洲綉收驟囚舅姑蓚皺鞦銹脩輯醜習羞酋聚舟秀祝袖拾啾蒐収執衆愁就臭蹴週終褶州宗集秋椶棕朱撞種修周手酒首須儁皴悛濬惷蕣雋墫順蠢舜旬浚竣峻駿逡筍瞬俊嗔蓁縉蔘鷏忱甄鷆寢岑畛矧疹槙齔臻娠譛譖哂脣袗怎晉瀋箴軫榛秦襯診鉐津駸讖紳斟唇針呻蜃賑芯瞋振殿侵薪晨辰震宸森伸愼眞慎寝晋進審深親臣鍼申心宍信真新藷墅薯杵岨胥蜍黍渚砠處嶼狙苜苴曙背緒雎蔗庶処署所暑誚篠聲橡奬觴舂囁蛸懾燮厰錆獎枩稍甞韶炒淞陞顳咲腫井摺嶂橸浹愴星升鍬樅簫慯廂霎庠剿筱鬆秤鯖政訟廠樵鷦邵愀妝璋湫艢劭峭殤梢將敞醤青慫従逍倡竦爿薔笙樟装肖菖<≦湘誦聳檣稱声裳蒋蕉嘯慴盛精霄清鈔粧彰悚鏘悄蕭哨瀟焦憔匠鍾償鞘瘴漿頌詔妾沼請薑唱庄渉障奨牀娼床椒荘抄聖宵傷性生相召銷賞猩症昭燒猖昌少憧紹晶祥尚承證将焼笑照招消章詳証硝掌商昇小觸穡屬稷嗇禝寔稙昃謖軾矚拭属燭贖囑嘱織蝕式喰蜀殖初諸触埴植食職砥姉摯誣侈髭肆仔及岐址梔咫刺贄沚旨誌資豕鷙凍厮粢齒雌耜枝齎領篩四嗤貲諮巵止死強仕熾市師指厶妛諡祗閇姿駟嗜衰偲嗣趾此染締詞茲釶〆覗弛士徙至嘴駛屎占啻之揣如知錙糸絞孜尸獅瓷緊笥始泗咨觜只匙輜廝使敷恃思痴漬脂氏蚩時紫沁俟絲巳祉矢恣若賜次浸詩志識司弑笶翅謚示梓伺視緇自祠史試私痣滲茨肢歯幟祀施竢舐卮耆呰芝阯しカ癢糜粥痒麹輕骨業軽鰈鰔餉通龜瓶甕亀鳫獵鴈殯K猟雁釀鳬鳧髢氈鴨巛側躱廁厠磧瓦獺翡為皮裘→紮〜搦苧碓柄躯躰軆體身体鴉犂烏絡空唐榧茅澗鸛厂蒄啣卷淦扞杆骭歛瞰讙奐戡豢坎瀚皖稈鐶拑酣陷繝嫺驩篏樌莟勸捍撼澣盥羹嫻鑵寰丱康懽憾羮揀歡潤罕觀橄涵渙堪覡巫鉋随萱簪舘艱咸翰柬駻悍燗槓浣邯攷稽宦考棺潅閂煥鉗疳癇函凾鹹緘款桓箝諫諌轗坩旱侃鰥 館莞橇韓患灌勧菅奸刊柑肝看桿寒緩干嵌廣広竿貫巻敢漢環喊陥監喚甘間歓閑寛管慣完汗艦乾幹官観壁椛屍姓庇鞄芳蔓千鯑一勘蜻⊃影陰蔭景*棧梯筧庚辛柧門廉乞癩Κ川κ合’)《‘”{〈“}》〉囓柁鮖悴舵鰍梶錺餝飾篭籠歸孵卻皈還省顧楓槭却帰反返守帋督祇髮韮主裃雷髪紙鉦曲矩予鐘樺沫偏騙語潟刀象模仇固硬傍難容忝辱頑形旁方型肩風滓翳微幽掠緕纃綛絣擦糟鎹粕春戞猾曷剋黠瞎鞨恰∧濶蠍筈蝎羯喝轄餓蛞聒劼擔刮蘰鬘桂闊括嘗捷豁渇担滑松堅鰹功割戛活疽暈鵲瘡傘嵩重襲葛笠堵硴墻牆蠣蛎柿掲關罹抱踵嬶嚊拘関係顏貌郁薫顔母感釡罐窰鴎框叺喧竃竈窯釜缶蒲鎌數数槝栢膳傅畏賢橿姦樫爨炊圍喞託囲鈎「『鉤」』限鍵傾(禿蕪鏑頭齧被兜哉適敵必要称彜彝鬲鼎叶片哀愛悲鋺蛇鉄蜩神奏金楫裹磆餅徒褐粮糧茖椁覺幗槨貉擴壑隱愨寉殼癨嚇穫咯膕骼膈∠掴狢埆蠖覈霍礁恪擱匿撹攪喀廓較郭〕【[】]〔殻挌劃閣格隠覚矍革馘鶴攫核獲拡客隔角確廨囘隗嵬觧榿蠏匯徊迴壞褂獪丐械枴畍誨揩醢誡夬懈喙椢恠峡价櫂茴蛙瑰乖浬鰄傀糴柏街鳰懷蛔蠶蚕邂蟹潰壊恢腕芥垣楷會拐悔詼諧皆界疥魁偕改繪貝胛絵快甲灰槐晦懐介塊解廻回階戒開会怪海縢篝炬耀赫輝冠鑒鑑各屈鏡柯噛箇上苛暇蚊廈易嘩ヵ描苅枯佳彼兼哥缺霞藉架啝下渦踝堝闕華嗄荷馨刈假夥河科個蝸迦軻咼黴舸繋書賀夏萪支卦掛掻蝦痂謌渮歌過香禾狩買變家枷克駈花賈畫珂呵替代訶袈咬画顆貸價淅飼和ヶ果糅厦課可醸葭勝仮搗嘉墟嗅譌日斯禍換窩苟貨蝌価懸欠化罅伽賭翔靴且嚼訛何駆驅个嫁譁借跏戈稼寡涸耶崋鹿笳火茄菓遐舁かc・…塩閉倶錫呼∩取籐加交ФГДАжБъйдзьЖНкёЗрЭцУТвСЮюЪЯЁЛИноыбВмМХЬЕэаепПКЩсШщяхЫштОРилгуЙф♪╂┼×╋┿◎○●銅∪χΧ子Чч株Ц珈、,色ク衝競構簡制≡変接カ┏┓└┌┛┘┗┐正コシセ℃¢c]\|ッ\_s*[コセクシカ]\|ッ\_s*[コセクシカ]\|っ\_s*[子こせくしか]\|焜\_s*炉\|嫡\_s*妻\|二\_s*合\_s*半\|牛\_s*尾\_s*魚\|巨\_s*勢\|独\_s*楽\|居\_s*士\|特\_s*牛\|粫\_s*門\|甦\_s*生\|f\_s*o\_s*o\_s*t\_s* \_s*a\_s*n\_s*d\_s* \_s*m\_s*o\_s*u\_s*s\_s*e\_s* \_s*d\_s*i\_s*s\_s*e\_s*a\_s*s\_s*e\|傴\_s*僂\|A\_s*\%(r\_s*c\_s*h\_s*i\_s*c\_s*h\_s*l\_s*a\_s*m\_s*y\_s*d\_s*e\_s*a\_s*e\|p\_s*i\_s*a\_s*l\_s*e\_s*s\)\|U\_s*m\_s*b\_s*e\_s*l\_s*l\_s*i\_s*f\_s*l\_s*o\_s*r\_s*a\_s*e\|台\_s*詞\|懺\_s*法\|前\_s*[妻栽]\|妹\_s*尾\|嘲\_s*笑\|儕\_s*輩\|斎\_s*次\|済\_s*[民済々]\|蒸\_s*[篭籠]\|救\_s*世\|莎\_s*草\|百\_s*[濟済]\|恭\_s*敬\|9\_s*[日月]\|秧\_s*鶏\|究\_s*竟\|釉\_s*掛\|典\_s*薬\_s*寮\|探\_s*湯\|球\_s*磨\|六\_s*合\|地\_s*祇\|都\_s*子\|群\_s*衆\|慈\_s*姑\|旧\_s*\%(訳\|唐\_s*書\)\|内\_s*蔵\_s*助\|H\_s*e\_s*l\_s*l\_s*e\_s*b\_s*o\_s*r\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|J\_s*u\_s*g\_s*l\_s*a\_s*n\_s*d\_s*a\_s*l\_s*e\_s*s\|R\_s*h\_s*a\_s*m\_s*n\_s*a\_s*l\_s*e\_s*s\|老\_s*舗\|望\_s*潮\|健\_s*か\|L\_s*a\_s*\%(u\_s*r\_s*\%(a\_s*c\_s*e\_s*a\_s*e\|o\_s*i\_s*d\_s*e\_s*a\_s*e\)\|m\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\|b\_s*i\_s*a\_s*t\_s*a\_s*e\)\|埋\_s*葬\_s*虫\|幣\_s*原\|卓\_s*袱\|桎\_s*梏\|柳\_s*葉\_s*魚\|汚\_s*点\|蠹\_s*魚\|惠\_s*雄\|舗\_s*石\|磯\_s*城\|W\_s*i\_s*n\_s*t\_s*e\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\|倭\_s*文\|云\_s*[云々]\|明\_s*\%(々\_s*後\_s*日\|明\_s*後\_s*日\)\|7\_s*月\|7\_s*月\|文\_s*月\|4\_s*[分月]\|4\_s*月\|竹\_s*[篦刀]\|羊\_s*[齒歯]\|爲\_s*\%([留難置果送極手兼合業]\|ん\_s*方\|來\_s*り\|納\_s*め\)\|I\_s*\%(l\_s*l\_s*i\_s*c\_s*i\_s*a\_s*c\_s*e\_s*a\_s*e\|s\_s*o\_s*p\_s*y\_s*r\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\)\|素\_s*[魚人面]\|不\_s*[忍知]\|注\_s*連\|軍\_s*鶏\|髑\_s*髏\|三\_s*\%(味\|鞭\_s*酒\)\|吃\_s*逆\|差\_s*[別異]\|叉\_s*手\|輸\_s*[出贏]\|卒\_s*去\|B\_s*r\|隼\_s*[朗郎]\|笋\_s*[干羹]\|参\_s*差\|財\_s*産\|枌\_s*所\|縦\_s*容\|睫\_s*毛\|M\_s*\%(e\_s*t\_s*a\_s*c\_s*h\_s*l\_s*a\_s*m\_s*y\_s*d\_s*e\_s*a\_s*e\|u\_s*s\_s*a\_s*l\_s*e\_s*s\)\|S\_s*\%([ge]\|p\_s*e\_s*r\_s*m\_s*a\_s*t\_s*o\_s*p\_s*h\_s*y\_s*t\_s*a\|c\_s*i\_s*t\_s*a\_s*m\_s*i\_s*n\_s*e\_s*a\_s*e\)\|Z\_s*i\_s*n\_s*g\_s*i\_s*b\_s*e\_s*r\_s*a\_s*l\_s*e\_s*s\|続\_s*\%(日\_s*本\_s*\%(紀\|後\_s*紀\)\|後\_s*撰\_s*和\_s*歌\_s*集\)\|離\_s*れ\_s*離\_s*れ\|掃\_s*部\|羚\_s*羊\|土\_s*器\|蝙\_s*蝠\|魚\_s*狗\|P\_s*\%(i\_s*p\_s*e\_s*r\_s*a\_s*\%(l\_s*e\_s*s\|c\_s*e\_s*a\_s*e\)\|t\_s*e\_s*r\_s*i\_s*d\_s*o\_s*s\_s*p\_s*e\_s*r\_s*m\_s*\%(a\_s*l\_s*e\_s*s\|i\_s*d\_s*a\_s*e\)\|o\_s*\%(t\_s*a\_s*s\_s*s\_s*i\_s*u\_s*m\|d\_s*o\_s*s\_s*t\_s*e\_s*m\_s*o\_s*n\_s*a\_s*l\_s*e\_s*s\)\)\|連\_s*枷\|枳\_s*殻\|機\_s*関\|落\_s*葉\_s*松\|凵\_s*繞\|檻\_s*車\|顴\_s*骨\|T\_s*\%(h\_s*a\_s*l\_s*i\_s*c\_s*t\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|u\_s*b\_s*i\_s*f\_s*l\_s*o\_s*r\_s*a\_s*e\)\|南\_s*瓜\|量\_s*子\|山\_s*\%(海\_s*経\|梔\_s*子\|陽\_s*道\)\|蜉\_s*蝣\|陽\_s*炎\|破\_s*片\|脚\_s*気\|旗\_s*魚\|鍛\_s*[治冶]\|挿\_s*頭\|駕\_s*\%(籠\|輿\_s*丁\)\|長\_s*[月官]\|剃\_s*刀\|天\_s*\%(牛\|鼠\_s*矢\)\|帷\_s*子\|酢\_s*漿\_s*草\|O\_s*x\_s*a\_s*l\_s*i\_s*d\_s*a\_s*c\_s*e\_s*a\_s*e\|飛\_s*[沫白]\|曽\_s*て\|曾\_s*て\|燕\_s*子\_s*花\|牡\_s*[蛎蠣]\|民\_s*部\|部\_s*曲\|E\_s*\%(b\_s*e\_s*n\_s*a\_s*l\_s*e\_s*s\|l\_s*a\_s*n\_s*a\_s*l\_s*e\_s*s\)\|案\_s*山\_s*子\|梭\_s*\%(魚\|子\_s*魚\)\|螳\_s*螂\|蟷\_s*螂\|瓜\_s*\%(田\|呂\_s*根\)\|拍\_s*手\|瑕\_s*[瑾疵]\|東\_s*\%([風雲]\|海\_s*林\|京\_s*都\_s*立\_s*科\_s*学\_s*技\_s*術\_s*大\_s*学\)\|気\_s*[質触]\|(\_s*株\_s*)\|贏\_s*ち\_s*得\|歩\_s*兵\|恁\_s*く\|杜\_s*\%(若\|父\_s*魚\)\|梅\_s*花\_s*皮\|頴\_s*田\|膾\_s*炙\|契\_s*経\|中\_s*央\_s*処\_s*理\_s*装\_s*置\|伊\_s*藤\_s*忠\_s*テ\_s*ク\_s*ノ\_s*サ\_s*イ\_s*エ\_s*ン\_s*ス\|分\_s*類\|ス\_s*リ\_s*ー\_s*ズ\|範\_s*疇\|ト\_s*ラ\_s*ン\_s*プ\|水\_s*[鶏母手夫晶]\|複\_s*雑\_s*命\_s*令\_s*セ\_s*ッ\_s*ト\_s*計\_s*算\_s*機\|サ\_s*\%(ン\_s*チ\_s*ー\_s*ム\|エ\_s*ラ\|イ\_s*\%(ト\_s*カ\_s*イ\_s*ン\|ラ\_s*ス\|ク\_s*\%([ルロ]\|リ\_s*\%(ン\|ッ\_s*ク\)\)\|ボ\_s*\%(ウ\_s*ズ\|ー\_s*グ\)\|バ\_s*\%(ー\|ネ\_s*テ\_s*ィ\_s*\%(ッ\_s*ク\|ク\_s*ス\)\)\|リ\_s*ュ\_s*ー\_s*ム\|ダ\_s*ー\|フ\_s*ァ\_s*ー\|ネ\_s*リ\_s*ア\)\|ー\_s*\%(テ\_s*ィ\_s*フ\_s*ィ\_s*ケ\_s*ー\_s*シ\_s*ョ\_s*ン\|ク\_s*ル\|カ\_s*\%(ス\|ム\_s*ス\_s*ク\_s*\%(ラ\_s*イ\_s*ブ\|リ\_s*プ\_s*シ\_s*ョ\_s*ン\)\)\|キ\_s*\%(ュ\_s*\%(ラ\_s*ー\|レ\_s*ー\_s*\%(タ\_s*ー\|シ\_s*ョ\_s*ン\)\)\|ッ\_s*ト\)\)\)\|マ\_s*ド\_s*ラ\_s*ス\|茶\_s*筅\|ケ\_s*\%([月アイ]\|フ\_s*ェ\_s*ウ\_s*ス\|プ\_s*ス\_s*ト\_s*ラ\_s*[ムル]\|チ\_s*ャ\_s*ッ\_s*プ\|ン\_s*\%(タ\_s*ウ\_s*\%(リ\|ロ\_s*ス\)\|ブ\_s*リ\_s*ッ\_s*ジ\)\|ー\_s*\%([キジブプスン]\|ク\_s*ウ\_s*ォ\_s*ー\_s*ク\|ソ\_s*ン\|タ\_s*リ\_s*ン\_s*グ\|パ\_s*\%(ー\|ビ\_s*リ\_s*テ\_s*ィ\)\|シ\_s*ン\_s*グ\|リ\_s*ー\)\|ル\_s*\%(ト\|ベ\_s*ロ\_s*ス\|テ\_s*ィ\_s*ッ\_s*ク\|ビ\_s*\%(ム\|ー\_s*ニ\)\)\|ミ\_s*\%(カ\_s*ル\|ス\_s*ト\)\)\|キ\_s*\%(ヤ\_s*ノ\_s*ン\|プ\_s*ロ\_s*ス\|ケ\_s*ロ\|ュ\_s*\%([イーア]\|ヴ\_s*ェ\|ビ\_s*\%(ズ\_s*ム\|ス\_s*ム\)\|ロ\_s*\%(ス\|ッ\_s*ト\)\|レ\_s*ー\_s*タ\_s*ー\|ラ\_s*ソ\_s*ー\|リ\_s*\%(ー\|ウ\_s*ム\|ア\_s*ス\|オ\_s*シ\_s*テ\_s*ィ\)\)\|ア\_s*\%(ラ\|ー\_s*ラ\|ン\_s*テ\_s*ィ\)\|チ\_s*ン\|ト\_s*サ\_s*ン\|メ\_s*ラ\|マ\_s*イ\_s*ラ\|ッ\_s*カ\|レ\_s*ー\_s*ト\|ャ\_s*\%([ドパスブンラ]\|デ\_s*\%(ィ\|ラ\_s*ッ\_s*ク\)\|ビ\_s*\%([アンネ]\|テ\_s*\%(ィ\|ー\_s*シ\_s*ョ\_s*ン\)\)\|ベ\_s*ツ\|バ\_s*\%(リ\_s*[エア]\|レ\_s*ー\)\|ト\_s*ル\|シ\_s*ー\|サ\_s*リ\_s*ン\|タ\_s*ピ\_s*ラ\|ピ\_s*\%(ト\_s*ル\|タ\_s*\%(ル\|リ\_s*ズ\_s*ム\)\)\|プ\_s*\%(ラ\|シ\_s*ョ\_s*ン\|テ\_s*ン\|チ\_s*ャ\)\|セ\_s*\%(イ\|ロ\_s*ー\_s*ル\)\|ッ\_s*\%([ツトチプ]\|サ\_s*バ\|ス\_s*ル\|シ\_s*\%(ュ\|ン\_s*グ\|ャ\_s*\%(ー\|ブ\_s*ル\)\)\)\|ニ\_s*\%(オ\_s*ン\|ス\_s*タ\_s*ー\)\|ナ\_s*ル\|ノ\_s*\%(ン\|ー\_s*ラ\|ピ\_s*ー\)\|ミ\_s*ソ\_s*ー\_s*ル\|メ\_s*\%(ル\|ロ\_s*\%(ン\|ッ\_s*ト\)\)\|ロ\_s*\%(ル\|ウ\_s*ェ\_s*イ\|リ\_s*ン\|ラ\_s*イ\_s*[ンナ]\|ッ\_s*ト\)\|レ\_s*ッ\_s*ト\|リ\_s*\%([コーア]\|バ\_s*ー\|ブ\_s*レ\_s*ー\_s*シ\_s*ョ\_s*ン\|ッ\_s*ジ\|ン\_s*グ\)\|ズ\_s*ム\)\|リ\_s*\%(コ\|ス\_s*ト\|シ\_s*タ\_s*ン\)\)\|総\_s*角\|チ\_s*\%([タリンマア]\|ワ\_s*ワ\|ラ\_s*ー\|ル\_s*ド\|ム\_s*ニ\_s*ー\|コ\_s*リ\|ッ\_s*\%([プク]\|テ\_s*リ\_s*オ\|タ\_s*ゴ\_s*ン\)\|キ\_s*\%(ン\|ー\_s*タ\)\|ュ\_s*\%(ア\_s*ブ\_s*ル\|ー\_s*イ\_s*ン\_s*ガ\_s*ム\)\|ー\_s*\%([フトプクズ]\|パ\_s*ー\|タ\_s*ー\)\|ェ\_s*\%([ロスカコアン]\|ザ\_s*\%(レ\|ー\_s*レ\)\|ル\_s*\%(ニ\_s*ー\|シ\_s*ー\|ノ\_s*ブ\_s*イ\_s*リ\)\|リ\_s*\%(ー\|ス\_s*ト\|ッ\_s*シ\_s*ュ\|モ\_s*ヤ\)\|レ\_s*\%(ス\_s*タ\|ン\_s*コ\_s*フ\)\|ビ\_s*チ\_s*ェ\_s*フ\|ダ\_s*ー\|チ\_s*ェ\_s*ン\|ッ\_s*\%([トクカ]\|キ\_s*ン\_s*グ\)\|イ\_s*\%([スン]\|ニ\_s*ー\|サ\_s*ー\|シ\_s*ン\_s*グ\)\|ー\_s*\%(ン\|ザ\_s*レ\|ホ\_s*フ\)\)\|ャ\_s*\%([オフドインコリウ]\|ツ\_s*ネ\|ク\_s*ラ\|プ\_s*タ\_s*ー\|パ\_s*テ\_s*ィ\|ペ\_s*\%(ル\|ッ\_s*ク\)\|チ\_s*ャ\|ネ\_s*\%(ル\|ラ\_s*ー\|リ\_s*ン\_s*グ\)\|ッ\_s*\%([クト]\|ピ\_s*ー\|プ\_s*\%(マ\_s*ン\|リ\_s*ン\)\)\|タ\_s*\%(レ\_s*[イー]\|リ\_s*ン\_s*グ\)\|ル\_s*マ\_s*ー\_s*ス\|レ\_s*ン\_s*ジ\|モ\_s*ロ\|ー\_s*\%([チタトムジ]\|ビ\_s*ル\|ミ\_s*\%(ー\|ン\_s*グ\)\|リ\_s*ー\|ル\_s*\%([ズス]\|ト\_s*ン\)\)\|ラ\_s*ン\_s*ゴ\)\|ョ\_s*\%([ンコ]\|イ\_s*ス\|ム\_s*ス\_s*キ\_s*ー\|ー\_s*\%(ク\|サ\_s*ー\|カ\_s*ー\|キ\_s*ン\_s*グ\)\|ゴ\_s*リ\|ッ\_s*\%(プ\|ピ\_s*ー\|パ\_s*ー\)\|リ\_s*ソ\)\)\|座\_s*標\|喜\_s*劇\|互\_s*換\|共\_s*\%(通\|産\_s*主\_s*義\_s*者\)\|継\_s*続\|C\_s*\%([srfdDeRoa]\|言\_s*語\|型\_s*肝\_s*炎\|y\_s*p\_s*e\_s*r\_s*a\_s*l\_s*e\_s*s\|P\_s*\%(U\|S\_s*(\_s*C\_s*o\_s*n\_s*t\_s*i\_s*n\_s*u\_s*a\_s*t\_s*i\_s*o\_s*n\_s*-\_s*P\_s*a\_s*s\_s*s\_s*i\_s*n\_s*g\_s* \_s*S\_s*t\_s*y\_s*l\_s*e\_s*)\)\|u\_s*r\_s*i\_s*u\_s*m\|M\_s*\%(U\|ソ\_s*ン\_s*グ\)\|タ\_s*イ\_s*プ\|T\_s*\%(ス\_s*キ\_s*ャ\_s*ン\|R\_s*L\_s*キ\_s*ー\)\|シ\_s*ェ\_s*ル\|S\_s*\%(V\_s*フ\_s*ァ\_s*イ\_s*ル\|チ\_s*ュ\_s*ー\_s*ナ\|ア\_s*ン\_s*テ\_s*ナ\)\|カ\_s*ッ\_s*プ\|ク\_s*ラ\_s*ス\|コ\_s*ン\_s*パ\_s*イ\_s*ラ\|C\_s*\%(R\_s*(\_s*C\_s*r\_s*e\_s*e\_s*d\_s*e\_s*n\_s*c\_s*e\_s* \_s*C\_s*l\_s*e\_s*a\_s*r\_s*w\_s*a\_s*t\_s*e\_s*r\_s* \_s*R\_s*e\_s*v\_s*i\_s*v\_s*a\_s*l\_s*)\|D\_s*カ\_s*メ\_s*ラ\)\|ド\_s*ラ\_s*イ\_s*ブ\|+\_s*+\|L\_s*\%(X\|O\_s*S\|I\_s*S\_s*P\)\|E\_s*S\_s*P\|A\_s*\%(D\|S\_s*[LE]\)\|ラ\_s*ン\_s*ク\|I\_s*S\_s*C\|h\_s*\%(l\_s*o\_s*r\_s*\%(a\_s*n\_s*t\_s*h\_s*a\_s*c\_s*e\_s*a\_s*e\|i\_s*n\_s*e\)\|r\_s*o\_s*m\_s*i\_s*u\_s*m\|a\_s*S\_s*e\_s*n\)\|O\_s*\%(B\_s*O\_s*L\|N\_s*T\_s*R\_s*O\_s*L\_s*キ\_s*ー\)\)\|C\_s*\%([型m]\|M\_s*ソ\_s*ン\_s*グ\|タ\_s*イ\_s*プ\|カ\_s*ッ\_s*プ\|ク\_s*ラ\_s*ス\|d\_s*S\|D\_s*−\_s*R\_s*O\_s*M\|ド\_s*ラ\_s*イ\_s*ブ\|+\_s*+\|ラ\_s*ン\_s*ク\|O\_s*2\|o\_s*C\_s*\%(o\|O\_s*ス\_s*ト\_s*ア\)\|言\_s*語\)\|ツ\_s*\%(ァ\_s*ー\|ィ\_s*リ\_s*ル\|ェ\_s*\%(ー\|ル\_s*ニ\_s*ー\|ラ\_s*ン\)\)\|炭\_s*素\)', + \ 'd' : '\%([共吃巴錚鑼鶏鳥響嫩緞丼呑曇貪鈍肭遠蚌溝隣鄰塢床処所年時鯲鰍鰌讀得徳獨髑毒読僮萄鐃耨嫐橈儂撓陶働ゞ桐通閙藤々恫瞳憧鬧≡⇔慟撞導仝〃洞堂瞠獰艟胴銅童動同道堵戸奴退取呶解怒土駑留努録何止度弩融孥ど瓰竕凸竍籵瓧禰泥捏溺寺棯甸黏沺佃鈿畋淀澱臀傳殿電照でヅ鶴辛強妻綱勤伝筒包做造作尽机月塚遣冢疲使連付突積吊詰漬津図釣づヂ中近力痔持地ぢ種棚倒彩濃逹畳諾゛濁默球玉魂騙谷点館舘竹嶽岳高凧蛸怛妲獺奪脱梯餒迺岱廼戴弟臺平内醍橙][題>≧第台代大鱈頼便誰懶樽怠斷椴灘黙旦煖彈暖談段断檀団團壇弾男柁舵駄雫娜橢拏朶蛇墮拿佗垂沱溜懦楕炊鴕陀儺唾騨澑建荼立田惰抱陏駝打兌妥堕出だd直◎,丶、.\.‥・…$”“↓†‡―┤達℃°独ド÷◇◆ダジДдΔδデ∂d]\|ッ\_s*\%(ト\_s*゙\|テ\_s*゙\|ツ\_s*゙\|チ\_s*゙\|タ\_s*゙\)\|ッ\_s*[ドデヅヂダ]\|っ\_s*[どでづぢだ]\|ト\_s*゙\|都\_s*々\_s*逸\|褞\_s*袍\|S\_s*a\_s*u\_s*r\_s*u\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\|C\_s*\%(u\|o\_s*p\_s*p\_s*e\_s*r\)\|満\_s*天\_s*星\|豆\_s*腐\|如\_s*何\|テ\_s*゙\|刑\_s*事\|粘\_s*葉\_s*装\|手\_s*間\|木\_s*偶\|丁\_s*[稚抹]\|蝸\_s*牛\|ツ\_s*゙\|頭\_s*[腦痛]\|チ\_s*゙\|調\_s*子\|茶\_s*碗\|知\_s*恵\|忸\_s*怩\|タ\_s*゙\|忠\_s*幸\|壁\_s*蝨\|伊\_s*達\|山\_s*車\|韃\_s*靼\|提\_s*婆\_s*達\_s*多\|太\_s*\%([刀宰鼓]\|平\_s*広\|上\_s*天\_s*皇\|政\_s*\%(官\|大\_s*臣\)\)\|乃\_s*[公毅]\|体\_s*操\|葮\_s*竹\|演\_s*\%(し\_s*物\|繹\_s*デ\_s*ー\_s*タ\_s*ベ\_s*ー\_s*ス\)\|コ\_s*ロ\_s*ン\_s*ビ\_s*ア\|ズ\_s*\%(ロ\_s*ー\_s*ス\|ッ\_s*ク\)\|イ\_s*ル\_s*カ\|医\_s*者\|博\_s*士\|文\_s*書\|行\_s*列\_s*式\|発\_s*見\_s*す\_s*る\|ハ\_s*ー\_s*グ\|拒\_s*否\_s*さ\_s*れ\_s*た\|破\_s*壊\_s*\%(者\|す\_s*る\)\|消\_s*滅\_s*子\|記\_s*述\_s*子\|D\_s*\%(論\|タ\_s*イ\_s*プ\|ド\_s*ラ\_s*イ\_s*ブ\|カ\_s*ッ\_s*プ\|C\_s*ブ\_s*ラ\_s*ン\_s*ド\|y\_s*l\_s*a\_s*n\|ラ\_s*ン\_s*ク\|a\_s*i\_s*s\_s*y\|e\_s*m\_s*a\_s*c\_s*s\)\|十\_s*進\_s*数\|ゼ\_s*ッ\_s*ケ\_s*ン\|復\_s*号\_s*化\|省\_s*略\|金\_s*剛\_s*石\|辞\_s*書\|D\_s*\%(b\|タ\_s*イ\_s*プ\|T\_s*\%(E\|P\_s*ソ\_s*フ\_s*ト\|M\_s*ソ\_s*フ\_s*ト\)\|M\_s*A\|ド\_s*ラ\_s*イ\_s*ブ\|カ\_s*ッ\_s*プ\|C\_s*\%(カ\_s*ー\_s*ド\|ブ\_s*ラ\_s*ン\_s*ド\)\|u\_s*b\_s*n\_s*i\_s*u\_s*m\|B\_s*\%(M\_s*S\|サ\_s*ー\_s*バ\)\|H\_s*C\_s*P\_s*\%(サ\_s*ー\_s*バ\|ク\_s*ラ\_s*イ\_s*ア\_s*ン\_s*ト\)\|y\_s*\%(s\_s*p\_s*r\_s*o\_s*s\_s*i\_s*u\_s*m\|l\_s*a\_s*n\)\|r\_s* \_s*P\_s*e\_s*p\_s*p\_s*e\_s*r\|ラ\_s*ン\_s*ク\|V\_s*D\_s*\%(ボ\_s*ッ\_s*ク\_s*ス\|シ\_s*ョ\_s*ッ\_s*プ\|ケ\_s*ー\_s*ス\|デ\_s*ッ\_s*キ\|ド\_s*ラ\_s*イ\_s*ブ\|オ\_s*ー\_s*デ\_s*ィ\_s*オ\|プ\_s*レ\_s*\%(イ\_s*ヤ\_s*ー\|ー\_s*ヤ\_s*ー\)\|ラ\_s*ッ\_s*ク\|レ\_s*コ\_s*ー\_s*ダ\_s*ー\|マ\_s*ル\_s*チ\|ビ\_s*デ\_s*オ\)\|O\_s*S\|o\_s*\%(c\_s*u\_s*m\_s*e\_s*n\_s*t\_s* \_s*\%(T\_s*y\_s*p\_s*e\_s* \_s*D\_s*e\_s*f\_s*i\_s*n\_s*i\_s*t\_s*i\_s*o\_s*n\|O\_s*b\_s*j\_s*e\_s*c\_s*t\_s* \_s*M\_s*o\_s*d\_s*e\_s*l\)\|C\_s*o\_s*M\_s*o\)\|e\_s*\%(g\_s*e\_s*n\_s*e\_s*r\_s*i\_s*a\_s*c\_s*e\_s*a\_s*e\|l\_s*a\_s*w\_s*a\_s*r\_s*e\)\|E\_s*\%(C\|L\_s*キ\_s*ー\)\|I\_s*\%(P\_s*ス\_s*イ\_s*ッ\_s*チ\|S\_s*K\)\|i\_s*\%(r\_s*e\_s*c\_s*t\_s* \_s*M\_s*e\_s*m\_s*o\_s*r\_s*y\_s* \_s*A\_s*c\_s*c\_s*e\_s*s\_s*s\|s\_s*t\_s*r\_s*i\_s*c\_s*t\_s* \_s*o\_s*f\_s* \_s*C\_s*o\_s*l\_s*u\_s*m\_s*b\_s*i\_s*a\|g\_s*i\_s*t\_s*a\_s*l\)\)\)', + \ 'e' : '\%([エ瘧腮偉鰓衿撰襟魘捐覃櫞湲檐薗篶¥渕鹽簷轅悁渊讌艷黶垣閼圜蜒爰掾媛鳶鴛焉宛嫣閻衍臙閹槐⌒援筵淹厭寃淵掩烟嚥圓沿宴蜿奄袁煙艶焔炎怨鉛園苑偃冤延婉遠堰燕演塩円縁刔刳抉猿狗描択鰕箙蛯蝦狄貊胡戎夷乢靨鉞戉粤咽噎桟悦閲謁亦繹伯懌掖蜴奕越役驛疫易益腋駅液咏瓔珱曵衡殪贏裔洩楹娃潁蠑瑩翳纓塋營頴瀛睿泳縊榮瑛暎曳盈郢影詠穎嬰鋭叡映営栄永枝会選衣依榎繪囘懷画絵衛會畫猥回恵獲惠慧衞荏重得餌江杖笑柄え━─┳┬┰┯┸┻┴┷фФ=≡⇔∋∈РрмМeН→英∃式!ηΗсСЛлεЭэエΕe]\|A\_s*\%([面判型級]\|V\_s*\%(機\_s*器\|女\_s*優\)\|B\_s*\%(型\|C\_s*順\)\)\|A\_s*\%([面判型級]\|V\_s*\%(機\_s*器\|女\_s*優\)\|B\_s*型\)\|M\_s*サ\_s*イ\_s*ズ\|M\_s*サ\_s*イ\_s*ズ\|豪\_s*物\|L\_s*\%(サ\_s*イ\_s*ズ\|L\_s*サ\_s*イ\_s*ズ\)\|L\_s*\%(サ\_s*イ\_s*ズ\|L\_s*\%(サ\_s*イ\_s*ズ\|教\_s*室\)\)\|羨\_s*道\|豌\_s*豆\|C\_s*\%(l\|h\_s*l\_s*o\_s*r\_s*i\_s*n\_s*e\)\|似\_s*\%(非\|而\_s*非\)\|桧\_s*原\_s*湖\|烏\_s*帽\_s*子\|吉\_s*方\|胞\_s*衣\|淮\_s*南\_s*子\|埃\_s*及\|干\_s*支\|岐\_s*路\|支\_s*繞\|壊\_s*[疽死]\|葡\_s*萄\|蛭\_s*子\|愛\_s*\%([莉理媛]\|知\_s*川\)\|N\_s*極\|N\_s*\%([個極響]\|次\_s*元\|角\_s*形\|H\_s*K\_s*ホ\_s*ー\_s*ル\)\|斉\_s*魚\|兄\_s*鼓\|ヱ\_s*ス\_s*ビ\_s*ー\_s*食\_s*品\|S\_s*\%([式極]\|サ\_s*イ\_s*ズ\|N\_s*比\|F\_s*小\_s*説\)\|S\_s*\%([波字席極]\|サ\_s*イ\_s*ズ\|N\_s*比\|F\_s*小\_s*説\)\|穢\_s*[多土]\|X\_s*\%([軸脚線]\|染\_s*色\_s*体\)\|X\_s*\%([軸脚]\|O\_s*醤\|染\_s*色\_s*体\)\|海\_s*\%(老\|鷂\_s*魚\)\|帝\_s*都\_s*高\_s*速\_s*度\_s*交\_s*通\_s*営\_s*団\|ワ\_s*ー\_s*ク\_s*ス\_s*テ\_s*ー\_s*シ\_s*ョ\_s*ン\|欧\_s*\%(州\|羅\_s*巴\)\|歐\_s*\%(州\|羅\_s*巴\)\|ヨ\_s*ー\_s*ロ\_s*\%(ピ\_s*ア\_s*ン\|ッ\_s*パ\)\|ユ\_s*\%(ア\_s*ン\|ウ\_s*ロ\_s*ピ\_s*ウ\_s*ム\|リ\_s*イ\_s*カ\|ー\_s*\%(ロ\|ノ\_s*ス\|ニ\_s*ス\|ジ\_s*\%(ン\|ー\_s*ン\)\|ド\_s*ラ\|レ\_s*カ\|ラ\_s*\%(ス\|シ\_s*ア\)\|フ\_s*\%(ラ\_s*テ\_s*ス\|ォ\_s*\%(リ\_s*ア\|ニ\_s*ア\_s*ム\)\)\|ク\_s*リ\_s*ッ\_s*ド\|カ\_s*リ\)\)\|編\_s*集\|強\_s*調\|電\_s*子\_s*メ\_s*\%(ー\_s*ル\|イ\_s*ル\)\|発\_s*展\|評\_s*価\_s*す\_s*る\|符\_s*号\_s*化\|百\_s*科\_s*事\_s*典\|カ\_s*プ\_s*セ\_s*ル\_s*化\|オ\_s*\%(ー\|イ\_s*\%(ラ\_s*ー\|ゲ\_s*ン\)\)\|実\_s*行\|拡\_s*張\|例\_s*外\|感\_s*嘆\_s*符\|E\_s*\%(P\_s*O\|ド\_s*ラ\_s*イ\_s*ブ\|D\_s*ベ\_s*ー\_s*タ\|m\_s*a\_s*c\_s*s\|カ\_s*ッ\_s*プ\|a\_s*s\_s*t\|x\_s*e\_s*r\_s*c\_s*i\_s*s\_s*e\|タ\_s*イ\_s*プ\)\|ア\_s*\%([ンイ]\|ニ\_s*ド\|ー\_s*\%([マスル]\|ウ\_s*ィ\_s*ン\|ラ\_s*ン\|ニ\_s*ー\|ネ\_s*ス\_s*ト\|ミ\_s*ン\|シ\_s*ー\|リ\_s*ー\)\)\|設\_s*立\|E\_s*\%(r\|O\_s*F\|u\_s*\%(p\_s*o\_s*m\_s*a\_s*t\_s*i\_s*a\_s*c\_s*e\_s*a\_s*e\|r\_s*o\_s*p\_s*i\_s*u\_s*m\)\|U\_s*C\_s*コ\_s*ー\_s*ド\|P\_s*レ\_s*コ\_s*ー\_s*ド\|ド\_s*ラ\_s*イ\_s*ブ\|d\_s*i\_s*t\_s*i\_s*n\_s*g\_s* \_s*M\_s*A\_s*C\_s*r\_s*o\_s*S\|-\_s*m\_s*a\_s*i\_s*l\|メ\_s*ー\_s*ル\|カ\_s*ッ\_s*プ\|コ\_s*マ\_s*ー\_s*ス\|N\_s*T\_s*E\_s*R\_s*キ\_s*ー\|タ\_s*イ\_s*プ\|i\_s*n\_s*s\_s*t\_s*e\_s*i\_s*n\_s*i\_s*u\_s*m\|S\_s*\%(P\|C\_s*キ\_s*ー\)\|l\_s*k\|m\_s*a\_s*c\_s*s\)\|イ\_s*\%([ブヴアラー]\|ジ\_s*ェ\_s*ク\_s*ト\|フ\_s*ェ\_s*ク\_s*[トタ]\|コ\_s*\%(ー\_s*ル\|ラ\_s*イ\_s*[ズザ]\)\|プ\_s*シ\_s*ロ\_s*ン\|ミ\_s*ュ\_s*レ\_s*\%(ー\_s*[トタ]\|イ\_s*タ\)\|ベ\_s*ン\_s*\%(ト\|タ\_s*ー\)\|ノ\_s*ッ\_s*ク\|ネ\_s*ー\_s*ブ\_s*ル\|ギ\_s*リ\_s*ス\|ン\_s*グ\_s*\%(ラ\_s*ン\_s*ド\|リ\_s*ッ\_s*シ\_s*ュ\)\|ッ\_s*チ\|ヤ\_s*\%(ー\|リ\_s*ン\_s*グ\|フ\_s*ォ\_s*ン\|ホ\_s*ン\)\|グ\_s*ジ\_s*\%(ッ\_s*ト\|ス\_s*ト\)\|ク\_s*\%(ス\|ア\_s*リ\_s*テ\_s*ィ\)\|ス\_s*フ\_s*ァ\_s*ハ\_s*ン\|リ\_s*[アヤ]\|レ\_s*\%(ー\_s*\%(ス\|ザ\_s*ー\|サ\_s*ー\)\|イ\_s*\%(ン\|ザ\_s*ー\|サ\_s*ー\)\|ブ\_s*ン\)\)\|ウ\_s*\%(ー\|ジ\_s*ェ\_s*ー\_s*ヌ\)\)', + \ 'f' : '\%([麓梺冬′枌賁汾濆吩刎氛雰糞褌忿墳吻紛焚扮分粉揮旧舊顫故震篩奮隹古衾襖贅燻筆鰒絃総惣總房閼鬱塞鞴章郁史艦簡札耽吭鰾笛文罧節苳蕗淦舩艙舷舟船肥太懷懐≧≪≠≫<>≦渊淵渕縁葢盖再弍蓋双藤鯊潭蒸鱶楓殕瘋封諷黻祓拂怫髴彿恚慍憤二払沸拒防茯蔔愎輹蝠箙腓⊇⊃膨脹嚢梟袋含⊆⊂袱覆輻腹幅復馥服副複福経俘麸賦麩蜉坿父附訃婦誣仆經舗咐符臥膚斧冨腑更俛觝怖腐斑踏深趺降畉譜履葺觸老敷歩布赴狂殖振夫苻噴罘伏匐賻風柎不巫蹈孵拭普芙郛埠鋪鯆付吹阜拊生桴溥榑扶俯触践負増傅鮒孚府芬呎フ飜翻ふf鉄♀∀¶富⌒金仏佛偽誤♭弗浮フΦфFФφf]\|ッ\_s*フ\|ッ\_s*フ\|っ\_s*ふ\|鞦\_s*韆\|睾\_s*丸\|陰\_s*嚢\|乱\_s*吹\|相\_s*応\|E\_s*u\_s*p\_s*t\_s*e\_s*l\_s*e\_s*a\_s*c\_s*e\_s*a\_s*e\|回\_s*回\_s*教\|書\_s*司\|図\_s*書\_s*寮\|海\_s*蘿\|補\_s*\%(任\|陀\_s*[洛落]\)\|頭\_s*垢\|雲\_s*脂\|鳧\_s*鐘\|款\_s*冬\|菜\_s*蕗\|蒲\_s*団\|M\_s*y\_s*r\_s*t\_s*a\_s*l\_s*e\_s*s\|釜\_s*[中山]\|雙\_s*葉\|B\_s*u\_s*d\_s*d\_s*l\_s*e\_s*j\_s*a\_s*c\_s*e\_s*a\_s*e\|渓\_s*井\|G\_s*e\_s*r\_s*a\_s*n\_s*i\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|2\_s*[人つ日]\|宿\_s*酔\|2\_s*\%([人つ日]\|通\_s*り\)\|○\_s*○\_s*○\|□\_s*□\_s*□\|△\_s*△\_s*△\|×\_s*×\_s*×\|帛\_s*紗\|河\_s*豚\|比\_s*律\_s*賓\|I\_s*r\_s*o\_s*n\|極\_s*東\_s*放\_s*送\|論\_s*理\_s*式\|形\_s*式\|ホ\_s*\%(ワ\_s*イ\_s*エ\|イ\_s*ル\|ル\_s*\%(マ\_s*\%(ン\_s*ト\|リ\_s*ン\)\|ム\_s*ア\_s*\%(ミ\_s*ド\|ル\_s*デ\_s*ヒ\_s*ド\)\)\)\|一\_s*杯\|機\_s*能\|関\_s*数\|汎\_s*関\_s*数\|修\_s*正\|ヒ\_s*\%(レ\|ュ\_s*ー\_s*[ズム]\)\|第\_s*1\_s*要\_s*素\|1\_s*\%(/\_s*f\_s*ゆ\_s*ら\_s*ぎ\|s\_s*t\)\|失\_s*敗\|ハ\_s*\%(エ\|ン\_s*ブ\_s*ル\|ロ\_s*ン\)\|柔\_s*軟\_s*な\|F\_s*\%(1\|カ\_s*ッ\_s*プ\|タ\_s*イ\_s*プ\|a\_s*\%(x\|m\_s*e\)\|l\_s*a\_s*v\_s*o\_s*r\)\|周\_s*波\_s*数\|エ\_s*フ\)', + \ 'g' : '\%([頃殺米諢魂權艮勤権鮴好蓙応駒事琴亊若毎如鏝埖込塵氷声肥聲腰拵心戀恋石国獄刧盒熬軣嗷壕敖噛濠哈遨拷囂轟毫傲鼇郷劫≡号豪剛沍五瑚晤珸呉超児檎庫互娯吾午極越護5篌兒冴茣梧誤寤5碁醐伍子唔忤期炬齬牾悟蜈后後宕ご〓戟屐鬩隙郤檄闃鷁撃激劇貎黥皃麑倪霓囈猊迎鯨芸藝蘖囓齧彦軒痃愿呟广監芫舷眩源儼衒弦絃験言諺現限幻玄減原拐実觧偈睨夏解下蹴毛げ靴草腐種口薬糞癖胡萸茱串藕遇嵎宮寓隅偶黒栗鞍倉蔵位昏麕羣郡群軍苦周包車狂惧組虞具弘暮食壷愚狗倶颶壺禺麌ぐ衣君嫌裂際牛垠崟斤岑憖吟銀圉圄禦馭魚嶷閠玉漁曉痙繞澆尭御翹嶢堯蟯驍僥仰業暁凝行謔瘧虐逆祇気曦議伎僞巍祁羲決城切艤礒擬沂犠萓嶬誼偽蟻宜斬疑木妓義犧技魏着欺戯儀戲ぎ巛皮川革乾側通殻絡辛柄鴉烏嵒頷巖厳嚴貫阮鳫偐岸厂⊃贋龕強翫岩鴈丸雁玩癌元願眼巌含頑神上紙髮髪金鐘係皈歸肯帰返潟固方語刀難型形鰹歹垳顏顔蟇釜鎌窯蒲蟹笠重傘號垣樫頭月合斈諤鄂壑鍔齶樂學萼愕嶽咢鰐額岳顎楽学乂既崖崕磑亥葢剴礙垓劾漑愾盖啀涯睚艾駭皚該咳階孩芥碍害鎧街凱慨概蓋骸外訛我伽臥哦換変借駕駆鵝貸画衙替代畫呀牙蛾訝勝ヶ果賀書餓芽河雅峩狩莪買峨掛ケヵ娥鵞刈俄が≫>g瓦≧ガゴΨβλΣΕΖΗΚΘοΤσνΠρΑκξιΝθμΜΩεΧδΞψΔπατΒΙυΦΥζΡφΟχΛηωギグгγΓゲГg]\|ッ\_s*\%(コ\_s*゙\|ケ\_s*゙\|ク\_s*゙\|キ\_s*゙\|カ\_s*゙\)\|ッ\_s*[ゴゲグギガ]\|っ\_s*[ごげぐぎが]\|コ\_s*゙\|小\_s*屋\|蒙\_s*御\_s*免\|巨\_s*頭\_s*鯨\|欣\_s*求\|独\_s*楽\|P\_s*e\_s*r\_s*s\_s*o\_s*n\_s*a\_s*l\_s*e\_s*s\|瞽\_s*女\|歩\_s*行\_s*虫\|向\_s*拝\|皐\_s*月\|穀\_s*潰\|寄\_s*居\_s*虫\|降\_s*魔\|格\_s*\%([間縁]\|天\_s*井\)\|恒\_s*河\_s*沙\|江\_s*\%([津湖商州]\|談\_s*抄\)\|豆\_s*[油汁]\|ケ\_s*゙\|蚰\_s*蜒\|景\_s*色\|化\_s*粧\|鴃\_s*舌\|稽\_s*古\|懸\_s*魚\|還\_s*[向俗]\|拳\_s*[万固骨]\|喧\_s*嘩\|顕\_s*界\|ク\_s*゙\|救\_s*世\_s*菩\_s*薩\|工\_s*合\|供\_s*[奉祭香進]\|紅\_s*蓮\|キ\_s*゙\|毬\_s*杖\|岐\_s*\%([南阜]\|セ\_s*ン\)\|棋\_s*将\_s*谷\|求\_s*\%([法道肥]\|不\_s*得\_s*苦\|聞\_s*持\_s*法\)\|A\_s*g\|S\_s*\%(c\_s*r\_s*o\_s*p\_s*h\_s*u\_s*l\_s*a\_s*r\_s*i\_s*a\_s*c\_s*e\_s*a\_s*e\|y\_s*m\_s*p\_s*e\_s*t\_s*a\_s*l\_s*a\_s*e\|i\_s*l\_s*v\_s*e\_s*r\)\|希\_s*臘\|杏\_s*葉\|餃\_s*子\|刑\_s*部\|カ\_s*゙\|搦\_s*み\|鑑\_s*真\|仮\_s*名\|蝦\_s*[蟆蟇]\|T\_s*y\_s*p\_s*a\_s*l\_s*e\_s*s\|鉤\_s*状\_s*部\|菓\_s*子\|甲\_s*斐\|会\_s*社\|ヌ\_s*ー\|G\_s*\%(O\_s*R\_s*O\|B\_s*y\_s*t\_s*e\|メ\_s*ン\|カ\_s*ッ\_s*プ\|タ\_s*イ\_s*プ\|ス\_s*ポ\_s*ッ\_s*ト\|パ\_s*ン\|n\_s*u\_s*s\)\|ニ\_s*ュ\_s*ー\_s*ズ\|ノ\_s*ー\_s*ム\|総\_s*司\_s*令\_s*部\|連\_s*合\_s*国\_s*軍\_s*総\_s*司\_s*令\_s*部\|ヒ\_s*ル\|ク\_s*ッ\_s*パ\|硝\_s*子\|ハ\_s*ボ\_s*ロ\_s*ー\_s*ネ\|瞿\_s*曇\|ヨ\_s*ー\_s*テ\_s*ボ\_s*リ\|エ\_s*ー\_s*テ\_s*ボ\_s*リ\|イ\_s*ェ\_s*\%(ー\_s*テ\_s*ボ\_s*リ\|テ\_s*ボ\_s*リ\)\|得\_s*る\|G\_s*\%([dae]\|o\_s*m\_s*o\_s*r\_s*t\_s*e\_s*g\_s*a\_s*c\_s*e\_s*a\_s*e\|M\_s*\%(T\|D\_s*(\_s*G\_s*e\_s*r\_s*m\_s*a\_s*n\_s* \_s*N\_s*a\_s*t\_s*i\_s*o\_s*n\_s*a\_s*l\_s* \_s*R\_s*e\_s*s\_s*e\_s*a\_s*r\_s*c\_s*h\_s* \_s*C\_s*e\_s*n\_s*t\_s*e\_s*r\_s* \_s*f\_s*o\_s*r\_s* \_s*C\_s*o\_s*m\_s*p\_s*u\_s*t\_s*e\_s*r\_s* \_s*S\_s*c\_s*i\_s*e\_s*n\_s*c\_s*e\_s*)\)\|メ\_s*ン\|C\_s*L\|c\_s*c\|カ\_s*ッ\_s*プ\|タ\_s*イ\_s*プ\|ス\_s*ポ\_s*ッ\_s*ト\|パ\_s*ン\|P\_s*L\|n\_s*u\_s*s\|I\_s*\%(N\_s*A\_s*(\_s*t\_s*h\_s*e\_s* \_s*G\_s*e\_s*n\_s*e\_s*r\_s*i\_s*c\_s* \_s*I\_s*n\_s*t\_s*e\_s*r\_s*a\_s*c\_s*t\_s*i\_s*v\_s*e\_s* \_s*A\_s*p\_s*p\_s*l\_s*i\_s*c\_s*a\_s*t\_s*i\_s*o\_s*n\_s*)\|F\_s*\%(フ\_s*ァ\_s*イ\_s*ル\|ア\_s*ニ\_s*メ\)\)\|U\_s*I\|N\_s*U\|O\_s*サ\_s*イ\_s*ン\|E\_s*T\_s*メ\_s*ソ\_s*ッ\_s*ド\)\|ヘ\_s*\%(ラ\_s*ル\_s*ド\|ル\_s*マ\_s*ン\)\|ド\_s*イ\_s*ツ\|成\_s*吉\_s*思\_s*汗\|ゼ\_s*\%(ラ\_s*\%(チ\_s*ン\|ニ\_s*ウ\_s*ム\)\|ム\_s*ク\_s*リ\_s*ッ\_s*プ\|ノ\_s*ア\|ン\_s*ト\_s*ル\_s*マ\_s*ン\|ネ\_s*\%(コ\_s*ン\|ラ\_s*\%(ル\|リ\_s*ス\_s*ト\)\)\)\|大\_s*\%(蚊\|学\_s*院\_s*生\)\|ジ\_s*\%([ムルジグノナオンー]\|プ\_s*シ\_s*ー\|ア\_s*ン\|ッ\_s*ド\|イ\_s*ド\|タ\_s*ン\|ゼ\_s*ル\|リ\_s*ア\_s*ン\|レ\_s*ッ\_s*ト\|ゴ\_s*ロ\|ラ\_s*\%(フ\|ル\_s*\%(ド\|デ\_s*ィ\_s*ー\_s*ノ\)\)\|ロ\_s*\%(ー\|ン\_s*ド\)\|バ\_s*ン\_s*シ\_s*ー\|ブ\_s*\%(リ\|ラ\_s*ル\_s*タ\_s*ル\)\|ベ\_s*\%(ル\_s*ナ\_s*ウ\|レ\_s*リ\_s*ン\)\|ネ\_s*ッ\_s*ト\|ョ\_s*\%(ッ\_s*ト\|ヴ\_s*ァ\_s*ン\_s*[ニナ]\|バ\_s*ン\_s*[ニナ]\|コ\_s*\%(ー\_s*ソ\|ン\_s*ダ\)\|ル\_s*\%(ジ\|ダ\_s*ー\_s*ノ\)\|ー\_s*\%(ジ\|ゼ\_s*ッ\_s*ト\)\)\|ャ\_s*\%(ン\|イ\_s*\%(ロ\|ル\_s*ズ\|ア\_s*ン\_s*[ツト]\)\|コ\_s*\%(モ\|メ\_s*ッ\_s*テ\_s*ィ\)\|ー\_s*マ\_s*ン\)\|ニ\_s*ー\|ュ\_s*\%([レネ]\|ゼ\_s*ッ\_s*ペ\|リ\_s*\%(ア\|ー\_s*ニ\|エ\_s*ッ\_s*タ\)\|ヌ\_s*\%(ビ\_s*エ\_s*ー\_s*ブ\|ヴ\_s*ィ\_s*エ\_s*ー\_s*ヴ\)\)\|ェ\_s*\%([リルフムマネ]\|ス\_s*チ\_s*ャ\_s*ー\|ロ\_s*ニ\_s*モ\|ラ\_s*\%(ー\_s*[トルド]\|ル\_s*\%(ド\|デ\_s*ィ\_s*ン\|ダ\_s*イ\_s*ン\)\)\|ミ\_s*ニ\|ニ\_s*ー\|ノ\_s*\%([アバ]\|ヴ\_s*ァ\|ワ\_s*ー\_s*ズ\|サ\_s*イ\_s*ド\)\|ン\_s*\%(マ\|ト\_s*\%(ル\|リ\_s*[ィー]\)\|ダ\_s*ー\)\)\)\)', + \ 'h' : '\%([ホ洞亡袰滅幌濠壕畚笨略檣艢焔炎仄朖朗塊程施滸幾殆缶熱解屠榾螢蛍骨細本*※糒恣縦擅星戟戈桙綻祠誇埃鉾矛堀頬袍垉膀鞄抔磅峯堋弸皰舫篷麭怦呆蔀棚褓泙枋棒勹鴇朴峰豐苞葬琺寳炮鵬寶繃魴鋒髣逢朋烹鳳彗箒俸焙蓬烽幇抱崩訪泡澎彷縫捧萌萠彭包胞倣邦飽疱庖奉豊砲報硼宝攴攵瀑蹼樮北恍掘畝譽保穗賞埔餔咆惚穂葡抛哮耄堡脯哺襃黼捕彫褒欲吼舖輔葆浦逋誉ほヘ謙遜篦廰廳貶褊胼諞篇駢蝙翩變∂遍返騙編扁変丿暼諛諂隔凹臍巳蛇蔕蒂瓸竡粨躄闢癖甓璧劈碧壁聘餅箆坪竝嬖幤閇娉病塀蔽并陛屏炳斃瓶弊幣併敝閉並辺邉減屁圧歴邊折舳戸へフ麓梺冬♭′枌賁汾濆吩氛雰糞褌忿墳吻紛焚扮分粉揮旧舊顫故震篩奮隹古衾襖贅燻鰒陰絃総惣總房閼鬱塞章郁艦簡補札耽吭鰾笛芬呎文罧節苳蕗淦舩艙舷舟船蒲懷懐≧≪≫>≦渊淵渕縁葢盖弍蓋双B藤潭蒸鱶楓殕瘋封諷黻怫髴佛彿恚慍憤仏F弗沸Φφ拒防茯蔔愎輹蝠箙⊇⊃嚢梟袋含⊆⊂袱覆輻復馥副複福経俘麸賦麩蜉坿父附訃婦誣仆經舗咐符臥斧冨更俛觝怖腐踏深趺富降畉譜葺觸敷歩赴狂殖振夫苻噴罘伏匐賻風柎不巫蹈孵拭普芙郛埠鋪鯆付吹阜拊桴溥榑扶俯触践負増傅鮒孚府ふヒ鶸彬禀斌蘋嬪繽殯賓擯牝貧頻瀕稟品怯葫晝飜蒜蛭昼綬胙紐鰭∝衡片鮃閃鵯辟百媛姫仭擴絋仞展尋宥太拡拓拾祐恕紘煕泰熙寛啓弘宏洋裕浩廣広髟馮飃飆殍冰冫凭俵驫彪雹飄豹漂驃慓剽嫖兵憑票評標平表燧老撚拈捫捻歪籤籖柊旱魃秀跪膝蜩羆攣佗−低隙閑暇雛髯鬚髭¬蹄濳潜潛顰密窃鬻提瓠蠡瓢匏壽央恒廂尚寿久率蟆痙蟇丙丁孤女史獨独稘斎均倫準斉等≠單偏単他仁瞳人11柆蔆拉杓柄犇◇◆菱醢醤曾蘖彦酷浸漬鶲額聖肱肘熈芒光膕控皸皹響罅僻鰉蹕匹逼篳畢疋柩棺弼櫃謐坤未羊筆必襞養饑(<「【←『左緋罷引披惹轡丕卑碑彼昜痺砒鞁退匪否毘皮蜚干疲蓖氷比匕桧日梭曳牽費扉魅肥痞灯豼鞴斐狒碾秕杼冷贔俾挽索被貔暃避火朏菲裨秘髀轢乾臂泌庇批紕脾霏檜飛悲妣妃樋祕陳鄙譬ひハ布鱧釖鉤蝟梁鍼磔針肚禳腑腸孕原拂祓払遼温玄請腹陽悠遙東遥治春捷頓鮠鶻駿疾囃林隼畔磐泛鈑潘膰樊笵釆胖拌絆蟠氾坂范凡燔楾洪瘢翻板攀゜大伴煩槃斑袢判範藩繙蕃版搬叛班阪般販犯汎帆頒反侍鯊櫨祝?硲間烈激勵劇励速蝿蠅省飯彈勢外筈弭辱逸育毓齦浮難掵阻憚幅巾柞母翅幟側圃旌旙旛将傍働鰰機叩疥畠籏幡畑旗斜鴿再鳩開秦跣膚肌裸弾薑椒元弌壹哉壱甫一創馨始鋼芳剪夾鋏螯挾挟脛萩贐餞離塙英蕚萼衂衄縹譚咄放噺話洟甚鼻華花觜赱迸枦奔艀婢梯燥箸柱走橋箪匣凾□筐繁方運匚筥箱函佰珀魄陌亳狛柏愽栢岶蘗粕膊璞擘箔舶泊搏迫帛拍諮測企圖秤謀量計図儚捗袴伯博墓秡癶髮釟溌肇廿二初椀蓮♪8鉢蜂發髪服法半醗白薄八発擺旆盃珮湃坏碚琲睥霈埴牌拜裴孛吠入沛榛杯悖―廢腓徘誹稗癈俳肺憊輩背鷂胚廃排拝敗灰配蛤濱浜跳馳霸羞爆禿杷碆叭匍怕栄玻撥穿愧歯膨破恥晴巴生派暎端覇着帚刃填腫吐刷菷刎菠羽琶張這頗簸佩耻早映履慙坡榮果脹跛陂葉播笆葩矧霽食芭把刄捌垪剥爬掃帶齒嵌貼はh━─┛┘┷┸┻┴┓┐┬┳┯┰┫┥┤┨╋┿┼╂波‐フ☆★非ヒホヘハh]\|ッ\_s*[ホヘフヒハ]\|ッ\_s*[ホヘフヒハ]\|っ\_s*[ほへふひは]\|寄\_s*生\|珠\_s*鶏\|混\_s*一\_s*色\|紅\_s*[幇中]\|T\_s*r\_s*i\_s*u\_s*r\_s*i\_s*d\_s*a\_s*l\_s*e\_s*s\|微\_s*[酔笑]\|子\_s*規\|蜀\_s*魂\|杜\_s*[鵑宇]\|時\_s*鳥\|上\_s*枝\|鬼\_s*灯\|酸\_s*漿\|叢\_s*祠\|和\_s*了\|鮑\_s*魚\|謗\_s*法\|黒\_s*子\|部\_s*屋\|竹\_s*\%(畚\|麦\_s*魚\)\|巻\_s*子\|綜\_s*麻\|下\_s*手\|糸\_s*瓜\|霹\_s*靂\|c\_s*l\_s*a\_s*u\_s*s\_s*t\_s*r\_s*o\_s*p\_s*h\_s*o\_s*b\_s*i\_s*a\|鞦\_s*韆\|睾\_s*丸\|乱\_s*吹\|相\_s*応\|E\_s*\%(r\_s*i\_s*o\_s*c\_s*a\_s*u\_s*l\_s*a\_s*l\_s*e\_s*s\|u\_s*p\_s*t\_s*e\_s*l\_s*e\_s*a\_s*c\_s*e\_s*a\_s*e\)\|回\_s*\%(鍋\_s*肉\|回\_s*教\)\|書\_s*司\|頭\_s*垢\|鳧\_s*鐘\|款\_s*冬\|菜\_s*蕗\|f\_s*\%(o\_s*r\_s*t\_s*e\|e\_s*m\_s*t\_s*o\)\|釜\_s*[中山]\|雙\_s*葉\|渓\_s*井\|G\_s*e\_s*r\_s*a\_s*n\_s*i\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|宿\_s*酔\|○\_s*○\_s*○\|△\_s*△\_s*△\|×\_s*×\_s*×\|河\_s*\%(豚\|底\_s*撈\_s*魚\)\|神\_s*[庫籬]\|領\_s*巾\|肩\_s*巾\|素\_s*見\|曹\_s*白\_s*魚\|枚\_s*[田方]\|敬\_s*昌\|幸\_s*展\|容\_s*靖\|晃\_s*道\|宙\_s*子\|欧\_s*子\|祥\_s*加\|終\_s*日\|翡\_s*翠\|曽\_s*祖\_s*父\|豪\_s*将\|偉\_s*紀\|周\_s*[行男]\|茅\_s*蜩\|向\_s*日\_s*葵\|七\_s*宗\|桶\_s*坂\|永\_s*和\|蟾\_s*蜍\|抽\_s*\%([斗出]\|き\_s*出\_s*し\)\|告\_s*天\_s*子\|雲\_s*[脂雀]\|為\_s*人\|緊\_s*[と々]\|鎮\_s*火\_s*\%(祭\|の\_s*祭\)\|A\_s*\%(s\|r\_s*s\_s*e\_s*n\_s*i\_s*c\|n\_s*g\_s*i\_s*o\_s*s\_s*p\_s*e\_s*r\_s*m\_s*a\_s*e\)\|粃\_s*糠\_s*疹\|只\_s*管\|直\_s*[向走垂隠]\|常\_s*陸\|鹿\_s*尾\_s*菜\|撲\_s*り\_s*倒\|同\_s*胞\|赦\_s*い\|青\_s*春\|哈\_s*爾\_s*浜\|美\_s*佳\|流\_s*行\|勇\_s*[樹人]\|韓\_s*流\|漢\_s*堡\|汗\_s*国\|盤\_s*陀\|R\_s*S\_s*I\|蔓\_s*延\|沙\_s*魚\|蝦\_s*虎\_s*魚\|馬\_s*銜\|狭\_s*間\|南\_s*風\|延\_s*\%(縄\|い\_s*て\)\|義\_s*母\|旅\_s*籠\|N\_s*e\_s*l\_s*u\_s*m\_s*b\_s*o\_s*n\_s*a\_s*c\_s*e\_s*a\_s*e\|黄\_s*[酒櫨]\|土\_s*[方生師]\|嘔\_s*[吐気]\|支\_s*倉\|長\_s*谷\|接\_s*ぎ\_s*合\|纏\_s*頭\|煙\_s*火\|麻\_s*疹\|階\_s*[上子]\|嘴\_s*\%(細\_s*鴉\|太\_s*鴉\)\|学\_s*胤\|2\_s*\%([人つ日]\|0\_s*[歳日]\)\|2\_s*\%([人つ日]\|通\_s*り\|0\_s*日\)\|淡\_s*竹\|8\_s*月\|客\_s*家\|P\_s*\%(t\|o\_s*t\_s*a\_s*m\_s*o\_s*g\_s*e\_s*t\_s*o\_s*n\_s*a\_s*l\_s*e\_s*s\|l\_s*a\_s*t\_s*i\_s*n\_s*u\_s*m\)\|海\_s*\%([鞘永蘿星牙]\|拉\_s*爾\|底\_s*撈\_s*月\)\|M\_s*\%(y\_s*r\_s*t\_s*a\_s*l\_s*e\_s*s\|e\_s*r\_s*c\_s*u\_s*r\_s*y\)\|色\_s*調\|呼\_s*和\_s*浩\_s*特\|ウ\_s*ー\_s*ゴ\|ユ\_s*\%(ー\|ペ\_s*ー\_s*ル\|ベ\_s*ー\_s*ル\|イ\_s*ス\_s*マ\_s*ン\_s*ス\|ゴ\_s*ー\|グ\_s*ノ\_s*ー\|マ\_s*ニ\_s*\%(テ\|ス\_s*[トム]\)\)\|現\_s*代\|十\_s*六\_s*進\_s*数\|高\_s*さ\|香\_s*港\|イ\_s*\%(ダ\_s*ル\_s*ゴ\|ス\_s*パ\_s*ニ\_s*ア\|レ\_s*ー\_s*ル\|エ\_s*ロ\)\|H\_s*\%(z\|カ\_s*ッ\_s*プ\|o\_s*b\_s*b\_s*i\_s*t\|i\_s*\%(8\|B\_s*a\_s*n\_s*d\)\)\|オ\_s*\%([ラー]\|ナ\_s*ー\|ノ\_s*レ\|ン\_s*フ\_s*ル\_s*ー\_s*ル\|ネ\_s*\%(ス\_s*\%(ト\|テ\_s*ィ\)\|ゲ\_s*ル\)\|テ\_s*ル\|ル\_s*ガ\_s*ー\|マ\_s*ー\_s*ジ\_s*ュ\)\|ア\_s*\%(ン\_s*\%(リ\|ベ\_s*ー\_s*ル\)\|ネ\_s*ス\_s*ト\|ワ\_s*ー\|ダ\_s*マ\_s*ー\_s*ル\|シ\_s*ェ\_s*ッ\_s*ト\|ビ\_s*タ\_s*シ\_s*オ\_s*ン\|ー\_s*\%(ネ\_s*ス\_s*ト\|ノ\_s*ン\_s*ク\_s*ー\_s*ル\)\)\|H\_s*\%([fsPeo]\|i\_s*m\_s*a\_s*n\_s*t\_s*a\_s*n\_s*d\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\|カ\_s*ッ\_s*プ\|T\_s*\%(M\_s*L\_s*フ\_s*ァ\_s*イ\_s*ル\|T\_s*P\_s*サ\_s*ー\_s*バ\)\|D\_s*D\_s*レ\_s*コ\_s*ー\_s*ダ\_s*ー\|u\_s*r\_s*d\|a\_s*\%(s\_s*s\_s*i\_s*u\_s*m\|f\_s*n\_s*i\_s*u\_s*m\|w\_s*a\_s*i\_s*i\)\|y\_s*\%(p\_s*e\_s*r\_s* \_s*T\_s*e\_s*x\_s*t\_s* \_s*M\_s*a\_s*r\_s*k\_s*u\_s*p\_s* \_s*L\_s*a\_s*n\_s*g\_s*u\_s*a\_s*g\_s*e\|d\_s*\%(n\_s*o\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\|r\_s*\%(a\_s*s\_s*t\_s*i\_s*d\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|o\_s*\%(s\_s*t\_s*a\_s*c\_s*h\_s*y\_s*d\_s*a\_s*l\_s*e\_s*s\|g\_s*e\_s*n\)\)\)\)\)\|エ\_s*\%(デ\_s*ィ\|ン\_s*リ\_s*ケ\|レ\_s*\%(ナ\|ー\_s*ヌ\)\|ロ\_s*イ\_s*ー\_s*ズ\|ク\_s*ト\_s*ル\|ル\_s*\%(ゲ\_s*ラ\|ヴ\_s*ェ\|メ\_s*ス\|マ\_s*ン\|ミ\_s*\%(ッ\_s*ト\|ー\_s*ト\)\|ブ\_s*ラ\_s*ン\|ナ\_s*ン\_s*デ\_s*ス\|キ\_s*ュ\_s*ー\_s*ル\)\|ノ\_s*ク\|イ\_s*チ\|ッ\_s*チ\)\|水\_s*[銀平素]\)', + \ 'i' : '\%([イηΗ賤鄙卑苟嫌弥薯妹芋藷夢艷鑪鈩彩鱗色鯆忽綺貸甍答応愈圦杁茵胤飮寅尹婬贇韵隱蚓氤酳霪蔭堙湮廴音飲慇韻咽淫殞姻隕院允隠殷陰窟巖巌頌祝鰮鰛鰯岩磐円¥鼾歪弋弑抱懐肬贅疣狗戌乾犬諱在坐未汝戒誡警縛今Εε曰禾稻員因蝗嘶鰍電引躄誘動≦忿鵤錨碇怒霆霹雷凧桴筏魚S菴庵彌雖家尿荊棘茨祈祷命豕猯古伍聿乙鎰鴪軼樹慈悼愴慯労格到至傷鼬頂戴病徒致鈑痛板柞沙砂聊些潔諍烈功諫勳勇勲漁諌憇=憩粹熱粋憤域閾勢勤忙急磯孰焉湶泉厳何弄苛≧鎔范啀毬訝燻息挑絲縷厭營営愛幼稚緒遑暇糸弌壹肆莓苺櫟著市碑鐓礎甃臀弩石牲犧犠池溢Y佚壱11鬻毓燠礇粥的戦戰軍郁幾育一稲否飯違居矮ゐ猪五煎彝醫斐逶貽善胆位萎可詑僞鑄熬活容依要斎行怡異衣逝猗胃洟好矣鋳揖椅去惟云懿熨痿射凍尉移将囗肄夷率囲姨慰頤忌唯緯逸噫挿鮪易偽苡彜莞往以韋遺炒謂李生威為維意倚良如彙已出淹言亥鰄井蔚痍圍幃渭堰饐医爲癒帷恚偉委詒畏い氷Йй→⇒⊂⊃▼▽伊i印入∞吋∈∋∬∫∩IイИΙи私ιi]\|E\_s*メ\_s*ー\_s*ル\|灼\_s*然\|祖\_s*谷\|湯\_s*文\_s*字\|文\_s*身\|郎\_s*[女子]\|蕁\_s*麻\|刺\_s*[青草]\|U\_s*r\_s*t\_s*i\_s*c\_s*a\_s*l\_s*e\_s*s\|海\_s*[豚参]\|西\_s*表\|鸚\_s*哥\|影\_s*青\|況\_s*ん\_s*や\|所\_s*謂\|D\_s*i\_s*a\_s*p\_s*e\_s*n\_s*s\_s*i\_s*a\_s*l\_s*e\_s*s\|藺\_s*草\|J\_s*u\_s*n\_s*c\_s*a\_s*l\_s*e\_s*s\|田\_s*舎\|膝\_s*行\|十\_s*六\_s*夜\|寝\_s*穢\|英\_s*\%(蘭\|吉\_s*利\)\|斑\_s*鳩\|烏\_s*賊\|玉\_s*筋\_s*魚\|硫\_s*黄\|夜\_s*来\_s*香\|N\_s*a\_s*j\_s*a\_s*d\_s*a\_s*l\_s*e\_s*s\|牛\_s*膝\|稜\_s*威\|常\_s*春\_s*藤\|5\_s*[つ日]\|5\_s*[つ日]\|惡\_s*戲\|甚\_s*振\|潮\_s*来\|悪\_s*戯\|交\_s*喙\|細\_s*小\_s*魚\|小\_s*魚\|鯨\_s*魚\|鶏\_s*魚\|経\_s*緯\|礒\_s*[山田]\|P\_s*\%(o\_s*a\_s*l\_s*e\_s*s\|l\_s*u\_s*m\_s*b\_s*a\_s*g\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\)\|和\_s*泉\|気\_s*吹\|E\_s*\%(A\_s*S\_s*T\|V\_s*E\)\|指\_s*宿\|拠\_s*所\|従\_s*[弟妹姉兄]\|鴨\_s*脚\_s*樹\|公\_s*孫\_s*樹\|G\_s*\%(r\_s*a\_s*m\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\|l\_s*u\_s*m\_s*i\_s*f\_s*l\_s*o\_s*r\_s*a\_s*e\|i\_s*n\_s*k\_s*g\_s*o\_s*p\_s*s\_s*i\_s*d\_s*a\)\|銀\_s*杏\|鳶\_s*尾\|檪\_s*本\|巫\_s*子\|神\_s*巫\|睦\_s*月\|都\_s*方\_s*流\|縊\_s*[殺死首]\|蝟\_s*[集縮]\|埋\_s*け\_s*[火炭]\|許\_s*[嫁婚]\|<\_s*=\_s*=\_s*>\|必\_s*要\_s*十\_s*分\_s*条\_s*件\|ヤ\_s*ン\|日\_s*本\_s*ア\_s*イ\_s*・\_s*ビ\_s*ー\_s*・\_s*エ\_s*ム\_s*株\_s*式\_s*会\_s*社\|国\_s*際\_s*\%(基\_s*督\_s*教\_s*大\_s*学\|標\_s*準\_s*化\_s*機\_s*構\)\|逆\_s*離\_s*散\_s*フ\_s*ー\_s*リ\_s*エ\_s*変\_s*換\|識\_s*別\_s*子\|即\_s*興\_s*曲\|な\_s*ら\_s*ば\|項\_s*目\|逐\_s*次\_s*型\|誤\_s*っ\_s*た\|無\_s*\%(花\_s*果\|効\_s*な\)\|帰\_s*納\_s*法\|字\_s*下\_s*げ\|不\_s*\%([可如足]\|充\_s*分\)\|具\_s*体\_s*化\|情\_s*報\|導\_s*入\|整\_s*数\|完\_s*全\|I\_s*\%([rPn]\|R\_s*Q\|カ\_s*ッ\_s*プ\|C\_s*\%(タ\_s*グ\|チ\_s*ッ\_s*プ\|カ\_s*ー\_s*ド\)\|l\_s*l\_s*i\_s*n\_s*o\_s*i\_s*s\|S\_s*\%(O\|B\_s*N\_s*\%(コ\_s*ー\_s*ド\|番\_s*号\)\|A\_s*バ\_s*ス\)\|d\_s*a\_s*h\_s*o\|D\_s*\%(カ\_s*ー\_s*ド\|E\_s*\%(ド\_s*ラ\_s*イ\_s*ブ\|デ\_s*バ\_s*イ\_s*ス\|ケ\_s*ー\_s*ブ\_s*ル\|コ\_s*ン\_s*ト\_s*ロ\_s*ー\_s*ラ\)\)\|タ\_s*ー\_s*ン\|T\_s*\%(シ\_s*ス\_s*テ\_s*ム\|バ\_s*ブ\_s*ル\)\|o\_s*\%(w\_s*a\|d\_s*i\_s*n\_s*e\)\)\|ヨ\_s*\%(ア\_s*ン\|シ\_s*フ\|ー\_s*ド\|ウ\_s*素\)\|ア\_s*\%(イ\|ー\_s*\%(ヴ\_s*ィ\_s*ン\|ビ\_s*ン\)\|ン\_s*\%(プ\_s*ロ\_s*ン\_s*プ\_s*\%(チ\_s*ュ\|テ\_s*ュ\)\|デ\_s*パ\_s*ン\_s*ダ\_s*ン\|フ\_s*ォ\_s*ル\_s*\%(メ\_s*ル\|マ\_s*テ\_s*ィ\_s*ー\_s*ク\)\)\)\)', + \ 'j' : '\%([塩嶋島嶌縞橲竺衂衄宍舳忸軸舌喰食直凝實昵実印尻侭仞刄臣恁儘潯贐稔進盡仭糂訊俥蕁迅刃靱荏甚靭燼櫁樒塵尽尋陣腎壬人敍莇茹杼洳敘汝蜍耡恕舒縟褥蓐辱溽所抒鋤徐絮序叙助帖穰疂聶疊驤襄淨讓繩禳絛蕘諚仗壌滌繞生靜蟐壤仍茸嬲疉塲乘遶星瀞拯釀躡孃如剩娘嬢錠静醸縄女尉饒丈成烝擾嫋穣丞盛場杖條条蒸貞状攘畳剰冗定浄乗情城上常譲懦愀鷲竪嬬戍得濡咒讐讎就聚笋篤盾徇凖楯詢隼筍蓴惇洵淳閏恂諄馴旬荀潤循醇巡遵順准殉純準襦誦需朮戌宿孰塾珠熟恤術述豎孺呪儒綬樹受授壽揉從澀狃中戎拾廿鞣从縱澁糅蹂神汁獸絨縦渋柔什充十従獣住銃重事迩爺滋除怩尓痔璽至児士寿茲孳染嗣柱寺磁仕死爾路而仁辞塒時岻粫持恃敷焦字只地轜侍瓷亊知辭餌冶邇弍似祀以子峙二史自畤兒示耳慈司蒔次珥膩醤鮭着鉐惹搦尺雀寂若弱邪戯者蛇麝闍じj┃│┝┣├┠┌┏.еЕ治яЯ日ЮюЁёйЙジj]\|ッ\_s*シ\_s*゙\|ッ\_s*ジ\|っ\_s*じ\|G\_s*\%(メ\_s*ン\|パ\_s*ン\)\|D\_s*y\|G\_s*\%(メ\_s*ン\|パ\_s*ン\)\|支\_s*度\|試\_s*合\|2\_s*乗\|2\_s*乗\|祖\_s*父\_s*\%(さ\_s*ん\|祖\_s*母\)\|獅\_s*子\|甲\_s*乙\_s*丙\_s*丁\_s*戊\_s*己\_s*庚\_s*辛\_s*壬\_s*癸\|k\_s*\$\_s*_\_s*{\_s*e\_s*f\_s*f\_s*}\_s*\$\|Z\_s*\%(r\|i\_s*r\_s*c\_s*o\_s*n\_s*i\_s*u\_s*m\)\|深\_s*\%(秘\|大\_s*寺\)\|秦\_s*泉\_s*寺\|沈\_s*\%(香\|丁\_s*花\)\|晨\_s*朝\|濁\_s*世\|判\_s*官\|諍\_s*論\|長\_s*夜\|漏\_s*斗\|↑\_s*↓\_s*←\_s*→\|焼\_s*酎\|鐘\_s*石\|橈\_s*脚\_s*類\|承\_s*久\|朱\_s*里\|C\_s*a\_s*b\_s*o\_s*m\_s*b\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|絢\_s*子\|頌\_s*偈\|数\_s*珠\|入\_s*[魂牢来洛院内水棺]\|霜\_s*月\|1\_s*\%(2\|6\_s*進\|0\_s*[進月]\|1\_s*月\|8\_s*禁\)\|師\_s*走\|極\_s*月\|紐\_s*帯\|1\_s*\%(0\|1\_s*月\|8\_s*禁\|2\_s*月\)\|シ\_s*゙\|爪\_s*哇\|射\_s*礼\|砂\_s*利\|謝\_s*花\|三\_s*味\_s*線\|雑\_s*魚\|著\_s*語\|杓\_s*子\|共\_s*同\_s*企\_s*業\_s*体\|ゼ\_s*リ\_s*ー\|エ\_s*\%(ホ\_s*バ\|リ\_s*コ\|レ\_s*ミ\_s*ヤ\|ル\_s*サ\_s*レ\_s*ム\|ッ\_s*サ\_s*イ\)\|ヘ\_s*\%(レ\_s*ス\|ス\_s*ス\)\|ヒ\_s*メ\_s*ネ\_s*ス\|チ\_s*ゲ\|北\_s*陸\_s*先\_s*端\_s*\%(大\|科\_s*学\_s*技\_s*術\_s*大\_s*学\_s*院\_s*大\_s*学\)\|ハ\_s*\%(イ\_s*メ\|ラ\_s*ペ\_s*ー\_s*ニ\_s*ョ\)\|碧\_s*玉\|ヤ\_s*\%([リンニナー]\|イ\_s*ル\|エ\_s*ル\|ル\_s*ノ\|レ\_s*ド\|ヌ\_s*\%(ス\|シ\_s*ュ\)\|ス\_s*パ\_s*ー\_s*ス\|コ\_s*[ビブ]\|ッ\_s*ケ\)\|フ\_s*\%(ァ\_s*[ンナ]\|リ\_s*[オア]\)\|J\_s*\%(R\_s*東\_s*日\_s*本\|\.\_s*S\_s*\.\_s*\%(B\_s*a\_s*c\_s*h\|バ\_s*ッ\_s*ハ\)\|リ\_s*ー\_s*グ\|カ\_s*ッ\_s*プ\|C\_s*B\_s*カ\_s*ー\_s*ド\|-\_s*P\_s*O\_s*P\|ポ\_s*ッ\_s*プ\|P\_s*\%(G\_s*フ\_s*ァ\_s*イ\_s*ル\|E\_s*G\_s*フ\_s*ァ\_s*イ\_s*ル\)\|I\_s*S\_s*\%(マ\_s*ー\_s*ク\|コ\_s*ー\_s*ド\)\|a\_s*p\_s*a\_s*n\_s* \_s*A\_s*d\_s*v\_s*a\_s*n\_s*c\_s*e\_s*d\_s* \_s*I\_s*n\_s*s\_s*t\_s*i\_s*t\_s*u\_s*t\_s*e\_s* \_s*o\_s*f\_s* \_s*S\_s*c\_s*i\_s*e\_s*n\_s*c\_s*e\_s* \_s*a\_s*n\_s*d\_s* \_s*T\_s*e\_s*c\_s*h\_s*n\_s*o\_s*l\_s*o\_s*g\_s*y\|A\_s*\%(I\_s*S\_s*T\|N\_s*コ\_s*ー\_s*ド\|V\_s*A\_s*\%(ス\_s*ク\_s*リ\_s*プ\_s*ト\|ア\_s*プ\_s*レ\_s*ッ\_s*ト\)\)\|U\_s*N\_s*E\_s*T\)\|ズ\_s*ボ\_s*ン\|J\_s*\%(2\|−\_s*W\_s*A\_s*V\_s*E\|リ\_s*ー\_s*グ\|カ\_s*ッ\_s*プ\|ポ\_s*ッ\_s*プ\|I\_s*C\_s*C\_s*出\_s*版\|u\_s*s\|U\_s*\%(S\|N\_s*K\_s*O\)\)\|ユ\_s*\%([ハリダノ]\|ル\_s*ゲ\_s*ン\|ー\_s*\%([リノ]\|ゲ\_s*ン\_s*ト\|デ\_s*ィ\_s*ッ\_s*ト\)\|ン\_s*\%(グ\|ケ\_s*ル\|カ\_s*ー\)\|ピ\_s*テ\_s*ル\|ッ\_s*[カシ]\)\|イ\_s*\%(エ\_s*\%([ナス]\|ン\_s*\%(ス\|セ\_s*ン\)\|ズ\_s*ス\)\|ェ\_s*\%(ナ\|ン\_s*\%(ス\|ゼ\_s*ン\|セ\_s*ン\)\|ー\_s*ガ\_s*ー\|ル\_s*\%(ク\|サ\_s*レ\_s*ム\)\)\)\|ホ\_s*\%([タセ]\|ル\_s*ヘ\|ホ\_s*バ\|ア\_s*\%(ン\|キ\_s*ン\)\)\|ヨ\_s*\%([ブナ]\|ル\_s*\%(グ\|ダ\_s*ン\)\|エ\_s*ル\|ア\_s*\%(キ\_s*ム\|ヒ\_s*ム\)\|ゼ\_s*フ\|シ\_s*\%(フ\|ュ\_s*ア\)\|ー\_s*\%([ドト]\|デ\_s*ル\|ゼ\_s*フ\)\|セ\_s*フ\|ハ\_s*[ナンネ]\)\)', + \ 'k' : '\%([コ怖之旃惟怺薦米暦轉殺悃鶤艮鯤很袞坤壼琿狠漿棍魂菎滾梱溷痕渾墾恨懇根梢杪王泥裔樸鞐熟枹醴聲声蛩凍溢零錯苔亊箏斷判諺理断盡悉尽辞詞殊事壽寿鯒礫鯉齣狛腓昆瘤鮗谺応應答爰茲是試志心凩笏惚榾兀輿甑腰拵拗鐺鏝衝杲磽絖昊耗闔狎靠冓汞湟塙慌嫦礦冦淆遘亘仰昴誥鬨鴿鏗浤哮砿鎬伉熕洽訌閧困縞鮫逅糠槹哽盍稾亙壙覯隍簧遑洸餃惶寇鵁皋黌椌扣晄倖矼肓頏蛤呷詬匣昿皐崗肱徨峇袷敲爻藁倥釦棡凰犒吭窖畊岡猴胱絋傚啌蚣缸紘湊搆閤峺羔鍠幌鱇扛肴恆紺鈩絳閘蒙冰氷郡蛟槁候楮媾溘蝗酵嚆犢稿亢哄睾慷郊岬肛項巷鑛洪佼狡叩昂勾喉晃滉糀晧剛曠宏控恍侯皓港膏耿皎坑江絞膠虹巧鴻鉱衡浩厚耕幸弘綱抗購攻講恒薨溝鋼航行肯光皇好荒高梏谷哭槲尅釛斛轂石告酷穀踰懲蝴鴣袴焦觚虍粐乎沽餬胯菰瞽請楜娘壺錮込葫痼兒估冴漕痩虎冱倒戸呱媚粉夸詁子鈷捏濃故濾箍漉恋呼誇壷放転仔鼓小股罟女乕琥跨滬越古糊滸扈瑚皷混怙弧辜戀蠱超児雇凝孤湖此瓠蛄凅肥こケ峻欅獸騫剱儉惓劵蜷謇鉉鵑綣幵娟險劒虔瞼俔顯臉圈釼歉權慊縣暄愃愆涓黔劔獻搴諠椦妍檢甄験慳捲倦遣羂嶮蹇鹸狷譴腱驗軒憲繭謙圏険硯倹献犬絢顕券劍剣見権拳研眷牽県建烟鑷言獣蓋涜吝削畩閲検貶健桁嗾竭訐亅碣杰譎偈抉厥蕨歇襭刔頡獗尻訣孑頁纈蹶桀穴傑結血憇夐彑勍攜迥冏檠絅蹊煢笄醯枅憬盻綮詣冂挈黥剄匸徑奚挂兮鮭瓊畦逕繼惠慧謦鷄系┻┣┠┨┝┴│┿┰╋━┛┬┥╂┤┸┯┼─┷├┏┳┫┃┓罫痙奎脛谿溪螢蛍渓閨憩圭携硅恵刑継勁珪計啓異毛蹴褻けク姑配椪栩櫪檪椡橡椚湫箜櫟含纐柵婚屎糞癖潛潜鵠凹窪縊跟軛頚珞頸首諄窟鞋履轡覆沓碎砕条降件頽崩屑釘莖茎陸杙杭掘崛倔鶏鐃藥擽薬樟楠梳櫛串釧與与挫籖鯀鯨籤隈熊艸嚔藾叢鏈腐鎖種ξΞ臭楔草圀邦國国髭嗽漱吻嘴脣唇梔腔φ粂皹勳熏裙醺桾皸崑燻訓勲葷委钁精詳鍬咥銜桑某暝峅眛昏罔冥鮓比闇位鞍藏暗倉廚厨涅曇蜘佝栗包俥車梍枢畔鐵玄蔵黒喰苦枸煦焼倶狗吼刳工絎駒眩垢口窶区劬繰呉暮貢嶇酌庫惧組衢紅食句吁懼區桍孔怐瞿くキ段痍疵絆紲傷築鱚稷嚴黍帛後碪砧絹萌兆刻椈鞫掬辟君牙檗蘗迄訖狐屹詰佶拮吃鞠橘菊喫‥\£、♀〇∵≡.&^‰▲‡`§¶′_〓☆;□↑↓・%■¢=/≒←− ̄★々≠♂〆ゝ◎―$¨♭+?ヽ…†♪‖@゜◆ヾ´。±|≪⌒≧○÷,≫<∞●◇∴≦△!℃゛▼♯¬°▽‐ー∽¥:∨>Ц#∝∫〃仝Å″〒ゞ煙蚶衣更細妃后楸蕈茸乙雉轢杵軋岸桔汚穢北樵際裂燦煌雲嫌胆竏粁瓩浄澄淳潔清雰錐蛬吉霧檮桐襟磬釁覲箘掀噤衿鈞檎瑾忻饉箟听芹衾釿懃斤蒟径窘擒巾菌公禽筋錦欣僅琴均禁謹緊欽近勤鉅秬擧渠踞據舉筥嘘苣慶倨距歔遽鋸醵拠拒去勗亟蕀洫跼旭局挙許居巨虚頃峽筴鍄陜卿竟筺僵狹竅洶誑羌抂炯烱劫經刧襁繦蕎篋況徼恊恟棘轎竸况廾荊亰姜梗孝亨跫敬筐梟饗矯挾矜挟校拱嬌響鞏杏向興匈嚮享警競喬怯兄彊僑兢狂供橋莢凶郷兇驕叫夾匡侠狭恐経疆協境胸強驚脅共恭今教玖赳鬮舊蚯逑恷歙貅扱樛9烋摎邱笈皀疚岌厳胡翕朽泣穹糺糾及躬汲窮灸弓臼宮久柩究給丘求鳩級球休救急旧吸九瞶來著喜旡决羈祈揮窺起聞弃伎燬憙毅綺麾基机棄希噐棋其尋祁熹奇肌跂稀覬暉企黄愾欹几稘城軌諱岐決詭極記猗喟槻竒季碕鰭悸切禧消己效朞淇驥揆麒嬉崎僖匱屓既毀杞危卉器貴徽癸虧畿忌耆曁伐紀晞畸饑酒碁樹生木覊聽剪截櫃熈嵜冀跪气愧煕期効斬訊飢妓箕祺圻熙餽来徠鬼譏羇馗着寄倚氣利幾汽欷姫饋聴唏剞鑽騏逵騎掎規幃棊きカ癢糜粥痒麹輕骨業軽鰈鰔餉通龜瓶甕亀鳫獵鴈殯猟雁釀鳬鳧髢鴨巛側躱廁厠磧瓦獺翡皮裘→紮搦苧碓柄枳躯躰軆體体鴉犂烏機絡空唐榧茅澗鸛厂蒄啣卷淦扞杆骭歛瞰讙奐戡豢坎瀚皖稈鐶拑酣陷繝嫺驩篏樌莟勸捍撼澣盥羹嫻鑵寰丱康懽憾羮揀歡潤罕觀橄涵渙凵堪覡巫鉋萱簪舘艱咸翰柬駻悍燗槓浣邯攷稽宦考棺潅閂煥鉗疳癇函凾鹹顴緘款桓箝諫諌轗坩旱侃鰥 館莞橇韓患灌勧菅簡奸刊柑肝看桿寒緩干嵌廣広竿貫巻敢漢環喊陥監喚甘間歓閑寛管慣完艦乾幹官観壁椛屍姓庇鞄芳蔓鯑一勘⊃影陰蔭景*棧梯筧庚辛┘┐柧┌門廉脚乞癩∪川合’)《‘”{〈“}》〉囓柁旗鮖悴舵鰍鍛梶錺餝飾篭籠歸孵卻皈還省顧楓却帰反返守帋督祇髮韮裃雷髪紙鉦曲矩予鐘樺沫偏騙語潟刀象模仇固硬傍難容忝辱頑形旁方型肩風滓翳微幽掠緕纃綛絣擦糟鎹粕戞猾曷剋黠瞎鞨恰∧濶∩蠍筈蝎羯喝轄餓蛞聒劼擔刮蘰鬘桂闊括嘗捷豁渇担滑堅鰹割戛活疽暈鵲瘡傘嵩重襲葛笠堵硴墻牆蠣蛎柿掲關罹抱踵嬶嚊拘関係顏貌郁薫顔母感釡罐窰鴎框叺構喧竃竈釜缶蒲鎌數数槝栢膳傅瑕畏賢橿姦樫爨炊圍喞託囲鈎「『鉤」』限鍵傾禿蕪鏑頭齧気被兜哉適敵必要彜彝鬲鼎叶片哀愛悲鋺蛇鉄蜩神奏楫裹磆餅徒褐粮糧茖椁覺幗槨貉擴壑隱愨寉殼癨嚇穫咯膕骼膈∠掴狢埆蠖覈霍礁恪擱匿撹攪喀廓較郭〕【[】]〔殻挌劃閣格隠覚矍革馘鶴攫核獲拡客隔角確廨囘隗嵬觧榿蠏匯徊迴壞褂獪丐械枴畍誨揩醢誡夬懈喙椢恠峡价櫂茴蛙瑰乖浬鰄傀糴柏街鳰懷蛔蠶蚕邂蟹潰壊恢腕芥垣楷會拐悔詼諧契皆界疥魁偕改繪貝胛絵快甲灰槐晦懐介塊解廻回階戒開会怪海縢篝炬耀赫輝冠鑒鑑各屈鏡柯噛箇上苛暇蚊廈易嘩ヵ描苅枯佳彼兼哥缺霞藉架啝下渦踝堝闕華嗄荷馨刈假夥河科珈個蝸迦軻咼黴舸繋書賀夏萪支卦掛掻蝦痂謌渮歌過香禾狩買變家枷克駈花賈畫珂呵替代訶袈咬画顆貸價淅飼和ヶ果糅厦課可醸葭勝仮搗嘉墟嗅譌日斯禍換窩苟貨蝌価懸欠化罅伽賭翔靴且嚼訛交何駆驅个嫁譁借加跏戈稼寡涸耶変崋鹿笳火茄菓遐舁かk京節└┗※хХ忽コ汗〜功株(Kク×金窯κキΧカКΚкχケk]\|ッ\_s*[コケクキカ]\|ッ\_s*[コケクキカ]\|っ\_s*[子こけくきか]\|蟀\_s*谷\|焜\_s*炉\|前\_s*妻\|嫡\_s*妻\|二\_s*合\_s*半\|秋\_s*桜\|牛\_s*尾\_s*魚\|庶\_s*幾\|独\_s*楽\|特\_s*牛\|粫\_s*門\|甦\_s*生\|M\_s*e\_s*t\_s*a\_s*c\_s*h\_s*l\_s*a\_s*m\_s*y\_s*d\_s*e\_s*a\_s*e\|f\_s*o\_s*o\_s*t\_s* \_s*a\_s*n\_s*d\_s* \_s*m\_s*o\_s*u\_s*s\_s*e\_s* \_s*d\_s*i\_s*s\_s*e\_s*a\_s*s\_s*e\|外\_s*連\_s*味\|螻\_s*蛄\|罌\_s*粟\|滅\_s*紫\|S\_s*i\|莎\_s*草\|百\_s*[濟済]\|9\_s*[日月]\|秧\_s*鶏\|釉\_s*掛\|典\_s*薬\_s*寮\|L\_s*a\_s*u\_s*r\_s*\%(a\_s*c\_s*e\_s*a\_s*e\|o\_s*i\_s*d\_s*e\_s*a\_s*e\)\|探\_s*湯\|誓\_s*湯\|六\_s*合\|地\_s*祇\|都\_s*子\|州\_s*光\|群\_s*衆\|慈\_s*姑\|c\_s*r\_s*e\_s*s\_s*c\|内\_s*蔵\_s*助\|H\_s*e\_s*l\_s*l\_s*e\_s*b\_s*o\_s*r\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|J\_s*u\_s*g\_s*l\_s*a\_s*n\_s*d\_s*a\_s*l\_s*e\_s*s\|仁\_s*彦\|啄\_s*木\_s*鳥\|X\_s*e\|如\_s*月\|私\_s*市\|昨\_s*日\|素\_s*地\|布\_s*地\|欺\_s*罔\|聖\_s*[之子美]\|沈\_s*菜\|蟋\_s*蟀\|螽\_s*斯\|G\_s*o\_s*l\_s*d\|A\_s*\%(u\|r\_s*c\_s*h\_s*i\_s*c\_s*h\_s*l\_s*a\_s*m\_s*y\_s*d\_s*e\_s*a\_s*e\|s\_s*t\_s*e\_s*r\_s*a\_s*l\_s*e\_s*s\|c\_s*a\_s*n\_s*t\_s*h\_s*a\_s*c\_s*e\_s*a\_s*e\)\|菫\_s*青\_s*石\|槿\_s*花\|R\_s*\%(h\_s*\%(o\_s*e\_s*a\_s*d\_s*a\_s*l\_s*e\_s*s\|a\_s*m\_s*n\_s*a\_s*l\_s*e\_s*s\)\|u\_s*n\_s*u\_s*n\_s*c\_s*u\_s*l\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|a\_s*n\_s*\%(u\_s*n\_s*c\_s*u\_s*l\_s*a\_s*\%(l\_s*e\_s*s\|c\_s*e\_s*a\_s*e\)\|a\_s*l\_s*e\_s*s\)\)\|裾\_s*礁\|脇\_s*[侍息]\|姉\_s*[妹弟]\|頬\_s*[骨筋]\|毬\_s*果\|舅\_s*姑\|厩\_s*\%([肥舎]\|務\_s*員\)\|廐\_s*舎\|離\_s*れ\_s*離\_s*れ\|掃\_s*部\|羚\_s*羊\|氈\_s*瓜\|土\_s*器\|蝙\_s*蝠\|魚\_s*狗\|為\_s*替\|連\_s*枷\|身\_s*体\|落\_s*葉\_s*松\|随\_s*神\|檻\_s*車\|T\_s*\%(h\_s*a\_s*l\_s*i\_s*c\_s*t\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|u\_s*b\_s*i\_s*f\_s*l\_s*o\_s*r\_s*a\_s*e\)\|南\_s*瓜\|量\_s*子\|千\_s*典\|山\_s*\%(梔\_s*子\|陽\_s*道\)\|蜉\_s*蝣\|陽\_s*炎\|蜻\_s*蛉\|破\_s*片\|挿\_s*頭\|駕\_s*\%(籠\|輿\_s*丁\)\|槭\_s*樹\|長\_s*[月官]\|主\_s*[紀計神]\|剃\_s*刀\|天\_s*\%(牛\|鼠\_s*矢\)\|帷\_s*子\|酢\_s*漿\_s*草\|O\_s*x\_s*a\_s*l\_s*i\_s*d\_s*a\_s*c\_s*e\_s*a\_s*e\|飛\_s*白\|春\_s*日\|C\_s*\%([ormfda]\|h\_s*r\_s*o\_s*m\_s*i\_s*u\_s*m\|i\_s*r\_s*c\_s*a\_s*e\_s*a\_s*s\_s*t\_s*e\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\|u\_s*r\_s*i\_s*u\_s*m\|y\_s*p\_s*e\_s*r\_s*a\_s*l\_s*e\_s*s\|e\_s*r\_s*c\_s*i\_s*d\_s*i\_s*p\_s*h\_s*y\_s*l\_s*l\_s*a\_s*c\_s*e\_s*a\_s*e\)\|曽\_s*て\|曾\_s*て\|松\_s*魚\|燕\_s*子\_s*花\|牡\_s*[蛎蠣]\|民\_s*部\|部\_s*曲\|E\_s*\%(b\_s*e\_s*n\_s*a\_s*l\_s*e\_s*s\|l\_s*a\_s*n\_s*a\_s*l\_s*e\_s*s\)\|案\_s*山\_s*子\|梭\_s*\%(魚\|子\_s*魚\)\|螳\_s*螂\|蟷\_s*螂\|瓜\_s*\%(田\|呂\_s*根\)\|拍\_s*手\|水\_s*[鶏母手夫]\|東\_s*\%(風\|京\_s*都\_s*立\_s*科\_s*学\_s*技\_s*術\_s*大\_s*学\)\|(\_s*株\_s*)\|称\_s*子\|贏\_s*ち\_s*得\|歩\_s*兵\|恁\_s*く\|杜\_s*\%(若\|父\_s*魚\)\|梅\_s*花\_s*皮\|頴\_s*田\|膾\_s*炙\|ノ\_s*\%([ブウ]\|ー\_s*ン\|ッ\_s*\%([トク]\|テ\_s*ィ\_s*ン\_s*グ\|カ\_s*ー\|キ\_s*ン\_s*グ\)\)\|ナ\_s*\%(ッ\_s*\%(ク\|プ\_s*\%(サ\_s*ッ\_s*ク\|ザ\_s*ッ\_s*ク\)\)\|レ\_s*ッ\_s*ジ\|イ\_s*[フトツ]\)\|ニ\_s*\%(ー\|ッ\_s*\%(ト\|テ\_s*ィ\_s*ン\_s*グ\)\)\|ホ\_s*\%(ー\_s*\%(ミ\_s*ー\|メ\_s*イ\)\|メ\_s*イ\_s*ニ\)\|フ\_s*\%(ビ\_s*ラ\_s*イ\|ル\_s*シ\_s*チ\_s*ョ\_s*フ\)\|ハ\_s*\%(ン\|ラ\_s*シ\_s*ョ\_s*ー\|ー\_s*ン\|バ\_s*ロ\_s*フ\_s*ス\_s*ク\|ル\_s*ツ\_s*ー\_s*ム\|チ\_s*ャ\_s*ト\_s*ゥ\_s*リ\_s*ア\_s*ン\)\|K\_s*\%([点gm]\|カ\_s*ッ\_s*プ\|n\_s*o\_s*c\_s*k\_s*O\_s*u\_s*t\|e\_s*n\_s*w\_s*o\_s*o\_s*d\)\|P\_s*\%(i\_s*p\_s*e\_s*r\_s*a\_s*\%(l\_s*e\_s*s\|c\_s*e\_s*a\_s*e\)\|a\_s*p\_s*a\_s*v\_s*e\_s*r\_s*a\_s*l\_s*e\_s*s\|o\_s*\%(d\_s*o\_s*s\_s*t\_s*e\_s*m\_s*o\_s*n\_s*a\_s*l\_s*e\_s*s\|t\_s*a\_s*s\_s*s\_s*i\_s*u\_s*m\)\)\)', + \ 'l' : '\%([ォォぉェェぇゥゥぅィィぃァァぁ<≪l_ ̄≦李左←∃∨¬∀⊃ル∧レラ£ЛλлΛl]\|ッ\_s*[ォェゥィァ]\|ッ\_s*[ォェゥィァ]\|っ\_s*[ぉぇぅぃぁ]\|液\_s*晶\|最\_s*小\_s*2\_s*乗\_s*法\|\.\_s*\.\_s*\.\|拉\_s*薩\|聯\_s*想\|補\_s*題\|檸\_s*檬\|手\_s*紙\|学\_s*習\|施\_s*錠\|局\_s*所\|論\_s*理\|ロ\_s*\%([キイアロリブボトメウスコゴグー]\|ペ\_s*ス\|ワ\_s*ー\_s*ル\|エ\_s*ベ\|ヨ\_s*ラ\|フ\_s*ト\|ル\_s*カ\|ベ\_s*リ\_s*ア\|ビ\_s*\%(ー\|ン\_s*グ\|イ\_s*\%(ス\_s*ト\|ン\_s*グ\)\)\|テ\_s*ィ\|サ\_s*ン\_s*\%(ジ\_s*ェ\_s*ル\_s*ス\|ゼ\_s*ル\_s*ス\)\|ニ\_s*ー\|ク\_s*リ\_s*ア\_s*ン\|ッ\_s*\%([ジタテトク]\|キ\_s*\%(ン\_s*グ\|ー\_s*ド\)\|カ\_s*ー\)\|ケ\_s*ー\_s*\%([トタル]\|シ\_s*ョ\_s*ン\)\|カ\_s*ー\_s*ル\|ガ\_s*ー\|ギ\_s*ン\_s*グ\|ジ\_s*\%(ー\|テ\_s*ッ\_s*ク\|ス\_s*テ\_s*ィ\_s*\%(ク\|ッ\_s*ク\)\|カ\_s*ル\|ク\_s*ー\_s*ル\|ッ\_s*[トク]\)\|ラ\_s*ン\|ン\_s*\%([ゴグダ]\|ボ\_s*\%(ク\|ッ\_s*ク\)\|バ\_s*ル\_s*デ\_s*ィ\|ズ\_s*デ\_s*ー\_s*ル\|リ\_s*[ーィ]\|ジ\_s*ン\|ド\_s*ン\)\|レ\_s*\%(ア\_s*ル\|ッ\_s*タ\|ー\_s*ヌ\|イ\_s*ン\|ン\_s*\%([ソス]\|ツ\_s*ォ\)\)\)\|\\\_s*L\_s*a\_s*T\_s*e\_s*X\|L\_s*\%(サ\_s*イ\_s*ズ\|L\_s*サ\_s*イ\_s*ズ\|U\_s*N\_s*A\|u\_s*\%(n\_s*a\|c\_s*\%(i\_s*d\|k\_s*y\)\)\|i\_s*\%(a\_s*r\|s\_s*p\|t\_s*e\)\|o\_s*f\_s*t\|A\_s*T\_s*E\_s*X\|a\_s*\%(w\_s*s\_s*o\_s*n\|T\_s*e\_s*X\|s\_s*e\_s*r\_s*W\_s*r\_s*i\_s*t\_s*e\_s*r\)\)\|L\_s*\%([DP]\|サ\_s*イ\_s*ズ\|L\_s*サ\_s*イ\_s*ズ\|u\_s*\%(t\_s*e\_s*t\_s*i\_s*u\_s*m\|c\_s*i\_s*d\)\|i\_s*\%(t\_s*h\_s*i\_s*u\_s*m\|s\_s*p\|n\_s*u\_s*x\)\|E\_s*D\_s*ラ\_s*イ\_s*ト\|e\_s*m\_s*m\_s*a\|o\_s*\%(g\_s*i\_s*c\_s*a\_s*l\_s* \_s*U\_s*n\_s*i\_s*t\_s* \_s*N\_s*u\_s*m\_s*b\_s*e\_s*r\|u\_s*i\_s*s\_s*i\_s*a\_s*n\_s*a\)\|a\_s*\%(w\_s*r\_s*e\_s*n\_s*c\_s*i\_s*u\_s*m\|n\_s*t\_s*h\_s*a\_s*n\_s*u\_s*m\|T\_s*e\_s*X\)\|A\_s*N\)\|研\_s*究\_s*室\|リ\_s*\%([ィセズザサスダポルラリマナノンヌブアー]\|ャ\_s*マ\|ヤ\_s*ド\_s*ロ\|ヨ\_s*ン\|ゾ\_s*チ\_s*ー\_s*ム\|コ\_s*\%(リ\_s*ス\|ピ\_s*ン\)\|ク\_s*ー\_s*ド\|カ\_s*\%(ー\|オ\_s*ン\)\|ジ\_s*[ンー]\|デ\_s*[ィル]\|ド\_s*カ\_s*イ\_s*ン\|プ\_s*ト\_s*ン\|パ\_s*ー\_s*ゼ\|グ\_s*\%(ニ\_s*ン\|ナ\_s*ン\)\|フ\_s*\%([エト]\|タ\_s*ー\|テ\_s*ィ\_s*ン\_s*グ\)\|テ\_s*ラ\_s*[ルシ]\|チ\_s*ウ\_s*ム\|ソ\_s*\%(ソ\_s*ー\_s*ム\|グ\_s*ラ\_s*フ\_s*ィ\)\|タ\_s*ー\|ト\_s*\%([レル]\|マ\_s*ス\|ア\_s*ニ\_s*ア\|グ\_s*ラ\_s*フ\|バ\_s*ル\_s*ス\_s*キ\_s*ー\)\|オ\_s*\%(タ\_s*ー\_s*ル\|ネ\_s*ル\)\|ミ\_s*\%(テ\_s*ッ\_s*ド\|ッ\_s*[タト]\)\|モ\_s*\%(ー\_s*ジ\_s*ュ\|ネ\_s*ン\|ン\_s*チ\_s*ェ\_s*ッ\_s*ロ\)\|ム\_s*ジ\_s*ン\|キ\_s*\%(ッ\_s*ド\|ュ\_s*ー\_s*ル\|テ\_s*ン\_s*\%(シ\_s*ュ\_s*タ\_s*イ\_s*ン\|ス\_s*タ\_s*イ\_s*ン\)\)\|エ\_s*\%(ゾ\_s*ン\|ー\_s*ジ\_s*ュ\)\|ヒ\_s*テ\_s*ン\_s*シ\_s*ュ\_s*タ\_s*イ\_s*ン\|ネ\_s*\%([アン]\|ッ\_s*ト\|ー\_s*ジ\_s*ュ\)\|ニ\_s*ア\|ベ\_s*\%([ロラ]\|リ\_s*ア\|レ\_s*ー\_s*シ\_s*ョ\_s*ン\|ル\_s*テ\)\|ビ\_s*\%([アー]\|ド\_s*ー\|ン\_s*グ\)\|ュ\_s*\%([スー]\|ブ\_s*リ\_s*ャ\_s*ー\_s*ナ\|リ\_s*ュ\|ド\_s*ミ\_s*ラ\|ク\_s*サ\_s*ン\_s*ブ\_s*ー\_s*ル\|ッ\_s*ク\|シ\_s*ア\_s*ン\|ミ\_s*エ\_s*ー\_s*ル\)\|ロ\_s*\%(イ\|ン\_s*グ\_s*ウ\_s*ェ\)\|ヴ\_s*\%(ィ\_s*ン\_s*グ\_s*ス\_s*ト\_s*ン\|ァ\_s*\%(プ\_s*ー\_s*ル\|イ\_s*ア\_s*サ\_s*ン\)\)\|バ\_s*\%(テ\_s*ィ\|タ\_s*リ\_s*ア\_s*\%(ン\|ニ\_s*ズ\_s*ム\)\|プ\_s*ー\_s*ル\|イ\_s*ア\_s*サ\_s*ン\)\|ッ\_s*\%([ドピプタクチト]\|ス\_s*ン\)\)\|エ\_s*ル\)', + \ 'm' : '\%([モ脆醪師諸催靄舫腿銛杜森捫聞匁紋問玩翫擡齎靠凭鵙鴃縺悶樅籾椛楓蛻濳潛艾潜殯黐餠用糯餅桃者懶專専物尤勿畚許故悖旧戻下乖求礎素基本元綟捩文默沐杢黙芒网莽檬罔耗耄朦魍艨矇濛曚亡蒙毛孟猛網漏裳望喪揉持母燃若藻以摸楙貰洩姆保茂模糢もメ麪緜眄緬麺門棉綿面蓍珎珍♀娶貭粧妾牝瞽盲娚暈繞萌惠慈恵萠溟暝滅謎姪瞑盟酩銘鳴芽睨召奴瑪碼賞減雌女めム羣榁室簇屯邨連邑叢村紫梅葎宜憤葮毳槿椋酬報尨骸躯旨難睦酷麥麦邀対百迎昔虚空鞅宗棟胸掬娘結笞鞭徒蝕蠧蠹蟲席莚蓆寧筵虫毟貉狢豸貪壻聟婿无謀霧矛毋無鵡夢梦剥六群牟務蒸噎武向咽むミ渠霙溝妊澪薨岑嶺峰峯亂紊婬淫妄濫猥乱◇※■*簔穣簑蓑醜儖慘短惨幹研耳壥廛店操陵鶚崎岬巫尊敕勅詔>」砌頻汀→】』右翠碧緑認幣蹊径倫導途通路道瞠髻鬟湖自蹼蛟瑞癸禊晦漲源鏖港湊南櫁瞶謐水調貢密甕帝蜜覩幸脉脈韮韭竓粍瓱榠螟茗名妙命冥都宮罠閔皆眠明民魅深觀身實彌観己診看味美盈三御充稔視壬巳靡弥箕みマ毬鞠紕蝮麿転稀賓客檀繭黛眉囘巡周防衛衞護守荳菽豆槫・圓.◯°゜。)(丸鬘謾幡縵懣鰻幔蹣蔓瞞卍饅漫滿慢迄笆貧幻瞼蔟疎眩回廻設申儲招繚統纒的蟶孫彎弯籬擬免猿亮純信実委罷壗侭圸飯儘継随髷任蒭芻耙紛鮪見猯塗斈學眥眦眼俎愛学斑枡斗鱒舛升桝萬蠱呪薪槙槇牧窗惑悗円窓甼襠区街町前複亦俣叉跨全瞬木胯股又鍖枕膜幕參眛参瑁詣妹哩迷枚米賄賂埋昧邁毎秣靺抹沫枩奉祀纏祭睫末大秀太勝柾弄優成盛將松匡鉞賢征誠昌希将政正仁雅媽万俟茉満目先麼未卷散磨枉眞益真増負蒔坐交馬捲舞嘛雑在放墹痲撒待播間摩敗巻混曲魔まm光月♪♭♯ム⊃∴≦∞÷≫≧≪⌒±∈∀⊂∬∫∝∨∽Δ¬⇒⊥∃∠∧⊆⇔∵≡∩×⊇∂∋≠√∪∇≒♂曼麻◎〇○●モ〒′−マ最ミМΜμメm]\|ッ\_s*[モメムミマ]\|ッ\_s*[モメムミマ]\|っ\_s*[もめむみま]\|双\_s*\%([手墨親]\|向\_s*き\|差\_s*し\)\|蜀\_s*黍\|唐\_s*土\_s*\%(書\|文\_s*字\)\|両\_s*\%([角親刃]\|差\_s*し\)\|楊\_s*梅\_s*皮\|主\_s*水\|旺\_s*角\|紅\_s*[絹染葉]\|強\_s*請\|虎\_s*落\|痘\_s*瘡\|莫\_s*斯\_s*科\|固\_s*よ\_s*り\|一\_s*徳\|O\_s*l\_s*e\_s*a\_s*l\_s*e\_s*s\|惘\_s*然\|乙\_s*張\|赤\_s*目\_s*魚\|針\_s*孔\|妻\_s*[君合沼]\|墨\_s*西\_s*哥\|鍍\_s*金\|繍\_s*眼\_s*児\|夫\_s*婦\|乳\_s*母\|布\_s*の\_s*子\|没\_s*\%([薬後入却有]\|義\_s*道\|食\_s*子\)\|B\_s*\%(e\_s*r\_s*b\_s*e\_s*r\_s*i\_s*d\_s*a\_s*c\_s*e\_s*a\_s*e\|i\_s*o\_s*r\_s*r\_s*a\_s*g\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\)\|浮\_s*腫\|6\_s*日\|6\_s*日\|崇\_s*田\|刀\_s*背\|襁\_s*褓\|零\_s*余\_s*子\|蜈\_s*蚣\|産\_s*霊\|息\_s*子\|k\_s*\$\_s*_\_s*{\_s*i\_s*n\_s*f\_s*}\_s*\$\|蚯\_s*蚓\|A\_s*\%(b\_s*i\_s*e\_s*s\|p\_s*e\_s*t\_s*a\_s*l\_s*a\_s*e\|c\_s*r\_s*o\_s*s\_s*t\_s*i\_s*c\_s*h\_s*u\_s*m\)\|山\_s*陵\|雎\_s*鳩\|親\_s*王\|嬰\_s*児\|亨\_s*治\|陸\_s*奥\|皇\_s*[子女國]\|3\_s*[つ日]\|3\_s*[つ日]\|角\_s*[鴟子髪]\|七\_s*寸\|鳩\_s*尾\|鷦\_s*鷯\|孤\_s*児\|凝\_s*視\|兎\_s*唇\|R\_s*u\_s*t\_s*a\_s*l\_s*e\_s*s\|神\_s*[子輿酒]\|苗\_s*字\|海\_s*[雲蘊藻布蜂松山]\|P\_s*o\_s*d\_s*o\_s*p\_s*h\_s*y\_s*l\_s*l\_s*a\_s*c\_s*e\_s*a\_s*e\|土\_s*[龍竜産]\|京\_s*都\|横\_s*浜\_s*マ\_s*リ\_s*ノ\_s*ス\|忠\_s*実\|肉\_s*刺\|翻\_s*\%(筋\_s*斗\|車\_s*魚\)\|H\_s*a\_s*m\_s*a\_s*m\_s*e\_s*l\_s*i\_s*d\_s*a\_s*l\_s*e\_s*s\|不\_s*\%(味\|見\_s*[転点]\)\|兇\_s*々\|凶\_s*鳥\|澗\_s*潟\|勾\_s*玉\|禍\_s*[々禍言事]\|況\_s*し\|澳\_s*門\|苧\_s*麻\|茅\_s*台\_s*酒\|丈\_s*夫\|倍\_s*達\|微\_s*[塵妙睡]\|燐\_s*寸\|驀\_s*地\|L\_s*o\_s*g\_s*a\_s*n\_s*i\_s*a\_s*c\_s*e\_s*a\_s*e\|豫\_s*て\|陪\_s*臣\|売\_s*僧\|C\_s*\%(a\_s*s\_s*u\_s*a\_s*r\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\|e\_s*r\_s*a\_s*t\_s*o\_s*p\_s*y\_s*l\_s*l\_s*a\_s*c\_s*e\_s*a\_s*e\)\|S\_s*\%(a\_s*p\_s*i\_s*n\_s*d\_s*a\_s*l\_s*e\_s*s\|c\_s*h\_s*i\_s*s\_s*a\_s*n\_s*d\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\)\|理\_s*[之元]\|允\_s*彦\|祐\_s*史\|晶\_s*子\|公\_s*[美則輝]\|斉\_s*加\_s*年\|方\_s*夫\|多\_s*言\_s*語\_s*化\|ニ\_s*ー\_s*モ\_s*ニ\_s*ッ\_s*ク\|単\_s*量\_s*体\|会\_s*議\|和\_s*布\_s*[刈蕪]\|中\_s*間\_s*子\|薄\_s*荷\_s*脳\|行\_s*[幸列]\|写\_s*像\|日\_s*\%(米\_s*相\_s*互\_s*防\_s*衛\_s*援\_s*助\_s*協\_s*定\|本\_s*製\)\|M\_s*\%(H\_s*z\|サ\_s*イ\_s*ズ\|S\_s*−\_s*D\_s*O\_s*S\|L\_s*サ\_s*イ\_s*ズ\|r\_s*.\|b\_s*p\_s*s\|c\_s*C\_s*a\_s*r\_s*t\_s*h\_s*y\|o\_s*t\_s*i\_s*f\|a\_s*c\)\|計\_s*算\_s*機\|手\_s*紙\|ザ\_s*ッ\_s*ヘ\_s*ル\_s*=\_s*マ\_s*ゾ\_s*ッ\_s*ホ\|嗜\_s*虐\_s*的\_s*趣\_s*味\|被\_s*虐\_s*\%(淫\_s*乱\_s*症\|趣\_s*味\)\|修\_s*士\|仮\_s*面\|移\_s*送\|M\_s*\%([dngtOo式]\|X\_s*テ\_s*レ\_s*ビ\|サ\_s*イ\_s*ズ\|S\_s*-\_s*D\_s*O\_s*S\|L\_s*サ\_s*イ\_s*ズ\|P\_s*3\_s*プ\_s*レ\_s*\%(ー\_s*ヤ\_s*ー\|イ\_s*ヤ\_s*ー\)\|D\_s*\%(プ\_s*レ\_s*ー\_s*ヤ\_s*ー\|レ\_s*コ\_s*ー\_s*ダ\_s*ー\)\|c\_s*C\_s*a\_s*r\_s*t\_s*h\_s*y\|e\_s*\%(d\_s*u\_s*s\_s*a\_s*n\_s*d\_s*r\_s*a\_s*l\_s*e\_s*s\|i\_s*t\_s*n\_s*e\_s*r\_s*i\_s*u\_s*m\|t\_s*a\_s*F\_s*o\_s*n\_s*t\|n\_s*\%(y\_s*a\_s*n\_s*t\_s*h\_s*a\_s*l\_s*e\_s*s\|d\_s*e\_s*l\_s*e\_s*v\_s*i\_s*u\_s*m\)\|C\_s*a\_s*b\)\|u\_s*l\_s*e\|A\_s*C\_s*ア\_s*ド\_s*レ\_s*ス\|a\_s*\%(g\_s*n\_s*\%(o\_s*l\_s*i\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|e\_s*s\_s*i\_s*u\_s*m\)\|n\_s*\%(u\_s*\%(e\_s*d\|s\_s*c\_s*r\_s*i\_s*p\_s*t\_s* \_s*E\_s*d\_s*i\_s*t\_s*i\_s*n\_s*g\)\|g\_s*a\_s*n\_s*e\_s*s\_s*e\)\|r\_s*y\_s*l\_s*a\_s*n\_s*d\|i\_s*n\_s*e\|k\_s*e\_s*f\_s*i\_s*l\_s*e\|c\_s*\%(h\|i\_s*n\_s*t\_s*o\_s*s\_s*h\)\|s\_s*\%(s\_s*a\_s*c\_s*h\_s*u\_s*s\_s*e\_s*t\_s*t\_s*s\|t\_s*e\_s*r\_s*C\_s*a\_s*r\_s*d\)\)\|i\_s*\%(n\_s*n\_s*e\_s*s\_s*o\_s*t\_s*a\|s\_s*s\_s*\%(i\_s*s\_s*s\_s*i\_s*p\_s*p\_s*i\|o\_s*u\_s*r\_s*i\)\|c\_s*\%(r\_s*o\_s* \_s*S\_s*o\_s*f\_s*t\_s*w\_s*a\_s*r\_s*e\_s* \_s*A\_s*s\_s*s\_s*o\_s*c\_s*i\_s*a\_s*t\_s*e\_s*s\|h\_s*i\_s*g\_s*a\_s*n\)\)\|I\_s*\%(T\|P\_s*S\|M\_s*D\)\)\|エ\_s*ム\)', + \ 'n' : '\%([ンンんノ麕咒燧烽詛呪悳孔伯朔弼雅教糊矩憲規哲宜紀範典惟亘修允攵展順暢信則法後罵吭咽喉鑿蚤々湾宣曰臨覘稀望覗遺殘残鋸芒禾騰幟昇登上簷檐軒遁逸衲瑙碯曩王皇腦嚢膿能脳農野伸嚥−陳除濃熨飲退飮延載之呑廼乘乗述埜のネ塒姉聹侫檸嚀濘寧佞鼡鼠拗猫嫉妬希願捏熱犒労葱狙閨睡棔眠然稔棯懇拈撚燃念年根寝音涅子捻禰袮練値錬粘捩祢寢嶺煉ねヌ絖饅垈帛幣鵺主蛻拭温布沼盜偸窃盗抽擢緯糠額縫抜貫拔怒奴塗濡脱ぬニ楡蒻潦鷄鶏瀑庭繞獰女尿韭眈薤睨韮儿刄姙葫蒜刃忍∀妊認任人乳擔蜷担濁賑握俄鳰臭匂沸錵贄偐僞贋偽柔靤如苦膠霓滲虹躙廿》《◎∬『』悪憎兄螺鯡鰊錦西入新肉‖岻仁逃似邇弍荷貳弐2二尼迩煮2丹貮児迯にナ靡抔嫐嬲鯆屶釶鉈泥薺詰若慨歎嘆抛擲撲毆殴慰治癒等猶直泪波辺邉邊鍋浪某棘棗懷懐夏擦梨情懶譌艶訛鉛鯰癜鮠膾鱠韲憖怠鈍腥捺准準擬凖謎涙洋宥傾灘詠霖眺痼乍存流轅永和梛椥渚長莫毋勿半・媒仲中7斜七蔑乃尚内繩畷縄苗滑鞣惱悩就哉也斉形業徳娚垂喃∵楠爾尓汝男軟難何倣肄双枹均列柞→⇒⊃楢習嘗投爲綯啾啼熟那鳴泣慣生為儺舐菜奈涕並納痿嚶撫茄凪無哭做狎南萎竝魚娜薙亡馴拿失な┘┛│┃┨┫┤┥┣┝├┠╋┿╂┼成#∋∇名┗└n日≒ニネ¬〜≠ナヌノнνΝНn]\|帳\_s*面\|狼\_s*[烟煙]\|惚\_s*気\|暖\_s*[簾気]\|礼\_s*江\|功\_s*晶\|賀\_s*子\|訓\_s*子\|祈\_s*子\|式\_s*部\_s*省\|記\_s*代\|倫\_s*[明子宗]\|敬\_s*之\|賭\_s*弓\|誠\_s*也\|敦\_s*子\|悦\_s*旦\|祝\_s*[女詞]\|仰\_s*け\_s*反\|盧\_s*泰\_s*愚\|逆\_s*上\|凌\_s*霄\_s*花\|姐\_s*さ\_s*ん\|杜\_s*松\|強\_s*請\|合\_s*歓\|微\_s*温\|零\_s*余\_s*子\|酸\_s*漿\|鐃\_s*鉢\|鰾\_s*膠\|I\_s*I\_s*部\|耳\_s*根\|面\_s*皰\|M\_s*y\_s*r\_s*i\_s*s\_s*t\_s*i\_s*c\_s*a\_s*c\_s*e\_s*a\_s*e\|莞\_s*爾\|L\_s*e\_s*a\_s*d\|P\_s*b\|海\_s*[苔鼠]\|C\_s*\%(e\_s*l\_s*a\_s*s\_s*t\_s*r\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|a\_s*r\_s*y\_s*o\_s*p\_s*h\_s*y\_s*l\_s*l\_s*a\_s*l\_s*e\_s*s\)\|雪\_s*崩\|竹\_s*節\_s*虫\|7\_s*[日個]\|地\_s*震\|行\_s*[木方]\|大\_s*\%(蒜\|理\_s*石\)\|蛞\_s*蝓\|弱\_s*竹\|追\_s*儺\|済\_s*\%(し\_s*崩\|り\_s*物\)\|可\_s*成\|平\_s*城\|不\_s*成\|空\_s*リ\_s*ス\_s*ト\|T\_s*h\_s*e\_s* \_s*N\_s*e\_s*t\_s*w\_s*o\_s*r\_s*k\_s* \_s*I\_s*n\_s*f\_s*o\_s*r\_s*m\_s*a\_s*t\_s*i\_s*o\_s*n\_s* \_s*C\_s*e\_s*n\_s*t\_s*e\_s*r\|S\_s*o\_s*\%(l\_s*a\_s*n\_s*a\_s*l\_s*e\_s*s\|d\_s*i\_s*u\_s*m\)\|紐\_s*育\|フ\_s*ォ\_s*ン\_s*・\_s*ノ\_s*イ\_s*マ\_s*ン\|ヤ\_s*ー\_s*ノ\_s*ッ\_s*シ\_s*ュ\_s*・\_s*フ\_s*ォ\_s*ン\_s*・\_s*ノ\_s*イ\_s*マ\_s*ン\|オ\_s*ラ\_s*ン\_s*ダ\|ア\_s*メ\_s*リ\_s*カ\_s*ネ\_s*ッ\_s*ト\_s*ワ\_s*ー\_s*ク\|番\_s*号\|節\_s*点\|N\_s*\%([点O]\|ク\_s*ィ\_s*ー\_s*ン\|\.\_s*Y\_s*\.\|I\_s*F\_s*T\_s*Y\|i\_s*f\_s*t\_s*y\|a\_s*\%(v\_s*i\|t\_s*u\_s*r\_s*e\)\|e\_s*\%(X\_s*T\|m\_s*a\_s*c\_s*s\|w\_s*−\_s*J\_s*e\_s*r\_s*s\_s*e\_s*y\|W\_s*S\|u\_s*r\_s*a\_s*l\)\|E\_s*\%(m\_s*a\_s*c\_s*s\|T\_s*t\_s*a\_s*l\_s*k\)\|o\_s*\%(.\|ё\_s*l\)\)\|夜\_s*想\_s*曲\|諾\_s*威\|正\_s*常\|エ\_s*ヌ\|N\_s*\%([dpbaeoi]\|R\_s*Z\_s*I\|-\_s*g\_s*r\_s*a\_s*m\|G\_s*ワ\_s*ー\_s*ド\|H\_s*K\_s*\%(ホ\_s*ー\_s*ル\|ラ\_s*ジ\_s*オ\)\|T\_s*T\|Y\_s*ダ\_s*ウ\|U\_s*L\_s*L\|A\_s*S\_s*A\|E\_s*\%(C\|p\_s*o\_s*c\_s*h\|m\_s*a\_s*c\_s*s\)\)\|窒\_s*素\)', + \ 'o' : '\%([オ俺游泳指妖畢在澱檻氈拇親愚疎颪卸念錘惟慮赴徐趣俤羈主想表重面瘟隱園Å怨♀妾温恩悍鈍臣覺溺朦朧思覚榲現朮桶威嚇踴戯縅棘駭愕驚躍踊傲奢驕嚴厳痴遣瘧怒行怠蒹補荻懼惧獺虞怐畏恐襲甥笈及綬葹ヽゞ〃仝ゝヾ々同唖繦襁鴛鴦教几忍筬收兎抑稚長幼理収治修遲檍納後遅饋賻諡贈送憶袵臆拜拝峻侵奇冒犯崗阜陵岳女陸丘岡欄斧自己各戦鬼衰劣囮頤訪貶乙漢♂音弟阿脅怯首夥誘屋膃億穩穏煽熈煕熾燠諚掟興隠沖翁鴬澳嚶毆泓浤惶罌瓮泱閘蓊墺悒凰殃徃奧秧襖枉姶鸚懊媼嫗鴎怏鏖謳旺凹櫻鴨樗欒楝殴朷甌汪横往鞅歐嘔陷陥遠果応掩蔽應夛奄蓋概欧公邑麋薤被仰扇皇狼弁鵬鴻鳳黄奥多衽覆粱凡鰲頁王穂怖桜壓緒居起降落墮将帶麻央小牡勇捺圧措唹織追悪苧汚下御置帯生折朗於負郎擱押推雄塢老男夫逐墜尾惜嗚乎堕終淤おo大◎∞和∝♪∪∨開○ωΟОオΩοоo]\|濠\_s*太\_s*剌\_s*利\|父\_s*[娘子]\|母\_s*[娘子屋]\|万\_s*年\_s*青\|本\_s*懸\_s*魚\|玩\_s*具\|沢\_s*瀉\|A\_s*l\_s*i\_s*s\_s*m\_s*a\_s*t\_s*a\_s*l\_s*e\_s*s\|厭\_s*離\|乳\_s*母\_s*日\_s*傘\|陰\_s*[陽地]\|飲\_s*[食酒]\|慍\_s*色\|婦\_s*系\_s*図\|手\_s*術\|螻\_s*蛄\|十\_s*八\_s*番\|鉄\_s*漿\|海\_s*髪\_s*海\_s*苔\|虎\_s*魚\|花\_s*魁\|美\_s*味\|含\_s*羞\_s*草\|白\_s*粉\|渡\_s*島\|訳\_s*語\|通\_s*事\|晩\_s*[稲生]\|可\_s*笑\|惡\_s*寒\|傍\_s*[目惚見]\|叔\_s*[父母]\|伯\_s*[父母]\|姨\_s*捨\|少\_s*女\|侠\_s*気\|D\_s*i\_s*l\_s*l\_s*e\_s*n\_s*i\_s*a\_s*l\_s*e\_s*s\|G\_s*u\_s*t\_s*t\_s*i\_s*f\_s*e\_s*r\_s*a\_s*l\_s*e\_s*s\|H\_s*y\_s*p\_s*e\_s*r\_s*i\_s*c\_s*a\_s*l\_s*e\_s*s\|霊\_s*屋\|蝌\_s*蚪\|飫\_s*肥\|佩\_s*物\|良\_s*人\|纓\_s*田\|C\_s*o\_s*p\_s*t\_s*i\_s*d\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|鷹\_s*揚\|椀\_s*飯\_s*振\_s*\%(舞\|る\_s*舞\)\|相\_s*知\|鶯\_s*語\|近\_s*江\|零\_s*落\|越\_s*[生訴智知度]\|彼\_s*方\|祖\_s*[神父母]\|車\_s*前\|従\_s*祖\_s*[母父]\|青\_s*[梅海木]\|太\_s*\%(田\|安\_s*万\_s*侶\|上\_s*天\_s*皇\)\|巨\_s*頭\|逢\_s*[魔瀬隈坂]\|そ\_s*の\_s*他\|承\_s*知\_s*し\_s*ま\_s*し\_s*た\_s*\.\|烏\_s*[滸龍]\|t\_s*h\_s*e\_s* \_s*O\_s*b\_s*j\_s*e\_s*c\_s*t\_s* \_s*M\_s*a\_s*n\_s*a\_s*g\_s*e\_s*m\_s*e\_s*n\_s*t\_s* \_s*G\_s*r\_s*o\_s*u\_s*p\|立\_s*石\_s*電\_s*機\|職\_s*業\|楕\_s*円\|ウ\_s*\%(ィ\|ー\_s*\%(ズ\|ロ\_s*ン\)\|ロ\_s*ボ\_s*ロ\_s*ス\)\|出\_s*力\|ア\_s*\%(ワ\|ザ\_s*ー\|ウ\_s*\%([チト]\|タ\_s*ー\)\)\|基\_s*本\_s*ソ\_s*フ\_s*ト\_s*ウ\_s*ェ\_s*ア\|一\_s*\%(昨\_s*[年日]\|対\_s*一\)\|ワ\_s*ン\|ま\_s*た\_s*は\|論\_s*理\_s*和\|聖\_s*譚\_s*曲\|水\_s*中\_s*酸\_s*素\_s*破\_s*壊\_s*剤\|蛋\_s*白\_s*石\|最\_s*適\_s*化\|O\_s*\%([脚型]\|R\_s*E\|\.\_s*K\_s*\.\|S\_s*9\|リ\_s*ン\_s*グ\|p\_s*e\_s*n\_s*\%(L\_s*o\_s*o\_s*k\|W\_s*i\_s*n\_s*d\_s*o\_s*w\_s*s\)\)\|歌\_s*劇\|演\_s*算\_s*子\|操\_s*作\|酸\_s*素\|O\_s*\%([型脚sS]\|h\_s*i\_s*o\|k\_s*l\_s*a\_s*h\_s*o\_s*m\_s*a\|b\_s*j\_s*e\_s*c\_s*t\_s*-\_s*O\_s*r\_s*i\_s*e\_s*n\_s*t\_s*e\_s*d\|O\_s*\%(D\_s*L\|P\_s*L\)\|M\_s*R\_s*O\_s*N\|A\_s*ク\_s*リ\_s*ー\_s*ナ\_s*ー\|C\_s*R\_s*ソ\_s*フ\_s*ト\|r\_s*e\_s*g\_s*o\_s*n\|''\_s*R\_s*e\_s*i\_s*l\_s*l\_s*y\_s* \_s*J\_s*a\_s*p\_s*a\_s*n\|リ\_s*ン\_s*グ\|p\_s*e\_s*n\_s*W\_s*i\_s*n\_s*d\_s*o\_s*w\|x\_s*y\_s*g\_s*e\_s*n\)\)', + \ 'p' : '\%([本磅椪烹方砲報法舖歩舗ぽ併蔽閇閉×邊編片邉辺遍篇屁ぺ幅服風分布符腐泌匹憑票俵品筒平日版幇搬板犯腹払発發走箱朴駮博拍泊愽包放敗杯盃配牌八播波破羽張ぱp鉛ψΨぴ±+ぷφΦ┣├∝北┴‰.%£〒点・プポ頁)(∂¶‖ペパПπピпΠ燐p]\|ッ\_s*\%(ホ\_s*゚\|ヘ\_s*゚\|フ\_s*゚\|ヒ\_s*゚\|ハ\_s*゚\)\|ッ\_s*[ポペプピパ]\|っ\_s*[ぽぺぷぴぱ]\|ホ\_s*゚\|先\_s*斗\_s*町\|ヘ\_s*゚\|祕\_s*[露魯]\|フ\_s*゚\|釜\_s*山\|普\_s*魯\_s*西\|ヒ\_s*゚\|皮\_s*蛋\|光\_s*一\|ハ\_s*゚\|麺\_s*麭\|巴\_s*\%(里\|奈\_s*馬\)\|S\_s*y\_s*n\_s*a\_s*n\_s*t\_s*h\_s*a\_s*e\|C\_s*y\_s*c\_s*l\_s*a\_s*n\_s*t\_s*h\_s*a\_s*l\_s*e\_s*s\|排\_s*骨\|B\_s*r\_s*o\_s*m\_s*e\_s*l\_s*i\_s*a\_s*l\_s*e\_s*s\|L\_s*e\_s*a\_s*d\|白\_s*[板酒金]\|シ\_s*\%(ュ\_s*ー\_s*ド\|ロ\_s*シ\_s*ビ\_s*ン\)\|サ\_s*\%(ー\_s*ム\|イ\_s*\%([ズクケコ]\|ロ\_s*シ\_s*ビ\_s*ン\|リ\_s*ウ\_s*ム\|キ\_s*ッ\_s*ク\)\)\|+\_s*α\|ホ\_s*\%(ン\|ス\_s*ゲ\_s*ン\)\|ヒ\_s*ロ\_s*ポ\_s*ン\|比\_s*\%(布\|律\_s*賓\)\|フ\_s*\%(リ\_s*ジ\_s*ア\_s*ン\|レ\_s*\%(ー\_s*\%(ズ\|ジ\_s*ン\_s*グ\)\|イ\_s*ジ\_s*ン\_s*グ\)\|タ\_s*レ\_s*イ\_s*ン\|ォ\_s*\%([ーンノト]\|ボ\_s*ス\|ビ\_s*ア\|ス\_s*フ\_s*ァ\_s*ー\|ニ\_s*ー\)\|ァ\_s*\%(イ\|ラ\_s*オ\|ー\_s*\%([ジマ]\|ミ\_s*ン\_s*グ\)\|ン\_s*\%(ト\_s*ム\|タ\_s*ズ\_s*[ムマ]\)\|ル\_s*[ツス]\|レ\_s*ノ\_s*プ\_s*シ\_s*ス\)\|ィ\_s*\%([ロル]\|ジ\_s*\%(ッ\_s*ク\_s*ス\|カ\_s*ル\)\|ー\_s*ビ\_s*ー\|ッ\_s*シ\_s*ン\_s*グ\|レ\_s*モ\_s*ン\|ラ\_s*デ\_s*ル\_s*フ\_s*ィ\_s*ア\|リ\_s*\%([スーアパ]\|ッ\_s*[プパ]\|ピ\_s*\%(ン\|ー\_s*ヌ\)\)\)\|ェ\_s*\%(ー\_s*\%([ベズ]\|ジ\_s*ン\_s*グ\)\|イ\_s*ズ\|ロ\_s*モ\_s*ン\|ニ\_s*\%(ル\|ッ\_s*ク\_s*ス\|キ\_s*ア\|ー\_s*ル\)\|ノ\_s*\%(キ\_s*シ\|ー\_s*ル\)\)\)\|述\_s*語\|証\_s*明\|タ\_s*ン\_s*パ\_s*ク\_s*質\|処\_s*理\|手\_s*続\_s*き\|進\_s*行\|算\_s*譜\|利\_s*潤\|南\_s*瓜\|公\_s*告\|宣\_s*伝\|真\_s*珠\|P\_s*\%(波\|L\_s*法\|C\_s*\%(/\_s*A\_s*T\|9\_s*8\|モ\_s*デ\_s*ル\)\|o\_s*s\_s*t\_s*S\_s*c\_s*r\_s*i\_s*p\_s*t\|S\_s*.\|.\_s*S\_s*.\|i\_s*t\_s*I\_s*n\_s*n\|r\_s*o\_s*\%(l\_s*o\_s*g\|t\_s*e\_s*o\_s*n\)\|e\_s*r\_s*\%(l\|i\_s*o\_s*d\)\)\|永\_s*続\|カ\_s*リ\_s*ウ\_s*ム\|葡\_s*萄\_s*牙\|重\_s*合\_s*体\|多\_s*相\_s*型\|バ\_s*テ\_s*レ\_s*ン\|貼\_s*り\_s*付\_s*け\|論\_s*文\|偏\_s*執\_s*[狂病]\|引\_s*数\|P\_s*\%([umdCaor]\|K\_s*戦\|D\_s*F\_s*フ\_s*ァ\_s*イ\_s*ル\|コ\_s*ー\_s*ド\|タ\_s*イ\_s*ル\|\.\_s*S\_s*\.\|S\_s*\%(\.\|Y\_s*・\_s*S\)\|I\_s*C\_s*マ\_s*イ\_s*コ\_s*ン\|l\_s*\%(a\_s*t\_s*i\_s*n\_s*u\_s*m\|u\_s*t\_s*o\_s*n\_s*i\_s*u\_s*m\)\|E\_s*T\_s*ボ\_s*ト\_s*ル\|O\_s*S\_s*\%(シ\_s*ス\_s*テ\_s*ム\|I\_s*X\|T\_s*メ\_s*ソ\_s*ッ\_s*ド\)\|e\_s*\%(r\_s*l\|n\_s*\%(t\_s*\%(o\_s*x\_s*y\_s*l\_s*i\_s*d\_s*a\_s*e\|i\_s*u\_s*m\)\|n\_s*s\_s*y\_s*l\_s*v\_s*a\_s*n\_s*i\_s*a\)\)\|h\_s*o\_s*s\_s*p\_s*h\_s*o\_s*r\_s*u\_s*s\)\|リ\_s*ン\)', + \ 'q' : '\%([配椪栩櫪椢檪椡橡椚湫櫟含纐柵婚屎糞癖潛潜鵠裹凹窪馘括縊踵跟軛頚珞頸首諄窟鞋履寛狐轡覆靴沓碎砕管条降件頽崩屑葛釘莖茎陸杙株杭掘崛倔鶏鐃藥擽薬樟楠酒髪梳櫛串釧與与挫籖鯀鯨鬮籤隈熊艸嚔藾叢鏈腐鎖種ξΞ臭日茸菌楔草圀邦國国髭嗽漱吻喙嘴脣唇蛇梔劫刧腔φ 空粂皹勳熏裙醺桾皸下薫燻訓勲葷君委钁精詳企鍬加咥銜桑塊某暝競峅眛昏晦罔冥鮓比較闇位鞍藏暗倉廚厨涅〃仝ヽゞヾ々ゝ曇雲蜘栗狂包俥車廓曲郭梍枢踝畔鉄鐵★●■玄蔵黒玖柧供喰苦九枸鳩煦悔焼功倶狗来拘徠吼刳工絎駒朽眩垢口屈窶駈区劬繰呉宮暮貢久嶇來矩奇鉤9酌庫惧躯組衢紅食句吁懼區桍孔驅駆怐瞿汲クくq”‘’“♪ケ?ク¶q]\|ッ\_s*ク\|ッ\_s*ク\|っ\_s*く\|姑\_s*娘\|箜\_s*篌\|救\_s*世\|莎\_s*草\|傀\_s*儡\|被\_s*下\_s*度\|百\_s*[濟済]\|果\_s*物\|恭\_s*敬\|長\_s*月\|9\_s*月\|秧\_s*鶏\|究\_s*竟\|釉\_s*掛\|典\_s*薬\_s*寮\|天\_s*鼠\_s*矢\|L\_s*a\_s*u\_s*r\_s*\%(a\_s*c\_s*e\_s*a\_s*e\|o\_s*i\_s*d\_s*e\_s*a\_s*e\)\|探\_s*湯\|誓\_s*湯\|球\_s*磨\|六\_s*合\|地\_s*祇\|都\_s*子\|州\_s*光\|山\_s*梔\_s*子\|崑\_s*央\|群\_s*衆\|慈\_s*姑\|旧\_s*\%(訳\|唐\_s*書\)\|c\_s*r\_s*e\_s*s\_s*c\|水\_s*[鶏母]\|海\_s*月\|内\_s*蔵\_s*助\|K\_s*r\|H\_s*e\_s*l\_s*l\_s*e\_s*b\_s*o\_s*r\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|公\_s*\%([家方卿界美事文]\|出\_s*挙\)\|佝\_s*僂\_s*病\|J\_s*u\_s*g\_s*l\_s*a\_s*n\_s*d\_s*a\_s*l\_s*e\_s*s\|胡\_s*桃\|C\_s*\%(r\|h\_s*r\_s*o\_s*m\_s*i\_s*u\_s*m\)\|R\_s*h\_s*a\_s*m\_s*n\_s*a\_s*l\_s*e\_s*s\|Q\_s*&\_s*A\|珠\_s*穆\_s*朗\_s*瑪\|チ\_s*ョ\_s*モ\_s*ラ\_s*ン\_s*マ\|Q\_s*\%(I\_s*C\|R\_s*コ\_s*ー\_s*ド\|C\_s*サ\_s*ー\_s*ク\_s*ル\|U\_s*O\_s*カ\_s*ー\_s*ド\)\|『\_s*』\|コ\_s*\%(ー\_s*ラ\_s*ン\|ン\_s*テ\_s*ィ\_s*フ\_s*ァ\_s*イ\_s*ア\)\|問\_s*合\_s*せ\|カ\_s*\%(ザ\_s*ン\|タ\_s*ー\_s*ル\|ス\_s*バ\|ー\_s*ヌ\_s*ー\_s*ン\|ナ\_s*ー\_s*ト\|ダ\_s*フ\_s*ィ\|リ\_s*テ\|ド\_s*リ\_s*ー\_s*[ユル]\|ル\_s*\%(チ\_s*[ェエ]\|テ\_s*\%(ィ\_s*エ\|ッ\_s*ト\)\)\|ン\_s*タ\_s*[ムスン]\)\|質\_s*問\|キ\_s*\%(ト\|ブ\_s*ラ\|ホ\_s*ー\_s*テ\|ハ\_s*ー\_s*ダ\|ル\_s*\%(ト\|テ\_s*ィ\_s*ン\_s*グ\)\|ー\_s*ン\|ノ\_s*ン\|ッ\_s*シ\_s*ュ\|ュ\_s*\%(ー\|エ\_s*リ\)\)\)', + \ 'r' : '\%([ロ侖崙崘堽栄論祿漉轆碌肋勒麓禄鹿6録弄榔薐勞琅實樓焜瓏潦簍僂咾鑞柆螂臈槞瑯哢隴朖蘢螻滝朧壟撈臘郎瘻廊牢浪蝋癆聾楼篭籠狼漏朗轤瀘廬櫓櫨艪顱驢蕗鷺鹵蘆枦櫚炉輅艫滷臚爐賂髏ろレ洌澪蛉儷犁勵鴒齢苓綟砺囹糲唳聆〇蛎齡蠡黎羚戻禮祈隸茘麗玲隷伶癘励零冷例冽劣烈裂列靂檪癧轣鬲櫪瀝礫轢歴濂戀匳嗹奩斂鏈瀲漣鎌縺輦簾櫺∧聨憐恋蓮煉錬攣練聯廉連れル♪路盧縲泪壘瘰誄涙羸塁累類縷璢鏤屡褸婁陋るリ犂篥葎率慄栗勠淕六戮陸律擽畧暦掠略澑苙嶐瀏鏐瑠窿餾鉚旒瘤畄霤嚠笠榴溜硫琉留立柳粒劉隆流躪藺醂痳棆懍鄰菻躙鈴廩麟P淪厘凜霖琳悋綸淋禀稟凛鱗倫吝隣林燐臨絽踉侶梠膂虜呂慮仂力緑魎粮獵靈粱裲倆怜輌鷯繆廖凉鬣椋楞崚嶺暸兩鐐蓼輛燎瞭聊陵令梁糧諒霊遼凌龍漁亮寮⇔涼撩繚綾療竜量菱僚領了寥稜喨両料閭旅璃籬履釐悧裏梨俚里離浬莅驪痢李哩罹俐漓吏利裡詈理莉りラΛλ婪儖繿纜嬾覧瀾臠亂檻欒欖攬籃襴巒覽襤懶爛藍鸞卵濫闌嵐欄乱蘭労剌溂老埓埒猟辣薤喇珞樂犖絡駱酪烙楽落洛徠醴罍櫑耒賚蕾籟擂儡莱磊癩來礼雷頼来螺拉裸們良蘿騾等邏鑼らr右→ДжАГБФдзъЧйёЗкНЖьЭцТУСвюЮЁЯЪЛВбХМмЦоынИэа露епЕЬКПЩсчщя魯ШглушЫхОитфЙ輪√根羅ロ々ラルレリРρрΡr]\|ッ\_s*[ロレルリラ]\|ッ\_s*[ロレルリラ]\|っ\_s*[ろれるりら]\|鱸\_s*魚\|芦\_s*[有花]\|濾\_s*[胞過紙]\|水\_s*無\_s*月\|6\_s*[時月]\|檸\_s*檬\|坩\_s*堝\|C\_s*\%(a\_s*l\_s*y\_s*c\_s*a\_s*n\_s*t\_s*h\_s*a\_s*c\_s*e\_s*a\_s*e\|h\_s*o\_s*r\_s*i\_s*p\_s*e\_s*t\_s*a\_s*l\_s*a\_s*e\)\|A\_s*\%(c\_s*t\_s*a\_s*e\_s*a\|p\_s*o\_s*p\_s*e\_s*t\_s*a\_s*l\_s*a\_s*e\)\|鯉\_s*[魚城]\|二\_s*\%(索\|翻\_s*縛\)\|V\_s*e\_s*r\_s*t\_s*i\_s*c\_s*i\_s*l\_s*l\_s*a\_s*t\_s*a\_s*e\|O\_s*r\_s*c\_s*h\_s*i\_s*d\_s*a\_s*l\_s*e\_s*s\|M\_s*i\_s*c\_s*r\_s*o\_s*s\_s*p\_s*e\_s*r\_s*m\_s*a\_s*e\|L\_s*\%([ruia]\|e\_s*i\_s*t\_s*n\_s*e\_s*r\_s*i\_s*a\_s*l\_s*e\_s*s\|A\_s*N\_s*ケ\_s*ー\_s*ブ\_s*ル\)\|海\_s*獺\|G\_s*\%(e\_s*n\_s*t\_s*i\_s*a\_s*n\_s*a\_s*l\_s*e\_s*s\|y\_s*\%(n\_s*a\_s*n\_s*d\_s*r\_s*a\_s*e\|m\_s*n\_s*o\_s*s\_s*p\_s*e\_s*r\_s*m\_s*a\_s*e\)\)\|関\_s*係\_s*デ\_s*ー\_s*タ\_s*ベ\_s*ー\_s*ス\|数\_s*理\_s*解\_s*析\_s*研\_s*究\_s*所\|京\_s*都\_s*大\_s*学\_s*数\_s*理\_s*解\_s*析\_s*研\_s*究\_s*所\|東\_s*北\_s*大\_s*\%(通\_s*研\|学\_s*電\_s*気\_s*通\_s*信\_s*研\_s*究\_s*所\)\|電\_s*気\_s*通\_s*信\_s*研\_s*究\_s*所\|限\_s*定\_s*命\_s*令\_s*セ\_s*ッ\_s*ト\_s*計\_s*算\_s*機\|範\_s*囲\|規\_s*則\|紅\_s*玉\|要\_s*求\|検\_s*索\|復\_s*帰\|返\_s*[信事]\|拒\_s*否\|反\_s*射\_s*鏡\|参\_s*\%(考\_s*文\_s*献\|照\_s*型\)\|R\_s*\%(I\_s*N\_s*A\|&\_s*D\|S\_s*−\_s*2\_s*3\_s*2\_s*C\|u\_s*m\_s*b\_s*l\_s*e\|e\_s*n\_s*o\)\|機\_s*能\_s*回\_s*復\_s*訓\_s*練\|再\_s*帰\_s*的\|認\_s*識\|R\_s*\%([bnfeauh]\|i\_s*c\_s*h\_s*a\_s*r\_s*d\_s* \_s*M\_s*\.\_s* \_s*S\_s*t\_s*a\_s*l\_s*l\_s*m\_s*a\_s*n\|C\_s*S\|S\_s*S\_s*リ\_s*ー\_s*ダ\|I\_s*S\_s*C\|A\_s*M\|O\_s*M\|E\_s*\%(M\_s*睡\_s*眠\|T\_s*U\_s*R\_s*N\_s*キ\_s*ー\|A\_s*D\_s*M\_s*E\)\)\|正\_s*規\_s*表\_s*現\|ア\_s*ー\_s*ル\)', + \ 's' : '\%([ソ似杣灌傍峙毓育具供備害底苑薗園儲貮酘妬埆埣譏讒詆誹謗濡外猝率喞熄仄息足促束測側赱澡鯵嗾掫筝竃裝弉髞瀧勦輳嗽搶蔟爭偬瘡窗菷葱剏梍壯竈譟崢蚤笊嫂薮雙帚叟諍屮滝槽贈湊箱艘愡甑箒艚抓燥樔奘懆歃孀窓踪匝噪遭艙爪糟莊倉怱曹匆淙繰宋漕簇槍躁鎗箏綜痩喪藻艸葬壮操掻掃奏蹌滄争草層創蒼叢僧走惣送叛乖抑諳某橇轌艝拵噂巽邨鱒忖蹲樽孫遜存尊損噌其反踈組粗租胙俎礎爼詛麁囎蔬姐塑甦疎副措訴愬疽酥逸鼡沮蘓徂沿阻齟疏祖鼠咀想祚そセ芹鬩槧羶甎揃倩翦箋燹濺苫栫槫孱孅簽吮纖湶纎亘筌蟾磚荐茜綫箭舩喘錢專僊贍鐫仟旃痊涎巛銛饌僣氈韆籤沾刋擶舛牋阡濳籖癬潛筅殱殲闡釧賎餞羨顫甅竰糎¢陝銓踐閃潺遷銑栴川剪煽譫僉瞻践栓跣疝詮銭穿戰腺繊僭泉嬋淺擅鮮専潜扇浅蘚船線撰宣洗煎戦千忙伜倅逼蝉旋洩椄卩屑絏鱈泄攝紲緤薛褻浙竊℃窃拙摂接節楔淅蹐績蹠蓆籍磧跡跖關藉晰威迹瘠勣裼晢夕鶺潟碩惜析関席隻情甥躋貰淒婿嘶睛擠撕牲萋菁韲瀞穽齏筬晟掣腥逝惺旌蜻整靖誓制晴競急世堰攻脊丗勢畆糶瀬畝せス鯣鋭坐座李既已昴術辷全滑皇脛臑裾双英村選優営寸漱薦啌勸雪濯啜勧芒薄煤賺鼈捩筋頗丞輔佑亮甫祐介助蘇裔陶曽乃曾即則淳漁凉鑾篶漫硯雀涼鱸鮓鮨遊椙犂犁耒篦隙尽末眇縋管菅頽廢廃窘救掬寡尠糘粭菫速純鈴炭角墨隅】【鄒數菘陬雛芻嵩崇趨樞∝∫∠∞≫∧∋÷⇒∬∃∂∴±∩≒Δ¬∇×∀∈⌒≪≧≠∨∵⇔枢翆榱陲悴隹粹瘁帥騅萃邃錘捶忰誰醉遂膵燧彗綏錐穂炊翠⊥H吹粋推水酔睡掏鋤總巣直簾拗耡醋棲総過饐剃澄籔空透磨壽澂寿統梳喫栖棄据吸擂剥住好漉シ埀謐蕋蘂蕊痺褥茵鵐蔀鷸鴫入霑蔵嶌縞嶋島凋澀沫澁渋縛暫屡荵凌鎬忍慕簧舖↓襪健認随从啝從.舌扱罔θ虐Θ粃秕椎椣卓貎尿肉臠猪榻黙蜆楙誠茂成繁重鋪惻陣頻閾櫁樒汐鹽潮隰瑟嫉櫛蛭蟋疾隲漆躾膝失室沒鎭沈滴雫賤鎮靜顰尓爾確聢併◇◆鹿貭叱征質卯滋撓科品鬼錣鍜錏凝痼而拉設萎栞襞吝咳爲什導怪汁徴験著記印〇○』銀城代『報調蝨濕湿七僕笞楚霜臀退斥尻寫卸者炙冩柘舍暹諜喋煮這謝鯱奢赦捨瀉嚼抉決皙勺釋蜥爍鑠妁斫蹟刳昔芍酌爵折癪笏赤綽灼石尺借赭写鷓積舎車斜釈社蛛株麈諏洙殳娶娵鬚侏銖繻卒菽粥叔俶戚蓿倏蹙槭肅淑夙粛縮取珠殊趣恤蟀卆出鰍繍楢葺溲泅嗅楫酬逎遒緝岫螽萩鷲甃駲楸穐蹤讎售讐洲綉收驟囚舅姑蓚鞦脩輯醜習羞酋聚舟秀祝袖拾啾蒐収執衆襲愁就臭蹴週終褶州宗椶棕守朱撞種修周手首狩須儁皴悛惷蕣雋墫順蠢舜旬竣峻駿逡筍春瞬俊嗔蓁縉蔘鷏忱簪甄鷆寢岑畛矧疹槙齔臻娠譛譖哂脣袗怎晉瀋箴軫榛秦襯診鉐津駸讖紳斟唇針呻蜃賑芯瞋振殿侵辛薪晨辰震宸森伸愼眞慎寝晋身進審深親臣鍼心宍信神藷墅薯杵岨胥蜍黍渚砠處嶼且狙苜苴曙背塩緒枌雎蔗庶処所書暑誚聲橡奬觴舂蛸懾燮厰姓獎枩稍甞韶炒淞陞顳腫井摺嶂橸浹愴星升鍬樅嘗簫慯廂霎庠剿筱鬆秤政訟廠樵鷦礁邵餉愀妝璋湫艢劭峭殤梢將敞醤慫従逍倡竦爿牆墻薔笙樟装肖菖<≦湘誦聳檣稱声裳()蒋蕉嘯慴精霄鈔粧彰悚鏘悄蕭哨瀟焦憔匠鍾償瘴漿頌詔妾沼請衝薑唱庄渉奨牀娼床椒鉦荘翔抄宵傷踵召銷賞猩症昭燒猖昌少憧松捷紹晶尚象承證正将称焼笑照勝招消章詳証鐘硝掌省商昇穡屬稷嗇禝寔稙昃謖軾矚拭餝属燭贖色飾囑嘱織蝕式喰蜀殖初諸埴植食職砥姉摯誣侈髭肆仔及岐址梔咫贄沚旨誌資豕鷙凍厮粢齒雌耜枝齎領篩四祇嗤貲諮巵死強紙熾市師厶妛飼諡祗閇姿駟嗣趾此染締詞茲釶柿覗弛徙至屍嘴斯駛屎占啻之揣如閉錙糸絞孜尸滓獅瓷緊笥始泗咨觜只輜廝使敷恃思帋痴漬脂氏蚩時紫沁俟絲巳祉矢恣若賜次浸詩志識司弑笶翅謚示梓伺視緇自祠史試子痣滲茨肢歯幟祀施竢舐卮耆呰為芝阯しサ杓雨寤鮫清鞘莢觸騷触椹鰆爽騒澤沢濬掠新攫渫杷浚更士桾申白素汕纉潸餐蒜衫讚粲芟爨鑚蠶戔嶄跚驂慘攅斬彡杉秋桑…≡簒纂鯢燦珊繖棧刪卅參蚕鑽算傘3▼▽贊3参賛O散惨産酸嘸摩遉樣彷碍妨様山漣貶蔑垂鮭叫仙鏥寞寥皺淋生鯆虱鯖捌偖扨偵宿禎貞定哘誘蝎蠍授皿祥桟匙簓障囁私篠支捧笹逧迫讃鐸蛹宛真碕嵜尖前崎魁遮峺哢囀候侍核実説俚了達逹暁叡聰敏諭慧哲知訓郷恵聡智悟理杆里小棹竿箚扎刹紮皐撮搜寒捜相主盛盞柧觚杯盃榮栄倒肴魚界阪堺境酒泝逆賢坂榊猿麾挟鷺拶撒擦颯先数察薩刷札綵衰縡偲腮樶責哉殺霽崔淬顋寨切洒纔碎晒犲濟凄砦灑釵靫悽摧倖豺呵苛幸猜塞蔡栽儕采齊財臍截載孥宰済齋犀際災柴賽菜砕採斉斎祭妻債催才細鰓裁歳最埼捉辟柞縒咋簀筰齪筴窄册槊酢嘖朔柵遡溯鑿索搾昨炸冊策錯櫻桜裟提砂乍去射狭狹紗刺唆曝柤蓑裂捺做梭磋褪銹荒插醒挫差莎削止冷早避些槎嵳嵯嗟沙娑然再渣蹉扠詐割咲注覚嗄茶螫簑瑣下左搓瑳冴寂鎖挿叉査佐作覺点冱錆さ√錫す/仕指製西 ┓┐〆□■шШ上#♯щЩ添∪日s⊂⊆⊃⊇文静★☆*標嗜青三聖土彩△▲悉署〜∽‘’┌┏集\探§″性セサシソス秒σΣСсs]\|ッ\_s*[ソセスシサ]\|ッ\_s*[ソセスシサ]\|っ\_s*[そせすしさ]\|遽\_s*走\|蕎\_s*麦\|内\_s*障\|彼\_s*杵\|諷\_s*歌\|幾\_s*許\|錚\_s*[錚々]\|十\_s*\%(路\|露\_s*盤\)\|冬\_s*青\|微\_s*風\|虚\_s*言\|宙\_s*組\|夫\_s*[々夫]\|返\_s*田\|傴\_s*僂\|U\_s*m\_s*b\_s*e\_s*l\_s*l\_s*i\_s*f\_s*l\_s*o\_s*r\_s*a\_s*e\|台\_s*詞\|c\_s*e\_s*n\_s*t\_s*i\|妹\_s*尾\|嘲\_s*笑\|海\_s*象\|蒸\_s*[篭籠]\|魑\_s*魅\|凡\_s*て\|典\_s*侍\|季\_s*雄\|天\_s*[皇蛾]\|蘿\_s*蔔\|V\_s*i\_s*o\_s*l\_s*a\_s*l\_s*e\_s*s\|N\_s*y\_s*m\_s*p\_s*h\_s*a\_s*e\_s*\%(a\_s*c\_s*e\_s*a\_s*e\|o\_s*i\_s*d\_s*e\_s*a\_s*e\)\|夊\_s*繞\|隧\_s*道\|C\_s*\%(型\|言\_s*語\)\|老\_s*舗\|望\_s*潮\|飛\_s*沫\|L\_s*a\_s*\%(m\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\|b\_s*i\_s*a\_s*t\_s*a\_s*e\)\|埋\_s*葬\_s*虫\|幣\_s*原\|桎\_s*梏\|柳\_s*葉\_s*魚\|衣\_s*魚\|汚\_s*点\|蠹\_s*魚\|惠\_s*雄\|舗\_s*石\|磯\_s*城\|W\_s*i\_s*n\_s*t\_s*e\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\|倭\_s*文\|閑\_s*[谷か]\|云\_s*[云々]\|明\_s*\%(々\_s*後\_s*日\|明\_s*後\_s*日\)\|7\_s*月\|7\_s*月\|4\_s*[分月]\|4\_s*月\|羊\_s*[齒歯]\|I\_s*\%(l\_s*l\_s*i\_s*c\_s*i\_s*a\_s*c\_s*e\_s*a\_s*e\|s\_s*o\_s*p\_s*y\_s*r\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\)\|不\_s*[忍知]\|後\_s*\%([輪口志目]\|込\_s*み\)\|軍\_s*鶏\|香\_s*菜\|吃\_s*逆\|蝦\_s*蛄\|輸\_s*[出贏]\|隼\_s*[朗郎]\|笋\_s*[干羹]\|縦\_s*容\|睫\_s*毛\|翡\_s*翠\|東\_s*\%(雲\|海\_s*林\)\|Z\_s*i\_s*n\_s*g\_s*i\_s*b\_s*e\_s*r\_s*a\_s*l\_s*e\_s*s\|続\_s*\%(日\_s*本\_s*\%(紀\|後\_s*紀\)\|後\_s*撰\_s*和\_s*歌\_s*集\)\|髑\_s*髏\|匣\_s*鉢\|復\_s*習\|百\_s*日\_s*紅\|胡\_s*孫\_s*眼\|←\_s*→\|霰\_s*弾\|弥\_s*生\|懺\_s*\%(法\|悔\_s*懺\_s*悔\)\|流\_s*[離石]\|蠑\_s*螺\|覇\_s*王\_s*樹\|C\_s*\%([es]\|y\_s*c\_s*a\_s*d\_s*\%(i\_s*d\_s*a\_s*e\|o\_s*\%(p\_s*s\_s*i\_s*d\_s*a\|f\_s*i\_s*l\_s*i\_s*c\_s*a\_s*l\_s*e\_s*s\)\)\|h\_s*l\_s*o\_s*r\_s*a\_s*n\_s*t\_s*h\_s*a\_s*c\_s*e\_s*a\_s*e\|言\_s*語\|D\_s*店\|型\_s*肝\_s*炎\|a\_s*\%(s\_s*s\_s*y\_s*t\_s*h\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|c\_s*t\_s*a\_s*l\_s*e\_s*s\)\)\|竹\_s*[篦刀筒]\|大\_s*角\_s*豆\|防\_s*人\|曩\_s*に\|向\_s*坂\|一\_s*昨\_s*\%(昨\_s*[年日]\|々\_s*[年日]\)\|實\_s*藤\|甘\_s*藷\|五\_s*月\|月\_s*代\|匂\_s*坂\|税\_s*所\|雑\_s*賀\|骰\_s*子\|P\_s*\%(a\_s*r\_s*i\_s*e\_s*t\_s*a\_s*l\_s*e\_s*s\|t\_s*e\_s*r\_s*i\_s*d\_s*o\_s*s\_s*p\_s*e\_s*r\_s*m\_s*\%(a\_s*l\_s*e\_s*s\|i\_s*d\_s*a\_s*e\)\|r\_s*i\_s*m\_s*u\_s*l\_s*a\_s*l\_s*e\_s*s\)\|A\_s*\%(p\_s*i\_s*a\_s*l\_s*e\_s*s\|r\_s*a\_s*l\_s*e\_s*s\|n\_s*t\_s*i\_s*m\_s*o\_s*n\_s*y\)\|瑞\_s*[典西]\|B\_s*\%(r\|シ\_s*ェ\_s*ル\)\|拡\_s*張\_s*子\|部\_s*分\|置\_s*換\|ア\_s*ン\_s*チ\_s*モ\_s*ン\|構\_s*造\_s*体\|D\_s*o\_s*n\_s*a\_s*t\_s*i\_s*o\_s*n\_s* \_s*A\_s*l\_s*p\_s*h\_s*o\_s*n\_s*s\_s*e\_s* \_s*F\_s*r\_s*a\_s*n\_s*c\_s*o\_s*i\_s*s\_s* \_s*d\_s*e\_s* \_s*S\_s*a\_s*d\_s*e\|M\_s*\%(e\_s*r\_s*c\_s*u\_s*r\_s*y\|u\_s*s\_s*a\_s*l\_s*e\_s*s\|a\_s*r\_s*q\_s*u\_s*i\_s*s\_s* \_s*d\_s*e\_s* \_s*S\_s*a\_s*d\_s*e\)\|加\_s*\%(之\|虐\_s*\%(淫\_s*乱\_s*症\|趣\_s*味\)\)\|T\_s*\%(e\_s*t\_s*r\_s*a\_s*c\_s*e\_s*n\_s*t\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\|i\_s*n\|h\_s*e\_s* \_s*S\_s*i\_s*m\_s*p\_s*l\_s*e\_s* \_s*A\_s*P\_s*I\_s* \_s*f\_s*o\_s*r\_s* \_s*e\_s*v\_s*e\_s*n\_s*t\_s*-\_s*b\_s*a\_s*s\_s*e\_s*d\_s* \_s*X\_s*M\_s*L\_s* \_s*p\_s*a\_s*r\_s*s\_s*i\_s*n\_s*g\)\|ケ\_s*イ\_s*素\|珪\_s*素\|計\_s*測\_s*自\_s*動\_s*制\_s*御\_s*学\_s*会\|ネ\_s*ッ\_s*ト\_s*サ\_s*ー\_s*ビ\_s*ス\|ザ\_s*\%(ッ\_s*ク\|ク\_s*セ\_s*ン\|ビ\_s*ー\_s*ネ\|ウ\_s*バ\_s*ー\|ワ\_s*ー\_s*ク\_s*ラ\_s*ウ\_s*ト\|ム\_s*ザ\|ル\_s*ツ\|イ\_s*\%([ルン]\|ラ\_s*ー\|デ\_s*ル\)\|ー\_s*\%([ルラ]\|メ\_s*ン\)\)\|意\_s*味\|ゼ\_s*ミ\|ナ\_s*ト\_s*リ\_s*ウ\_s*ム\|ゾ\_s*\%(ル\|ン\_s*デ\|ー\_s*\%(ム\|リ\_s*ン\_s*ゲ\_s*ン\)\|フ\_s*ィ\_s*ー\)\|ジ\_s*\%(ム\|ー\_s*\%([グク]\|メ\_s*ン\_s*[ズス]\)\|グ\_s*ム\_s*ン\_s*ト\|ン\_s*\%(メ\_s*ル\|グ\_s*シ\_s*ュ\_s*ピ\_s*ー\_s*ル\|テ\_s*ー\_s*ゼ\)\)\|S\_s*\%([席式]\|サ\_s*イ\_s*ズ\|S\_s*サ\_s*イ\_s*ズ\|m\_s*a\_s*l\_s*l\_s*t\_s*a\_s*l\_s*k\|p\_s*a\_s*i\_s*n\|c\_s*o\_s*t\_s*c\_s*h\|U\_s*N\|u\_s*\%(n\|p\_s*e\_s*r\_s*A\_s*s\_s*c\_s*i\_s*i\)\|I\_s*C\_s*P\_s*(\_s*S\_s*t\_s*r\_s*u\_s*c\_s*t\_s*u\_s*r\_s*e\_s* \_s*a\_s*n\_s*d\_s* \_s*I\_s*n\_s*t\_s*e\_s*r\_s*p\_s*r\_s*e\_s*t\_s*a\_s*t\_s*i\_s*o\_s*n\_s* \_s*o\_s*f\_s* \_s*C\_s*o\_s*m\_s*p\_s*u\_s*t\_s*e\_s*r\_s* \_s*P\_s*r\_s*o\_s*g\_s*r\_s*a\_s*m\_s*s\_s*)\|−\_s*e\_s*x\_s*p\_s*r\_s*e\_s*s\_s*s\_s*i\_s*o\_s*n\|O\_s*N\_s*Y\_s* \_s*N\_s*E\_s*W\_s*S\|o\_s*l\_s*a\_s*r\_s*i\_s*s\|y\_s*s\_s*V\)\|硫\_s*黄\|エ\_s*ス\|S\_s*\%([nrgmce式]\|G\_s*M\_s*L\|サ\_s*イ\_s*ズ\|S\_s*サ\_s*イ\_s*ズ\|F\_s*マ\_s*ガ\_s*ジ\_s*ン\|Q\_s*U\_s*A\_s*R\_s*E\_s* \_s*E\_s*N\_s*I\_s*X\|K\_s*\%(K\|Y\_s* \_s*P\_s*e\_s*r\_s*f\_s*e\_s*c\_s*T\_s*V\_s*!\)\|a\_s*\%(r\_s*\%(r\_s*a\_s*c\_s*e\_s*n\_s*i\_s*a\_s*l\_s*e\_s*s\|g\_s*e\_s*n\_s*t\_s*o\_s*d\_s*o\_s*x\_s*a\_s*c\_s*e\_s*a\_s*e\)\|m\_s*a\_s*r\_s*i\_s*u\_s*m\)\|M\_s*\%(プ\_s*レ\_s*イ\|ク\_s*ラ\_s*ブ\)\|P\_s*\%(レ\_s*コ\_s*ー\_s*ド\|A\_s*C\_s*E\_s*キ\_s*ー\)\|p\_s*\%(l\_s*u\_s*s\|e\_s*\%(r\_s*m\_s*a\_s*t\_s*o\_s*p\_s*h\_s*y\_s*t\_s*a\|c\_s*a\_s*l\_s*i\_s*t\_s*y\_s* \_s*S\_s*t\_s*o\_s*r\_s*e\_s* \_s*R\_s*e\_s*t\_s*a\_s*i\_s*l\_s*e\_s*r\_s* \_s*o\_s*f\_s* \_s*P\_s*r\_s*i\_s*v\_s*a\_s*t\_s*e\_s* \_s*L\_s*a\_s*b\_s*e\_s*l\_s* \_s*A\_s*p\_s*p\_s*a\_s*r\_s*e\_s*l\)\|a\_s*\%(t\_s*h\_s*i\_s*f\_s*l\_s*o\_s*r\_s*a\_s*e\|r\_s*c\)\)\|H\_s*I\_s*F\_s*T\_s*キ\_s*ー\|C\_s*S\_s*I\|T\_s*\%(k\|A\_s*R\)\|h\_s*u\_s*g\_s*a\_s*r\_s*t\_s* \_s*A\_s*s\_s*s\_s*o\_s*c\_s*i\_s*a\_s*t\_s*e\_s*s\_s* \_s*S\_s*y\_s*s\_s*t\_s*e\_s*m\_s* \_s*I\_s*n\_s*t\_s*e\_s*r\_s*f\_s*a\_s*c\_s*e\|A\_s*\%(P\|S\_s*I\)\|i\_s*\%(m\_s*p\_s*l\_s*e\_s* \_s*K\_s*a\_s*n\_s*a\_s* \_s*t\_s*o\_s* \_s*K\_s*a\_s*n\_s*j\_s*i\_s* \_s*c\_s*o\_s*n\_s*v\_s*e\_s*r\_s*s\_s*i\_s*o\_s*n\_s* \_s*p\_s*r\_s*o\_s*g\_s*r\_s*a\_s*m\|l\_s*i\_s*c\_s*o\_s*n\)\|t\_s*r\_s*o\_s*n\_s*t\_s*i\_s*u\_s*m\|o\_s*\%(u\_s*t\_s*h\_s* \_s*\%(D\_s*a\_s*k\_s*o\_s*t\_s*a\|C\_s*a\_s*r\_s*o\_s*l\_s*i\_s*n\_s*a\)\|l\_s*a\_s*r\_s*i\_s*s\|f\_s*t\_s*w\_s*a\_s*r\_s*e\_s* \_s*R\_s*e\_s*s\_s*e\_s*a\_s*r\_s*c\_s*h\_s* \_s*A\_s*s\_s*s\_s*o\_s*c\_s*i\_s*a\_s*t\_s*e\_s*,\_s*I\_s*n\_s*c\_s*\.\)\|u\_s*\%(n\|l\_s*f\_s*u\_s*r\)\)\)', + \ 't' : '\%([ト乕囚寅虎瀞侶舮靹供纜燭艫朋倶鞆輩讎讐伴共友巴沌惇丼飩團暾団遯燉遁豚鷄禽酉砦塞俘擒虜豐恍惚枢乏塒迚科咎篷笘攴苫鶏伽唱稱鄰隣朿棘刺整鎖處処所床享鴟鵄扉鳶嫁訥晨穐秋刻鴇鬨斎頓幄幃帷柮杤栃閼軣轟屆届咄吶凸世暁祀駿壽繁稔寿豊歳俊利敏年慝牘悳黷犢匿督徳涜∃得特磴稻鞜剳宕滕鬥纛櫂讀盜綯橦叨桶盪竇抖縢礑荅閙塘罩帑棹兜檮納亠嶋棠搨档嶝溏鞳夲蘯道黨酘陦榻樋梼沓涛朸淌篤吋擣萄釖鬧籘諮迯儻潼鐙嶌逗螳蟷稲■幢滔鼕掏當峠読饕疼淘濤籐董悼棟搭痘套=豆燈桃韜遠統騰橈冬討骰祷藤灯島橙凍刀陶糖謄唐答投等桐兎砿外富止礪研閇觧疾莵梳穫融録問砥採飛杜賭翔留冨図熔人途登菟畄蠧泊戸跿荼蠹十蚪砺盗屠渡解取執溶睹兔脱妬鍍磨説摂覩鎔堵秉獲汢塗肚圖とテ瑛晃輝衒寺靦囀躔忝、鷆鷏碾巓,槙沾殄霑腆壥諂廛轉‥.:輾填甜奠顛纒癲恬殿纏覘展篆添梃輦輟鐡耋咥餮垤跌屮銕姪迭俶逖荻鏑狄糴廸笛覿擲迪滴轍的哲敵撤剔徹鐵鉄酲眤碵羝觝幀嚔嚏渟柢酊掟睇楴詆棣汀騁鵜叮遉釘弟碇剃蹄邸締梯悌訂程底偵廷遞逓抵牴呈艇鄭涕啼庭定低弖照てツ模幹劈聾列辛貫面液汁露冷錘舶紡系艷艶絃鉉寉橡剱劒釼劍劔剣弦蔓敦鶴幣兵鉗噤鶫償桓恆典恒常夙務勉努勤拙拐倹抓嬬撮詳審爪褄妻募角晦螺瞑円呟礫具粒辻辟罪捉捕閊把曹阜丘元首寮司官柄仕掴遣攫搏疲使窄莟蕾局壷壺坪綱繋壌蝪培霾戊己伝傳鐔翅翼鍔燕唾續約皷鼓続葛綴番栂槌縋弊費序潰終墜遂鎚椎追做殱殲捏繕傍旁創造作熟机佃蹲拒欟坏鴾槻月裹砲障躑榴謹慎筒愼恙包堤痛椄衝告點附撞繼津搗継嗣支突積尾漬詰尽通憑浸次盡攣連就接付つチ吃釁岐巷衢粽粡因杠契鵆児交腟帙膣些蟄N窒斉秩父捷矗筑築逐盟税力親邇誓迩近苣尖縮鏤塵朕珎趁抻鎭碪狆亭跛闖鴆砧椿枕鎮陳珍沈賃杖找摘茶嫡着潴儲豬箸紵竚躇瀦墸杼苧緒樗楮⊥陟飭敕捗稙躅猪勅著悵髫廳樢微聽鵈楪齠甼漲佻膓吊鼎趙迢萇誂廰澂脹疔輙昶糶蔦窕晁鬯塚輒雕挺凋帖掉停諜跳眺貼鐇澄提喋頭銚ー蝶暢帳丁牒重逃鳥張弔懲肇嘲徴兆釣聴彫潮町頂調庁貂腸超挑朝丶黜寵儔冑肘蟲惆鍮晝紬綢廚籌※冢丑胄稠酎紐鑄冲沖偸宙虫}[{]厨誅鋳紂仲註駐柱衷注籀昼抽中躓蜘踟褫魑夊黐笞黹池値夂輊治耻千薙家血岻痴散地稚遲知茅恥置穉緻致智遅乳禿癡馳ちタ便党屯椽榱架樽弛膤鰔蕩鱈盥戯俵袂保躊為樣様爲啗猯擔疸餤湍覃彖亶鄲靼綻站潭憺酖殫膽襌賺毯摶袒檀褝槫緞椴憚攤壇慱湯澹‡†蛋耽W旦痰啖坦眈反C嘆歎誕胆箪譚担淡鍛單短探貪単覊栲妙戲訊攜携尋訪比畴疇類民髱娯樂恃頼愉楽喩例譬激滾斃仆嵶垰殕倒嫋旅貍狸讃称賛敲蹈踏祟湛鬪戰斗戦闘彳佇叩疊疂疉畳箍鏨違互畉耕畊掌店棚到炭辿燵撻斬韃闥巽辰佐扶+援相佑輔弼助襷髻椨誑胤種塔龍竜糜糺爛漂維伊理貞是直禎忠惟匡徒唯只窘嗜慥確鮹鱆胝凧蛸嶽哮誥茸英豪威毅猛笋筍酣雄健丈斌武靈彈珪承賚珠霊魂卵偶適環弾球玉丹謀莨束縱|盾鬣奉楯蓼縦竪質城達館忽橘舘瀑薪滝瀧峪溪渓谿谷尭亨臣任集宇昂楼小剛恭岳洪喬嵩孚尚尊敬孝崇隆貴鷹竹篁簟寶財高寳宝但濯綰鐸倬澤拆柝擢柘戳啅擇鈬魄畜企啄磔匠巧択沢逞琢蓄度宅託卓謫托拓躰隶殆抬靆黛紿替滯體碓帶軆平駘擡逮腿当怠玳諦岱鯛對颱袋戴堆頽態苔滞待代帝貸隊褪胎帯体退泰大対足手斷垂佗闌経炊撓焚矯溜躱經咤食發朶薫詫誰他詑耐太強蛇起逹貯給堪長揉閉埀発断勃多澑岔截絶田立裁汰点夛侘建它賜たtцЦ〜天時×型火土→吐都東上噸瓲┃│台表第木スジ∴Θθザ正ツ¨転透▲△▼▽トチ…・試端タт┝Τ┯┰┣┷┸┤┬┥┴┻┠τ┫┳├〒Т┨テt]\|ッ\_s*[トテツチタ]\|ッ\_s*[トテツチタ]\|っ\_s*[とてつちた]\|門\_s*渡\_s*り\|薯\_s*蕷\|船\_s*尾\_s*座\|公\_s*[明暁]\|倫\_s*[子明]\|邑\_s*中\|蜻\_s*蛉\|A\_s*c\_s*o\_s*n\_s*i\_s*t\_s*u\_s*m\|蜷\_s*局\|跡\_s*[絶切]\|蜥\_s*蜴\|舎\_s*人\|馴\_s*鹿\|野\_s*老\|瓊\_s*脂\|永\_s*[遠久]\|宿\_s*直\|朱\_s*鷺\|左\_s*見\_s*右\_s*見\|朽\_s*木\|H\_s*y\_s*d\_s*r\_s*o\_s*c\_s*h\_s*a\_s*r\_s*i\_s*t\_s*a\_s*l\_s*e\_s*s\|独\_s*鈷\|季\_s*[衣道栄]\|聡\_s*[明徳]\|祈\_s*年\_s*祭\|淑\_s*[夫子]\|洞\_s*爺\|光\_s*男\|晧\_s*史\|紅\_s*娘\|瓢\_s*虫\|F\_s*e\|I\_s*r\_s*o\_s*n\|劇\_s*村\|滌\_s*除\|2\_s*×\_s*4\|悪\_s*阻\|石\_s*\%(蕗\|竜\_s*子\)\|心\_s*[太算]\|自\_s*\%(摸\|模\_s*和\)\|氷\_s*柱\|倩\_s*々\|黴\_s*雨\|入\_s*梅\|梅\_s*雨\|再\_s*見\|悉\_s*に\|備\_s*に\|旋\_s*[風毛]\|B\_s*a\_s*l\_s*a\_s*n\_s*o\_s*p\_s*h\_s*o\_s*r\_s*a\_s*l\_s*e\_s*s\|1\_s*\%(日\|0\_s*日\)\|朔\_s*日\|1\_s*\%(日\|0\_s*日\)\|美\_s*人\_s*局\|E\_s*\%(u\_s*p\_s*h\_s*o\_s*r\_s*b\_s*i\_s*a\_s*l\_s*e\_s*s\|r\_s*i\_s*c\_s*a\_s*l\_s*e\_s*s\)\|字\_s*\%(牌\|一\_s*色\)\|少\_s*と\|義\_s*父\|主\_s*[殿税]\|周\_s*夫\|睦\_s*子\|渠\_s*睦\_s*子\|萵\_s*苣\|身\_s*柱\|似\_s*指\|清\_s*\%(老\_s*頭\|一\_s*色\)\|青\_s*\%([幇島]\|梗\_s*菜\|椒\_s*肉\_s*絲\)\|全\_s*帯\|昌\_s*洙\|J\_s*i\_s*a\_s*n\_s*g\_s*s\_s*u\|江\_s*蘇\|焼\_s*豚\|叉\_s*焼\|察\_s*哈\_s*爾\|餃\_s*子\|雑\_s*砕\|炒\_s*[麺飯]\|北\_s*谷\|甘\_s*露\_s*子\|錯\_s*和\|総\_s*角\|一\_s*[日寸]\|植\_s*字\|魚\_s*[屋蝨]\|金\_s*魚\_s*蝨\|草\_s*石\_s*蚕\|春\_s*\%(麗\|宮\_s*坊\)\|九\_s*\%(十\_s*九\|連\_s*宝\_s*[灯燈]\)\|揺\_s*蕩\|容\_s*易\|白\_s*痴\|猶\_s*豫\|蜑\_s*民\|段\_s*銭\|蒲\_s*公\_s*英\|騨\_s*州\|M\_s*\%(e\_s*n\_s*i\_s*s\_s*p\_s*e\_s*r\_s*m\_s*a\_s*c\_s*e\_s*a\_s*e\|o\_s*n\_s*o\_s*\%(p\_s*e\_s*t\_s*a\_s*l\_s*a\_s*e\|c\_s*\%(h\_s*l\_s*a\_s*m\_s*y\_s*d\_s*e\_s*a\_s*e\|o\_s*t\_s*y\_s*l\_s*e\_s*d\_s*o\_s*n\_s*e\_s*a\_s*e\)\)\)\|仮\_s*令\|打\_s*[擲坐]\|七\_s*\%(夕\|対\_s*子\)\|活\_s*計\|方\_s*便\|無\_s*料\|黄\_s*\%(昏\|蜀\_s*葵\)\|章\_s*魚\|胼\_s*胝\|P\_s*\%(\.\_s*S\_s*\.\|o\_s*l\_s*y\_s*\%(g\_s*o\_s*n\_s*a\_s*l\_s*e\_s*s\|c\_s*a\_s*r\_s*p\_s*i\_s*c\_s*a\_s*e\)\|a\_s*n\_s*d\_s*a\_s*n\_s*a\_s*l\_s*e\_s*s\)\|壮\_s*聡\|煙\_s*草\|殺\_s*陣\|賢\_s*明\|性\_s*質\|怱\_s*ち\|亢\_s*ぶ\|堂\_s*子\|学\_s*聡\|能\_s*[文之]\|内\_s*匠\|松\_s*明\|奈\_s*子\|幇\_s*間\|切\_s*符\|デ\_s*ィ\_s*ス\|3\_s*r\_s*d\|閾\_s*値\|ソ\_s*\%(ー\_s*[トンプ]\|ロ\_s*ー\)\|ヘ\_s*ー\_s*グ\|ゼ\_s*[インムア]\|セ\_s*\%(オ\|ル\_s*マ\|ロ\_s*\%(ン\|ニ\_s*ア\_s*ス\)\|ラ\_s*ピ\_s*\%(ー\|ス\_s*ト\)\)\|シ\_s*\%(ン\|ッ\_s*ク\|ス\_s*ル\|ア\_s*タ\_s*ー\|ソ\_s*ー\_s*ラ\_s*ス\|オ\_s*ド\_s*ア\|ー\_s*[フタ]\)\|サ\_s*\%([イム]\|ミ\_s*ン\_s*グ\|ウ\_s*ザ\_s*ン\_s*ド\|ラ\_s*ブ\_s*レ\_s*ッ\_s*ド\|ー\_s*\%([ドモ]\|テ\_s*ィ\|ス\_s*ト\_s*ン\|ズ\_s*デ\_s*[イィー]\|マ\_s*ル\)\|ッ\_s*チ\_s*ャ\_s*ー\|ン\_s*\%(ク\|ダ\_s*ー\|キ\_s*ュ\_s*ー\)\|リ\_s*ド\_s*マ\_s*イ\_s*ド\)\|ポ\_s*リ\_s*ペ\_s*プ\_s*チ\_s*ド\|三\_s*\%(和\_s*土\|連\_s*文\_s*字\)\|\\\_s*T\_s*e\_s*X\|文\_s*字\_s*列\|教\_s*科\_s*書\|用\_s*語\|電\_s*\%([視話]\|気\_s*通\_s*信\_s*研\_s*究\_s*所\)\|T\_s*\%([字i]\|細\_s*胞\|K\_s*8\_s*0\|ゾ\_s*ー\_s*ン\|バ\_s*ッ\_s*ク\|シ\_s*ャ\_s*ツ\|V\_s*\%(ニ\_s*ュ\_s*ー\_s*ス\|ゲ\_s*ー\_s*ム\|ド\_s*ラ\_s*マ\|ア\_s*ニ\_s*メ\)\|C\_s*P\_s*/\_s*I\_s*P\|a\_s*g\|r\_s*u\_s*e\_s*T\_s*y\_s*p\_s*e\|E\_s*X\|e\_s*[Xl]\)\|T\_s*\%([bc字mliahe]\|r\_s*i\_s*m\_s*e\_s*n\_s*i\_s*a\_s*c\_s*e\_s*a\_s*e\|u\_s*n\_s*g\_s*s\_s*t\_s*e\_s*n\|ゾ\_s*ー\_s*ン\|X\_s*T\_s*フ\_s*ァ\_s*イ\_s*ル\|シ\_s*ャ\_s*ツ\|バ\_s*ッ\_s*ク\|V\_s*\%(ニ\_s*ュ\_s*ー\_s*ス\|ゲ\_s*ー\_s*ム\|ド\_s*ラ\_s*マ\|モ\_s*ニ\_s*タ\|ア\_s*ニ\_s*メ\|シ\_s*ョ\_s*ッ\_s*ピ\_s*ン\_s*グ\)\|C\_s*P\|コ\_s*ー\_s*ド\|-\_s*C\_s*o\_s*d\_s*e\|O\_s*E\_s*I\_s*C\|A\_s*\%(C\|I\_s*N\_s*S\|B\_s*キ\_s*ー\)\|E\_s*L\)\)', + \ 'u' : '\%([ウ孳蛤礼敬恭洞鱗愛潤煩騒粳漆閏患慯悄恙騷愁呻楳梅嫐釉噂褞吽曇紜耘黄云繧慍蘊薀暈運錙怏麗羨卦憾怨恨占卜末嬉心裏浦糶瓜汝己畦疇畆畴畝疎踈宜諾奪姥腕莵兔驢鑿穿嗽魘唸促令項頷訴鷽獺嘯嘘蠢蠕動覘窺伺海萼台詠謌唱唄宴讌転詩謠謳謡疑歌葎鯏鴬鶯ヱゑゐヰ鶉疼堆踞蹲渦舂臼碓羅薄筌食槽朮肯凵魚巧茨廏廐厩鰻午甘秣孫餞馬旨蔚寫暎冩遷噐器移慈俯映写現虚美笂靭靱靫空鰾萍初蛆雲氏上後喪艮丑潮牛裡鬱欝中袿梁家内紆嫗羽打禹請浮攴得雨有飢熟于埋倦鵜迂生賣挧受撃泛傴憂茹射膿売撲菟盂搏齲右胡承卯攵績産芋討夘兎植饂宇享失烏うu¨↑∪уウΥυУUu]\|武\_s*漢\|狼\_s*狽\|夏\_s*枯\_s*草\|蟒\_s*蛇\|蠎\_s*蛇\|譫\_s*言\|琅\_s*珠\|温\_s*[麺気州]\|C\_s*u\_s*c\_s*u\_s*r\_s*b\_s*i\_s*t\_s*a\_s*l\_s*e\_s*s\|自\_s*惚\|采\_s*女\|乳\_s*母\|姨\_s*捨\_s*山\|独\_s*活\|優\_s*\%(婆\_s*[塞夷]\|曇\_s*華\)\|合\_s*格\|親\_s*族\|斥\_s*候\|泡\_s*沫\|雅\_s*楽\_s*[頭寮]\|楽\_s*官\|干\_s*莉\|維\_s*納\|太\_s*秦\|護\_s*田\_s*鳥\_s*尾\|淡\_s*\%(青\|口\_s*醤\_s*油\)\|五\_s*\%(加\|月\_s*蝿\)\|稲\_s*魂\|誓\_s*約\|石\_s*\%(女\|斑\_s*魚\)\|不\_s*生\_s*女\|味\_s*酒\|苜\_s*蓿\|A\_s*r\_s*i\_s*s\_s*t\_s*o\_s*l\_s*o\_s*c\_s*h\_s*i\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|伝\_s*染\|呆\_s*気\_s*者\|茴\_s*香\|外\_s*郎\|餓\_s*\%(死\|え\_s*死\_s*に\)\|裲\_s*襠\|団\_s*扇\|イ\_s*ギ\_s*リ\_s*ス\|オ\_s*マ\_s*ル\|識\_s*別\_s*不\_s*能\|共\_s*\%(用\_s*体\|有\_s*体\)\|ア\_s*\%([スン]\|グ\_s*リ\_s*ー\|ー\_s*\%(シ\_s*ュ\_s*ラ\|ジ\_s*ェ\_s*ン\_s*ト\|バ\_s*ン\)\|ル\_s*テ\_s*ィ\_s*メ\_s*ッ\_s*ト\|ポ\_s*ン\|ッ\_s*\%(プ\|パ\_s*ー\|シ\_s*ャ\_s*ー\)\)\|単\_s*\%(位\|一\_s*化\)\|U\_s*\%(ボ\_s*ー\_s*ト\|タ\_s*ー\_s*ン\|ネ\_s*ッ\_s*ク\|N\_s*I\_s*X\_s*\%(フ\_s*ェ\_s*ア\_s*ー\|マ\_s*ガ\_s*ジ\_s*ン\)\)\|ユ\_s*\%([タニー]\|ト\_s*\%(リ\_s*ロ\|レ\_s*ヒ\_s*ト\)\|リ\_s*\%(ア\|シ\_s*ー\_s*ズ\)\|プ\_s*シ\_s*ロ\_s*ン\|ネ\_s*ス\_s*コ\|ナ\_s*\%(カ\_s*イ\_s*ト\|イ\_s*テ\_s*ッ\_s*ド\)\|ビ\_s*キ\_s*\%(タ\_s*ス\|ノ\_s*ン\)\)\)', + \ 'v' : '\%([v:├値⊥版в↓В∨ヴv]\|ッ\_s*ウ\_s*゙\|ッ\_s*ヴ\|っ\_s*ヴ\|ウ\_s*゙\|チ\_s*ェ\_s*ロ\|ヰ\_s*タ\| \_s*ビ\_s*ク\_s*ト\_s*ー\_s*ル\|視\_s*覚\|仮\_s*想\|ニ\_s*ス\|変\_s*数\|恒\_s*真\|ワ\_s*\%(デ\_s*ィ\_s*ム\|ギ\_s*ナ\|ニ\_s*ス\|セ\_s*リ\_s*ン\|ク\_s*チ\_s*ン\|ル\_s*キ\_s*ュ\_s*ー\_s*レ\|レ\_s*リ\_s*ー\|ー\_s*ニ\_s*ャ\)\|V\_s*\%(c\|ゾ\_s*ー\_s*ン\|サ\_s*イ\_s*ン\|ネ\_s*ッ\_s*ク\|ゴ\_s*ー\_s*ル\|シ\_s*ネ\|リ\_s*ー\_s*グ\|i\_s*e\_s*w\|a\_s*l\_s*u\_s*e\|o\_s*l\_s*k\_s*l\)\|語\_s*彙\|ボ\_s*\%(ス\_s*ト\_s*ー\_s*ク\|ン\_s*ゴ\_s*レ\|ル\_s*\%([ガボトタ]\|テ\_s*\%(ッ\_s*ク\_s*ス\|ー\_s*[ジル]\)\)\|リ\_s*ュ\_s*ー\_s*ム\|ラ\_s*ン\_s*\%(チ\|テ\_s*ィ\_s*ア\|タ\_s*リ\_s*ー\)\|レ\_s*ー\|コ\_s*ー\_s*ダ\|ー\_s*\%([ントグ]\|ル\_s*ト\|ド\_s*ビ\_s*\%(ル\|リ\_s*ア\_s*ン\)\|パ\_s*ル\|ダ\_s*フ\_s*ォ\_s*ン\|カ\_s*\%(ル\|リ\_s*ス\_s*ト\)\)\|キ\_s*ャ\_s*ブ\_s*ラ\_s*リ\|イ\_s*\%([ドス]\|ジ\_s*ャ\_s*ー\|シ\_s*ン\_s*グ\)\)\|ヘ\_s*ッ\_s*ト\|冗\_s*長\_s*な\|垂\_s*直\|フ\_s*\%(ァ\_s*\%(ン\|ド\_s*ー\_s*ツ\)\|ォ\_s*\%(ン\|ル\_s*\%(ク\|カ\_s*ー\)\)\|ェ\_s*ル\_s*メ\_s*ー\_s*ル\)\|ウ\_s*\%(ラ\_s*\%(デ\_s*ィ\_s*ミ\_s*ー\_s*ル\|ジ\_s*\%(ー\_s*ミ\_s*ル\|ミ\_s*ー\_s*ル\|オ\_s*ス\_s*ト\_s*\%(ク\|ッ\_s*ク\)\)\)\|ィ\_s*\%(ン\_s*ナ\|ル\_s*ス\)\|ォ\_s*ッ\_s*カ\|イ\_s*\%(ル\_s*ス\|ン\_s*ナ\_s*ー\)\|ェ\_s*\%(ル\_s*ギ\_s*リ\_s*ウ\_s*ス\|ヌ\_s*ス\)\)\|ビ\_s*\%([アラブバスザ]\|ガ\_s*ー\|ハ\_s*ー\_s*ラ\|タ\_s*ミ\_s*ン\|レ\_s*\%(ッ\_s*ジ\|ロ\_s*イ\)\|ビ\_s*\%(ア\_s*ン\|ッ\_s*ド\)\|ッ\_s*\%(ク\|キ\_s*ー\)\|セ\_s*ン\_s*テ\|ク\_s*\%(タ\_s*ー\|ト\_s*\%(ル\|リ\_s*[ーア]\)\)\|シ\_s*\%(ャ\_s*ス\|ソ\_s*ワ\_s*ー\_s*ズ\)\|ン\_s*\%([チス]\|ソ\_s*ン\|テ\_s*ー\_s*ジ\|セ\_s*ン\_s*ト\)\|ネ\_s*\%(ガ\_s*ー\|グ\_s*レ\_s*ッ\_s*ト\)\|ニ\_s*\%([ール]\|リ\_s*デ\_s*ン\)\|ュ\_s*ー\|エ\_s*ン\_s*チ\_s*ャ\_s*ン\|ジ\_s*\%(ャ\|ッ\_s*ト\|タ\_s*ー\|ョ\_s*\%(ン\|ナ\_s*リ\_s*ー\)\|ュ\_s*ア\_s*\%(ル\|ラ\_s*イ\_s*\%(ズ\|ゼ\_s*ー\_s*シ\_s*ョ\_s*ン\)\)\)\|ダ\_s*ル\|デ\_s*オ\|ル\_s*\%(ゴ\|ヌ\_s*ー\_s*ブ\)\|オ\_s*ラ\|リ\_s*ジ\_s*ア\_s*ン\|ィ\_s*ー\_s*ナ\_s*ス\|ー\_s*\%(ボ\|ル\_s*ス\|ク\_s*ル\|ナ\_s*ス\)\)\|ベ\_s*\%([ガラン]\|ト\_s*ナ\_s*ム\|イ\_s*ダ\_s*ー\|ー\_s*\%(ル\|ダ\_s*ー\)\|テ\_s*ラ\_s*ン\|ッ\_s*セ\_s*ル\|ス\_s*\%([トタパ]\|ビ\_s*オ\)\|ク\_s*\%(タ\|ト\_s*ル\)\|ジ\_s*タ\_s*\%(ブ\_s*ル\|リ\_s*ア\_s*ン\)\|リ\_s*\%([ィー]\|フ\_s*ァ\_s*イ\|サ\_s*イ\_s*ン\)\|ロ\_s*\%(ナ\|シ\_s*テ\_s*ィ\|ー\_s*ナ\|ニ\_s*[カク]\)\|ル\_s*\%(デ\|ベ\_s*ッ\_s*ト\|ダ\_s*ン\|レ\_s*ー\_s*ヌ\|サ\_s*\%(ー\_s*チ\|イ\_s*ユ\)\|モ\_s*ッ\_s*ト\)\|ノ\_s*ム\|ニ\_s*[スヤア]\|ネ\_s*\%(シ\_s*ャ\_s*ン\|チ\_s*ア\|ツ\_s*ィ\_s*ア\|ズ\_s*エ\_s*ラ\)\)\|V\_s*\%(H\_s*L\_s*L\_s*(\_s*V\_s*e\_s*r\_s*y\_s* \_s*H\_s*i\_s*g\_s*h\_s* \_s*L\_s*e\_s*v\_s*e\_s*l\_s* \_s*L\_s*a\_s*n\_s*g\_s*u\_s*a\_s*g\_s*e\_s*)\|ゾ\_s*ー\_s*ン\|サ\_s*イ\_s*ン\|ネ\_s*ッ\_s*ク\|ゴ\_s*ー\_s*ル\|J\_s*E\_s*-\_s*β\|シ\_s*ネ\|リ\_s*ー\_s*グ\|I\_s*S\_s*A\_s*カ\_s*ー\_s*ド\|i\_s*r\_s*g\_s*i\_s*n\_s*i\_s*a\|A\_s*X\|e\_s*r\_s*\%(m\_s*o\_s*n\_s*t\|i\_s*S\_s*i\_s*g\_s*n\)\|a\_s*n\_s*a\_s*d\_s*i\_s*u\_s*m\)\|ブ\_s*\%(イ\|ラ\_s*\%(ド\|ッ\_s*ド\)\|ー\_s*ド\_s*ゥ\_s*ー\)\|バ\_s*\%([ルン]\|イ\_s*\%([アブンオ]\|パ\_s*ー\|タ\_s*\%(ル\|リ\_s*テ\_s*ィ\)\|キ\_s*ン\_s*グ\|ザ\_s*ー\|シ\_s*ャ\)\|ッ\_s*ト\|チ\_s*カ\_s*ン\|ギ\_s*ナ\|ガ\_s*ボ\_s*ン\_s*ド\|ラ\_s*\%(ナ\_s*シ\|エ\_s*テ\_s*ィ\)\|サ\_s*ロ\|ス\_s*\%(コ\|ケ\_s*ス\)\|カ\_s*ン\_s*ス\|ケ\_s*ー\_s*シ\_s*ョ\_s*ン\|キ\_s*ュ\_s*ー\_s*ム\|ウ\_s*チ\_s*ャ\_s*ー\|リ\_s*\%(ン\|エ\_s*ー\_s*シ\_s*ョ\_s*ン\|ュ\_s*ー\|ア\_s*\%(ブ\_s*ル\|ン\_s*ト\)\|ッ\_s*ド\|デ\_s*ー\_s*シ\_s*ョ\_s*ン\)\|ヌ\_s*ア\_s*ツ\|ニ\_s*\%(ラ\|ー\_s*ユ\)\|レ\_s*\%([ラー]\|ロ\_s*ン\|リ\_s*ー\|ン\_s*\%(シ\_s*ア\|チ\_s*ノ\|タ\_s*イ\_s*ン\)\)\|ー\_s*\%([ゴグ]\|チ\_s*ャ\_s*ル\|リ\_s*ト\_s*ゥ\_s*ー\_s*ド\|バ\_s*ル\|ボ\_s*ス\|ベ\_s*ナ\|テ\_s*ィ\_s*カ\_s*ル\|サ\_s*ス\|ジ\_s*\%(ン\|ニ\_s*ア\|ョ\_s*ン\)\|ノ\_s*ン\|ニ\_s*ア\|モ\_s*ン\_s*ト\|ミ\_s*\%(リ\_s*オ\_s*ン\|キ\_s*ュ\_s*ラ\_s*イ\_s*ト\)\)\|ナ\_s*\%(キ\_s*ュ\_s*ラ\_s*ー\|ジ\_s*ウ\_s*ム\)\)\)', + \ 'w' : '\%([ヲヲ女翁緒牡小雄汚惜尾男をウ孳蛤礼敬恭洞鱗愛潤騒粳漆閏慯悄恙騷愁呻楳梅嫐釉噂褞吽曇紜耘云繧慍蘊薀暈運錙怏麗羨U卦憾怨恨占卜末嬉心裏浦糶瓜汝己Υυ畦疇畆畴畝疎踈宜諾奪姥莵兔驢鑿穿嗽魘唸促令項頷訴鷽獺嘯嘘蠢蠕動覘窺伺萼台詠謌唱唄宴讌転詩謠謳謡疑歌葎鯏鴬鶯ヱゑ鶉疼堆踞蹲渦舂臼碓羅薄筌食槽朮肯凵魚巧茨廏廐厩鰻午甘秣孫餞馬旨蔚寫暎冩遷噐器移慈俯映写現虚美笂靭靱靫空鰾萍初蛆氏↑上後喪艮丑潮牛裡鬱欝中袿梁家内紆嫗打禹請浮攴得雨有飢熟于埋倦鵜迂生賣挧受撃泛傴憂茹射膿売撲菟盂搏齲右胡承卯攵績産芋討夘兎植饂宇享失烏うヰ居ゐワ叫喚惡÷悪原稿嗤妾蕨童藁鞋笑灣綰萬豌万弯彎椀雲腕碗湾横黄皇往羂罠毫纔微僅患煩伎術厄禍災態業技佗王鰐忘掖弁腋譯腸緜渉亙道航弥亘棉渡綿私隈薈賄淮脇矮猥歪轍海蟠儂∪解頒觧判訣別稚若或枠惑鷲沸詫輪和涌湧我吾把話侘杷訳破萵啝割倭環分琶羽わw幅水∧波ウワw]\|ッ\_s*[ヲヱウヰワ]\|ッ\_s*[ヲヱウヰワ]\|っ\_s*[をゑうゐわ]\|乎\_s*古\_s*止\_s*点\|武\_s*漢\|狼\_s*狽\|夏\_s*枯\_s*草\|蟒\_s*蛇\|蠎\_s*蛇\|譫\_s*言\|琅\_s*珠\|温\_s*[麺気州]\|C\_s*u\_s*c\_s*u\_s*r\_s*b\_s*i\_s*t\_s*a\_s*l\_s*e\_s*s\|自\_s*惚\|采\_s*女\|乳\_s*母\|姨\_s*捨\_s*山\|独\_s*活\|優\_s*\%(婆\_s*[塞夷]\|曇\_s*華\)\|合\_s*格\|親\_s*族\|斥\_s*候\|泡\_s*沫\|雅\_s*楽\_s*[頭寮]\|楽\_s*官\|干\_s*莉\|維\_s*納\|護\_s*田\_s*鳥\_s*尾\|淡\_s*\%(青\|口\_s*醤\_s*油\)\|五\_s*\%(加\|月\_s*蝿\)\|稲\_s*魂\|誓\_s*約\|石\_s*\%(女\|斑\_s*魚\)\|不\_s*生\_s*女\|味\_s*酒\|苜\_s*蓿\|A\_s*r\_s*i\_s*s\_s*t\_s*o\_s*l\_s*o\_s*c\_s*h\_s*i\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|伝\_s*染\|呆\_s*気\_s*者\|茴\_s*香\|外\_s*郎\|餓\_s*\%(死\|え\_s*死\_s*に\)\|裲\_s*襠\|団\_s*扇\|草\_s*鞋\|(\_s*笑\_s*)\|(\_s*笑\_s*)\|戦\_s*慄\|俳\_s*優\|勿\_s*忘\_s*草\|早\_s*[生稲]\|山\_s*葵\|戯\_s*奴\|度\_s*会\|Y\_s*\%(軸\|シ\_s*ャ\_s*ツ\|染\_s*色\_s*体\)\|Y\_s*\%(軸\|シ\_s*ャ\_s*ツ\|染\_s*色\_s*体\)\|華\_s*盛\_s*頓\|裙\_s*蔕\_s*菜\|理\_s*[由解]\|公\_s*魚\|病\_s*葉\|大\_s*東\_s*亜\_s*戰\_s*爭\|太\_s*\%(秦\|平\_s*洋\_s*戦\_s*争\)\|歐\_s*州\_s*大\_s*戰\|第\_s*\%(二\_s*次\_s*世\_s*界\_s*大\_s*戦\|一\_s*次\_s*世\_s*界\_s*大\_s*戦\)\|ブ\_s*ル\_s*ツ\_s*ブ\_s*ル\_s*ク\|ロ\_s*ン\_s*グ\|レ\_s*\%(ン\|イ\_s*ス\|ッ\_s*カ\_s*ー\|ス\_s*\%(ラ\_s*ー\|リ\_s*ン\_s*グ\)\)\|リ\_s*\%(ー\_s*ス\|ン\_s*ク\_s*ル\|ス\_s*ト\)\|書\_s*き\_s*込\_s*み\|ラ\_s*\%(ッ\_s*\%([プパ]\|ピ\_s*ン\_s*グ\)\|イ\_s*\%([タト]\|テ\_s*ィ\_s*ン\_s*グ\)\)\|ボ\_s*ル\_s*フ\|フ\_s*\%([ムー]\|ァ\_s*イ\_s*ル\|ィ\_s*\%(ー\_s*ト\|ッ\_s*チ\)\)\|ホ\_s*\%(エ\_s*[ーイア]\|ー\_s*ル\|イ\_s*\%(ー\_s*\%(ル\|ラ\_s*ー\)\|ッ\_s*\%(プ\|ス\_s*ル\|パ\_s*ー\|ト\_s*\%(ニ\_s*ー\|マ\_s*ン\)\)\)\|ワ\_s*\%(イ\|ッ\_s*[トツ]\)\)\|ベ\_s*ル\_s*ナ\_s*ー\|W\_s*\%(S\|N\_s*N\|y\_s*o\_s*m\_s*i\_s*n\_s*g\|O\_s*W\_s*O\_s*W\|I\_s*\%(D\_s*E\|N\_s*T\_s*E\_s*R\_s*P\_s*(\_s*W\_s*i\_s*d\_s*g\_s*e\_s*t\_s* \_s*I\_s*n\_s*t\_s*e\_s*r\_s*p\_s*r\_s*e\_s*t\_s*e\_s*r\_s*)\)\|i\_s*\%(s\_s*c\_s*o\_s*n\_s*s\_s*i\_s*n\|d\_s*g\_s*e\_s*t\|n\_s*d\_s*o\_s*w\_s*s\)\|h\_s*\%(y\_s* \_s*d\_s*o\_s*n\_s*e\_s* \_s*i\_s*t\_s*?\|o\_s* \_s*d\_s*o\_s*n\_s*e\_s* \_s*i\_s*t\_s*?\)\|E\_s*B\_s*\%(ブ\_s*ラ\_s*ウ\_s*ザ\|マ\_s*ガ\_s*ジ\_s*ン\)\|e\_s*\%(s\_s*t\_s* \_s*V\_s*i\_s*r\_s*g\_s*i\_s*n\_s*i\_s*a\|b\_s*\%(ペ\_s*ー\_s*ジ\|ラ\_s*ジ\_s*オ\|コ\_s*ミ\_s*ッ\_s*ク\|サ\_s*\%(イ\_s*ト\|ー\_s*\%(バ\|ビ\_s*ス\)\)\|ド\_s*ラ\_s*マ\)\)\|a\_s*s\_s*h\_s*i\_s*n\_s*g\_s*t\_s*o\_s*n\|A\_s*V\_s*フ\_s*ァ\_s*イ\_s*ル\)\|警\_s*告\|W\_s*\%(杯\|n\_s*n\|i\_s*n\_s*k\|a\_s*r\_s*e\)\|バ\_s*ル\_s*タ\_s*ー\|ヴ\_s*\%(ュ\_s*ル\_s*ツ\_s*ブ\_s*ル\_s*ク\|ォ\_s*ル\_s*フ\|ィ\_s*\%([ーム]\|ル\_s*\%(ム\|ヘ\_s*ル\_s*ム\)\)\|ェ\_s*\%(ン\_s*ダ\_s*ー\_s*ス\|ル\_s*ナ\_s*ー\|ー\_s*バ\_s*ー\|イ\_s*ユ\)\|ァ\_s*\%(イ\_s*[ンス]\|ー\_s*グ\_s*ナ\_s*ー\|ン\_s*ダ\|ル\_s*\%(タ\_s*ー\|キ\_s*ュ\_s*ー\_s*レ\)\)\)\|T\_s*\%(h\_s*e\_s* \_s*W\_s*o\_s*r\_s*l\_s*d\_s* \_s*W\_s*i\_s*d\_s*e\_s* \_s*W\_s*e\_s*b\_s* \_s*C\_s*o\_s*n\_s*s\_s*o\_s*r\_s*t\_s*i\_s*u\_s*m\|u\_s*n\_s*g\_s*s\_s*t\_s*e\_s*n\)\|ダ\_s*ブ\_s*リ\_s*ュ\_s*ー\|タ\_s*ン\_s*グ\_s*ス\_s*テ\_s*ン\)', + \ 'x' : '\%([ォォぉェェぇゥゥぅィィぃァァぁxξ×ХхΞx]\|ッ\_s*[ォェゥィァ]\|ッ\_s*[ォェゥィァ]\|っ\_s*[ぉぇぅぃぁ]\|シ\_s*ロ\_s*\%(フ\_s*ォ\_s*ン\|ホ\_s*ン\)\|X\_s*\%([軸線]\|デ\_s*[イー]\|v\_s*i\_s*e\_s*w\|S\_s*サ\_s*イ\_s*ズ\|L\_s*\%(i\_s*s\_s*p\|サ\_s*イ\_s*ズ\)\|ウ\_s*ィ\_s*ン\_s*ド\_s*ウ\|端\_s*末\)\|X\_s*\%([軸線]\|C\_s*o\_s*n\_s*s\_s*o\_s*r\_s*t\_s*i\_s*u\_s*m\|デ\_s*[イー]\|P\_s*S\_s*(\_s*e\_s*X\_s*p\_s*a\_s*n\_s*s\_s*i\_s*o\_s*n\_s* \_s*P\_s*a\_s*s\_s*s\_s*i\_s*n\_s*g\_s* \_s*S\_s*t\_s*y\_s*l\_s*e\_s*)\|S\_s*サ\_s*イ\_s*ズ\|l\_s*i\_s*b\|L\_s*\%(i\_s*s\_s*p\|サ\_s*イ\_s*ズ\)\|e\_s*n\_s*o\_s*n\)\|ジ\_s*オ\_s*ン\|ゼ\_s*\%(ビ\_s*ウ\_s*ス\|ロ\_s*\%(ッ\_s*ク\_s*ス\|グ\_s*ラ\_s*フ\_s*ィ\)\)\|ハ\_s*ビ\_s*エ\_s*ル\|ザ\_s*\%(ン\|ビ\_s*エ\_s*ル\)\|キ\_s*\%(シ\_s*\%(ロ\|レ\_s*ン\|リ\_s*ト\_s*ー\_s*ル\)\|セ\_s*ノ\_s*ン\|サ\_s*ン\_s*\%(チ\_s*ン\|タ\_s*ン\)\)\|E\_s*x\_s*t\_s*e\_s*n\_s*s\_s*i\_s*b\_s*l\_s*e\_s* \_s*M\_s*a\_s*r\_s*k\_s*u\_s*p\_s* \_s*L\_s*a\_s*n\_s*g\_s*u\_s*a\_s*g\_s*e\|ク\_s*\%(シ\_s*ー\|ロ\_s*ス\_s*ポ\_s*ス\_s*ト\|セ\_s*\%(ナ\_s*キ\_s*ス\|ノ\_s*フ\_s*ォ\_s*ン\)\|ザ\_s*ヴ\_s*ィ\_s*エ\|サ\_s*\%(イ\|ン\_s*\%(ト\_s*ス\|テ\_s*ィ\_s*ッ\_s*ペ\|チ\_s*ッ\_s*ペ\)\)\|リ\_s*ス\_s*マ\_s*ス\)\|エ\_s*\%(ク\_s*ス\|ッ\_s*ク\_s*ス\)\)', + \ 'y' : '\%([ヨ艾蒿蓬娵嫁齡齢據頼弱歓憙鎧万萬過便婚汚涎捩峪杙翊緘慾欲翌翼抑米比裝粧装澱淀縦誼祥葭悦宜克純圭禎葦慶淑禧美喜芳吉義癰穃慂踴遙榕幺怏曄陶甬瀁燿珱踊暘廱樣蓉恙慵泱姚雍癢瑶昜瘍痒孕窰謠漾鷹瓔煬邀遥拗擁瑤窯徭膺窈殀耀曜庸夭揚葉蛹腰羊熔杳沃壅様妖溶用佯謡陽洋嘉宵蘇甦蘓奸辟横攀豫世与酔縒輿読讀訓預與喚予醉誉余憑能4舁蕷四譱畭譽餘撚呼詠除選飫歟丗代避よユ潤赦緩弛聴岼閖梦努纈∴故濯檠穰豐豊倖志裄之幸雪趾梼讓譲牀紫縁浴床攸犹黝俑邑熊猷悒酉蝣蚰囿莠尢蕕佳尤佑〒右郵涌祐侑游猶湧融宥夕幽悠釉友雄憂有楡油諭瘉汰徃柚逾揺弓踰諛愉瑜臾渝遊結覦腴由兪喩揃蝓淘揄輸茹征搖ゆイηΗ賤鄙卑苟嫌妹湯芋藷夢艷鑪鈩彩鱗色鯆忽綺貸甍答応愈圦杁茵胤飮寅尹婬贇韵隱蚓氤酳霪蔭堙湮吋廴I音慇韻咽淫殞姻隕院允隠殷陰窟巖巌頌祝鰮鰛鰯岩磐鼾歪弋弑抱懐肬贅疣狗戌乾犬諱在坐未汝戒誡警縛今Εε曰禾稻員因蝗印嘶鰍電引躄誘動≦忿鵤錨碇怒霆霹雷凧桴筏Ιι魚菴庵雖尿荊棘茨祈祷命豕猯古伍聿乙鎰鴪軼樹慈悼愴慯労格到至傷鼬頂戴徒致鈑痛板柞沙砂聊些潔諍烈功諫勳勇勲漁諌憇=憩粹熱粋憤域閾勢勤忙急磯孰焉湶泉厳何弄苛≧鎔范啀毬訝燻息指挑拠絲縷厭營営愛幼緒遑暇糸I弌壹肆莓苺櫟著市碑鐓礎甃臀弩石牲犧犠池溢佚壱11鬻毓燠礇粥的戦戰軍郁幾一稲許否飯違居矮ゐ猪五煎彝醫斐逶貽善胆位萎可詑僞鑄熬活容依要斎行怡異衣入逝猗胃洟好矣鋳揖椅去惟云懿熨痿射凍移将囗肄夷率囲姨慰頤忌唯緯逸噫挿鮪伊偽苡彜莞往以韋遺炒謂李生威為維意倚良如彙出淹言亥鰄井蔚痍圍幃渭堰饐医爲癒帷恚偉委詒畏いヤ稚稍飲鎗鑓槍孀寡鰥Я碼傭雇闇敗吝藪薮殕脂寄宿櫓軈軅簗梁S漸鋏刃灸軟柔和窶鱧奴僕萢優柳喧宅館舘輩族鏃鑰≒籥繹譯葯蜴檪藥龠扼益厄疫躍約役訳薬疾岾疚楊谺邪薯豺犲《》〈〉山邸壥廛豢養社鑢育尉寧廉裕恭泰易休康保安靖妬已瘠弥辭埜辞家輻矢痩屋灼笶八罷冶焼破夜爺谷也殺⇒病耶演⇔野燒遣彌熄椰止哉揶やyеЕ円¥→↑↓←Ёё─━ユヤヨыイЙYΥυЫйy]\|ッ\_s*[ヨユイヤ]\|ッ\_s*[ヨユイヤ]\|っ\_s*[よゆいや]\|歐\_s*羅\_s*巴\|欧\_s*羅\_s*巴\|尸\_s*童\|蹌\_s*踉\|蹣\_s*跚\|終\_s*夜\|4\_s*\%([項者つ日]\|番\_s*目\|種\_s*類\)\|他\_s*所\|仁\_s*史\|隆\_s*克\|尚\_s*武\|孝\_s*高\|悌\_s*也\|彬\_s*伯\|賀\_s*[子悟]\|栄\_s*伸\|新\_s*生\|昌\_s*[美男]\|宗\_s*生\|暢\_s*[子一]\|永\_s*沈\|8\_s*日\|8\_s*日\|黄\_s*泉\|左\_s*手\|百\_s*合\|L\_s*i\_s*l\_s*i\_s*\%(o\_s*p\_s*s\_s*i\_s*d\_s*a\|a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\)\|U\_s*\%(字\|タ\_s*ー\_s*ン\)\|鞦\_s*韆\|強\_s*請\|梅\_s*桃\|桜\_s*桃\|靫\_s*負\|宙\_s*美\|礼\_s*暁\|温\_s*\%(雄\|泉\_s*津\)\|長\_s*庚\|昨\_s*夜\|又\_s*木\|木\_s*綿\|E\_s*\%(u\|メ\_s*ー\_s*ル\)\|祖\_s*谷\|文\_s*身\|郎\_s*[女子]\|蕁\_s*麻\|刺\_s*[青草]\|U\_s*\%(字\|タ\_s*ー\_s*ン\|r\_s*t\_s*i\_s*c\_s*a\_s*l\_s*e\_s*s\)\|海\_s*[豚参]\|西\_s*表\|鸚\_s*哥\|影\_s*[向青]\|況\_s*ん\_s*や\|所\_s*[以縁謂]\|D\_s*i\_s*a\_s*p\_s*e\_s*n\_s*s\_s*i\_s*a\_s*l\_s*e\_s*s\|藺\_s*草\|J\_s*u\_s*\%(l\_s*i\_s*a\_s*n\_s*i\_s*a\_s*l\_s*e\_s*s\|n\_s*c\_s*a\_s*l\_s*e\_s*s\)\|田\_s*舎\|膝\_s*行\|十\_s*六\_s*夜\|寝\_s*穢\|英\_s*\%([一桃蘭]\|吉\_s*利\)\|斑\_s*鳩\|烏\_s*賊\|玉\_s*筋\_s*魚\|硫\_s*黄\|N\_s*a\_s*j\_s*a\_s*d\_s*a\_s*l\_s*e\_s*s\|牛\_s*膝\|稜\_s*威\|常\_s*春\_s*藤\|5\_s*[つ日]\|5\_s*[つ日]\|惡\_s*戲\|甚\_s*振\|潮\_s*来\|悪\_s*戯\|交\_s*喙\|細\_s*小\_s*魚\|小\_s*魚\|鯨\_s*魚\|鶏\_s*魚\|経\_s*緯\|礒\_s*[山田]\|気\_s*吹\|E\_s*\%(A\_s*S\_s*T\|V\_s*E\)\|従\_s*[弟妹姉兄]\|鴨\_s*脚\_s*樹\|公\_s*孫\_s*樹\|G\_s*\%(r\_s*a\_s*m\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\|l\_s*u\_s*m\_s*i\_s*f\_s*l\_s*o\_s*r\_s*a\_s*e\|i\_s*n\_s*k\_s*g\_s*o\_s*p\_s*s\_s*i\_s*d\_s*a\)\|銀\_s*杏\|鳶\_s*尾\|巫\_s*子\|神\_s*巫\|無\_s*花\_s*果\|睦\_s*月\|都\_s*方\_s*流\|縊\_s*[殺死首]\|蝟\_s*[集縮]\|埋\_s*け\_s*[火炭]\|不\_s*[可如]\|守\_s*宮\|燕\_s*龍\_s*茶\|両\_s*班\|流\_s*鏑\_s*馬\|柵\_s*原\|箭\_s*[田内]\|R\_s*a\_s*f\_s*f\_s*l\_s*e\_s*s\_s*i\_s*a\_s*\%(c\_s*e\_s*a\_s*e\|l\_s*e\_s*s\)\|自\_s*棄\|火\_s*傷\|徐\_s*ら\|M\_s*y\_s*r\_s*i\_s*c\_s*a\_s*l\_s*e\_s*s\|天\_s*蚕\|倭\_s*絵\|日\_s*本\_s*武\_s*尊\|大\_s*和\|T\_s*\%(h\_s*e\_s*l\_s*i\_s*g\_s*o\_s*n\_s*a\_s*l\_s*e\_s*s\|r\_s*o\_s*c\_s*h\_s*o\_s*d\_s*e\_s*n\_s*d\_s*r\_s*a\_s*c\_s*e\_s*a\_s*e\)\|香\_s*具\_s*師\|玄\_s*孫\|P\_s*\%(o\_s*a\_s*l\_s*e\_s*s\|l\_s*u\_s*m\_s*b\_s*a\_s*g\_s*i\_s*n\_s*a\_s*l\_s*e\_s*s\|a\_s*l\_s*m\_s*a\_s*l\_s*e\_s*s\|r\_s*\%(o\_s*t\_s*e\_s*a\_s*l\_s*e\_s*s\|i\_s*n\_s*c\_s*i\_s*p\_s*e\_s*s\)\)\|A\_s*r\_s*a\_s*c\_s*a\_s*l\_s*e\_s*s\|妥\_s*子\|寿\_s*[詞男]\|Y\_s*\%([談軸]\|シ\_s*ャ\_s*ツ\)\|エ\_s*\%(ホ\_s*バ\|フ\_s*ゲ\_s*ニ\_s*ー\|レ\_s*ヴ\_s*ァ\_s*ン\|ニ\_s*セ\_s*イ\|ー\_s*ル\)\|ワ\_s*イ\)', + \ 'z' : '\%([空損存揃園薗底續束足屬∈∋賊続粟族俗属慥僧梍臧噌賍臟贓憎像臓贈象増造曾初沿曽反添ぞ譱然繕禪苒薇千蠕∀髯禅善漸冉前全關関蝉膳錢銭絶噬説勢筮贅脆税攻是責ぜ狡詰桷寸喘鮨附◆惴蘂膸蕋髓蕊隧隋隨瑞髄随厨付圖頭刷鶴津酢逗図廚豆好ず塩嶋島嶌縞橲竺衂衄宍舳忸軸舌祖喰食直凝日實昵印者闍鮭邪蛇麝着鉐惹搦尺雀寂若弱尻侭仞刄臣恁儘潯贐稔進盡仭糂訊俥蕁迅刃靱荏甚靭燼櫁樒塵尽尋陣腎壬人敍莇茹杼洳敘汝蜍耡恕舒縟褥蓐辱溽所抒鋤徐絮序叙助帖穰疂聶疊驤襄淨讓繩禳絛蕘諚仗壌滌繞生靜蟐壤仍茸嬲疉塲乘遶星瀞拯釀躡孃如醤剩娘嬢錠静醸縄女尉饒丈成烝擾嫋穣丞場杖條条蒸貞状攘畳剰冗定浄乗情城上常譲懦愀鷲竪嬬戍得濡咒讐讎就聚笋篤盾徇凖楯詢隼筍蓴惇洵淳閏恂諄馴旬荀潤循醇巡遵順准殉純準襦誦需朮戌宿孰塾珠熟恤術述豎孺呪儒綬樹受授壽揉從澀狃中戎拾廿鞣从縱澁糅蹂神汁獸絨縦渋柔什充十従獣住銃重事迩爺滋除怩尓痔璽至児士寿茲孳染嗣柱寺磁仕治死爾路而仁辞塒時岻粫持恃敷焦字只地轜侍瓷亊知辭餌冶邇弍似祀以子峙二史自畤兒示耳慈司蒔次珥膩じ騒澤沢猿笊晒皿曝鮫参算懴慘竄鏨山殘塹巉懺嶄讒惨暫慚慙斬残実笹酒坂盛三嵜崎桜榴襍雜棹竿雑斉濟西才済劑戝剤材財罪在覚座咲戯冴坐蔵左裂冷藏差醒挫ざz→↑ЪЬьъ↓←жЖズゾ零〇〒ザジζЗゼзΖz]\|ッ\_s*\%(ソ\_s*゙\|セ\_s*゙\|ス\_s*゙\|シ\_s*゙\|サ\_s*゙\)\|ッ\_s*[ゾゼズジザ]\|っ\_s*[ぞぜずじざ]\|ソ\_s*゙\|簇\_s*生\|双\_s*紙\|草\_s*[履子紙]\|セ\_s*゙\|台\_s*詞\|0\_s*次\|撥\_s*条\|発\_s*条\|發\_s*条\|世\_s*阿\_s*弥\|ス\_s*゙\|相\_s*撲\|木\_s*菟\|修\_s*法\|杜\_s*撰\|調\_s*所\|徒\_s*[罪刑]\|螟\_s*虫\|芋\_s*茎\|F\_s*i\_s*g\_s*u\_s*r\_s*e\|シ\_s*゙\|G\_s*\%(メ\_s*ン\|パ\_s*ン\)\|D\_s*y\|G\_s*\%(メ\_s*ン\|パ\_s*ン\)\|支\_s*度\|試\_s*合\|2\_s*乗\|2\_s*乗\|J\_s*\%(I\_s*S\_s*コ\_s*ー\_s*ド\|ポ\_s*ッ\_s*プ\|R\_s*東\_s*日\_s*本\)\|獅\_s*子\|甲\_s*乙\_s*丙\_s*丁\_s*戊\_s*己\_s*庚\_s*辛\_s*壬\_s*癸\|k\_s*\$\_s*_\_s*{\_s*e\_s*f\_s*f\_s*}\_s*\$\|爪\_s*哇\|射\_s*礼\|砂\_s*利\|謝\_s*花\|著\_s*語\|杓\_s*子\|深\_s*\%(秘\|大\_s*寺\)\|秦\_s*泉\_s*寺\|沈\_s*\%(香\|丁\_s*花\)\|晨\_s*朝\|濁\_s*世\|判\_s*官\|諍\_s*論\|長\_s*夜\|漏\_s*斗\|焼\_s*酎\|鐘\_s*石\|橈\_s*脚\_s*類\|承\_s*久\|朱\_s*里\|C\_s*a\_s*b\_s*o\_s*m\_s*b\_s*o\_s*i\_s*d\_s*e\_s*a\_s*e\|J\_s*\%(リ\_s*ー\_s*グ\|ポ\_s*ッ\_s*プ\|U\_s*N\_s*K\_s*O\)\|絢\_s*子\|頌\_s*偈\|数\_s*珠\|入\_s*[魂牢来洛院内水棺]\|霜\_s*月\|1\_s*\%(2\|6\_s*進\|0\_s*[進月]\|1\_s*月\|8\_s*禁\)\|師\_s*走\|極\_s*月\|紐\_s*帯\|1\_s*\%(0\|1\_s*月\|8\_s*禁\|2\_s*月\)\|サ\_s*゙\|搾\_s*菜\|蜊\_s*蛄\|粗\_s*目\|槧\_s*本\|散\_s*切\_s*り\|沙\_s*汰\|柘\_s*榴\|石\_s*榴\|細\_s*工\|亜\_s*鉛\|サ\_s*\%(モ\_s*ラ\|ン\_s*ポ\_s*ー\_s*ニ\_s*ャ\|ラ\_s*ゴ\_s*サ\)\|Z\_s*\%([r軸]\|i\_s*\%(r\_s*c\_s*o\_s*n\_s*i\_s*u\_s*m\|n\_s*c\)\|ガ\_s*ン\_s*ダ\_s*ム\|バ\_s*ッ\_s*フ\_s*ァ\|I\_s*P\_s*フ\_s*ァ\_s*イ\_s*ル\)\|シ\_s*\%(タ\_s*ー\_s*ル\|オ\_s*\%(ン\|ニ\_s*\%(ス\_s*ト\|ズ\_s*ム\)\)\)\|Z\_s*\%([旗軸]\|変\_s*換\|i\_s*g\_s*g\_s*y\)\|ツ\_s*\%(ァ\_s*\%(ラ\_s*ト\_s*ゥ\_s*ス\_s*ト\_s*ラ\|イ\_s*ト\)\|ェ\_s*\%(ナ\_s*ー\|ッ\_s*ペ\_s*リ\_s*ン\|ル\_s*マ\_s*ッ\_s*ト\)\|ィ\_s*\%(ク\_s*ル\_s*ス\|タ\_s*ー\|ー\_s*グ\_s*ラ\_s*ー\|ン\_s*\%(バ\_s*ロ\_s*ン\|マ\_s*ー\_s*マ\_s*ン\)\|ゴ\_s*イ\_s*ネ\_s*ル\)\)\|チ\_s*\%(ク\_s*ル\_s*ス\|ア\_s*ノ\_s*ー\_s*ゼ\|ュ\_s*ー\_s*リ\_s*\%(ヒ\|ッ\_s*ヒ\)\|ャ\_s*ル\_s*ダ\_s*ッ\_s*シ\_s*ュ\|ゴ\_s*イ\_s*ネ\_s*ル\_s*ワ\_s*イ\_s*ゼ\_s*ン\)\)', + \ '{' : '[{{]', + \ '|' : '[├┣|‖│┃|]', + \ '}' : '[}}]', + \ '~' : '[¬〜 ̄~]', + \ } +endfunction diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/EasyMotion/overwin.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/EasyMotion/overwin.vim new file mode 100644 index 0000000..ea4d425 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/EasyMotion/overwin.vim @@ -0,0 +1,27 @@ +let s:V = vital#easymotion#new() +let s:HitAHintMotion = s:V.import('HitAHint.Motion') + +call EasyMotion#init() + +function! EasyMotion#overwin#move(pattern) abort + return s:HitAHintMotion.move(a:pattern, { + \ 'keys': g:EasyMotion_keys, + \ 'use_upper': g:EasyMotion_use_upper, + \ 'highlight': { + \ 'shade': g:EasyMotion_hl_group_shade, + \ 'target': g:EasyMotion_hl_group_target, + \ }, + \ 'jump_first_target_keys': + \ (g:EasyMotion_enter_jump_first ? ["\"] : []) + + \ (g:EasyMotion_space_jump_first ? ["\"] : []), + \ 'do_shade': g:EasyMotion_do_shade, + \ }) +endfunction + +function! EasyMotion#overwin#line() abort + return EasyMotion#overwin#move('^') +endfunction + +function! EasyMotion#overwin#w() abort + return EasyMotion#overwin#move('\(\<.\|^$\)') +endfunction diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/EasyMotion/sticky_table.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/EasyMotion/sticky_table.vim new file mode 100644 index 0000000..7e962c8 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/EasyMotion/sticky_table.vim @@ -0,0 +1,24 @@ +" Saving 'cpoptions' {{{ +let s:save_cpo = &cpo +set cpo&vim +" }}} +" +let EasyMotion#sticky_table#us = { + \',' : '<', '.' : '>', '/' : '?', + \'1' : '!', '2' : '@', '3' : '#', '4' : '$', '5' : '%', + \'6' : '^', '7' : '&', '8' : '*', '9' : '(', '0' : ')', '-' : '_', '=' : '+', + \';' : ':', '[' : '{', ']' : '}', '`' : '~', "'" : "\"", '\' : '|', + \} + +let EasyMotion#sticky_table#jp = { + \',' : '<', '.' : '>', '/' : '?', + \'1' : '!', '2' : '"', '3' : '#', '4' : '$', '5' : '%', + \'6' : '&', '7' : "'", '8' : '(', '9' : ')', '0' : '_', '-' : '=', '^' : '~', + \';' : '+', ':' : '*', '[' : '{', ']' : '}', '@' : '`', '\' : '|', + \} + +" Restore 'cpoptions' {{{ +let &cpo = s:save_cpo +unlet s:save_cpo +" }}} +" vim: fdm=marker:et:ts=4:sw=4:sts=4 diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/EasyMotion/undo.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/EasyMotion/undo.vim new file mode 100644 index 0000000..a14ef88 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/EasyMotion/undo.vim @@ -0,0 +1,50 @@ +let s:Buffer = vital#easymotion#import('Vim.Buffer') + +function! EasyMotion#undo#save() abort + return s:undo_lock.save() +endfunction + +let s:undo_lock = {} + +function! s:undo_lock.save() abort + let undo = deepcopy(self) + call undo._save() + return undo +endfunction + +function! s:undo_lock._save() abort + if undotree().seq_last == 0 + " if there are no undo history, disable undo feature by setting + " 'undolevels' to -1 and restore it. + let self.save_undolevels = &l:undolevels + let &l:undolevels = -1 + elseif !s:Buffer.is_cmdwin() + " command line window doesn't support :wundo. + let self.undofile = tempname() + execute 'wundo!' self.undofile + else + let self.is_cmdwin = s:TRUE + endif +endfunction + +function! s:undo_lock.restore() abort + if has_key(self, 'save_undolevels') + let &l:undolevels = self.save_undolevels + endif + if has_key(self, 'undofile') && filereadable(self.undofile) + silent execute 'rundo' self.undofile + call delete(self.undofile) + endif + if has_key(self, 'is_cmdwin') + " XXX: it breaks undo history. AFAIK, there are no way to save and restore + " undo history in commandline window. + call self.undobreak() + endif +endfunction + +function! s:undo_lock.undobreak() abort + let old_undolevels = &l:undolevels + setlocal undolevels=-1 + keepjumps call setline('.', getline('.')) + let &l:undolevels = old_undolevels +endfunction diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital.vim new file mode 100644 index 0000000..f1ba849 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital.vim @@ -0,0 +1,12 @@ +function! vital#of(name) abort + let files = globpath(&runtimepath, 'autoload/vital/' . a:name . '.vital', 1) + let file = split(files, "\n") + if empty(file) + throw 'vital: version file not found: ' . a:name + endif + let ver = readfile(file[0], 'b') + if empty(ver) + throw 'vital: invalid version file: ' . a:name + endif + return vital#_{substitute(ver[0], '\W', '', 'g')}#new() +endfunction diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion.vim new file mode 100644 index 0000000..9eba177 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion.vim @@ -0,0 +1,5 @@ +let s:_plugin_name = expand(':t:r') + +function! vital#{s:_plugin_name}#new() abort + return vital#{s:_plugin_name[1:]}#new() +endfunction diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Data/Dict.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Data/Dict.vim new file mode 100644 index 0000000..482886d --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Data/Dict.vim @@ -0,0 +1,116 @@ +" ___vital___ +" NOTE: lines between '" ___vital___' is generated by :Vitalize. +" Do not mofidify the code nor insert new lines before '" ___vital___' +if v:version > 703 || v:version == 703 && has('patch1170') + function! vital#_easymotion#Data#Dict#import() abort + return map({'pick': '', 'clear': '', 'max_by': '', 'foldl': '', 'swap': '', 'omit': '', 'min_by': '', 'foldr': '', 'make_index': '', 'make': ''}, 'function("s:" . v:key)') + endfunction +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + execute join(['function! vital#_easymotion#Data#Dict#import() abort', printf("return map({'pick': '', 'clear': '', 'max_by': '', 'foldl': '', 'swap': '', 'omit': '', 'min_by': '', 'foldr': '', 'make_index': '', 'make': ''}, \"function('%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n") + delfunction s:_SID +endif +" ___vital___ +" Utilities for dictionary. + +let s:save_cpo = &cpo +set cpo&vim + +" Makes a dict from keys and values +function! s:make(keys, values, ...) abort + let dict = {} + let fill = a:0 ? a:1 : 0 + for i in range(len(a:keys)) + let key = type(a:keys[i]) == type('') ? a:keys[i] : string(a:keys[i]) + if key ==# '' + throw "vital: Data.Dict: Can't use an empty string for key." + endif + let dict[key] = get(a:values, i, fill) + endfor + return dict +endfunction + +" Swaps keys and values +function! s:swap(dict) abort + return s:make(values(a:dict), keys(a:dict)) +endfunction + +" Makes a index dict from a list +function! s:make_index(list, ...) abort + let value = a:0 ? a:1 : 1 + return s:make(a:list, [], value) +endfunction + +function! s:pick(dict, keys) abort + let new_dict = {} + for key in a:keys + if has_key(a:dict, key) + let new_dict[key] = a:dict[key] + endif + endfor + return new_dict +endfunction + +function! s:omit(dict, keys) abort + let new_dict = copy(a:dict) + for key in a:keys + if has_key(a:dict, key) + call remove(new_dict, key) + endif + endfor + return new_dict +endfunction + +function! s:clear(dict) abort + for key in keys(a:dict) + call remove(a:dict, key) + endfor + return a:dict +endfunction + +function! s:_max_by(dict, expr) abort + let dict = s:swap(map(copy(a:dict), a:expr)) + let key = dict[max(keys(dict))] + return [key, a:dict[key]] +endfunction + +function! s:max_by(dict, expr) abort + if empty(a:dict) + throw 'vital: Data.Dict: Empty dictionary' + endif + return s:_max_by(a:dict, a:expr) +endfunction + +function! s:min_by(dict, expr) abort + if empty(a:dict) + throw 'vital: Data.Dict: Empty dictionary' + endif + return s:_max_by(a:dict, '-(' . a:expr . ')') +endfunction + +function! s:_foldl(f, init, xs) abort + let memo = a:init + for [k, v] in a:xs + let expr = substitute(a:f, 'v:key', string(k), 'g') + let expr = substitute(expr, 'v:val', string(v), 'g') + let expr = substitute(expr, 'v:memo', string(memo), 'g') + unlet memo + let memo = eval(expr) + endfor + return memo +endfunction + +function! s:foldl(f, init, dict) abort + return s:_foldl(a:f, a:init, items(a:dict)) +endfunction + +function! s:foldr(f, init, dict) abort + return s:_foldl(a:f, a:init, reverse(items(a:dict))) +endfunction + +let &cpo = s:save_cpo +unlet s:save_cpo + +" vim:set et ts=2 sts=2 sw=2 tw=0: diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Data/List.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Data/List.vim new file mode 100644 index 0000000..2302cd8 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Data/List.vim @@ -0,0 +1,457 @@ +" ___vital___ +" NOTE: lines between '" ___vital___' is generated by :Vitalize. +" Do not mofidify the code nor insert new lines before '" ___vital___' +if v:version > 703 || v:version == 703 && has('patch1170') + function! vital#_easymotion#Data#List#import() abort + return map({'combinations': '', 'and': '', 'sort_by': '', 'foldr1': '', 'sort': '', 'flatten': '', 'has_index': '', 'find_indices': '', 'any': '', 'unshift': '', 'span': '', 'pop': '', 'binary_search': '', 'uniq_by': '', 'or': '', 'all': '', 'zip': '', 'find_last_index': '', 'find': '', 'partition': '', 'map_accum': '', 'permutations': '', 'break': '', 'max_by': '', 'foldl': '', 'foldr': '', 'find_index': '', 'group_by': '', 'take_while': '', 'conj': '', 'push': '', 'char_range': '', 'cons': '', 'foldl1': '', 'intersect': '', 'concat': '', 'shift': '', 'clear': '', 'has_common_items': '', 'product': '', 'zip_fill': '', 'uniq': '', 'has': '', 'min_by': '', 'with_index': ''}, 'function("s:" . v:key)') + endfunction +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + execute join(['function! vital#_easymotion#Data#List#import() abort', printf("return map({'combinations': '', 'and': '', 'sort_by': '', 'foldr1': '', 'sort': '', 'flatten': '', 'has_index': '', 'find_indices': '', 'any': '', 'unshift': '', 'span': '', 'pop': '', 'binary_search': '', 'uniq_by': '', 'or': '', 'all': '', 'zip': '', 'find_last_index': '', 'find': '', 'partition': '', 'map_accum': '', 'permutations': '', 'break': '', 'max_by': '', 'foldl': '', 'foldr': '', 'find_index': '', 'group_by': '', 'take_while': '', 'conj': '', 'push': '', 'char_range': '', 'cons': '', 'foldl1': '', 'intersect': '', 'concat': '', 'shift': '', 'clear': '', 'has_common_items': '', 'product': '', 'zip_fill': '', 'uniq': '', 'has': '', 'min_by': '', 'with_index': ''}, \"function('%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n") + delfunction s:_SID +endif +" ___vital___ +" Utilities for list. + +let s:save_cpo = &cpo +set cpo&vim + +function! s:pop(list) abort + return remove(a:list, -1) +endfunction + +function! s:push(list, val) abort + call add(a:list, a:val) + return a:list +endfunction + +function! s:shift(list) abort + return remove(a:list, 0) +endfunction + +function! s:unshift(list, val) abort + return insert(a:list, a:val) +endfunction + +function! s:cons(x, xs) abort + return [a:x] + a:xs +endfunction + +function! s:conj(xs, x) abort + return a:xs + [a:x] +endfunction + +" Removes duplicates from a list. +function! s:uniq(list) abort + return s:uniq_by(a:list, 'v:val') +endfunction + +" Removes duplicates from a list. +function! s:uniq_by(list, f) abort + let list = map(copy(a:list), printf('[v:val, %s]', a:f)) + let i = 0 + let seen = {} + while i < len(list) + let key = string(list[i][1]) + if has_key(seen, key) + call remove(list, i) + else + let seen[key] = 1 + let i += 1 + endif + endwhile + return map(list, 'v:val[0]') +endfunction + +function! s:clear(list) abort + if !empty(a:list) + unlet! a:list[0 : len(a:list) - 1] + endif + return a:list +endfunction + +" Concatenates a list of lists. +" XXX: Should we verify the input? +function! s:concat(list) abort + let memo = [] + for Value in a:list + let memo += Value + endfor + return memo +endfunction + +" Take each elements from lists to a new list. +function! s:flatten(list, ...) abort + let limit = a:0 > 0 ? a:1 : -1 + let memo = [] + if limit == 0 + return a:list + endif + let limit -= 1 + for Value in a:list + let memo += + \ type(Value) == type([]) ? + \ s:flatten(Value, limit) : + \ [Value] + unlet! Value + endfor + return memo +endfunction + +" Sorts a list with expression to compare each two values. +" a:a and a:b can be used in {expr}. +function! s:sort(list, expr) abort + if type(a:expr) == type(function('function')) + return sort(a:list, a:expr) + endif + let s:expr = a:expr + return sort(a:list, 's:_compare') +endfunction + +function! s:_compare(a, b) abort + return eval(s:expr) +endfunction + +" Sorts a list using a set of keys generated by mapping the values in the list +" through the given expr. +" v:val is used in {expr} +function! s:sort_by(list, expr) abort + let pairs = map(a:list, printf('[v:val, %s]', a:expr)) + return map(s:sort(pairs, + \ 'a:a[1] ==# a:b[1] ? 0 : a:a[1] ># a:b[1] ? 1 : -1'), 'v:val[0]') +endfunction + +" Returns a maximum value in {list} through given {expr}. +" Returns 0 if {list} is empty. +" v:val is used in {expr} +function! s:max_by(list, expr) abort + if empty(a:list) + return 0 + endif + let list = map(copy(a:list), a:expr) + return a:list[index(list, max(list))] +endfunction + +" Returns a minimum value in {list} through given {expr}. +" Returns 0 if {list} is empty. +" v:val is used in {expr} +" FIXME: -0x80000000 == 0x80000000 +function! s:min_by(list, expr) abort + return s:max_by(a:list, '-(' . a:expr . ')') +endfunction + +" Returns List of character sequence between [a:from, a:to] +" e.g.: s:char_range('a', 'c') returns ['a', 'b', 'c'] +function! s:char_range(from, to) abort + return map( + \ range(char2nr(a:from), char2nr(a:to)), + \ 'nr2char(v:val)' + \) +endfunction + +" Returns true if a:list has a:value. +" Returns false otherwise. +function! s:has(list, value) abort + return index(a:list, a:value) isnot -1 +endfunction + +" Returns true if a:list[a:index] exists. +" Returns false otherwise. +" NOTE: Returns false when a:index is negative number. +function! s:has_index(list, index) abort + " Return true when negative index? + " let index = a:index >= 0 ? a:index : len(a:list) + a:index + return 0 <= a:index && a:index < len(a:list) +endfunction + +" similar to Haskell's Data.List.span +function! s:span(f, xs) abort + let border = len(a:xs) + for i in range(len(a:xs)) + if !eval(substitute(a:f, 'v:val', string(a:xs[i]), 'g')) + let border = i + break + endif + endfor + return border == 0 ? [[], copy(a:xs)] : [a:xs[: border - 1], a:xs[border :]] +endfunction + +" similar to Haskell's Data.List.break +function! s:break(f, xs) abort + return s:span(printf('!(%s)', a:f), a:xs) +endfunction + +" similar to Haskell's Data.List.takeWhile +function! s:take_while(f, xs) abort + return s:span(a:f, a:xs)[0] +endfunction + +" similar to Haskell's Data.List.partition +function! s:partition(f, xs) abort + return [filter(copy(a:xs), a:f), filter(copy(a:xs), '!(' . a:f . ')')] +endfunction + +" similar to Haskell's Prelude.all +function! s:all(f, xs) abort + return !s:any(printf('!(%s)', a:f), a:xs) +endfunction + +" similar to Haskell's Prelude.any +function! s:any(f, xs) abort + return !empty(filter(map(copy(a:xs), a:f), 'v:val')) +endfunction + +" similar to Haskell's Prelude.and +function! s:and(xs) abort + return s:all('v:val', a:xs) +endfunction + +" similar to Haskell's Prelude.or +function! s:or(xs) abort + return s:any('v:val', a:xs) +endfunction + +function! s:map_accum(expr, xs, init) abort + let memo = [] + let init = a:init + for x in a:xs + let expr = substitute(a:expr, 'v:memo', init, 'g') + let expr = substitute(expr, 'v:val', x, 'g') + let [tmp, init] = eval(expr) + call add(memo, tmp) + endfor + return memo +endfunction + +" similar to Haskell's Prelude.foldl +function! s:foldl(f, init, xs) abort + let memo = a:init + for x in a:xs + let expr = substitute(a:f, 'v:val', string(x), 'g') + let expr = substitute(expr, 'v:memo', string(memo), 'g') + unlet memo + let memo = eval(expr) + endfor + return memo +endfunction + +" similar to Haskell's Prelude.foldl1 +function! s:foldl1(f, xs) abort + if len(a:xs) == 0 + throw 'vital: Data.List: foldl1' + endif + return s:foldl(a:f, a:xs[0], a:xs[1:]) +endfunction + +" similar to Haskell's Prelude.foldr +function! s:foldr(f, init, xs) abort + return s:foldl(a:f, a:init, reverse(copy(a:xs))) +endfunction + +" similar to Haskell's Prelude.fold11 +function! s:foldr1(f, xs) abort + if len(a:xs) == 0 + throw 'vital: Data.List: foldr1' + endif + return s:foldr(a:f, a:xs[-1], a:xs[0:-2]) +endfunction + +" similar to python's zip() +function! s:zip(...) abort + return map(range(min(map(copy(a:000), 'len(v:val)'))), "map(copy(a:000), 'v:val['.v:val.']')") +endfunction + +" similar to zip(), but goes until the longer one. +function! s:zip_fill(xs, ys, filler) abort + if empty(a:xs) && empty(a:ys) + return [] + elseif empty(a:ys) + return s:cons([a:xs[0], a:filler], s:zip_fill(a:xs[1 :], [], a:filler)) + elseif empty(a:xs) + return s:cons([a:filler, a:ys[0]], s:zip_fill([], a:ys[1 :], a:filler)) + else + return s:cons([a:xs[0], a:ys[0]], s:zip_fill(a:xs[1 :], a:ys[1: ], a:filler)) + endif +endfunction + +" Inspired by Ruby's with_index method. +function! s:with_index(list, ...) abort + let base = a:0 > 0 ? a:1 : 0 + return map(copy(a:list), '[v:val, v:key + base]') +endfunction + +" similar to Ruby's detect or Haskell's find. +function! s:find(list, default, f) abort + for x in a:list + if eval(substitute(a:f, 'v:val', string(x), 'g')) + return x + endif + endfor + return a:default +endfunction + +" Returns the index of the first element which satisfies the given expr. +function! s:find_index(xs, f, ...) abort + let len = len(a:xs) + let start = a:0 > 0 ? (a:1 < 0 ? len + a:1 : a:1) : 0 + let default = a:0 > 1 ? a:2 : -1 + if start >=# len || start < 0 + return default + endif + for i in range(start, len - 1) + if eval(substitute(a:f, 'v:val', string(a:xs[i]), 'g')) + return i + endif + endfor + return default +endfunction + +" Returns the index of the last element which satisfies the given expr. +function! s:find_last_index(xs, f, ...) abort + let len = len(a:xs) + let start = a:0 > 0 ? (a:1 < 0 ? len + a:1 : a:1) : len - 1 + let default = a:0 > 1 ? a:2 : -1 + if start >=# len || start < 0 + return default + endif + for i in range(start, 0, -1) + if eval(substitute(a:f, 'v:val', string(a:xs[i]), 'g')) + return i + endif + endfor + return default +endfunction + +" Similar to find_index but returns the list of indices satisfying the given expr. +function! s:find_indices(xs, f, ...) abort + let len = len(a:xs) + let start = a:0 > 0 ? (a:1 < 0 ? len + a:1 : a:1) : 0 + let result = [] + if start >=# len || start < 0 + return result + endif + for i in range(start, len - 1) + if eval(substitute(a:f, 'v:val', string(a:xs[i]), 'g')) + call add(result, i) + endif + endfor + return result +endfunction + +" Return non-zero if a:list1 and a:list2 have any common item(s). +" Return zero otherwise. +function! s:has_common_items(list1, list2) abort + return !empty(filter(copy(a:list1), 'index(a:list2, v:val) isnot -1')) +endfunction + +function! s:intersect(list1, list2) abort + let items = [] + " for funcref + for X in a:list1 + if index(a:list2, X) != -1 && index(items, X) == -1 + let items += [X] + endif + endfor + return items +endfunction + +" similar to Ruby's group_by. +function! s:group_by(xs, f) abort + let result = {} + let list = map(copy(a:xs), printf('[v:val, %s]', a:f)) + for x in list + let Val = x[0] + let key = type(x[1]) !=# type('') ? string(x[1]) : x[1] + if has_key(result, key) + call add(result[key], Val) + else + let result[key] = [Val] + endif + unlet Val + endfor + return result +endfunction + +function! s:_default_compare(a, b) abort + return a:a <# a:b ? -1 : a:a ># a:b ? 1 : 0 +endfunction + +function! s:binary_search(list, value, ...) abort + let Predicate = a:0 >= 1 ? a:1 : 's:_default_compare' + let dic = a:0 >= 2 ? a:2 : {} + let start = 0 + let end = len(a:list) - 1 + + while 1 + if start > end + return -1 + endif + + let middle = (start + end) / 2 + + let compared = call(Predicate, [a:value, a:list[middle]], dic) + + if compared < 0 + let end = middle - 1 + elseif compared > 0 + let start = middle + 1 + else + return middle + endif + endwhile +endfunction + +function! s:product(lists) abort + let result = [[]] + for pool in a:lists + let tmp = [] + for x in result + let tmp += map(copy(pool), 'x + [v:val]') + endfor + let result = tmp + endfor + return result +endfunction + +function! s:permutations(list, ...) abort + if a:0 > 1 + throw 'vital: Data.List: too many arguments' + endif + let r = a:0 == 1 ? a:1 : len(a:list) + if r > len(a:list) + return [] + elseif r < 0 + throw 'vital: Data.List: {r} must be non-negative integer' + endif + let n = len(a:list) + let result = [] + for indices in s:product(map(range(r), 'range(n)')) + if len(s:uniq(indices)) == r + call add(result, map(indices, 'a:list[v:val]')) + endif + endfor + return result +endfunction + +function! s:combinations(list, r) abort + if a:r > len(a:list) + return [] + elseif a:r < 0 + throw 'vital: Data:List: {r} must be non-negative integer' + endif + let n = len(a:list) + let result = [] + for indices in s:permutations(range(n), a:r) + if s:sort(copy(indices), 'a:a - a:b') == indices + call add(result, map(indices, 'a:list[v:val]')) + endif + endfor + return result +endfunction + +let &cpo = s:save_cpo +unlet s:save_cpo + +" vim:set et ts=2 sts=2 sw=2 tw=0: diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Data/Set.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Data/Set.vim new file mode 100644 index 0000000..e9191bc --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Data/Set.vim @@ -0,0 +1,284 @@ +" ___vital___ +" NOTE: lines between '" ___vital___' is generated by :Vitalize. +" Do not mofidify the code nor insert new lines before '" ___vital___' +if v:version > 703 || v:version == 703 && has('patch1170') + function! vital#_easymotion#Data#Set#import() abort + return map({'set': '', 'frozenset': ''}, 'function("s:" . v:key)') + endfunction +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + execute join(['function! vital#_easymotion#Data#Set#import() abort', printf("return map({'set': '', 'frozenset': ''}, \"function('%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n") + delfunction s:_SID +endif +" ___vital___ +let s:save_cpo = &cpo +set cpo&vim + +let s:TRUE = !0 +let s:FALSE = 0 + +function! s:set(...) abort + return call(s:set._new, a:000, s:set) +endfunction + +function! s:frozenset(...) abort + return call(s:frozenset._new, a:000, s:frozenset) +endfunction + +function! s:_hash_func(x) abort + return a:x +endfunction + +let s:_base_set = { +\ '_is_set' : s:TRUE, +\ '_data' : {}, +\ '_hash_func' : function('s:_hash_func') +\ } + +function! s:_base_set._new(...) abort + let obj = deepcopy(self) + let xs = get(a:, 1, []) + let obj._hash_func = get(a:, 2, obj._hash_func) + call obj._set_data(xs) + return obj +endfunction + +"" Return the union of two sets as a new set. +" (I.e. all elements that are in either set.) +function! s:_base_set.union(t) abort + let r = deepcopy(self) + call r._update(a:t) + return r +endfunction +let s:_base_set.or = s:_base_set.union + +"" Return the intersection of two sets as a new set. +" (I.e. all elements that are in both sets.) +function! s:_base_set.intersection(t) abort + let t = self._to_set(a:t) + let [little, big] = self.len() <= t.len() ? [self, t] : [t, self] + return self._new(filter(copy(big.to_list()), 'little.in(v:val)')) +endfunction +let s:_base_set.and = s:_base_set.intersection + +"" Return the symmetric difference of two sets as a new set. +" (I.e. all elements that are in exactly one of the sets.) +function! s:_base_set.symmetric_difference(t) abort + let t = self._to_set(a:t) + return self._new(filter(copy(self.to_list()), '!t.in(v:val)') + \ + filter(copy(t.to_list()), '!self.in(v:val)')) +endfunction +let s:_base_set.xor = s:_base_set.symmetric_difference + +"" Return the difference of two sets as a new Set. +function! s:_base_set.difference(t) abort + let t = self._to_set(a:t) + return self._new(filter(copy(self.to_list()), '!t.in(v:val)')) +endfunction +let s:_base_set.sub = s:_base_set.difference + +"" Report whether another set contains this set. +function! s:_base_set.issubset(t) abort + let t = self._to_set(a:t) + return self.len() > t.len() ? s:FALSE + \ : empty(filter(copy(self.to_list()), '!t.in(v:val)')) +endfunction + +"" Report whether this set contains another set. +function! s:_base_set.issuperset(t) abort + let t = self._to_set(a:t) + return self.len() < t.len() ? s:FALSE + \ : empty(filter(copy(t.to_list()), '!self.in(v:val)')) +endfunction + +" less than equal & greater than equal +let s:_base_set.le = s:_base_set.issubset +let s:_base_set.ge = s:_base_set.issuperset + +" less than +function! s:_base_set.lt(t) abort + let t = self._to_set(a:t) + return self.len() < t.len() && self.issubset(t) +endfunction + +" greater than +function! s:_base_set.gt(t) abort + let t = self._to_set(a:t) + return self.len() > t.len() && self.issuperset(t) +endfunction + +function! s:_base_set.len() abort + return len(self._data) +endfunction + +function! s:_base_set.to_list() abort + return values(self._data) +endfunction + +function! s:_base_set._update(xs) abort + for X in (s:_is_set(a:xs) ? a:xs.to_list() : a:xs) + call self._add(X) + unlet X + endfor +endfunction + +function! s:_base_set._add(x) abort + let key = self._hash(a:x) + if !has_key(self._data, key) + let self._data[key] = a:x + endif +endfunction + +" Report whether an element is a member of a set. +function! s:_base_set.in(x) abort + return has_key(self._data, self._hash(a:x)) +endfunction + +function! s:_base_set._to_set(x) abort + return s:_is_set(a:x) ? a:x : self._new(a:x) +endfunction + +function! s:_base_set._clear() abort + let self._data = {} +endfunction + +function! s:_base_set._set_data(xs) abort + call self._clear() + call self._update(a:xs) +endfunction + +function! s:_base_set._hash(x) abort + return string(self._hash_func(a:x)) +endfunction + +" frozenset: Immutable set class. + +let s:frozenset = deepcopy(s:_base_set) + +" Set: Mutable set class. + +let s:set = deepcopy(s:_base_set) + +" Update a set with the union of itself and another. +function! s:set.update(iterable) abort + call self._update(a:iterable) +endfunction + +" Update a set with the union of itself and another. +function! s:set.ior(t) abort + call self.update(a:t) + return self +endfunction + +" Update a set with the intersection of itself and another. +function! s:set.intersection_update(t) abort + let r = self.and(a:t).to_list() + call self.clear() + call self.update(r) +endfunction + +" Update a set with the intersection of itself and another. +function! s:set.iand(t) abort + call self.intersection_update(a:t) + return self +endfunction + +" Update a set with the symmetric difference of itself and another. +function! s:set.symmetric_difference_update(t) abort + let t = self._to_set(a:t) + if self is t + call self.clear() + return + endif + for X in t.to_list() + if self.in(X) + call self.remove(X) + else + call self._add(X) + endif + unlet X + endfor +endfunction + +" Update a set with the symmetric difference of itself and another. +function! s:set.ixor(t) abort + call self.symmetric_difference_update(a:t) + return self +endfunction + +" Remove all elements of another set from this set. +function! s:set.difference_update(t) abort + let t = self._to_set(a:t) + if self is t + call self.clear() + return + endif + for X in filter(t.to_list(), 'self.in(v:val)') + call self.remove(X) + unlet X + endfor +endfunction + +" Remove all elements of another set from this set. +function! s:set.isub(t) abort + call self.difference_update(a:t) + return self +endfunction + +" Remove all elements from this set. +function! s:set.clear() abort + call self._clear() +endfunction + +"" Add an element to a set. +" This has no effect if the element is already present. +function! s:set.add(x) abort + return self._add(a:x) +endfunction + +"" Remove an element from a set; it must be a member. +" If the element is not a member, throw Exception. +function! s:set.remove(e) abort + try + unlet self._data[self._hash(a:e)] + catch /^Vim\%((\a\+)\)\?:E716/ + call s:_throw('the element is not a member') + endtry +endfunction + +"" Remove an element from a set if it is a member. +" If the element is not a member, do nothing. +function! s:set.discard(e) abort + try + call self.remove(a:e) + catch /vital: Data.Set: the element is not a member/ + " Do nothing + endtry +endfunction + +" Remove and return an arbitrary set element. +function! s:set.pop() abort + try + let k = keys(self._data)[0] + catch /^Vim\%((\a\+)\)\?:E684/ + call s:_throw('set is empty') + endtry + let v = self._data[k] + unlet self._data[k] + return v +endfunction + +" Helper: + +function! s:_is_set(x) abort + return type(a:x) is type({}) && get(a:x, '_is_set', s:FALSE) +endfunction + +function! s:_throw(message) abort + throw 'vital: Data.Set: ' . a:message +endfunction + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/HitAHint/Hint.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/HitAHint/Hint.vim new file mode 100644 index 0000000..5735e4c --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/HitAHint/Hint.vim @@ -0,0 +1,126 @@ +" ___vital___ +" NOTE: lines between '" ___vital___' is generated by :Vitalize. +" Do not mofidify the code nor insert new lines before '" ___vital___' +if v:version > 703 || v:version == 703 && has('patch1170') + function! vital#_easymotion#HitAHint#Hint#import() abort + return map({'create': '', '_vital_loaded': ''}, 'function("s:" . v:key)') + endfunction +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + execute join(['function! vital#_easymotion#HitAHint#Hint#import() abort', printf("return map({'create': '', '_vital_loaded': ''}, \"function('%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n") + delfunction s:_SID +endif +" ___vital___ +" function() wrapper +if v:version > 703 || v:version == 703 && has('patch1170') + let s:_function = function('function') +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + let s:_s = '' . s:_SID() . '_' + function! s:_function(fstr) abort + return function(substitute(a:fstr, 's:', s:_s, 'g')) + endfunction +endif + +function! s:_assert(...) abort + return '' +endfunction + +function! s:_vital_loaded(V) abort + if a:V.exists('Vim.PowerAssert') + let s:assert = a:V.import('Vim.PowerAssert').assert + else + let s:assert = s:_function('s:_assert') + endif +endfunction + +" TERMS: +" key: A character to generate hint. e.g. a,b,c,d,e,f,... +" hint: A hint is a combination of keys. e.g. a,b,ab,abc,.. + +" s:create() assigns keys to each targets and generate hint dict. +" Example: +" let targets = [1, 2, 3, 4, 5, 6] +" echo s:label(targets, ['a', 'b', 'c']) +" " => { +" 'a': 1, +" 'b': { +" 'a': 2, +" 'b': 3 +" }, +" 'c': { +" 'a': 4, +" 'b': 5, +" 'c': 6 +" } +" } +" Hint-to-target: +" a -> 1 +" ba -> 2 +" bb -> 3 +" ca -> 4 +" cb -> 5 +" cc -> 6 +" @param {list} targets +" @param {list} keys each key should be uniq +" @return Tree{string: (T|Tree)} +function! s:create(targets, keys) abort + exe s:assert('len(a:keys) > 1') + let groups = {} + let keys_count = reverse(s:_keys_count(len(a:targets), len(a:keys))) + + let target_idx = 0 + let key_idx = 0 + for key_count in keys_count + if key_count > 1 + " We need to create a subgroup + " Recurse one level deeper + let sub_targets = a:targets[target_idx : target_idx + key_count - 1] + let groups[a:keys[key_idx]] = s:create(sub_targets, a:keys) + elseif key_count == 1 + " Assign single target key_idx + let groups[a:keys[key_idx]] = a:targets[target_idx] + else + " No target + continue + endif + let key_idx += 1 + let target_idx += key_count + endfor + return groups +endfunction + +" s:_keys_count() generates list which represents how many targets to be +" assigned to the key. +" If the count > 1, use tree recursively. +" Example: +" echo s:_keys_count(5, 3) +" " => [3, 1, 1] +" echo s:_keys_count(8, 3) +" " => [3, 3, 2] +" @param {number} target_len +" @param {number} keys_len +function! s:_keys_count(targets_len, keys_len) abort + exe s:assert('a:keys_len > 1') + let _keys_count = repeat([0], a:keys_len) + let is_first_level = 1 + let targets_left_cnt = a:targets_len + while targets_left_cnt > 0 + let cnt_to_add = is_first_level ? 1 : a:keys_len - 1 + for i in range(a:keys_len) + let _keys_count[i] += cnt_to_add + let targets_left_cnt -= cnt_to_add + if targets_left_cnt <= 0 + let _keys_count[i] += targets_left_cnt + break + endif + endfor + let is_first_level = 0 + endwhile + exe s:assert('len(_keys_count) is# a:keys_len') + return _keys_count +endfunction diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/HitAHint/Motion.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/HitAHint/Motion.vim new file mode 100644 index 0000000..1f52cbd --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/HitAHint/Motion.vim @@ -0,0 +1,806 @@ +" ___vital___ +" NOTE: lines between '" ___vital___' is generated by :Vitalize. +" Do not mofidify the code nor insert new lines before '" ___vital___' +if v:version > 703 || v:version == 703 && has('patch1170') + function! vital#_easymotion#HitAHint#Motion#import() abort + return map({'deepextend': '', 'gather_poses': '', 'tab2spacelen': '', 'move_f': '', 'setline': '', '_vital_depends': '', 'wincall': '', 'move': '', 'move_to_winpos': '', 'pos2hint_to_line2col2hint': '', 'gather_visible_matched_poses': '', 'move_to_win': '', 'throw': '', 'has_patch': '', 'win2pos2hint_to_w2l2c2h': '', 'move_f2': '', 'new_overwin': '', 'create_win2pos2hint': '', 'pos2poskey': '', 'winnr2poses_to_list': '', 'poskey2pos': '', 'is_in_fold': '', '_vital_loaded': ''}, 'function("s:" . v:key)') + endfunction +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + execute join(['function! vital#_easymotion#HitAHint#Motion#import() abort', printf("return map({'deepextend': '', 'gather_poses': '', 'tab2spacelen': '', 'move_f': '', 'setline': '', '_vital_depends': '', 'wincall': '', 'move': '', 'move_to_winpos': '', 'pos2hint_to_line2col2hint': '', 'gather_visible_matched_poses': '', 'move_to_win': '', 'throw': '', 'has_patch': '', 'win2pos2hint_to_w2l2c2h': '', 'move_f2': '', 'new_overwin': '', 'create_win2pos2hint': '', 'pos2poskey': '', 'winnr2poses_to_list': '', 'poskey2pos': '', 'is_in_fold': '', '_vital_loaded': ''}, \"function('%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n") + delfunction s:_SID +endif +" ___vital___ +function! s:_vital_loaded(V) abort + let s:Hint = a:V.import('HitAHint.Hint') + let s:PHighlight = a:V.import('Palette.Highlight') + let s:Buffer = a:V.import('Vim.Buffer') + let s:Prelude = a:V.import('Prelude') + let s:Set = a:V.import('Data.Set') + let s:Input = a:V.import('Over.Input') +endfunction + +function! s:_vital_depends() abort + return [ + \ 'HitAHint.Hint', + \ 'Palette.Highlight', + \ 'Vim.Buffer', + \ 'Prelude', + \ 'Data.Set', + \ 'Over.Input', + \ ] +endfunction + +let s:TRUE = !0 +let s:FALSE = 0 +let s:DIRECTION = {'forward': 0, 'backward': 1} + +" Check Vim version +function! s:has_patch(major, minor, patch) abort + let l:version = (a:major * 100 + a:minor) + return has('patch-' . a:major . '.' . a:minor . '.' . a:patch) || + \ (v:version > l:version) || + \ (v:version == l:version && 'patch' . a:patch) +endfunction + +" matchadd('Conceal', {pattern}, {priority}, -1, {'conceal': {char}}}) can +" highlight pattern and conceal target correctly even if the target is keyword +" characters. +" - http://ftp.vim.org/vim/patches/7.4/7.4.792 +" - https://groups.google.com/forum/#!searchin/vim_dev/matchadd$20conceal/vim_dev/8bKa98GhHdk/VOzIBhd1m8YJ +let s:can_preserve_syntax = s:has_patch(7, 4, 792) + +" s:move() moves cursor over/across window with Hit-A-Hint feature like +" vim-easymotion +" @param {dict} config +function! s:move(pattern, ...) abort + let o = s:new_overwin(get(a:, 1, {})) + return o.pattern(a:pattern) +endfunction + +function! s:move_f(...) abort + echo 'Target: ' + let c = s:Input.getchar() + return s:move(c, get(a:, 1, {})) +endfunction + +function! s:move_f2() abort + echo 'Target: ' + let c = s:Input.getchar() + redraw + echo 'Target: ' . c + let c2 = s:Input.getchar() + return s:move(s:Prelude.escape_pattern(c . c2), get(a:, 1, {})) +endfunction + + +let s:overwin = { +\ 'config': { +\ 'keys': 'asdghklqwertyuiopzxcvbnmfj;', +\ 'use_upper': s:FALSE, +\ 'auto_land': s:TRUE, +\ 'highlight': { +\ 'shade': 'HitAHintShade', +\ 'target': 'HitAHintTarget', +\ 'cursor': 'HitAHintCursor', +\ }, +\ 'jump_first_target_keys': [], +\ 'do_shade': s:TRUE, +\ } +\ } + +function! s:_init_hl() abort + highlight default HitAHintShade ctermfg=242 guifg=#777777 + highlight default HitAHintTarget ctermfg=81 guifg=#66D9EF + " Cursor highlight doesn't exist for some environment with some + " colorscheme ref:#275 + " e.g. + " - :colorscheme default + " - :colorscheme hybrid + if hlexists('Cursor') + highlight default link HitAHintCursor Cursor + else + highlight default HitAHintCursor term=reverse cterm=reverse gui=reverse + endif +endfunction + +call s:_init_hl() + +augroup vital-hit-a-hint-motion-default-highlight + autocmd! + autocmd ColorScheme * call s:_init_hl() +augroup END + + +function! s:new_overwin(...) abort + let o = deepcopy(s:overwin) + call s:deepextend(o.config, get(a:, 1, {})) + return o +endfunction + +function! s:overwin.pattern(pattern) abort + let winpos = self.select_winpos(self.gather_poses_overwin(a:pattern), self.config.keys) + if winpos is# -1 + else + call s:move_to_winpos(winpos) + endif +endfunction + +" @param {{winnr: [lnum, cnum]}} +function! s:move_to_winpos(winpos) abort + let [winnr_str, pos] = a:winpos + let winnr = str2nr(winnr_str) + let is_win_moved = !(winnr is# winnr()) + if is_win_moved + if exists('#WinLeave') + silent doautocmd WinLeave + endif + call s:move_to_win(winnr) + else + normal! m` + endif + call cursor(pos) + if is_win_moved && exists('#WinEnter') + silent doautocmd WinEnter + endif +endfunction + +function! s:overwin.select_winpos(winnr2poses, keys) abort + let wposes = s:winnr2poses_to_list(a:winnr2poses) + if self.config.auto_land && len(wposes) is# 1 + return wposes[0] + endif + call self.set_options() + try + return self.choose_prompt(s:Hint.create(wposes, a:keys)) + finally + call self.restore_options() + endtry +endfunction + +function! s:overwin.set_options() abort + " s:move_to_win() takes long time if 'foldmethod' == 'syntax' or 'expr' + let self.save_foldmethod = {} + for winnr in range(1, winnr('$')) + let self.save_foldmethod[winnr] = getwinvar(winnr, '&foldmethod') + call setwinvar(winnr, '&foldmethod', 'manual') + endfor +endfunction + +function! s:overwin.restore_options() abort + for winnr in range(1, winnr('$')) + call setwinvar(winnr, '&foldmethod', self.save_foldmethod[winnr]) + endfor +endfunction + +" s:wpos_to_hint() returns dict whose key is position with window and whose +" value is the hints. +" @param Tree{string: ((winnr, (number,number))|Tree)} hint_dict +" @return {{winnr: {string: list}}} poskey to hint for each window +" e.g. +" { +" '1': { +" '00168:00004': ['b', 'c', 'b'], +" '00174:00001': ['b', 'c', 'a'], +" '00188:00004': ['b', 'b'], +" '00190:00001': ['b', 'a'], +" '00191:00016': ['a', 'c'], +" '00192:00004': ['a', 'b'], +" '00195:00035': ['a', 'a'] +" }, +" '3': { +" '00168:00004': ['c', 'c', 'c'], +" '00174:00001': ['c', 'c', 'b'], +" '00188:00004': ['c', 'c', 'a'], +" '00190:00001': ['c', 'b'], +" '00191:00016': ['c', 'a'], +" '00192:00004': ['b', 'c', 'c'] +" } +" } +function! s:create_win2pos2hint(hint_dict) abort + return s:_create_win2pos2hint({}, a:hint_dict) +endfunction + +function! s:_create_win2pos2hint(dict, hint_dict, ...) abort + let prefix = get(a:, 1, []) + for [hint, v] in items(a:hint_dict) + if type(v) is# type({}) + call s:_create_win2pos2hint(a:dict, v, prefix + [hint]) + else + let [winnr, pos] = v + let a:dict[winnr] = get(a:dict, winnr, {}) + let a:dict[winnr][s:pos2poskey(pos)] = prefix + [hint] + endif + unlet v + endfor + return a:dict +endfunction + +" s:pos2poskey() convertes pos to poskey to use pos as dictionary keys and +" sort pos correctly. +" @param {(number,number)} pos +" @return string +" e.g. [1, 1] -> '00001:00001' +function! s:pos2poskey(pos) abort + return join(map(copy(a:pos), "printf('%05d', v:val)"), ':') +endfunction + +" s:poskey2pos() convertes poskey to pos. +" @param {string} poskey e.g. '00001:00001' +" @return {(number,number)} +" e.g. '00001:00001' -> [1, 1] +function! s:poskey2pos(poskey) abort + return map(split(a:poskey, ':'), 'str2nr(v:val)') +endfunction + +function! s:overwin.choose_prompt(hint_dict) abort + if empty(a:hint_dict) + redraw + echo 'No target' + return -1 + endif + let hinter = s:Hinter.new(a:hint_dict, self.config) + try + call hinter.before() + call hinter.show_hint() + redraw + echo 'Target key: ' + let c = s:Input.getchar() + if self.config.use_upper + let c = toupper(c) + endif + catch + echo v:throwpoint . ':' . v:exception + return -1 + finally + call hinter.after() + endtry + + " Jump to first target if target key is in config.jump_first_target_keys. + if index(self.config.jump_first_target_keys, c) isnot# -1 + let c = split(self.config.keys, '\zs')[0] + endif + + if has_key(a:hint_dict, c) + let target = a:hint_dict[c] + return type(target) is# type({}) ? self.choose_prompt(target) : target + else + redraw + echo 'Invalid target: ' . c + return -1 + endif +endfunction + +" Hinter show hints accross window. +" save_lines: {{winnr: {lnum: string}}} +" w2l2c2h: winnr to lnum to col num to hints. col2hints is tuple because we +" need sorted col to hints pair. +" save_syntax: {{winnr: &syntax}} +" {{winnr: {lnum: list<(cnum, list)>}}} +let s:Hinter = { +\ 'save_lines': {}, +\ 'w2l2c2h': {}, +\ 'winnrs': [], +\ 'save_syntax': {}, +\ 'save_conceallevel': {}, +\ 'save_concealcursor': {}, +\ 'save_modified': {}, +\ 'save_modifiable': {}, +\ 'save_readonly': {}, +\ 'save_undo': {}, +\ 'highlight_ids': {}, +\ } + +function! s:Hinter.new(hint_dict, config) abort + let s = deepcopy(self) + let s.config = a:config + call s.init(a:hint_dict) + return s +endfunction + +function! s:Hinter.init(hint_dict) abort + let win2pos2hint = s:create_win2pos2hint(a:hint_dict) + let self.winnrs = sort(map(keys(win2pos2hint), 'str2nr(v:val)')) + let self.win2pos2hint = win2pos2hint + let self.w2l2c2h = s:win2pos2hint_to_w2l2c2h(win2pos2hint) + let self.hl_target_ids = {} + for winnr in self.winnrs + let self.hl_target_ids[winnr] = [] + endfor + call self._save_lines() +endfunction + +function! s:Hinter.before() abort + let self.highlight_id_cursor = matchadd(self.config.highlight.cursor, '\%#', 101) + call self.save_options() + call self.disable_conceal_in_other_win() +endfunction + +function! s:Hinter.after() abort + call matchdelete(self.highlight_id_cursor) + call self.restore_env() + call self.restore_conceal_in_other_win() +endfunction + +function! s:Hinter._save_lines() abort + let nr = winnr() + try + for [winnr, pos2hint] in items(self.win2pos2hint) + call s:move_to_win(winnr) + let lnums = map(copy(keys(pos2hint)), 's:poskey2pos(v:val)[0]') + let self.save_lines[winnr] = get(self.save_lines, winnr, {}) + for lnum in lnums + let self.save_lines[winnr][lnum] = getline(lnum) + endfor + endfor + finally + call s:move_to_win(nr) + endtry +endfunction + +function! s:Hinter.restore_lines_for_win(winnr) abort + let lnum2line = self.save_lines[a:winnr] + for [lnum, line] in items(lnum2line) + call s:setline(lnum, line) + endfor +endfunction + +function! s:Hinter.save_options() abort + for winnr in self.winnrs + let self.save_syntax[winnr] = getwinvar(winnr, '&syntax') + let self.save_conceallevel[winnr] = getwinvar(winnr, '&conceallevel') + let self.save_concealcursor[winnr] = getwinvar(winnr, '&concealcursor') + let self.save_modified[winnr] = getwinvar(winnr, '&modified') + let self.save_modifiable[winnr] = getwinvar(winnr, '&modifiable') + let self.save_readonly[winnr] = getwinvar(winnr, '&readonly') + endfor +endfunction + +function! s:Hinter.restore_options() abort + for winnr in self.winnrs + call setwinvar(winnr, '&conceallevel', self.save_conceallevel[winnr]) + call setwinvar(winnr, '&concealcursor', self.save_concealcursor[winnr]) + call setwinvar(winnr, '&modified', self.save_modified[winnr]) + call setwinvar(winnr, '&modifiable', self.save_modifiable[winnr]) + call setwinvar(winnr, '&readonly', self.save_readonly[winnr]) + endfor +endfunction + +function! s:Hinter.modify_env_for_win(winnr) abort + let self.save_conceal = s:PHighlight.get('Conceal') + let self.save_undo[a:winnr] = s:undo_lock.save() + + setlocal modifiable + setlocal noreadonly + + if !s:can_preserve_syntax + ownsyntax overwin + endif + + setlocal conceallevel=2 + setlocal concealcursor=ncv + + let self.highlight_ids[a:winnr] = get(self.highlight_ids, a:winnr, []) + if self.config.do_shade + if !s:can_preserve_syntax + syntax clear + endif + let self.highlight_ids[a:winnr] += [matchadd(self.config.highlight.shade, '\_.*', 100)] + endif + + " XXX: other plugins specific handling + if getbufvar('%', 'indentLine_enabled', 0) + silent! syntax clear IndentLine + endif +endfunction + +function! s:Hinter.restore_env() abort + call s:PHighlight.set('Conceal', self.save_conceal) + let nr = winnr() + try + for winnr in self.winnrs + call s:move_to_win(winnr) + call self.restore_lines_for_win(winnr) + call self.remove_hints(winnr) + + if !s:can_preserve_syntax && self.config.do_shade + let &syntax = self.save_syntax[winnr] + endif + + call self.save_undo[winnr].restore() + + for id in self.highlight_ids[winnr] + call matchdelete(id) + endfor + + " XXX: other plugins specific handling + if getbufvar('%', 'indentLine_enabled', 0) && exists(':IndentLinesEnable') is# 2 + call setbufvar('%', 'indentLine_enabled', 0) + :IndentLinesEnable + endif + endfor + catch + call s:throw(v:throwpoint . ' ' . v:exception) + finally + call s:move_to_win(nr) + endtry + + call self.restore_options() +endfunction + +let s:undo_lock = {} + +function! s:undo_lock.save() abort + let undo = deepcopy(self) + call undo._save() + return undo +endfunction + +function! s:undo_lock._save() abort + if undotree().seq_last == 0 + " if there are no undo history, disable undo feature by setting + " 'undolevels' to -1 and restore it. + let self.save_undolevels = &l:undolevels + let &l:undolevels = -1 + elseif !s:Buffer.is_cmdwin() + " command line window doesn't support :wundo. + let self.undofile = tempname() + execute 'wundo!' self.undofile + else + let self.is_cmdwin = s:TRUE + endif +endfunction + +function! s:undo_lock.restore() abort + if has_key(self, 'save_undolevels') + let &l:undolevels = self.save_undolevels + endif + if has_key(self, 'undofile') && filereadable(self.undofile) + silent execute 'rundo' self.undofile + call delete(self.undofile) + endif + if has_key(self, 'is_cmdwin') + " XXX: it breaks undo history. AFAIK, there are no way to save and restore + " undo history in commandline window. + call self.undobreak() + endif +endfunction + +function! s:undo_lock.undobreak() abort + let old_undolevels = &l:undolevels + setlocal undolevels=-1 + keepjumps call setline('.', getline('.')) + let &l:undolevels = old_undolevels +endfunction + +function! s:Hinter.disable_conceal_in_other_win() abort + let allwinnrs = s:Set.set(range(1, winnr('$'))) + let other_winnrs = allwinnrs.sub(self.winnrs).to_list() + for w in other_winnrs + if 'help' !=# getwinvar(w, '&buftype') + call setwinvar(w, 'overwin_save_conceallevel', getwinvar(w, '&conceallevel')) + call setwinvar(w, '&conceallevel', 0) + endif + endfor +endfunction + +function! s:Hinter.restore_conceal_in_other_win() abort + let allwinnrs = s:Set.set(range(1, winnr('$'))) + let other_winnrs = allwinnrs.sub(self.winnrs).to_list() + for w in other_winnrs + if 'help' !=# getwinvar(w, '&buftype') + call setwinvar(w, '&conceallevel', getwinvar(w, 'overwin_save_conceallevel')) + endif + endfor +endfunction + +" ._pos2hint_to_line2col2hint() converts pos2hint to line2col2hint dict whose +" key is line number and whose value is list of tuple of col number to hint. +" line2col2hint is for show hint with replacing line by line. +" col should be sorted. +" @param {{string: list}} pos2hint +" @return {number: [(number, list)]} +function! s:Hinter._pos2hint_to_line2col2hint(pos2hint) abort + let line2col2hint = {} + let poskeys = sort(keys(a:pos2hint)) + for poskey in poskeys + let [lnum, cnum] = s:poskey2pos(poskey) + let line2col2hint[lnum] = get(line2col2hint, lnum, []) + let line2col2hint[lnum] += [[cnum, a:pos2hint[poskey]]] + endfor + return line2col2hint +endfunction + +function! s:Hinter.show_hint() abort + let nr = winnr() + try + for winnr in self.winnrs + call s:move_to_win(winnr) + call self._show_hint_for_win(winnr) + endfor + finally + call s:move_to_win(nr) + endtry +endfunction + +function! s:Hinter._show_hint_for_win(winnr) abort + call self.modify_env_for_win(a:winnr) + + let hints = [] + for [lnum, col2hint] in items(self.w2l2c2h[a:winnr]) + let hints += self._show_hint_for_line(a:winnr, lnum, col2hint) + endfor + " Restore syntax and show hints after replacing all lines for performance. + if !s:can_preserve_syntax && !self.config.do_shade + let &l:syntax = self.save_syntax[a:winnr] + endif + execute 'highlight! link Conceal' self.config.highlight.target + for [lnum, cnum, char] in hints + call self.show_hint_pos(lnum, cnum, char, a:winnr) + endfor +endfunction + +function! s:Hinter._show_hint_for_line(winnr, lnum, col2hint) abort + let hints = [] " [lnum, cnum, char] + let line = self.save_lines[a:winnr][a:lnum] + let col_offset = 0 + let prev_cnum = -1 + let next_offset = 0 + for [cnum, hint] in a:col2hint + let col_num = cnum + col_offset + + let is_consecutive = cnum is# prev_cnum + 1 + if !is_consecutive + let col_num += next_offset + endif + let save_next_offset = next_offset + + let [line, offset, next_offset] = self._replace_line_for_hint(col_num, line, hint) + + if is_consecutive + let col_offset += save_next_offset + endif + let col_offset += offset + + let hints = [[a:lnum, col_num, hint[0]]] + hints + if len(hint) > 1 + let hints = [[a:lnum, col_num + 1, hint[1]]] + hints + endif + + let prev_cnum = cnum + endfor + call s:setline(a:lnum, line) + return hints +endfunction + +" ._replace_line_for_hint() replaces line to show hints. +" - It appends space if the line is empty +" - It replaces to space if the target character is +" - It replaces next target character if it's and len(hint) > 1 +" Replacing line changes col number, so it returns offset of col number. +" As for replaceing next target character, the timing to calculate offset +" depends on the col number of next hint in the same line, so it returns +" `next_offset` instead of returning offset all at once. +" @return {(string, number, number)} (line, offset, next_offset) +function! s:Hinter._replace_line_for_hint(col_num, line, hint) abort + let line = a:line + let col_num = a:col_num + let do_replace_target = !(self.config.do_shade || s:can_preserve_syntax) + let target = matchstr(line, '\%' . col_num .'c.') + " Append one space for empty line or match at end of line + if target is# '' + let hintwidth = strdisplaywidth(join(a:hint[:1], '')) + let char = do_replace_target ? ' ' : '.' + let line .= repeat(char, hintwidth) + return [line, hintwidth, 0] + endif + + let offset = 0 + if target is# "\t" + let [line, offset] = self._replace_tab_target(col_num, line) + elseif strdisplaywidth(target) > 1 + let line = self._replace_text_to_space(line, col_num, strdisplaywidth(target)) + let offset = strdisplaywidth(target) - len(target) + else + if do_replace_target + " The priority of :syn-cchar is always under the priority of keywords. + " So, Hit-A-Hint replaces targets character with '.'. + let space = '.' + let line = substitute(line, '\%' . col_num . 'c.', space, '') + let offset = len(space) - len(target) + endif + endif + + let next_offset = 0 + if len(a:hint) > 1 && target isnot# "\t" + " pass [' '] as hint to stop recursion. + let [line, next_offset, _] = self._replace_line_for_hint(col_num + offset + 1, line, [' ']) + endif + return [line, offset, next_offset] +endfunction + +" @return {(line, offset)} +function! s:Hinter._replace_tab_target(col_num, line) abort + let space_len = s:tab2spacelen(a:line, a:col_num) + let line = self._replace_text_to_space(a:line, a:col_num, space_len) + return [line, space_len - 1] +endfunction + +function! s:Hinter._replace_text_to_space(line, col_num, len) abort + let target = printf('\%%%dc.', a:col_num) + let line = substitute(a:line, target, repeat(' ', a:len), '') + return line +endfunction + +function! s:Hinter.show_hint_pos(lnum, cnum, char, winnr) abort + let p = '\%'. a:lnum . 'l\%'. a:cnum . 'c.' + if s:can_preserve_syntax + let self.hl_target_ids[a:winnr] += [matchadd('Conceal', p, 101, -1, {'conceal': a:char})] + else + exec "syntax match HitAHintTarget '". p . "' contains=NONE containedin=.* conceal cchar=". a:char + endif +endfunction + +function! s:Hinter.remove_hints(winnr) abort + if s:can_preserve_syntax + for id in self.hl_target_ids[a:winnr] + call matchdelete(id) + endfor + else + " Clear syntax defined by Hit-A-Hint motion before restoring syntax. + syntax clear HitAHintTarget + endif +endfunction + +" @param {number} col_num col_num is 1 origin like col() +function! s:tab2spacelen(line, col_num) abort + let before_line = a:col_num > 2 ? a:line[: a:col_num - 2] + \ : a:col_num is# 2 ? a:line[0] + \ : '' + let vcol_num = 1 + for c in split(before_line, '\zs') + let vcol_num += c is# "\t" ? s:_virtual_tab2spacelen(vcol_num) : len(c) + endfor + return s:_virtual_tab2spacelen(vcol_num) +endfunction + +function! s:_virtual_tab2spacelen(col_num) abort + return &tabstop - ((a:col_num - 1) % &tabstop) +endfunction + +function! s:win2pos2hint_to_w2l2c2h(win2pos2hint) abort + let w2l2c2h = {} + for [winnr, pos2hint] in items(a:win2pos2hint) + let w2l2c2h[winnr] = s:pos2hint_to_line2col2hint(pos2hint) + endfor + return w2l2c2h +endfunction + +" s:pos2hint_to_line2col2hint() converts pos2hint to line2col2hint dict whose +" key is line number and whose value is list of tuple of col number to hint. +" line2col2hint is for show hint with replacing line by line. +" col should be sorted. +" @param {{string: list}} pos2hint +" @return {number: [(number, list)]} +function! s:pos2hint_to_line2col2hint(pos2hint) abort + let line2col2hint = {} + let poskeys = sort(keys(a:pos2hint)) + for poskey in poskeys + let [lnum, cnum] = s:poskey2pos(poskey) + let line2col2hint[lnum] = get(line2col2hint, lnum, []) + let line2col2hint[lnum] += [[cnum, a:pos2hint[poskey]]] + endfor + return line2col2hint +endfunction + +" @param {number} winnr +function! s:move_to_win(winnr) abort + if a:winnr !=# winnr() + execute 'noautocmd' a:winnr . 'wincmd w' + endif +endfunction + +" @param {regex} pattern +" @return {{winnr: list}} +function! s:overwin.gather_poses_overwin(pattern) abort + return s:wincall(function('s:gather_poses'), [a:pattern]) +endfunction + +" s:gather_poses() aggregates patterm matched positions in visible current +" window for both direction excluding poses in fold. +" @return {{list}} +function! s:gather_poses(pattern) abort + let f = s:gather_visible_matched_poses(a:pattern, s:DIRECTION.forward, s:TRUE) + let b = s:gather_visible_matched_poses(a:pattern, s:DIRECTION.backward, s:FALSE) + return filter(f + b, '!s:is_in_fold(v:val[0])') +endfunction + +" s:gather_visible_matched_poses() aggregates pattern matched positions in visible current +" window. +" @param {regex} pattern +" @param {enum} direction see s:DIRECTION +" @param {bool} allow_cursor_pos_match +" @return {list>} positions +function! s:gather_visible_matched_poses(pattern, direction, allow_cursor_pos_match) abort + let stop_line = line(a:direction is# s:DIRECTION.forward ? 'w$' : 'w0') + let search_flag = (a:direction is# s:DIRECTION.forward ? '' : 'b') + let c_flag = a:allow_cursor_pos_match ? 'c' : '' + let view = winsaveview() + let poses = [] + keepjumps let pos = searchpos(a:pattern, c_flag . search_flag, stop_line) + while pos != [0, 0] + let poses += [pos] + keepjumps let pos = searchpos(a:pattern, search_flag, stop_line) + endwhile + call winrestview(view) + return poses +endfunction + +" @param {{winnr: list}} winnr2poses +" @param {number?} first_winnr the top winnr poses in returned list +" @return {list<{list<(winnr, (number,number))}>} +function! s:winnr2poses_to_list(winnr2poses, ...) abort + let first_winnr = get(a:, 1, winnr()) + let first_winnr_poses = [] + let other_poses = [] + for [winnr_str, poses] in items(a:winnr2poses) + let winnr = str2nr(winnr_str) + if winnr is# first_winnr + let first_winnr_poses = map(copy(poses), '[winnr, v:val]') + else + let other_poses += map(copy(poses), '[winnr, v:val]') + endif + endfor + return first_winnr_poses + other_poses +endfunction + +" @param {number} lnum line number +function! s:is_in_fold(lnum) abort + return foldclosed(a:lnum) != -1 +endfunction + +" @param {funcref} func +" @param {arglist} list +" @param {dict?} dict for :h call() +" @return {{winnr: }} +function! s:wincall(func, arglist, ...) abort + let dict = get(a:, 1, {}) + let r = {} + let start_winnr = winnr() + let r[start_winnr] = call(a:func, a:arglist, dict) + if s:Buffer.is_cmdwin() + return r + endif + noautocmd wincmd w + while winnr() isnot# start_winnr + let r[winnr()] = call(a:func, a:arglist, dict) + noautocmd wincmd w + endwhile + return r +endfunction + +" deepextend (nest: 1) +function! s:deepextend(expr1, expr2) abort + let expr2 = copy(a:expr2) + for [k, V] in items(a:expr1) + if (type(V) is type({}) || type(V) is type([])) && has_key(expr2, k) + let a:expr1[k] = extend(a:expr1[k], expr2[k]) + unlet expr2[k] + endif + unlet V + endfor + return extend(a:expr1, expr2) +endfunction + +function! s:setline(lnum, text) abort + if getline(a:lnum) isnot# a:text + call setline(a:lnum, a:text) + endif +endfunction + +function! s:throw(message) abort + throw 'vital: HitAHint.Motion: ' . a:message +endfunction + diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Base.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Base.vim new file mode 100644 index 0000000..36ddbbb --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Base.vim @@ -0,0 +1,606 @@ +" ___vital___ +" NOTE: lines between '" ___vital___' is generated by :Vitalize. +" Do not mofidify the code nor insert new lines before '" ___vital___' +if v:version > 703 || v:version == 703 && has('patch1170') + function! vital#_easymotion#Over#Commandline#Base#import() abort + return map({'_vital_depends': '', 'make_plain': '', 'is_input_waiting': '', 'make': '', '_vital_loaded': ''}, 'function("s:" . v:key)') + endfunction +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + execute join(['function! vital#_easymotion#Over#Commandline#Base#import() abort', printf("return map({'_vital_depends': '', 'make_plain': '', 'is_input_waiting': '', 'make': '', '_vital_loaded': ''}, \"function('%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n") + delfunction s:_SID +endif +" ___vital___ +scriptencoding utf-8 +let s:save_cpo = &cpo +set cpo&vim + + +function! s:_vital_loaded(V) + let s:V = a:V + let s:String = s:V.import("Over.String") + let s:Signals = s:V.import("Over.Signals") + let s:Input = s:V.import("Over.Input") + let s:Keymapping = s:V.import("Over.Keymapping") + let s:Module = s:V.import("Over.Commandline.Modules") + let s:base.variables.modules = s:Signals.make() + function! s:base.variables.modules.get_slot(val) + return a:val.slot.module + endfunction + + let s:Highlight = s:V.import("Palette.Highlight") +endfunction + + +function! s:_vital_depends() + return [ +\ "Over.String", +\ "Over.Signals", +\ "Over.Input", +\ "Over.Keymapping", +\ "Over.Commandline.Modules", +\ "Palette.Highlight", +\ ] +endfunction + + +function! s:make(...) + let result = deepcopy(s:base) + call result.set_prompt(get(a:, 1, ":")) + call result.connect(result, "_") + return result +endfunction + + +function! s:make_plain() + return deepcopy(s:base) +endfunction + + +let s:base = { +\ "line" : {}, +\ "variables" : { +\ "prompt" : "", +\ "char" : "", +\ "input" : "", +\ "tap_key" : "", +\ "exit" : 0, +\ "keymapping" : {}, +\ "suffix" : "", +\ "is_setted" : 0, +\ }, +\ "highlights" : { +\ "prompt" : "NONE", +\ "cursor" : "VitalOverCommandLineCursor", +\ "cursor_on" : "VitalOverCommandLineCursorOn", +\ "cursor_insert" : "VitalOverCommandLineOnCursor", +\ }, +\} + +if exists("s:Signals") + let s:base.variables.modules = s:Signals.make() + function! s:base.variables.modules.get_slot(val) + return a:val.slot.module + endfunction +endif + + +function! s:base.getline() + return self.line.str() +endfunction + + +function! s:base.setline(line) + return self.line.set(a:line) +endfunction + + +function! s:base.char() + return self.variables.char +endfunction + + +function! s:base.setchar(char, ...) + " 1 の場合は既に設定されていても上書きする + " 0 の場合は既に設定されていれば上書きしない + let overwrite = get(a:, 1, 1) + if overwrite || self.variables.is_setted == 0 + let self.variables.input = a:char + let self.variables.is_setted = 1 + endif +endfunction + + +function! s:base.getpos() + return self.line.pos() +endfunction + + +function! s:base.setpos(pos) + return self.line.set_pos(a:pos) +endfunction + + +function! s:base.tap_keyinput(key) + let self.variables.tap_key = a:key +endfunction + + +function! s:base.untap_keyinput(key) + if self.variables.tap_key == a:key + let self.variables.tap_key = "" + return 1 + endif +endfunction + + +function! s:base.get_tap_key() + return self.variables.tap_key +endfunction + + +function! s:base.is_input(key, ...) + let prekey = get(a:, 1, "") + return self.get_tap_key() ==# prekey +\ && self.char() ==# a:key +" \ && self.char() == (prekey . a:key) +endfunction + + +function! s:base.input_key() + return self.variables.input_key +endfunction + + +function! s:base.set_prompt(prompt) + let self.variables.prompt = a:prompt +endfunction + + +function! s:base.get_prompt() + return self.variables.prompt +endfunction + + +function! s:base.set_suffix(str) + let self.variables.suffix = a:str +endfunction + + +function! s:base.get_suffix() + return self.variables.suffix +endfunction + + +function! s:base.insert(word, ...) + if a:0 + call self.line.set(a:1) + endif + call self.line.input(a:word) +endfunction + +function! s:base.forward() + return self.line.forward() +endfunction + +function! s:base.backward() + return self.line.backward() +endfunction + + +function! s:base.backward_word(...) + let pat = get(a:, 1, '\k\+\s*\|.') + return matchstr(self.backward(), '\%(' . pat . '\)$') +endfunction + + +function! s:base.connect(module, ...) + if type(a:module) == type("") + return call(self.connect, [s:Module.make(a:module)] + a:000, self) + endif + if empty(a:module) + return + endif + let name = a:0 > 0 ? a:1 : a:module.name + let slot = self.variables.modules.find_first_by("get(v:val.slot, 'name', '') == " . string(name)) + if empty(slot) + call self.variables.modules.connect({ "name" : name, "module" : a:module }) + else + let slot.slot.module = a:module + endif +" let self.variables.modules[name] = a:module +endfunction + + +function! s:base.disconnect(name) + return self.variables.modules.disconnect_by( +\ "get(v:val.slot, 'name', '') == " . string(a:name) +\ ) +" unlet self.variables.modules[a:name] +endfunction + + +function! s:base.get_module(name) + let slot = self.variables.modules.find_first_by("get(v:val.slot, 'name', '') == " . string(a:name)) + return empty(slot) ? {} : slot.slot.module +endfunction + + +function! s:base.callevent(event) + call self.variables.modules.sort_by("has_key(v:val.slot.module, 'priority') ? v:val.slot.module.priority('" . a:event . "') : 0") + return self.variables.modules.call(a:event, [self]) +" call map(filter(copy(self.variables.modules), "has_key(v:val, a:event)"), "v:val." . a:event . "(self)") +endfunction + + +function! s:base.cmap(lhs, rhs) + let self.variables.keymapping[a:lhs] = a:rhs +endfunction + + +function! s:base.cnoremap(lhs, rhs) + let key = s:Keymapping.as_key_config(a:rhs) + let key.noremap = 1 + let self.variables.keymapping[a:lhs] = key +endfunction + + +function! s:base.cunmap(lhs) + unlet self.variables.keymapping[a:lhs] +endfunction + + +function! s:base.keymapping() + return self.__keymapping__() +endfunction + + +function! s:base.__keymapping__() + return {} +endfunction + + +function! s:base.execute(...) + let command = get(a:, 1, self.getline()) + call self.__execute(command) +endfunction + + +function! s:base.draw() + call self.callevent("on_draw_pre") + call self.callevent("on_draw") +endfunction + + +function! s:base.exit(...) + let self.variables.exit = 1 + let self.variables.exit_code = get(a:, 1, 0) +endfunction + + +function! s:base.enable_keymapping() + let self.variables.enable_keymapping = 1 +endfunction + + +function! s:base.disable_keymapping() + let self.variables.enable_keymapping = 0 +endfunction + + +function! s:base.is_enable_keymapping() + return self.variables.enable_keymapping +endfunction + +" function! s:base.cancel() +" call self.exit(1) +" call self.__on_cancel() +" endfunction + + +function! s:base.exit_code() + return self.variables.exit_code +endfunction + + +function! s:base.hl_cursor_on() + if exists("self.variables.old_guicursor") + set guicursor& + let &guicursor = self.variables.old_guicursor + unlet self.variables.old_guicursor + endif + + if exists("self.variables.old_t_ve") + let &t_ve = self.variables.old_t_ve + unlet self.variables.old_t_ve + endif +endfunction + + +function! s:base.hl_cursor_off() + if exists("self.variables.old_t_ve") + return + endif + + let self.variables.old_guicursor = &guicursor + set guicursor=n:block-NONE + let self.variables.old_t_ve = &t_ve + set t_ve= +endfunction + + +function! s:base.start(...) + let exit_code = call(self.__main, a:000, self) + return exit_code +endfunction + + +function! s:base.__empty(...) +endfunction + + +function! s:base.get(...) + let Old_execute = self.execute + let self.execute = self.__empty + try + let exit_code = call(self.start, a:000, self) + if exit_code == 0 + return self.getline() + endif + finally + let self.execute = Old_execute + endtry + return "" +endfunction + + +function! s:base.input_key_stack() + return self.variables.input_key_stack +endfunction + + +function! s:base.input_key_stack_string() + return join(self.variables.input_key_stack, "") +endfunction + + +function! s:base.set_input_key_stack(stack) + let self.variables.input_key_stack = a:stack + return self.variables.input_key_stack +endfunction + + +function! s:base.input_key_stack_pop() + return remove(self.input_key_stack(), 0) +endfunction + + +function! s:base.getchar(...) + if empty(self.input_key_stack()) + return call(s:Input.getchar, a:000, s:Input) + endif + return self.input_key_stack_pop() +endfunction + + +function! s:base.__init_variables() + let self.variables.tap_key = "" + let self.variables.char = "" + let self.variables.input = "" + let self.variables.exit = 0 + let self.variables.exit_code = 1 + let self.variables.enable_keymapping = 1 + let self.variables.input_key_stack = [] + let self.line = deepcopy(s:String.make()) +endfunction + + +function! s:_is_valid_highlight(name) + let highlight = s:Highlight.get(a:name) + if empty(highlight) + return 0 + endif + + if has("gui_running") +\ && (has_key(highlight, "guifg") || has_key(highlight, "guibg")) + return 1 + elseif (has_key(highlight, "ctermfg") || has_key(highlight, "ctermbg")) + return 1 + endif + return 0 +endfunction + + +function! s:base.__init() + call self.__init_variables() + call self.hl_cursor_off() + if !hlexists(self.highlights.cursor) + if s:_is_valid_highlight("Cursor") + execute "highlight link " . self.highlights.cursor . " Cursor" + else + " Workaround by CUI Vim Cursor Highlight + " issues #92 + " https://github.com/osyo-manga/vital-over/issues/92 + execute "highlight " . self.highlights.cursor . " term=reverse cterm=reverse gui=reverse" + endif + endif + if !hlexists(self.highlights.cursor_on) + execute "highlight link " . self.highlights.cursor_on . " " . self.highlights.cursor + endif + if !hlexists(self.highlights.cursor_insert) + execute "highlight " . self.highlights.cursor_insert . " cterm=underline term=underline gui=underline" + endif +endfunction + + +function! s:base.__execute(command) + call self.callevent("on_execute_pre") + try + call self.__execute__(a:command) + catch + echohl ErrorMsg + echom matchstr(v:exception, 'Vim\((\w*)\)\?:\zs.*\ze') + echohl None + call self.callevent("on_execute_failed") + finally + call self.callevent("on_execute") + endtry +endfunction + + +function! s:base.__execute__(cmd) + execute a:cmd +endfunction + + +function! s:base.__input_char(char) + let char = a:char + let self.variables.input_key = char + let self.variables.char = char + call self.setchar(self.variables.char) + let self.variables.is_setted = 0 + call self.callevent("on_char_pre") + call self.insert(self.variables.input) + call self.callevent("on_char") +endfunction + + +function! s:base.__input(input, ...) + if a:input == "" + return + endif + + let self.variables.input_key = a:input + if a:0 == 0 + let keymapping = self.__get_keymapping() + else + let keymapping = a:1 + endif + if self.is_enable_keymapping() + let key = s:Keymapping.unmapping(keymapping, a:input) + else + let key = a:input + endif + if key == "" + return + endif + + call self.set_input_key_stack(s:String.split_by_keys(key)) + while !(empty(self.input_key_stack()) || self.is_exit()) + call self.__input_char(self.input_key_stack_pop()) + endwhile +endfunction + + +function! s:is_input_waiting(keymapping, input) + let num = len(filter(copy(a:keymapping), 'stridx(v:key, a:input) == 0')) + return num > 1 || (num == 1 && !has_key(a:keymapping, a:input)) +endfunction + + +function! s:base.__inputting() + if !self.is_enable_keymapping() + return self.__input(s:Input.getchar()) + endif + + let input = s:Input.getchar() + let old_line = self.getline() + let old_pos = self.getpos() + let keymapping = self.__get_keymapping() + try + let t = reltime() + while s:is_input_waiting(keymapping, input) +\ && str2nr(reltimestr(reltime(t))) * 1000 < &timeoutlen + call self.setline(old_line) + call self.insert(input) + call self.setpos(old_pos) + call self.draw() + let input .= s:Input.getchar(0) + endwhile + finally + call self.setline(old_line) + call self.setpos(old_pos) + endtry + call self.__input(input, keymapping) +endfunction + + +function! s:base.__update() +" call self.callevent("on_update") +" if !getchar(1) +" continue +" endif +" +" call self.__input(s:getchar(0)) +" call self.draw() + + call self.callevent("on_update") + call self.__inputting() +" call self.__input(s:Input.getchar()) + if self.is_exit() + return -1 + endif + call self.draw() +endfunction + + +function! s:base.__main(...) + try + call self.__init() + call self.callevent("on_enter") + + call self.__input(get(a:, 1, "")) + call self.draw() + while !self.is_exit() + try + if self.__update() + break + endif + catch + call self.callevent("on_exception") + endtry + endwhile + catch + echohl ErrorMsg | echom v:throwpoint . " " . v:exception | echohl None + let self.variables.exit_code = -1 + finally + call self.__finish() + call self.callevent("on_leave") + endtry + return self.exit_code() +endfunction + + +function! s:base.__finish() + call self.hl_cursor_on() +endfunction + + +function! s:base.__is_exit() + return self.is_exit() +endfunction + + +function! s:base.is_exit() + return self.variables.exit +endfunction + + +function! s:base.__get_keymapping() + let result = {} +" for module in values(self.variables.modules) + for module in self.variables.modules.slots() + if has_key(module, "keymapping") + if module isnot self + call extend(result, module.keymapping(self)) + endif + endif + endfor + return extend(extend(result, self.variables.keymapping), self.keymapping()) +endfunction + + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules.vim new file mode 100644 index 0000000..d37d2b4 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules.vim @@ -0,0 +1,42 @@ +" ___vital___ +" NOTE: lines between '" ___vital___' is generated by :Vitalize. +" Do not mofidify the code nor insert new lines before '" ___vital___' +if v:version > 703 || v:version == 703 && has('patch1170') + function! vital#_easymotion#Over#Commandline#Modules#import() abort + return map({'get': '', 'make': '', '_vital_loaded': ''}, 'function("s:" . v:key)') + endfunction +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + execute join(['function! vital#_easymotion#Over#Commandline#Modules#import() abort', printf("return map({'get': '', 'make': '', '_vital_loaded': ''}, \"function('%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n") + delfunction s:_SID +endif +" ___vital___ +scriptencoding utf-8 +let s:save_cpo = &cpo +set cpo&vim + + +function! s:_vital_loaded(V) + let s:V = a:V +endfunction + + +function! s:get(name) + if exists("s:" . a:name) + return s:{a:name} + endif + let s:{a:name} = s:V.import('Over.Commandline.Modules.' . a:name) + return s:{a:name} +endfunction + + +function! s:make(name, ...) + let module = s:get(a:name) + return call(module.make, a:000, module) +endfunction + + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/BufferComplete.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/BufferComplete.vim new file mode 100644 index 0000000..32e1dd8 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/BufferComplete.vim @@ -0,0 +1,179 @@ +" ___vital___ +" NOTE: lines between '" ___vital___' is generated by :Vitalize. +" Do not mofidify the code nor insert new lines before '" ___vital___' +if v:version > 703 || v:version == 703 && has('patch1170') + function! vital#_easymotion#Over#Commandline#Modules#BufferComplete#import() abort + return map({'make': ''}, 'function("s:" . v:key)') + endfunction +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + execute join(['function! vital#_easymotion#Over#Commandline#Modules#BufferComplete#import() abort', printf("return map({'make': ''}, \"function('%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n") + delfunction s:_SID +endif +" ___vital___ +scriptencoding utf-8 +let s:save_cpo = &cpo +set cpo&vim + + +function! s:_uniq(list) + let dict = {} + for _ in a:list + let dict[_] = 0 + endfor + return keys(dict) +endfunction + + +let s:module = { +\ "name" : "BufferComplete", +\} + + +function! s:_buffer_complete() + return sort(s:_uniq(filter(split(join(getline(1, '$')), '\W'), '!empty(v:val)')), 1) +endfunction + + +function! s:_parse_line(line) + let keyword = matchstr(a:line, '\zs\w\+\ze$') + let pos = strchars(a:line) - strchars(keyword) + return [pos, keyword] +endfunction + + +function! s:_as_statusline(list, count) + if empty(a:list) + return + endif + let hl_none = "%#StatusLine#" + let hl_select = "%#StatusLineNC#" + let tail = " > " + let result = a:list[0] + let pos = 0 + for i in range(1, len(a:list)-1) + if strdisplaywidth(result . " " . a:list[i]) > &columns - len(tail) + if a:count < i + break + else + let pos = -i + endif + let result = a:list[i] + else + let result .= (" " . a:list[i]) + endif + if a:count == i + let pos = pos + i + endif + endfor + return join(map(split(result, " "), 'v:key == pos ? hl_select . v:val . hl_none : v:val')) +endfunction + + +function! s:module.get_complete_words() + return s:_buffer_complete() +endfunction + + +function! s:module.complete(cmdline) + call s:_finish() + let s:old_statusline = &statusline + + let backward = a:cmdline.backward() + let [pos, keyword] = s:_parse_line(backward) + + if !exists("s:complete") + let s:complete = self.get_complete_words() + endif + let s:complete_list = filter(copy(s:complete), 'v:val =~ ''^''.keyword') + if empty(s:complete_list) + return -1 + endif + + if pos == 0 + let backward = "" + else + let backward = join(split(backward, '\zs')[ : pos-1 ], "") + endif + let s:line = backward . a:cmdline.forward() + let s:pos = pos + call a:cmdline.setline(s:line) + + let s:count = 0 +endfunction + + +function! s:_finish() + if exists("s:old_statusline") + let &statusline = s:old_statusline + unlet s:old_statusline + redrawstatus + endif +endfunction + + +function! s:module.on_char_pre(cmdline) + if a:cmdline.is_input("(buffer-complete)") +\ || a:cmdline.is_input("(buffer-complete-prev)") + if self.complete(a:cmdline) == -1 + call s:_finish() + call a:cmdline.setchar('') + return + endif + if a:cmdline.is_input("(buffer-complete-prev)") + let s:count = len(s:complete_list) - 1 + endif + call a:cmdline.setchar('') + call a:cmdline.tap_keyinput("Completion") +" elseif a:cmdline.is_input("\", "Completion") + elseif a:cmdline.is_input("(buffer-complete)", "Completion") +\ || a:cmdline.is_input("\", "Completion") + call a:cmdline.setchar('') + let s:count += 1 + if s:count >= len(s:complete_list) + let s:count = 0 + endif + elseif a:cmdline.is_input("(buffer-complete-prev)", "Completion") +\ || a:cmdline.is_input("\", "Completion") + call a:cmdline.setchar('') + let s:count -= 1 + if s:count < 0 + let s:count = len(s:complete_list) - 1 + endif + else + if a:cmdline.untap_keyinput("Completion") + call a:cmdline.callevent("on_char_pre") + endif + call s:_finish() + return + endif + call a:cmdline.setline(s:line) + call a:cmdline.insert(s:complete_list[s:count], s:pos) + if len(s:complete_list) > 1 + let &statusline = s:_as_statusline(s:complete_list, s:count) + redrawstatus + endif + if len(s:complete_list) == 1 + call a:cmdline.untap_keyinput("Completion") + endif +endfunction + + +function! s:module.on_draw_pre(...) +" redrawstatus +endfunction + + +function! s:module.on_leave(cmdline) + call s:_finish() + unlet! s:complete +endfunction + +function! s:make() + return deepcopy(s:module) +endfunction + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/Cancel.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/Cancel.vim new file mode 100644 index 0000000..0946e86 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/Cancel.vim @@ -0,0 +1,40 @@ +" ___vital___ +" NOTE: lines between '" ___vital___' is generated by :Vitalize. +" Do not mofidify the code nor insert new lines before '" ___vital___' +if v:version > 703 || v:version == 703 && has('patch1170') + function! vital#_easymotion#Over#Commandline#Modules#Cancel#import() abort + return map({'make': ''}, 'function("s:" . v:key)') + endfunction +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + execute join(['function! vital#_easymotion#Over#Commandline#Modules#Cancel#import() abort', printf("return map({'make': ''}, \"function('%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n") + delfunction s:_SID +endif +" ___vital___ +scriptencoding utf-8 +let s:save_cpo = &cpo +set cpo&vim + +let s:module = { +\ "name" : "Cancel" +\} + +function! s:module.on_char_pre(cmdline) + if a:cmdline.is_input("\") +\ || a:cmdline.is_input("\") +" call a:cmdline.cancel() + call a:cmdline.exit(1) + call a:cmdline.setchar("") + endif +endfunction + + +function! s:make() + return deepcopy(s:module) +endfunction + + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/CursorMove.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/CursorMove.vim new file mode 100644 index 0000000..dab1774 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/CursorMove.vim @@ -0,0 +1,58 @@ +" ___vital___ +" NOTE: lines between '" ___vital___' is generated by :Vitalize. +" Do not mofidify the code nor insert new lines before '" ___vital___' +if v:version > 703 || v:version == 703 && has('patch1170') + function! vital#_easymotion#Over#Commandline#Modules#CursorMove#import() abort + return map({'make': ''}, 'function("s:" . v:key)') + endfunction +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + execute join(['function! vital#_easymotion#Over#Commandline#Modules#CursorMove#import() abort', printf("return map({'make': ''}, \"function('%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n") + delfunction s:_SID +endif +" ___vital___ +scriptencoding utf-8 +let s:save_cpo = &cpo +set cpo&vim + + +let s:module = { +\ "name" : "CursorMove" +\} +function! s:module.on_char_pre(cmdline) + if a:cmdline.is_input("\") + call a:cmdline.line.next() + call a:cmdline.setchar('') + elseif a:cmdline.is_input("\") + call a:cmdline.line.prev() + call a:cmdline.setchar('') + elseif a:cmdline.is_input("\") +\ || a:cmdline.is_input("\") + call a:cmdline.setline(0) + call a:cmdline.setchar('') + elseif a:cmdline.is_input("\") +\ || a:cmdline.is_input("\") + call a:cmdline.setline(a:cmdline.line.length()) + call a:cmdline.setchar('') + elseif a:cmdline.is_input("\") +\ || a:cmdline.is_input("\") + call a:cmdline.setline(strridx(a:cmdline.backward()[:-2], ' ') + 1) + call a:cmdline.setchar('') + elseif a:cmdline.is_input("\") +\ || a:cmdline.is_input("\") + let p = stridx(a:cmdline.forward()[1:], ' ') + call a:cmdline.setline(p != -1 ? a:cmdline.line.pos() + p + 2 : a:cmdline.line.length()) + call a:cmdline.setchar('') + endif +endfunction + + +function! s:make() + return deepcopy(s:module) +endfunction + + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/Delete.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/Delete.vim new file mode 100644 index 0000000..a47b1c4 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/Delete.vim @@ -0,0 +1,56 @@ +" ___vital___ +" NOTE: lines between '" ___vital___' is generated by :Vitalize. +" Do not mofidify the code nor insert new lines before '" ___vital___' +if v:version > 703 || v:version == 703 && has('patch1170') + function! vital#_easymotion#Over#Commandline#Modules#Delete#import() abort + return map({'make': ''}, 'function("s:" . v:key)') + endfunction +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + execute join(['function! vital#_easymotion#Over#Commandline#Modules#Delete#import() abort', printf("return map({'make': ''}, \"function('%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n") + delfunction s:_SID +endif +" ___vital___ +scriptencoding utf-8 +let s:save_cpo = &cpo +set cpo&vim + + +let s:module = { +\ "name" : "Delete", +\} +function! s:module.on_char_pre(cmdline) + if a:cmdline.is_input("\") +\ || a:cmdline.is_input("\") + if a:cmdline.line.length() == 0 + return a:cmdline.exit(1) + else + call a:cmdline.line.remove_prev() + call a:cmdline.setchar('') + endif + elseif a:cmdline.is_input("\") + call a:cmdline.line.remove_pos() + call a:cmdline.setchar('') + elseif a:cmdline.is_input("\") + let word = a:cmdline.backward_word() + let backward = a:cmdline.backward()[ : -strlen(word)-1 ] + call a:cmdline.setline(backward . a:cmdline.line.pos_char() . a:cmdline.forward()) + call a:cmdline.setline(strchars(backward)) + call a:cmdline.setchar('') + elseif a:cmdline.is_input("\") + call a:cmdline.setline(a:cmdline.line.pos_char() . a:cmdline.forward()) + call a:cmdline.setline(0) + call a:cmdline.setchar('') + endif +endfunction + + +function! s:make() + return deepcopy(s:module) +endfunction + + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/Doautocmd.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/Doautocmd.vim new file mode 100644 index 0000000..af4baac --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/Doautocmd.vim @@ -0,0 +1,121 @@ +" ___vital___ +" NOTE: lines between '" ___vital___' is generated by :Vitalize. +" Do not mofidify the code nor insert new lines before '" ___vital___' +if v:version > 703 || v:version == 703 && has('patch1170') + function! vital#_easymotion#Over#Commandline#Modules#Doautocmd#import() abort + return map({'_vital_depends': '', 'doautocmd_user': '', 'get_cmdline': '', 'make': '', '_vital_loaded': ''}, 'function("s:" . v:key)') + endfunction +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + execute join(['function! vital#_easymotion#Over#Commandline#Modules#Doautocmd#import() abort', printf("return map({'_vital_depends': '', 'doautocmd_user': '', 'get_cmdline': '', 'make': '', '_vital_loaded': ''}, \"function('%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n") + delfunction s:_SID +endif +" ___vital___ +scriptencoding utf-8 +let s:save_cpo = &cpo +set cpo&vim + + +function! s:_vital_loaded(V) + let s:V = a:V + let s:E = s:V.import("Over.Exception") +endfunction + + +function! s:_vital_depends() + return [ +\ "Over.Exception", +\ ] +endfunction + + +let s:cache_command = {} +function! s:doautocmd_user(prefix, command) + let group = a:prefix . "-vital-over-commandline-doautocmd-dummy" + if !has_key(s:cache_command, a:prefix) + let s:cache_command[a:prefix] = {} + endif + + if !has_key(s:cache_command[a:prefix], a:command) + execute "autocmd " . group +\ . " User " . a:command." silent! execute ''" + + if v:version > 703 || v:version == 703 && has("patch438") + let s:cache_command[a:prefix][a:command] = "doautocmd User " . a:command + else + let s:cache_command[a:prefix][a:command] = "doautocmd User " . a:command + endif + endif + + execute s:cache_command[a:prefix][a:command] +endfunction + + +let s:hooks = [ +\ "enter", +\ "leave", +\ "char", +\ "char_pre", +\ "draw", +\ "draw_pre", +\ "execute_pre", +\ "execute_failed", +\ "execute", +\ "exception", +\] + +let s:hooks_camel = [ +\ "Enter", +\ "Leave", +\ "Char", +\ "CharPre", +\ "Draw", +\ "DrawPre", +\ "ExecutePre", +\ "ExecuteFailed", +\ "Execute", +\ "Exception", +\] + + +let s:module = { +\ "name" : "Doautocmd", +\} + + +for s:i in range(len(s:hooks)) + execute join([ +\ "function! s:module.on_" . s:hooks[s:i] . "(cmdline, ...)", +\ " let s:cmdline = a:cmdline", +\ " call s:doautocmd_user(self.prefix, self.prefix . " . string(s:hooks_camel[s:i]) . ")", +\ "endfunction", +\ ], "\n") +endfor + + +function! s:get_cmdline() + if !exists("s:cmdline") + execute s:E.throw_cmd("Undefined cmdline object.", "Over.Commandline.Modules.Doautocmd") + endif + return s:cmdline +endfunction + + +function! s:make(prefix) + if has_key(s:cache_command, a:prefix) + unlet! s:cache_command[a:prefix] + endif + execute "augroup " a:prefix . "-vital-over-commandline-doautocmd-dummy" + autocmd! + augroup END + + let module = deepcopy(s:module) + let module.prefix = a:prefix + return module +endfunction + + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/DrawCommandline.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/DrawCommandline.vim new file mode 100644 index 0000000..92e1681 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/DrawCommandline.vim @@ -0,0 +1,155 @@ +" ___vital___ +" NOTE: lines between '" ___vital___' is generated by :Vitalize. +" Do not mofidify the code nor insert new lines before '" ___vital___' +if v:version > 703 || v:version == 703 && has('patch1170') + function! vital#_easymotion#Over#Commandline#Modules#DrawCommandline#import() abort + return map({'suffix': '', 'make': ''}, 'function("s:" . v:key)') + endfunction +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + execute join(['function! vital#_easymotion#Over#Commandline#Modules#DrawCommandline#import() abort', printf("return map({'suffix': '', 'make': ''}, \"function('%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n") + delfunction s:_SID +endif +" ___vital___ +scriptencoding utf-8 +let s:save_cpo = &cpo +set cpo&vim + +let s:module = { +\ "name" : "DrawCommandline" +\} + +let s:cmdheight = {} + +function! s:cmdheight.save() + if has_key(self, "value") + return + endif + let self.value = &cmdheight +endfunction + +function! s:cmdheight.restore() + if has_key(self, "value") + let &cmdheight = self.value + unlet self.value + endif +endfunction + + +function! s:cmdheight.get() + return self.value +endfunction + + +function! s:suffix(left, suffix) + let left_len = strdisplaywidth(a:left) + let len = &columns - left_len % &columns + let len = len + (&columns * (strdisplaywidth(a:suffix) > (len - 1))) - 1 + return repeat(" ", len - strdisplaywidth(a:suffix)) . a:suffix +" return printf("%" . len . "S", a:suffix) +endfunction + + +let s:old_width = 0 +function! s:_redraw(cmdline) + let left = a:cmdline.get_prompt() . a:cmdline.getline() . (empty(a:cmdline.line.pos_char()) ? " " : "") + let width = len(left) + 1 + + if a:cmdline.get_suffix() != "" + let width += len(s:suffix(left, a:cmdline.get_suffix())) - 1 + endif + + if &columns >= width && &columns <= s:old_width && s:old_width >= width + redraw + normal! : + elseif &columns <= width + normal! : + else + redraw + endif + let s:old_width = width + + call s:cmdheight.save() + let height = max([(width - 1) / (&columns) + 1, s:cmdheight.get()]) + if height > &cmdheight || &cmdheight > height + let &cmdheight = height + redraw + endif +endfunction + + +function! s:_as_echon(str) + return "echon " . strtrans(string(a:str)) +endfunction + + +function! s:module.on_draw_pre(cmdline) + if empty(a:cmdline.line.pos_char()) + let cursor = "echohl " . a:cmdline.highlights.cursor . " | echon ' '" + else + let cursor = "echohl " . a:cmdline.highlights.cursor_on . " | " . s:_as_echon(a:cmdline.line.pos_char()) + endif + let suffix = "" + if a:cmdline.get_suffix() != "" + let suffix = s:_as_echon(s:suffix(a:cmdline.get_prompt() . a:cmdline.getline() . repeat(" ", empty(a:cmdline.line.pos_char())), a:cmdline.get_suffix())) + endif + let self.draw_command = join([ +\ "echohl " . a:cmdline.highlights.prompt, +\ s:_as_echon(a:cmdline.get_prompt()), +\ "echohl NONE", +\ s:_as_echon(a:cmdline.backward()), +\ cursor, +\ "echohl NONE", +\ s:_as_echon(a:cmdline.forward()), +\ suffix, +\ ], " | ") + + call s:_redraw(a:cmdline) +endfunction + + +function! s:_echon(expr) + echon strtrans(a:expr) +endfunction + + +function! s:module.on_draw(cmdline) + execute self.draw_command +" execute "echohl" a:cmdline.highlights.prompt +" call s:echon(a:cmdline.get_prompt()) +" echohl NONE +" call s:echon(a:cmdline.backward()) +" if empty(a:cmdline.line.pos_char()) +" execute "echohl" a:cmdline.highlights.cursor +" call s:echon(' ') +" else +" execute "echohl" a:cmdline.highlights.cursor_on +" call s:echon(a:cmdline.line.pos_char()) +" endif +" echohl NONE +" call s:echon(a:cmdline.forward()) +" if a:cmdline.get_suffix() != "" +" call s:echon(s:suffix(a:cmdline.get_prompt() . a:cmdline.getline() . repeat(" ", empty(a:cmdline.line.pos_char())), a:cmdline.get_suffix())) +" endif +endfunction + + +function! s:module.on_execute_pre(...) + call s:cmdheight.restore() +endfunction + + +function! s:module.on_leave(...) + call s:cmdheight.restore() +endfunction + + +function! s:make() + return deepcopy(s:module) +endfunction + + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/ExceptionExit.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/ExceptionExit.vim new file mode 100644 index 0000000..2ab8655 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/ExceptionExit.vim @@ -0,0 +1,37 @@ +" ___vital___ +" NOTE: lines between '" ___vital___' is generated by :Vitalize. +" Do not mofidify the code nor insert new lines before '" ___vital___' +if v:version > 703 || v:version == 703 && has('patch1170') + function! vital#_easymotion#Over#Commandline#Modules#ExceptionExit#import() abort + return map({'make': ''}, 'function("s:" . v:key)') + endfunction +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + execute join(['function! vital#_easymotion#Over#Commandline#Modules#ExceptionExit#import() abort', printf("return map({'make': ''}, \"function('%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n") + delfunction s:_SID +endif +" ___vital___ +scriptencoding utf-8 +let s:save_cpo = &cpo +set cpo&vim + +let s:module = { +\ "name" : "ExceptionExit", +\} + + +function! s:module.on_exception(cmdline) + call a:cmdline.exit(-1) +endfunction + + +function! s:make(...) + let result = deepcopy(s:module) + let result.exit_code = get(a:, 1, 0) + return result +endfunction + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/ExceptionMessage.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/ExceptionMessage.vim new file mode 100644 index 0000000..87802f4 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/ExceptionMessage.vim @@ -0,0 +1,66 @@ +" ___vital___ +" NOTE: lines between '" ___vital___' is generated by :Vitalize. +" Do not mofidify the code nor insert new lines before '" ___vital___' +if v:version > 703 || v:version == 703 && has('patch1170') + function! vital#_easymotion#Over#Commandline#Modules#ExceptionMessage#import() abort + return map({'make': ''}, 'function("s:" . v:key)') + endfunction +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + execute join(['function! vital#_easymotion#Over#Commandline#Modules#ExceptionMessage#import() abort', printf("return map({'make': ''}, \"function('%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n") + delfunction s:_SID +endif +" ___vital___ +scriptencoding utf-8 +let s:save_cpo = &cpo +set cpo&vim + + +let s:vname = expand(":h:h:h:h:t") + + +let s:module = { +\ "name" : "ExceptionMessage", +\} + + +function! s:module.on_exception(cmdline) + let self.exception = v:exception + let self.throwpoint = v:throwpoint +endfunction + + +function! s:module.on_draw_pre(cmdline) + if has_key(self, "exception") + call self.message(a:cmdline) + unlet self.exception + endif +endfunction + +function! s:module.message(...) + echohl ErrorMsg + execute self.command string(self.prefix . " : " . self.throwpoint . " " . self.exception) + echohl None +endfunction + + +function! s:module.on_leave(cmdline) + if has_key(self, "exception") + call self.message(a:cmdline) + unlet self.exception + endif +endfunction + + +function! s:make(...) + let result = deepcopy(s:module) + let result.prefix = get(a:, 1, "vital-over(".s:vname.") Exception") + let result.command = get(a:, 2, "echom") + return result +endfunction + + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/Exit.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/Exit.vim new file mode 100644 index 0000000..f8645eb --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/Exit.vim @@ -0,0 +1,40 @@ +" ___vital___ +" NOTE: lines between '" ___vital___' is generated by :Vitalize. +" Do not mofidify the code nor insert new lines before '" ___vital___' +if v:version > 703 || v:version == 703 && has('patch1170') + function! vital#_easymotion#Over#Commandline#Modules#Exit#import() abort + return map({'make': ''}, 'function("s:" . v:key)') + endfunction +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + execute join(['function! vital#_easymotion#Over#Commandline#Modules#Exit#import() abort', printf("return map({'make': ''}, \"function('%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n") + delfunction s:_SID +endif +" ___vital___ +scriptencoding utf-8 +let s:save_cpo = &cpo +set cpo&vim + +let s:module = { +\ "name" : "Exit", +\ "exit_code" : 0 +\} + + +function! s:module.on_char_pre(cmdline) + if a:cmdline.is_input("(exit)") + call a:cmdline.setchar("") + call a:cmdline.exit(self.exit_code) + endif +endfunction + + +function! s:make() + return deepcopy(s:module) +endfunction + + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/History.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/History.vim new file mode 100644 index 0000000..f6a7c57 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/History.vim @@ -0,0 +1,75 @@ +" ___vital___ +" NOTE: lines between '" ___vital___' is generated by :Vitalize. +" Do not mofidify the code nor insert new lines before '" ___vital___' +if v:version > 703 || v:version == 703 && has('patch1170') + function! vital#_easymotion#Over#Commandline#Modules#History#import() abort + return map({'make': ''}, 'function("s:" . v:key)') + endfunction +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + execute join(['function! vital#_easymotion#Over#Commandline#Modules#History#import() abort', printf("return map({'make': ''}, \"function('%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n") + delfunction s:_SID +endif +" ___vital___ +scriptencoding utf-8 +let s:save_cpo = &cpo +set cpo&vim + +let s:module = { +\ "name" : "History", +\ "mode" : "cmd", +\} + +function! s:module.histories() + return map(range(1, &history), 'histget(self.mode, v:val * -1)') +endfunction + +function! s:_should_match_cmdline(cmdline) + return a:cmdline.is_input("\") +\ || a:cmdline.is_input("\") +endfunction + +function! s:_reset() + let s:cmdhist = [] + let s:count = 0 + let s:is_match_mode = 0 " /: true, /: false +endfunction + +function! s:module.on_enter(...) + call s:_reset() +endfunction + +function! s:module.on_char_pre(cmdline) + if !a:cmdline.is_input("\") && !a:cmdline.is_input("\") + \ && !a:cmdline.is_input("\") && !a:cmdline.is_input("\") + call s:_reset() + return + else + if s:count == 0 && empty(s:cmdhist) + \ || s:is_match_mode != s:_should_match_cmdline(a:cmdline) + let cmdline = '^' . a:cmdline.getline() + let s:is_match_mode = s:_should_match_cmdline(a:cmdline) + let s:cmdhist = [a:cmdline.getline()] + (s:is_match_mode ? + \ filter(self.histories(), 'v:val =~ cmdline') : self.histories()) + endif + endif + call a:cmdline.setchar("") + if a:cmdline.is_input("\") || a:cmdline.is_input("\") + let s:count = max([s:count - 1, 0]) + endif + if a:cmdline.is_input("\") || a:cmdline.is_input("\") + let s:count = min([s:count + 1, len(s:cmdhist)]) + endif + call a:cmdline.setline(get(s:cmdhist, s:count, a:cmdline.getline())) +endfunction + +function! s:make(...) + let module = deepcopy(s:module) + let module.mode = get(a:, 1, "cmd") + return module +endfunction + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/InsertRegister.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/InsertRegister.vim new file mode 100644 index 0000000..ba5c2b5 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/InsertRegister.vim @@ -0,0 +1,164 @@ +" ___vital___ +" NOTE: lines between '" ___vital___' is generated by :Vitalize. +" Do not mofidify the code nor insert new lines before '" ___vital___' +if v:version > 703 || v:version == 703 && has('patch1170') + function! vital#_easymotion#Over#Commandline#Modules#InsertRegister#import() abort + return map({'_vital_depends': '', 'to_string': '', 'input': '', 'get_cmdline_cword': '', 'make': '', '_vital_loaded': ''}, 'function("s:" . v:key)') + endfunction +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + execute join(['function! vital#_easymotion#Over#Commandline#Modules#InsertRegister#import() abort', printf("return map({'_vital_depends': '', 'to_string': '', 'input': '', 'get_cmdline_cword': '', 'make': '', '_vital_loaded': ''}, \"function('%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n") + delfunction s:_SID +endif +" ___vital___ +scriptencoding utf-8 +let s:save_cpo = &cpo +set cpo&vim + + +function! s:_vital_loaded(V) + let s:V = a:V + let s:String = s:V.import("Over.String") +endfunction + + +function! s:_vital_depends() + return [ +\ "Over.String", +\ ] +endfunction + + +function! s:to_string(expr) + return type(a:expr) == type("") ? a:expr : string(a:expr) +endfunction + + +function! s:input(cmdline) + let CR_index = index(a:cmdline.input_key_stack(), "\") + if CR_index != -1 + let input = a:cmdline.input_key_stack_string() + let input = input[ : CR_index-1] + call a:cmdline.set_input_key_stack(a:cmdline.input_key_stack()[CR_index+1 : ]) + return eval(input) + endif + + let input_text = "" + if !empty(a:cmdline.input_key_stack()) + let input_text = a:cmdline.input_key_stack_string() + call a:cmdline.set_input_key_stack([]) + endif + + call a:cmdline.hl_cursor_on() + try + redraw + let input = input("=", input_text, "expression") + if !empty(input) + let input = s:to_string(eval(input)) + endif + catch + return "" + finally + call a:cmdline.hl_cursor_off() + endtry + return input +endfunction + + +let s:module = { +\ "name" : "InsertRegister" +\} + + + +function! s:module.reset() + let self.cword = expand("") + let self.cWORD = expand("") + let self.cfile = expand("") +endfunction + +function! s:module.on_enter(...) + call self.reset() +" let self.prefix_key = "" +endfunction + + +function! s:get_cmdline_cword(backward, cword) +" let backward = matchstr(a:backward, '.\{-}\zs\k\+$') + let backward = a:backward + if &incsearch == 0 || a:cword == "" || a:backward == "" || s:String.index(a:cword, backward) != 0 + return a:cword + endif + return a:cword[len(backward) : ] +endfunction + + +function! s:module.on_char_pre(cmdline) + if a:cmdline.is_input("\") + call a:cmdline.setchar('"') + let self.prefix_key = a:cmdline.input_key() + let self.old_line = a:cmdline.getline() + let self.old_pos = a:cmdline.getpos() + return + elseif exists("self.prefix_key") +\ && a:cmdline.get_tap_key() == self.prefix_key + call a:cmdline.setline(self.old_line) + call a:cmdline.setpos(self.old_pos) + let char = a:cmdline.input_key() + if char =~ '^[0-9a-zA-z.%#:/"\-*+]$' + let register = tr(getreg(char), "\n", "\r") + call a:cmdline.setchar(register) + elseif char == "=" + call a:cmdline.setchar(s:input(a:cmdline)) + elseif char == "\" + call a:cmdline.setchar(s:get_cmdline_cword(a:cmdline.backward_word(), self.cword)) + elseif char == "\" + call a:cmdline.setchar(self.cWORD) + elseif char == "\" + call a:cmdline.setchar(self.cfile) + elseif char == "\" + call a:cmdline.setchar('"') + else + call a:cmdline.setchar("") + endif +" elseif a:cmdline.is_input('=', self.prefix_key) +" call a:cmdline.setchar(s:input(a:cmdline)) +" elseif a:cmdline.is_input("\", self.prefix_key) +" call a:cmdline.setchar(self.cword) +" elseif a:cmdline.is_input("\", self.prefix_key) +" call a:cmdline.setchar(self.cWORD) +" elseif a:cmdline.is_input("\", self.prefix_key) +" call a:cmdline.setchar(self.cfile) +" elseif a:cmdline.is_input("\", self.prefix_key) +" call a:cmdline.setchar('"') +" else +" call a:cmdline.setchar("") +" endif + endif +endfunction + + +function! s:module.on_char(cmdline) + if a:cmdline.is_input("\") + call a:cmdline.tap_keyinput(self.prefix_key) + call a:cmdline.disable_keymapping() + call a:cmdline.setpos(a:cmdline.getpos()-1) + else + if exists("self.prefix_key") + call a:cmdline.untap_keyinput(self.prefix_key) + call a:cmdline.enable_keymapping() + unlet! self.prefix_key + endif + endif +endfunction + + + +function! s:make() + return deepcopy(s:module) +endfunction + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/KeyMapping.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/KeyMapping.vim new file mode 100644 index 0000000..dc2da35 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/KeyMapping.vim @@ -0,0 +1,139 @@ +" ___vital___ +" NOTE: lines between '" ___vital___' is generated by :Vitalize. +" Do not mofidify the code nor insert new lines before '" ___vital___' +if v:version > 703 || v:version == 703 && has('patch1170') + function! vital#_easymotion#Over#Commandline#Modules#KeyMapping#import() abort + return map({'_vital_depends': '', 'make_emacs': '', 'make_vim_cmdline_mapping': '', '_vital_loaded': ''}, 'function("s:" . v:key)') + endfunction +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + execute join(['function! vital#_easymotion#Over#Commandline#Modules#KeyMapping#import() abort', printf("return map({'_vital_depends': '', 'make_emacs': '', 'make_vim_cmdline_mapping': '', '_vital_loaded': ''}, \"function('%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n") + delfunction s:_SID +endif +" ___vital___ +scriptencoding utf-8 +let s:save_cpo = &cpo +set cpo&vim + + +function! s:_vital_loaded(V) + let s:Keymapping = a:V.import("Palette.Keymapping") +endfunction + + +function! s:_vital_depends() + return [ +\ "Palette.Keymapping", +\ ] +endfunction + + +let s:emacs = { +\ "name" : "KeyMapping_emacs_like" +\} + +function! s:emacs.keymapping(cmdline) + return { +\ "\" : { +\ "key" : "\", +\ "noremap" : 1, +\ "lock" : 1, +\ }, +\ "\" : { +\ "key" : "\", +\ "noremap" : 1, +\ "lock" : 1, +\ }, +\ "\" : { +\ "key" : "\", +\ "noremap" : 1, +\ "lock" : 1, +\ }, +\ "\" : { +\ "key" : "\", +\ "noremap" : 1, +\ "lock" : 1, +\ }, +\ "\" : { +\ "key" : "\", +\ "noremap" : 1, +\ "lock" : 1, +\ }, +\ "\" : { +\ "key" : "\", +\ "noremap" : 1, +\ "lock" : 1, +\ }, +\ "\" : { +\ "key" : "\", +\ "noremap" : 1, +\ "lock" : 1, +\ }, +\ "\" : { +\ "key" : "\", +\ "noremap" : 1, +\ "lock" : 1, +\ }, +\ "\" : { +\ "key" : "\", +\ "noremap" : 1, +\ "lock" : 1, +\ }, +\ "\" : { +\ "key" : "\", +\ "noremap" : 1, +\ "lock" : 1, +\ }, +\ } +endfunction + + +function! s:make_emacs() + return deepcopy(s:emacs) +endfunction + + +let s:vim_cmdline_mapping = { +\ "name" : "KeyMapping_vim_cmdline_mapping", +\ "_cmaps" : {} +\} + +function! s:_convert_sid(rhs, sid) abort + return substitute(a:rhs, '', '' . a:sid . '_', 'g') +endfunction + +function! s:_auto_cmap() + let cmaps = {} + let cmap_info = s:Keymapping.rhs_key_list("c", 0, 1) + " vital-over currently doesn't support mappings + for c in filter(cmap_info, "v:val['buffer'] ==# 0") + let cmaps[s:Keymapping.escape_special_key(c['lhs'])] = { + \ 'noremap' : c['noremap'], + \ 'key' : s:Keymapping.escape_special_key(s:_convert_sid(c['rhs'], c['sid'])), + \ 'expr' : s:Keymapping.escape_special_key(c['expr']), + \ } + endfor + return cmaps +endfunction + + +function! s:vim_cmdline_mapping.on_enter(cmdline) + let self._cmaps = s:_auto_cmap() +endfunction + + +function! s:vim_cmdline_mapping.keymapping(cmdline) + return self._cmaps +endfunction + + +function! s:make_vim_cmdline_mapping() + return deepcopy(s:vim_cmdline_mapping) +endfunction + + + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/NoInsert.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/NoInsert.vim new file mode 100644 index 0000000..62f5e16 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/NoInsert.vim @@ -0,0 +1,55 @@ +" ___vital___ +" NOTE: lines between '" ___vital___' is generated by :Vitalize. +" Do not mofidify the code nor insert new lines before '" ___vital___' +if v:version > 703 || v:version == 703 && has('patch1170') + function! vital#_easymotion#Over#Commandline#Modules#NoInsert#import() abort + return map({'make_special_chars': '', 'make': ''}, 'function("s:" . v:key)') + endfunction +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + execute join(['function! vital#_easymotion#Over#Commandline#Modules#NoInsert#import() abort', printf("return map({'make_special_chars': '', 'make': ''}, \"function('%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n") + delfunction s:_SID +endif +" ___vital___ +scriptencoding utf-8 +let s:save_cpo = &cpo +set cpo&vim + +let s:module = { +\ "name" : "NoInsert", +\ "chars" : [] +\} + + +function! s:module.is_no_insert(char) + return index(self.chars, a:char) >= 0 +endfunction + + +function! s:module.on_char_pre(cmdline) + if self.is_no_insert(a:cmdline.char()) + call a:cmdline.setchar("", 0) + endif +endfunction + + +function! s:make(chars) + let module = deepcopy(s:module) + let module.chars = type(a:chars) == type([]) ? a:chars : [a:chars] + return module +endfunction + + +function! s:make_special_chars() + let module = s:make([]) + function! module.is_no_insert(char) + return char2nr(a:char) == 128 || char2nr(a:char) < 27 + endfunction + return module +endfunction + + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/Paste.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/Paste.vim new file mode 100644 index 0000000..67ef760 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/Paste.vim @@ -0,0 +1,40 @@ +" ___vital___ +" NOTE: lines between '" ___vital___' is generated by :Vitalize. +" Do not mofidify the code nor insert new lines before '" ___vital___' +if v:version > 703 || v:version == 703 && has('patch1170') + function! vital#_easymotion#Over#Commandline#Modules#Paste#import() abort + return map({'make': ''}, 'function("s:" . v:key)') + endfunction +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + execute join(['function! vital#_easymotion#Over#Commandline#Modules#Paste#import() abort', printf("return map({'make': ''}, \"function('%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n") + delfunction s:_SID +endif +" ___vital___ +scriptencoding utf-8 +let s:save_cpo = &cpo +set cpo&vim + + +let s:module = { +\ "name" : "Paste" +\} + +function! s:module.on_char_pre(cmdline) + if a:cmdline.is_input("(paste)") + let register = v:register == "" ? '"' : v:register + call a:cmdline.insert(tr(getreg("*"), "\n", "\r")) + call a:cmdline.setchar('') + endif +endfunction + + +function! s:make() + return deepcopy(s:module) +endfunction + + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/Redraw.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/Redraw.vim new file mode 100644 index 0000000..c75e2b0 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Commandline/Modules/Redraw.vim @@ -0,0 +1,72 @@ +" ___vital___ +" NOTE: lines between '" ___vital___' is generated by :Vitalize. +" Do not mofidify the code nor insert new lines before '" ___vital___' +if v:version > 703 || v:version == 703 && has('patch1170') + function! vital#_easymotion#Over#Commandline#Modules#Redraw#import() abort + return map({'make': ''}, 'function("s:" . v:key)') + endfunction +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + execute join(['function! vital#_easymotion#Over#Commandline#Modules#Redraw#import() abort', printf("return map({'make': ''}, \"function('%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n") + delfunction s:_SID +endif +" ___vital___ +scriptencoding utf-8 +let s:save_cpo = &cpo +set cpo&vim + + +let s:module = { +\ "name" : "Redraw", +\} + +function! s:module.on_execute_pre(cmdline) + call self.redraw(a:cmdline) +endfunction + +function! s:module.on_enter(...) + let self.is_execute = 0 +endfunction + +function! s:module.on_execute(...) + let self.is_execute = 1 +endfunction + +function! s:module.on_execute_failed(...) + let self.is_execute = 0 +endfunction + +function! s:module.on_leave(cmdline) + if self.is_execute == 0 && a:cmdline.exit_code() != -1 + call self.redraw(a:cmdline) + endif +endfunction + + +" function! s:module.on_draw_pre(cmdline) +" call self.redraw(a:cmdline) +" endfunction + + +function! s:module.redraw(cmdline) + redraw + " Workaround for the :set cedit= + " https://github.com/osyo-manga/vital-over/issues/52 + " https://github.com/Lokaltog/vim-easymotion/issues/177#issuecomment-53663431 + if &cedit != "" +\ ||(v:version > 704 || v:version == 704 && has("patch441")) + normal! : + else + execute "normal! :\" + endif +endfunction + +function! s:make() + return deepcopy(s:module) +endfunction + + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Exception.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Exception.vim new file mode 100644 index 0000000..fddf3cc --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Exception.vim @@ -0,0 +1,46 @@ +" ___vital___ +" NOTE: lines between '" ___vital___' is generated by :Vitalize. +" Do not mofidify the code nor insert new lines before '" ___vital___' +if v:version > 703 || v:version == 703 && has('patch1170') + function! vital#_easymotion#Over#Exception#import() abort + return map({'throw': '', 'throw_cmd': '', 'set_prefix': '', 'error': ''}, 'function("s:" . v:key)') + endfunction +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + execute join(['function! vital#_easymotion#Over#Exception#import() abort', printf("return map({'throw': '', 'throw_cmd': '', 'set_prefix': '', 'error': ''}, \"function('%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n") + delfunction s:_SID +endif +" ___vital___ +scriptencoding utf-8 +let s:save_cpo = &cpo +set cpo&vim + + +let s:vname = expand(":h:h:t") +let s:prefix = printf("vital-over(%s) Exception", s:vname) + +function! s:set_prefix(prefix) + let s:prefix = a:prefix +endfunction + +function! s:throw_cmd(exp, where) + return 'throw ' . string(s:prefix . " : " . a:exp . " in " . a:where) +endfunction + + +function! s:throw(exp, where) + execute s:throw_cmd(a:exp, a:where) +endfunction + + +function! s:error(text, where) + echohl ErrorMsg + echom s:prefix . " : " . a:text . " in " . a:where + echohl None +endfunction + + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Input.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Input.vim new file mode 100644 index 0000000..f4ebd1f --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Input.vim @@ -0,0 +1,40 @@ +" ___vital___ +" NOTE: lines between '" ___vital___' is generated by :Vitalize. +" Do not mofidify the code nor insert new lines before '" ___vital___' +if v:version > 703 || v:version == 703 && has('patch1170') + function! vital#_easymotion#Over#Input#import() abort + return map({'getchar': ''}, 'function("s:" . v:key)') + endfunction +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + execute join(['function! vital#_easymotion#Over#Input#import() abort', printf("return map({'getchar': ''}, \"function('%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n") + delfunction s:_SID +endif +" ___vital___ +scriptencoding utf-8 +let s:save_cpo = &cpo +set cpo&vim + + +function! s:getchar(...) + let mode = get(a:, 1, 0) + while 1 + " Workaround for https://github.com/osyo-manga/vital-over/issues/53 + try + let char = call("getchar", a:000) + catch /^Vim:Interrupt$/ + let char = 3 " + endtry + " Workaround for the mappings + if string(char) !=# "\x80\xfd`" + return mode == 1 ? !!char +\ : type(char) == type(0) ? nr2char(char) : char + endif + endwhile +endfunction + + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Keymapping.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Keymapping.vim new file mode 100644 index 0000000..c96c66c --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Keymapping.vim @@ -0,0 +1,95 @@ +" ___vital___ +" NOTE: lines between '" ___vital___' is generated by :Vitalize. +" Do not mofidify the code nor insert new lines before '" ___vital___' +if v:version > 703 || v:version == 703 && has('patch1170') + function! vital#_easymotion#Over#Keymapping#import() abort + return map({'_vital_depends': '', 'unmapping': '', 'as_key_config': '', 'match_key': '', '_vital_loaded': ''}, 'function("s:" . v:key)') + endfunction +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + execute join(['function! vital#_easymotion#Over#Keymapping#import() abort', printf("return map({'_vital_depends': '', 'unmapping': '', 'as_key_config': '', 'match_key': '', '_vital_loaded': ''}, \"function('%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n") + delfunction s:_SID +endif +" ___vital___ +scriptencoding utf-8 +let s:save_cpo = &cpo +set cpo&vim + + + +function! s:_vital_loaded(V) + let s:V = a:V + let s:String = s:V.import("Over.String") +endfunction + + +function! s:_vital_depends() + return [ +\ "Over.String", +\ ] +endfunction + + +function! s:as_key_config(config) + let base = { +\ "noremap" : 0, +\ "lock" : 0, +\ "expr" : 0, +\ } + return type(a:config) == type({}) ? extend(base, a:config) +\ : extend(base, { +\ "key" : a:config, +\ }) +endfunction + + +function! s:match_key(keymapping, key) + let keys = sort(keys(a:keymapping)) + return get(filter(keys, 'stridx(a:key, v:val) == 0'), -1, '') +endfunction + + +function! s:_safe_eval(expr, ...) + call extend(l:, get(a:, 1, {})) + let result = get(a:, 2, "") + try + let result = eval(a:expr) + catch + echohl ErrorMsg | echom v:exception | echohl None + endtry + return result +endfunction + + +function! s:_get_key(conf) +" call extend(l:, a:conf) + let self = a:conf + return get(a:conf, "expr", 0) ? s:_safe_eval(a:conf.key, l:) : a:conf.key +endfunction + + +function! s:unmapping(keymapping, key, ...) + let is_locking = get(a:, 1, 0) + let key = s:match_key(a:keymapping, a:key) + if key == "" + return s:String.length(a:key) <= 1 ? a:key : s:unmapping(a:keymapping, a:key[0], is_locking) . s:unmapping(a:keymapping, a:key[1:], is_locking) + endif + + let map_conf = s:as_key_config(a:keymapping[key]) + + let next_input = s:unmapping(a:keymapping, a:key[len(key) : ], is_locking) + if map_conf.lock == 0 && is_locking + return key . next_input + elseif map_conf.lock + return s:unmapping(a:keymapping, s:_get_key(map_conf), is_locking) . next_input + else + return s:unmapping(a:keymapping, s:_get_key(map_conf), map_conf.noremap) . next_input + endif +endfunction + + + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Signals.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Signals.vim new file mode 100644 index 0000000..b787ee7 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/Signals.vim @@ -0,0 +1,119 @@ +" ___vital___ +" NOTE: lines between '" ___vital___' is generated by :Vitalize. +" Do not mofidify the code nor insert new lines before '" ___vital___' +if v:version > 703 || v:version == 703 && has('patch1170') + function! vital#_easymotion#Over#Signals#import() abort + return map({'_vital_depends': '', 'call': '', 'make': '', '_vital_loaded': ''}, 'function("s:" . v:key)') + endfunction +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + execute join(['function! vital#_easymotion#Over#Signals#import() abort', printf("return map({'_vital_depends': '', 'call': '', 'make': '', '_vital_loaded': ''}, \"function('%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n") + delfunction s:_SID +endif +" ___vital___ +scriptencoding utf-8 +let s:save_cpo = &cpo +set cpo&vim + + +function! s:_vital_loaded(V) + let s:V = a:V + let s:L = s:V.import("Data.List") +endfunction + + +function! s:_vital_depends() + return ["Data.List"] +endfunction + + +let s:base = { +\ "variables" : { +\ "slots" : [], +\ "counter" : 0, +\ } +\} + + +function! s:base.connect(slot) + let self.variables.counter += 1 + let slot = { "id" : self.variables.counter, "slot" : a:slot } + call add(self.variables.slots, slot) + return slot +endfunction + + +function! s:base.disconnect(slot) + if empty(a:slot) + return -1 + endif + for i in range(len(self.variables.slots)) + if self.variables.slots[i].id == a:slot.id + unlet self.variables.slots[i] + return + endif + endfor + return -1 +endfunction + + +function! s:base.disconnect_by(expr) + return self.disconnect(self.find_first_by(a:expr)) +endfunction + + +function! s:call(list, func, ...) + let args = get(a:, 1, []) + let def = get(a:, 2, 0) + return map(copy(a:list), "has_key(v:val, a:func) ? call(v:val.".a:func.", args, v:val) : def") +endfunction + +function! s:base.call(func, ...) + return call("s:call", [self.slots(), a:func] + a:000) +endfunction + + +function! s:base.find_by(expr) + return filter(copy(self.variables.slots), a:expr) +endfunction + + +function! s:base.find_first_by(expr) + return get(self.find_by(a:expr), 0, {}) +endfunction + + +function! s:base.sort_by(expr) + let self.variables.slots = s:L.sort_by(self.variables.slots, a:expr) +endfunction + + +function! s:base.get_slot(val) + return a:val.slot +endfunction + + +function! s:base.slots() + return map(copy(self.variables.slots), "self.get_slot(v:val)") +endfunction + + +" function! s:base.dict() +" let result = {} +" for _ in self.variables.slots +" let result[_.id] = _.value +" endfor +" return result +" endfunction + + +function! s:make() + let result = deepcopy(s:base) + return result +endfunction + + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/String.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/String.vim new file mode 100644 index 0000000..f812ecb --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Over/String.vim @@ -0,0 +1,164 @@ +" ___vital___ +" NOTE: lines between '" ___vital___' is generated by :Vitalize. +" Do not mofidify the code nor insert new lines before '" ___vital___' +if v:version > 703 || v:version == 703 && has('patch1170') + function! vital#_easymotion#Over#String#import() abort + return map({'_vital_depends': '', 'length': '', 'index': '', 'split_by_keys': '', 'make': '', '_vital_loaded': ''}, 'function("s:" . v:key)') + endfunction +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + execute join(['function! vital#_easymotion#Over#String#import() abort', printf("return map({'_vital_depends': '', 'length': '', 'index': '', 'split_by_keys': '', 'make': '', '_vital_loaded': ''}, \"function('%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n") + delfunction s:_SID +endif +" ___vital___ +scriptencoding utf-8 +let s:save_cpo = &cpo +set cpo&vim + + +function! s:_vital_loaded(V) + let s:V = a:V + let s:List = s:V.import("Data.List") +endfunction + + +function! s:_vital_depends() + return [ +\ "Data.List", +\ ] +endfunction + + +function! s:_clamp(x, max, min) + return min([max([a:x, a:max]), a:min]) +endfunction + + +let s:base = {} + +function! s:base.set(item) + return type(a:item) == type("") ? self.set_str(a:item) +\ : type(a:item) == type(0) ? self.set_pos(a:item) +\ : self +endfunction + +function! s:base.str() + return join(self.list, "") +endfunction + +function! s:base.set_pos(pos) + let self.col = s:_clamp(a:pos, 0, self.length()) + return self +endfunction + +function! s:base.backward() + return self.col > 0 ? join(self.list[ : self.col-1], '') : "" +endfunction + +function! s:base.forward() + return join(self.list[self.col+1 : ], '') +endfunction + +function! s:base.pos_char() + return get(self.list, self.col, "") +endfunction + +function! s:base.set_str(str) + let self.list = split(a:str, '\zs') + let self.col = strchars(a:str) + return self +endfunction + +function! s:base.pos() + return self.col +endfunction + +function! s:base.input(str) + call extend(self.list, split(a:str, '\zs'), self.col) + let self.col += len(split(a:str, '\zs')) + return self +endfunction + +function! s:base.length() + return len(self.list) +endfunction + +function! s:base.next() + return self.set_pos(self.col + 1) +endfunction + +function! s:base.prev() + return self.set_pos(self.col - 1) +endfunction + +function! s:base.remove(index) + if a:index < 0 || self.length() <= a:index + return "" + endif + let result = self.list[a:index] + unlet self.list[a:index] + if a:index < self.col + call self.set(self.col - 1) + endif + return result +endfunction + +function! s:base.remove_pos() + return self.remove(self.col) +endfunction + +function! s:base.remove_prev() + return self.remove(self.col - 1) +endfunction + +function! s:base.remove_next() + return self.remove(self.col + 1) +endfunction + + +function! s:make(...) + let default = get(a:, 1, "") + let result = deepcopy(s:base) + call result.set(default) + return result +endfunction + +" NOTE: old regexpengine has a bug with string which contains binary +" :echo "\x80" =~ "\\%#=1\x80" | " => 0 +" But it matches correctly with :h /collection +" :echo "\x80" =~ "\\%#=1[\x80]" | " => 1 +" http://lingr.com/room/vim/archives/2015/02/13#message-21261450 +let s:_engine = exists("+regexpengine") ? '\%#=2' : '' +" \ => Û\xfdQ +" \ => À\xfeX +let s:_regex = exists("+regexpengine") +\ ? "\\%(Û\xfdQ\\|À\xfeX\\|\x80\xfc.\\%(\x80..\\|.\\)\\|\x80..\\|.\\)\\zs" +\ : "\\%(Û[\xfd]Q\\|À[\xfe]X\\|[\x80][\xfc].\\%([\x80]..\\|.\\)\\|[\x80]..\\|.\\)\\zs" +function! s:_split_keystring(str, ...) + return split(a:str, s:_engine . '\m\%(' . get(a:, 1, '') . s:_regex . '\)') +endfunction + +function! s:split_by_keys(str) + return s:_split_keystring(a:str, "\\%(\\\|\\)(.\\{-})\\zs\\|") +endfunction + +function! s:index(haystack, needle, ...) + let start = get(a:, 1, 0) + let ignorecase = get(a:, 2, &ignorecase) + if ignorecase + return stridx(tolower(a:haystack), tolower(a:needle), start) + else + return stridx(a:haystack, a:needle, start) + endif +endfunction + + +function! s:length(str) + return len(s:split_by_keys(a:str)) +endfunction + + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Palette/Capture.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Palette/Capture.vim new file mode 100644 index 0000000..0863461 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Palette/Capture.vim @@ -0,0 +1,74 @@ +" ___vital___ +" NOTE: lines between '" ___vital___' is generated by :Vitalize. +" Do not mofidify the code nor insert new lines before '" ___vital___' +if v:version > 703 || v:version == 703 && has('patch1170') + function! vital#_easymotion#Palette#Capture#import() abort + return map({'extend': '', 'command': ''}, 'function("s:" . v:key)') + endfunction +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + execute join(['function! vital#_easymotion#Palette#Capture#import() abort', printf("return map({'extend': '', 'command': ''}, \"function('%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n") + delfunction s:_SID +endif +" ___vital___ +scriptencoding utf-8 +let s:save_cpo = &cpo +set cpo&vim + + +let s:verbosefiles = [] + +function! s:_verbosefile_push(file) + call add(s:verbosefiles, &verbosefile) + let &verbosefile = a:file + return a:file +endfunction + + +function! s:_verbosefile_pop() + let filename = &verbosefile + let &verbosefile = get(s:verbosefiles, -1) + call remove(s:verbosefiles, -1) + return filename +endfunction + + +function! s:_reset() + let s:verbosefiles = [] +endfunction + + +function! s:extend(dict, src) + for [key, value] in items(a:src) + let a:dict[key] = value + unlet value + endfor +endfunction + + +function! s:command(cmd, ...) + " Workaround : Vim 7.3.xxx in Travis and Ubuntu + " https://github.com/osyo-manga/vital-palette/issues/5 +" call extend(l:, get(a:, 1, {})) + if a:0 > 0 + call s:extend(l:, a:1) + endif + + call s:_verbosefile_push(tempname()) + try + redir =>result + silent execute a:cmd + finally + redir END + endtry + call s:_verbosefile_pop() +" let result = substitute(result, "", "\", "g") +" let result = substitute(result, "", "\", "g") + return result +endfunction + + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Palette/Highlight.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Palette/Highlight.vim new file mode 100644 index 0000000..7e62e90 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Palette/Highlight.vim @@ -0,0 +1,133 @@ +" ___vital___ +" NOTE: lines between '" ___vital___' is generated by :Vitalize. +" Do not mofidify the code nor insert new lines before '" ___vital___' +if v:version > 703 || v:version == 703 && has('patch1170') + function! vital#_easymotion#Palette#Highlight#import() abort + return map({'capture': '', '_vital_depends': '', 'parse': '', 'group_list': '', 'set': '', 'parse_to_name': '', 'links_to': '', 'get': '', '_vital_loaded': ''}, 'function("s:" . v:key)') + endfunction +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + execute join(['function! vital#_easymotion#Palette#Highlight#import() abort', printf("return map({'capture': '', '_vital_depends': '', 'parse': '', 'group_list': '', 'set': '', 'parse_to_name': '', 'links_to': '', 'get': '', '_vital_loaded': ''}, \"function('%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n") + delfunction s:_SID +endif +" ___vital___ +scriptencoding utf-8 +let s:save_cpo = &cpo +set cpo&vim + + +function! s:_vital_loaded(V) + let s:V = a:V + let s:Message = s:V.import("Vim.Message") +endfunction + + +function! s:_vital_depends() + return [ +\ "Vim.Message", +\ ] +endfunction + + +function! s:_execute(cmd) + execute a:cmd +endfunction + + +function! s:capture(name) + if hlexists(a:name) == 0 + return "" + endif + return s:Message.capture("highlight " . a:name) +endfunction + + +function! s:links_to(highlight) + return matchstr(a:highlight, '^\S\+\s\+xxx links to \zs.*\ze$') +endfunction + + +function! s:parse_to_name(highlight) + return matchstr(a:highlight, '^\zs\w\+\ze') +endfunction + + +function! s:parse(highlight) + let highlight = a:highlight + + if highlight !~# '^\w\+\s\+xxx\s' + return {} + endif + + let name = s:parse_to_name(a:highlight) + let result = { "_name" : name } + + if highlight =~# '^\w\+\s\+xxx cleared' + let result.cleared = 1 + return result + endif + + let link = s:links_to(highlight) + if link != "" + let result.link = link + return result + endif + + let attrs = [ +\ "term", +\ "cterm", +\ "ctermfg", +\ "ctermbg", +\ "gui", +\ "font", +\ "guifg", +\ "guibg", +\ "guisp", +\ ] + for attr in attrs + let item = matchstr(highlight, '\s' . attr . '=\zs#\?\w\+\ze') + if item != "" + let result[attr] = item + endif + endfor + return result +endfunction + + +function! s:get(name, ...) + if !hlexists(a:name) + return {} + endif + let result = s:parse(substitute(s:capture(a:name), "\n", "", "g")) + if has_key(result, "link") && get(a:, 1, 0) + return s:get(result.link, get(a:, 1, 0)) + else + return result + endif +endfunction + + +function! s:set(name, config) + if type(a:config) == type("") + return s:set(a:config, s:get(a:config)) + endif + if has_key(a:config, "cleared") + return s:_execute("highlight clear " . a:name) + endif + if has_key(a:config, "link") + return s:_execute("highlight link " . a:name . " " . a:config.link) + endif + return s:_execute("highlight " . a:name . " " . join(map(items(filter(a:config, "v:key !=# '_name'")), "v:val[0] . '=' . v:val[1]"), " ")) +endfunction + + +function! s:group_list() + let highlights = split(s:Message.capture("highlight"), "\n") + return filter(map(highlights, "s:parse_to_name(v:val)"), "v:val != ''") +endfunction + + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Palette/Keymapping.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Palette/Keymapping.vim new file mode 100644 index 0000000..924a22e --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Palette/Keymapping.vim @@ -0,0 +1,121 @@ +" ___vital___ +" NOTE: lines between '" ___vital___' is generated by :Vitalize. +" Do not mofidify the code nor insert new lines before '" ___vital___' +if v:version > 703 || v:version == 703 && has('patch1170') + function! vital#_easymotion#Palette#Keymapping#import() abort + return map({'capture': '', '_vital_depends': '', 'escape_special_key': '', 'rhs_key_list': '', 'parse_lhs_list': '', 'lhs_key_list': '', 'capture_list': '', 'parse_lhs': '', '_vital_loaded': ''}, 'function("s:" . v:key)') + endfunction +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + execute join(['function! vital#_easymotion#Palette#Keymapping#import() abort', printf("return map({'capture': '', '_vital_depends': '', 'escape_special_key': '', 'rhs_key_list': '', 'parse_lhs_list': '', 'lhs_key_list': '', 'capture_list': '', 'parse_lhs': '', '_vital_loaded': ''}, \"function('%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n") + delfunction s:_SID +endif +" ___vital___ +scriptencoding utf-8 +let s:save_cpo = &cpo +set cpo&vim + + +let s:modep = "[nvoicsxl]" + + +function! s:_vital_loaded(V) + let s:V = a:V + let s:Capture = s:V.import("Palette.Capture") +endfunction + + +function! s:_vital_depends() + return [ +\ "Palette.Capture", +\ ] +endfunction + + +function! s:_capture(mode) + let cmd = "map" + if a:mode ==# "!" + let cmd = cmd . "!" + elseif a:mode =~# "[nvoicsxl]" + let cmd = a:mode . cmd + endif + return s:Capture.command(cmd) +endfunction + + +function! s:capture(...) + let mode = get(a:, 1, "") + let modes = split(mode, '\zs') + return join(map(modes, "s:_capture(v:val)"), "\n") +endfunction + + +function! s:_keymapping(str) + return a:str =~ '^[!nvoicsxl]\s' +endfunction + + +function! s:capture_list(...) + let mode = get(a:, 1, "") + return filter(split(s:capture(mode), "\n"), "s:_keymapping(v:val)") +endfunction + + +function! s:escape_special_key(key) + " Workaround : https://github.com/osyo-manga/vital-palette/issues/5 + if a:key ==# "<^?>" + return "\" + endif + execute 'let result = "' . substitute(escape(a:key, '\"'), '\(<.\{-}>\)', '\\\1', 'g') . '"' + return result +endfunction + + +function! s:parse_lhs(text, ...) + let mode = get(a:, 1, '[!nvoicsxl]') + " NOTE: :map! Surpport : https://github.com/osyo-manga/vital-palette/issues/4 + if get(a:, 1, "") =~# '[!ci]' + let mode = '[!ci]' + endif + return matchstr(a:text, mode . '\{1,3\}\s*\zs\S\{-}\ze\s\+') +endfunction + + +function! s:parse_lhs_list(...) + let mode = get(a:, 1, "") + return map(s:capture_list(mode), "s:parse_lhs(v:val, mode)") +endfunction + + +function! s:lhs_key_list(...) + let mode = get(a:, 1, "") + return map(s:parse_lhs_list(mode), "s:escape_special_key(v:val)") +endfunction + + +function! s:_maparg(name, mode, abbr, dict) + " Workaround : https://github.com/osyo-manga/vital-palette/issues/5 + if a:name ==# "<^?>" + return maparg("\", a:mode, a:abbr, a:dict) + endif + return maparg(a:name, a:mode, a:abbr, a:dict) +endfunction + + +function! s:rhs_key_list(...) + let mode = get(a:, 1, "") + let abbr = get(a:, 2, 0) + let dict = get(a:, 3, 0) + + let result = [] + for m in split(mode, '\zs') + let result += map(s:parse_lhs_list(m), "s:_maparg(v:val, m, abbr, dict)") + endfor + return filter(result, "empty(v:val) == 0") +endfunction + + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Prelude.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Prelude.vim new file mode 100644 index 0000000..f123dc6 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Prelude.vim @@ -0,0 +1,430 @@ +" ___vital___ +" NOTE: lines between '" ___vital___' is generated by :Vitalize. +" Do not mofidify the code nor insert new lines before '" ___vital___' +if v:version > 703 || v:version == 703 && has('patch1170') + function! vital#_easymotion#Prelude#import() abort + return map({'escape_pattern': '', 'is_funcref': '', 'path2directory': '', 'wcswidth': '', 'is_string': '', 'input_helper': '', 'is_number': '', 'is_cygwin': '', 'path2project_directory': '', 'strwidthpart_reverse': '', 'input_safe': '', 'is_list': '', 'truncate_skipping': '', 'glob': '', 'truncate': '', 'is_dict': '', 'set_default': '', 'is_numeric': '', 'getchar_safe': '', 'substitute_path_separator': '', 'is_mac': '', 'strwidthpart': '', 'getchar': '', 'is_unix': '', 'is_windows': '', 'globpath': '', 'escape_file_searching': '', 'is_float': '', 'smart_execute_command': ''}, 'function("s:" . v:key)') + endfunction +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + execute join(['function! vital#_easymotion#Prelude#import() abort', printf("return map({'escape_pattern': '', 'is_funcref': '', 'path2directory': '', 'wcswidth': '', 'is_string': '', 'input_helper': '', 'is_number': '', 'is_cygwin': '', 'path2project_directory': '', 'strwidthpart_reverse': '', 'input_safe': '', 'is_list': '', 'truncate_skipping': '', 'glob': '', 'truncate': '', 'is_dict': '', 'set_default': '', 'is_numeric': '', 'getchar_safe': '', 'substitute_path_separator': '', 'is_mac': '', 'strwidthpart': '', 'getchar': '', 'is_unix': '', 'is_windows': '', 'globpath': '', 'escape_file_searching': '', 'is_float': '', 'smart_execute_command': ''}, \"function('%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n") + delfunction s:_SID +endif +" ___vital___ +let s:save_cpo = &cpo +set cpo&vim + +if v:version > 703 || +\ (v:version == 703 && has('patch465')) + function! s:glob(expr) abort + return glob(a:expr, 1, 1) + endfunction +else + function! s:glob(expr) abort + return split(glob(a:expr, 1), '\n') + endfunction +endif + +if v:version > 704 || +\ (v:version == 704 && has('patch279')) + function! s:globpath(path, expr) abort + return globpath(a:path, a:expr, 1, 1) + endfunction +else + function! s:globpath(path, expr) abort + return split(globpath(a:path, a:expr, 1), '\n') + endfunction +endif + +" Wrapper functions for type(). +" NOTE: __TYPE_FLOAT = -1 when -float. +" this doesn't match to anything. +if has('patch-7.4.2071') + let [ + \ s:__TYPE_NUMBER, + \ s:__TYPE_STRING, + \ s:__TYPE_FUNCREF, + \ s:__TYPE_LIST, + \ s:__TYPE_DICT, + \ s:__TYPE_FLOAT] = [ + \ v:t_number, + \ v:t_string, + \ v:t_func, + \ v:t_list, + \ v:t_dict, + \ v:t_float] +else + let [ + \ s:__TYPE_NUMBER, + \ s:__TYPE_STRING, + \ s:__TYPE_FUNCREF, + \ s:__TYPE_LIST, + \ s:__TYPE_DICT, + \ s:__TYPE_FLOAT] = [ + \ type(3), + \ type(''), + \ type(function('tr')), + \ type([]), + \ type({}), + \ has('float') ? type(str2float('0')) : -1] +endif + +" Number or Float +function! s:is_numeric(Value) abort + let _ = type(a:Value) + return _ ==# s:__TYPE_NUMBER + \ || _ ==# s:__TYPE_FLOAT +endfunction + +" Number +function! s:is_number(Value) abort + return type(a:Value) ==# s:__TYPE_NUMBER +endfunction + +" String +function! s:is_string(Value) abort + return type(a:Value) ==# s:__TYPE_STRING +endfunction + +" Funcref +function! s:is_funcref(Value) abort + return type(a:Value) ==# s:__TYPE_FUNCREF +endfunction + +" List +function! s:is_list(Value) abort + return type(a:Value) ==# s:__TYPE_LIST +endfunction + +" Dictionary +function! s:is_dict(Value) abort + return type(a:Value) ==# s:__TYPE_DICT +endfunction + +" Float +function! s:is_float(Value) abort + return type(a:Value) ==# s:__TYPE_FLOAT +endfunction + + +function! s:truncate_skipping(str, max, footer_width, separator) abort + call s:_warn_deprecated('truncate_skipping', 'Data.String.truncate_skipping') + + let width = s:wcswidth(a:str) + if width <= a:max + let ret = a:str + else + let header_width = a:max - s:wcswidth(a:separator) - a:footer_width + let ret = s:strwidthpart(a:str, header_width) . a:separator + \ . s:strwidthpart_reverse(a:str, a:footer_width) + endif + + return s:truncate(ret, a:max) +endfunction + +function! s:truncate(str, width) abort + " Original function is from mattn. + " http://github.com/mattn/googlereader-vim/tree/master + + call s:_warn_deprecated('truncate', 'Data.String.truncate') + + if a:str =~# '^[\x00-\x7f]*$' + return len(a:str) < a:width ? + \ printf('%-'.a:width.'s', a:str) : strpart(a:str, 0, a:width) + endif + + let ret = a:str + let width = s:wcswidth(a:str) + if width > a:width + let ret = s:strwidthpart(ret, a:width) + let width = s:wcswidth(ret) + endif + + if width < a:width + let ret .= repeat(' ', a:width - width) + endif + + return ret +endfunction + +function! s:strwidthpart(str, width) abort + call s:_warn_deprecated('strwidthpart', 'Data.String.strwidthpart') + + if a:width <= 0 + return '' + endif + let ret = a:str + let width = s:wcswidth(a:str) + while width > a:width + let char = matchstr(ret, '.$') + let ret = ret[: -1 - len(char)] + let width -= s:wcswidth(char) + endwhile + + return ret +endfunction +function! s:strwidthpart_reverse(str, width) abort + call s:_warn_deprecated('strwidthpart_reverse', 'Data.String.strwidthpart_reverse') + + if a:width <= 0 + return '' + endif + let ret = a:str + let width = s:wcswidth(a:str) + while width > a:width + let char = matchstr(ret, '^.') + let ret = ret[len(char) :] + let width -= s:wcswidth(char) + endwhile + + return ret +endfunction + +if v:version >= 703 + " Use builtin function. + function! s:wcswidth(str) abort + call s:_warn_deprecated('wcswidth', 'Data.String.wcswidth') + return strwidth(a:str) + endfunction +else + function! s:wcswidth(str) abort + call s:_warn_deprecated('wcswidth', 'Data.String.wcswidth') + + if a:str =~# '^[\x00-\x7f]*$' + return strlen(a:str) + end + + let mx_first = '^\(.\)' + let str = a:str + let width = 0 + while 1 + let ucs = char2nr(substitute(str, mx_first, '\1', '')) + if ucs == 0 + break + endif + let width += s:_wcwidth(ucs) + let str = substitute(str, mx_first, '', '') + endwhile + return width + endfunction + + " UTF-8 only. + function! s:_wcwidth(ucs) abort + let ucs = a:ucs + if (ucs >= 0x1100 + \ && (ucs <= 0x115f + \ || ucs == 0x2329 + \ || ucs == 0x232a + \ || (ucs >= 0x2e80 && ucs <= 0xa4cf + \ && ucs != 0x303f) + \ || (ucs >= 0xac00 && ucs <= 0xd7a3) + \ || (ucs >= 0xf900 && ucs <= 0xfaff) + \ || (ucs >= 0xfe30 && ucs <= 0xfe6f) + \ || (ucs >= 0xff00 && ucs <= 0xff60) + \ || (ucs >= 0xffe0 && ucs <= 0xffe6) + \ || (ucs >= 0x20000 && ucs <= 0x2fffd) + \ || (ucs >= 0x30000 && ucs <= 0x3fffd) + \ )) + return 2 + endif + return 1 + endfunction +endif + +let s:is_windows = has('win16') || has('win32') || has('win64') || has('win95') +let s:is_cygwin = has('win32unix') +let s:is_mac = !s:is_windows && !s:is_cygwin + \ && (has('mac') || has('macunix') || has('gui_macvim') || + \ (!isdirectory('/proc') && executable('sw_vers'))) +let s:is_unix = has('unix') + +function! s:is_windows() abort + return s:is_windows +endfunction + +function! s:is_cygwin() abort + return s:is_cygwin +endfunction + +function! s:is_mac() abort + return s:is_mac +endfunction + +function! s:is_unix() abort + return s:is_unix +endfunction + +function! s:_warn_deprecated(name, alternative) abort + try + echohl Error + echomsg 'Prelude.' . a:name . ' is deprecated! Please use ' . a:alternative . ' instead.' + finally + echohl None + endtry +endfunction + +function! s:smart_execute_command(action, word) abort + execute a:action . ' ' . (a:word ==# '' ? '' : '`=a:word`') +endfunction + +function! s:escape_file_searching(buffer_name) abort + return escape(a:buffer_name, '*[]?{}, ') +endfunction + +function! s:escape_pattern(str) abort + call s:_warn_deprecated( + \ 'escape_pattern', + \ 'Data.String.escape_pattern', + \) + return escape(a:str, '~"\.^$[]*') +endfunction + +function! s:getchar(...) abort + let c = call('getchar', a:000) + return type(c) == type(0) ? nr2char(c) : c +endfunction + +function! s:getchar_safe(...) abort + let c = s:input_helper('getchar', a:000) + return type(c) == type('') ? c : nr2char(c) +endfunction + +function! s:input_safe(...) abort + return s:input_helper('input', a:000) +endfunction + +function! s:input_helper(funcname, args) abort + let success = 0 + if inputsave() !=# success + throw 'vital: Prelude: inputsave() failed' + endif + try + return call(a:funcname, a:args) + finally + if inputrestore() !=# success + throw 'vital: Prelude: inputrestore() failed' + endif + endtry +endfunction + +function! s:set_default(var, val) abort + if !exists(a:var) || type({a:var}) != type(a:val) + let {a:var} = a:val + endif +endfunction + +function! s:substitute_path_separator(path) abort + return s:is_windows ? substitute(a:path, '\\', '/', 'g') : a:path +endfunction + +function! s:path2directory(path) abort + return s:substitute_path_separator(isdirectory(a:path) ? a:path : fnamemodify(a:path, ':p:h')) +endfunction + +function! s:_path2project_directory_git(path) abort + let parent = a:path + + while 1 + let path = parent . '/.git' + if isdirectory(path) || filereadable(path) + return parent + endif + let next = fnamemodify(parent, ':h') + if next == parent + return '' + endif + let parent = next + endwhile +endfunction + +function! s:_path2project_directory_svn(path) abort + let search_directory = a:path + let directory = '' + + let find_directory = s:escape_file_searching(search_directory) + let d = finddir('.svn', find_directory . ';') + if d ==# '' + return '' + endif + + let directory = fnamemodify(d, ':p:h:h') + + " Search parent directories. + let parent_directory = s:path2directory( + \ fnamemodify(directory, ':h')) + + if parent_directory !=# '' + let d = finddir('.svn', parent_directory . ';') + if d !=# '' + let directory = s:_path2project_directory_svn(parent_directory) + endif + endif + return directory +endfunction + +function! s:_path2project_directory_others(vcs, path) abort + let vcs = a:vcs + let search_directory = a:path + + let find_directory = s:escape_file_searching(search_directory) + let d = finddir(vcs, find_directory . ';') + if d ==# '' + return '' + endif + return fnamemodify(d, ':p:h:h') +endfunction + +function! s:path2project_directory(path, ...) abort + let is_allow_empty = get(a:000, 0, 0) + let search_directory = s:path2directory(a:path) + let directory = '' + + " Search VCS directory. + for vcs in ['.git', '.bzr', '.hg', '.svn'] + if vcs ==# '.git' + let directory = s:_path2project_directory_git(search_directory) + elseif vcs ==# '.svn' + let directory = s:_path2project_directory_svn(search_directory) + else + let directory = s:_path2project_directory_others(vcs, search_directory) + endif + if directory !=# '' + break + endif + endfor + + " Search project file. + if directory ==# '' + for d in ['build.xml', 'prj.el', '.project', 'pom.xml', 'package.json', + \ 'Makefile', 'configure', 'Rakefile', 'NAnt.build', + \ 'P4CONFIG', 'tags', 'gtags'] + let d = findfile(d, s:escape_file_searching(search_directory) . ';') + if d !=# '' + let directory = fnamemodify(d, ':p:h') + break + endif + endfor + endif + + if directory ==# '' + " Search /src/ directory. + let base = s:substitute_path_separator(search_directory) + if base =~# '/src/' + let directory = base[: strridx(base, '/src/') + 3] + endif + endif + + if directory ==# '' && !is_allow_empty + " Use original path. + let directory = search_directory + endif + + return s:substitute_path_separator(directory) +endfunction + +let &cpo = s:save_cpo +unlet s:save_cpo + +" vim:set et ts=2 sts=2 sw=2 tw=0: diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Vim/Buffer.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Vim/Buffer.vim new file mode 100644 index 0000000..a4c3db5 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Vim/Buffer.vim @@ -0,0 +1,187 @@ +" ___vital___ +" NOTE: lines between '" ___vital___' is generated by :Vitalize. +" Do not mofidify the code nor insert new lines before '" ___vital___' +if v:version > 703 || v:version == 703 && has('patch1170') + function! vital#_easymotion#Vim#Buffer#import() abort + return map({'parse_cmdarg': '', '_vital_depends': '', 'read_content': '', 'get_selected_text': '', 'is_cmdwin': '', 'edit_content': '', 'open': '', 'get_last_selected': '', '_vital_loaded': ''}, 'function("s:" . v:key)') + endfunction +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + execute join(['function! vital#_easymotion#Vim#Buffer#import() abort', printf("return map({'parse_cmdarg': '', '_vital_depends': '', 'read_content': '', 'get_selected_text': '', 'is_cmdwin': '', 'edit_content': '', 'open': '', 'get_last_selected': '', '_vital_loaded': ''}, \"function('%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n") + delfunction s:_SID +endif +" ___vital___ +let s:save_cpo = &cpo +set cpo&vim + +function! s:_vital_loaded(V) abort + let s:V = a:V + let s:P = s:V.import('Prelude') + let s:G = s:V.import('Vim.Guard') +endfunction + +function! s:_vital_depends() abort + return ['Prelude', 'Vim.Guard'] +endfunction + +if exists('*getcmdwintype') + function! s:is_cmdwin() abort + return getcmdwintype() !=# '' + endfunction +else + function! s:is_cmdwin() abort + return bufname('%') ==# '[Command Line]' + endfunction +endif + +function! s:open(buffer, opener) abort + let save_wildignore = &wildignore + let &wildignore = '' + try + if s:P.is_funcref(a:opener) + let loaded = !bufloaded(a:buffer) + call a:opener(a:buffer) + elseif a:buffer is 0 || a:buffer is# '' + let loaded = 1 + silent execute a:opener + enew + else + let loaded = !bufloaded(a:buffer) + if s:P.is_string(a:buffer) + execute a:opener '`=a:buffer`' + elseif s:P.is_number(a:buffer) + silent execute a:opener + execute a:buffer 'buffer' + else + throw 'vital: Vim.Buffer: Unknown opener type.' + endif + endif + finally + let &wildignore = save_wildignore + endtry + return loaded +endfunction + +function! s:get_selected_text(...) abort + echohl WarningMsg + echom "[WARN] s:get_selected_text() is deprecated. Use 's:get_last_selected()'." + echohl None + return call('s:get_last_selected', a:000) +endfunction + +" Get the last selected text in visual mode +" without using |gv| to avoid |textlock|. +" NOTE: +" * This function uses |gv| only when using |CTRL-V| +" because |gv| is the only way to get selected text +" when using $ . +" Please see #192 for the details. +" * If you don't care about |textlock|, +" you can use simple version of this function. +" https://github.com/vim-jp/vital.vim/commit/39aae80f3839fdbeebd838ff14d87327a6b889a9 +function! s:get_last_selected() abort + if visualmode() ==# "\" + let save = getreg('"', 1) + let save_type = getregtype('"') + try + normal! gv""y + return @" + finally + call setreg('"', save, save_type) + endtry + else + let [begin, end] = [getpos("'<"), getpos("'>")] + let lastchar = matchstr(getline(end[1])[end[2]-1 :], '.') + if begin[1] ==# end[1] + let lines = [getline(begin[1])[begin[2]-1 : end[2]-2]] + else + let lines = [getline(begin[1])[begin[2]-1 :]] + \ + (end[1] - begin[1] <# 2 ? [] : getline(begin[1]+1, end[1]-1)) + \ + [getline(end[1])[: end[2]-2]] + endif + return join(lines, "\n") . lastchar . (visualmode() ==# 'V' ? "\n" : '') + endif +endfunction + +function! s:read_content(content, ...) abort + let options = extend({ + \ 'tempfile': '', + \ 'fileformat': '', + \ 'encoding': '', + \ 'binary': 0, + \ 'nobinary': 0, + \ 'bad': '', + \ 'edit': 0, + \ 'line': '', + \}, get(a:000, 0, {})) + let tempfile = empty(options.tempfile) ? tempname() : options.tempfile + let optnames = [ + \ empty(options.fileformat) ? '' : '++ff=' . options.fileformat, + \ empty(options.encoding) ? '' : '++enc=' . options.encoding, + \ empty(options.binary) ? '' : '++bin', + \ empty(options.nobinary) ? '' : '++nobin', + \ empty(options.bad) ? '' : '++bad=' . options.bad, + \ empty(options.edit) ? '' : '++edit', + \] + let optname = join(filter(optnames, '!empty(v:val)')) + try + call writefile(a:content, tempfile) + execute printf('keepalt keepjumps %sread %s%s', + \ options.line, + \ empty(optname) ? '' : optname . ' ', + \ fnameescape(tempfile), + \) + finally + call delete(tempfile) + execute 'bwipeout!' tempfile + endtry +endfunction + +function! s:edit_content(content, ...) abort + let options = extend({ + \ 'edit': 1, + \}, get(a:000, 0, {})) + let guard = s:G.store(['&l:modifiable']) + let saved_view = winsaveview() + try + let &l:modifiable=1 + silent keepjumps %delete _ + silent call s:read_content(a:content, options) + silent keepjumps 1delete _ + finally + keepjump call winrestview(saved_view) + call guard.restore() + endtry + setlocal nomodified +endfunction + +function! s:parse_cmdarg(...) abort + let cmdarg = get(a:000, 0, v:cmdarg) + let options = {} + if cmdarg =~# '++enc=' + let options.encoding = matchstr(cmdarg, '++enc=\zs[^ ]\+\ze') + endif + if cmdarg =~# '++ff=' + let options.fileformat = matchstr(cmdarg, '++ff=\zs[^ ]\+\ze') + endif + if cmdarg =~# '++bad=' + let options.bad = matchstr(cmdarg, '++bad=\zs[^ ]\+\ze') + endif + if cmdarg =~# '++bin' + let options.binary = 1 + endif + if cmdarg =~# '++nobin' + let options.nobinary = 1 + endif + if cmdarg =~# '++edit' + let options.edit = 1 + endif + return options +endfunction + +let &cpo = s:save_cpo +unlet s:save_cpo + +" vim:set et ts=2 sts=2 sw=2 tw=0: diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Vim/Guard.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Vim/Guard.vim new file mode 100644 index 0000000..6b46c77 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Vim/Guard.vim @@ -0,0 +1,240 @@ +" ___vital___ +" NOTE: lines between '" ___vital___' is generated by :Vitalize. +" Do not mofidify the code nor insert new lines before '" ___vital___' +if v:version > 703 || v:version == 703 && has('patch1170') + function! vital#_easymotion#Vim#Guard#import() abort + return map({'_vital_depends': '', '_vital_created': '', 'store': '', '_vital_loaded': ''}, 'function("s:" . v:key)') + endfunction +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + execute join(['function! vital#_easymotion#Vim#Guard#import() abort', printf("return map({'_vital_depends': '', '_vital_created': '', 'store': '', '_vital_loaded': ''}, \"function('%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n") + delfunction s:_SID +endif +" ___vital___ +let s:save_cpo = &cpo +set cpo&vim + +" Use a Funcref as a special term _UNDEFINED +function! s:_undefined() abort + return 'undefined' +endfunction +let s:_UNDEFINED = function('s:_undefined') + +function! s:_vital_loaded(V) abort + let s:V = a:V + let s:Prelude = s:V.import('Prelude') + let s:List = s:V.import('Data.List') + let s:Dict = s:V.import('Data.Dict') +endfunction +function! s:_vital_depends() abort + return ['Prelude', 'Data.List', 'Data.Dict'] +endfunction +function! s:_vital_created(module) abort + " define constant variables + if !exists('s:const') + let s:const = {} + let s:const.is_local_variable_supported = + \ v:version > 703 || (v:version == 703 && has('patch560')) + " NOTE: + " The third argument is available from 7.4.242 but it had bug and that + " bug was fixed from 7.4.513 + let s:const.is_third_argument_of_getreg_supported = has('patch-7.4.513') + lockvar s:const + endif + call extend(a:module, s:const) +endfunction +function! s:_throw(msg) abort + throw printf('vital: Vim.Guard: %s', a:msg) +endfunction + +let s:option = {} +function! s:_new_option(name) abort + if a:name !~# '^&' + call s:_throw(printf( + \'An option name "%s" requires to be started from "&"', a:name + \)) + elseif !exists(a:name) + call s:_throw(printf( + \'An option name "%s" does not exist', a:name + \)) + endif + let option = copy(s:option) + let option.name = a:name + let option.value = eval(a:name) + return option +endfunction +function! s:option.restore() abort + execute printf('let %s = %s', self.name, string(self.value)) +endfunction + +let s:register = {} +function! s:_new_register(name) abort + if len(a:name) != 2 + call s:_throw(printf( + \'A register name "%s" requires to be "@" + a single character', a:name + \)) + elseif a:name !~# '^@' + call s:_throw(printf( + \'A register name "%s" requires to be started from "@"', a:name + \)) + elseif a:name =~# '^@[:.%]$' + call s:_throw(printf( + \'A register name "%s" is read only', a:name + \)) + elseif a:name !~# '^@[@0-9a-zA-Z#=*+~_/-]$' + call s:_throw(printf( + \'A register name "%s" does not exist. See ":help let-register"', a:name + \)) + endif + let name = a:name ==# '@@' ? '' : a:name[1] + let register = copy(s:register) + let register.name = name + if s:const.is_third_argument_of_getreg_supported + let register.value = getreg(name, 1, 1) + else + let register.value = getreg(name, 1) + endif + let register.type = getregtype(name) + return register +endfunction +function! s:register.restore() abort + " https://github.com/vim/vim/commit/5a50c2255c447838d08d3b4895a3be3a41cd8eda + if has('patch-7.4.243') || self.name !=# '=' + call setreg(self.name, self.value, self.type) + else + let @= = self.value + endif +endfunction + +let s:environment = {} +function! s:_new_environment(name) abort + if a:name !~# '^\$' + call s:_throw(printf( + \'An environment variable name "%s" requires to be started from "$"', a:name + \)) + elseif !exists(a:name) + call s:_throw(printf( + \'An environment variable name "%s" does not exist. While Vim cannot unlet environment variable, it requires to exist', a:name + \)) + endif + let environment = copy(s:environment) + let environment.name = a:name + let environment.value = eval(a:name) + return environment +endfunction +function! s:environment.restore() abort + execute printf('let %s = %s', self.name, string(self.value)) +endfunction + +let s:variable = {} +function! s:_new_variable(name, ...) abort + if a:0 == 0 + let m = matchlist(a:name, '^\([bwtg]:\)\(.*\)$') + if empty(m) + call s:_throw(printf( + \ join([ + \ 'An variable name "%s" requires to start from b:, w:, t:, or g:', + \ 'while no {namespace} is specified', + \ ]), + \ a:name, + \)) + endif + let [prefix, name] = m[1 : 2] + let namespace = eval(prefix) + else + let name = a:name + let namespace = a:1 + endif + let variable = copy(s:variable) + let variable.name = name + let variable.value = get(namespace, name, s:_UNDEFINED) + let variable.value = + \ type(variable.value) == type({}) || type(variable.value) == type([]) + \ ? deepcopy(variable.value) + \ : variable.value + let variable._namespace = namespace + return variable +endfunction +function! s:variable.restore() abort + " unlet the variable to prevent variable type mis-match in case + silent! unlet! self._namespace[self.name] + if type(self.value) == type(s:_UNDEFINED) && self.value == s:_UNDEFINED + " do nothing, leave the variable as undefined + else + let self._namespace[self.name] = self.value + endif +endfunction + +let s:instance = {} +function! s:_new_instance(instance, ...) abort + let shallow = get(a:000, 0, 0) + if !s:Prelude.is_list(a:instance) && !s:Prelude.is_dict(a:instance) + call s:_throw(printf( + \'An instance "%s" requires to be List or Dictionary', string(a:instance) + \)) + endif + let instance = copy(s:instance) + let instance.instance = a:instance + let instance.values = shallow ? copy(a:instance) : deepcopy(a:instance) + return instance +endfunction +function! s:instance.restore() abort + if s:Prelude.is_list(self.instance) + call s:List.clear(self.instance) + else + call s:Dict.clear(self.instance) + endif + call extend(self.instance, self.values) +endfunction + +let s:guard = {} +function! s:store(targets) abort + let resources = [] + for meta in a:targets + if s:Prelude.is_list(meta) + if len(meta) == 1 + call add(resources, s:_new_instance(meta[0])) + elseif len(meta) == 2 + if s:Prelude.is_string(meta[0]) + call add(resources, call('s:_new_variable', meta)) + else + call add(resources, call('s:_new_instance', meta)) + endif + else + call s:_throw('List assignment requires one or two elements') + endif + elseif type(meta) == type('') + if meta =~# '^[bwtgls]:' + " Note: + " To improve an error message, handle l:XXX or s:XXX as well + call add(resources, s:_new_variable(meta)) + elseif meta =~# '^&' + call add(resources, s:_new_option(meta)) + elseif meta =~# '^@' + call add(resources, s:_new_register(meta)) + elseif meta =~# '^\$' + call add(resources, s:_new_environment(meta)) + else + call s:_throw(printf( + \ 'Unknown value "%s" was specified', + \ meta + \)) + endif + endif + unlet meta + endfor + let guard = copy(s:guard) + let guard._resources = resources + return guard +endfunction +function! s:guard.restore() abort + for resource in self._resources + call resource.restore() + endfor +endfunction + +let &cpo = s:save_cpo +unlet! s:save_cpo +" vim:set et ts=2 sts=2 sw=2 tw=0 fdm=marker: diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Vim/Message.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Vim/Message.vim new file mode 100644 index 0000000..ced76b7 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/_easymotion/Vim/Message.vim @@ -0,0 +1,80 @@ +" ___vital___ +" NOTE: lines between '" ___vital___' is generated by :Vitalize. +" Do not mofidify the code nor insert new lines before '" ___vital___' +if v:version > 703 || v:version == 703 && has('patch1170') + function! vital#_easymotion#Vim#Message#import() abort + return map({'capture': '', 'echomsg': '', 'echo': '', 'warn': '', 'get_hit_enter_max_length': '', 'error': ''}, 'function("s:" . v:key)') + endfunction +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + execute join(['function! vital#_easymotion#Vim#Message#import() abort', printf("return map({'capture': '', 'echomsg': '', 'echo': '', 'warn': '', 'get_hit_enter_max_length': '', 'error': ''}, \"function('%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n") + delfunction s:_SID +endif +" ___vital___ +let s:save_cpo = &cpo +set cpo&vim + + + +function! s:echo(hl, msg) abort + execute 'echohl' a:hl + try + echo a:msg + finally + echohl None + endtry +endfunction + +function! s:echomsg(hl, msg) abort + execute 'echohl' a:hl + try + for m in split(a:msg, "\n") + echomsg m + endfor + finally + echohl None + endtry +endfunction + +function! s:error(msg) abort + call s:echomsg('ErrorMsg', a:msg) +endfunction + +function! s:warn(msg) abort + call s:echomsg('WarningMsg', a:msg) +endfunction + +function! s:capture(command) abort + try + redir => out + silent execute a:command + finally + redir END + endtry + return out +endfunction + +" * Get max length of |hit-enter|. +" If a string length of a message is greater than the max length, +" Vim waits for user input according to |hit-enter|. +" XXX: Those fixed values may be different between different OSes? +" Currently tested on only Windows. +function! s:get_hit_enter_max_length() abort + let maxlen = &columns * &cmdheight - 1 + if &ruler + " TODO + endif + if &showcmd + let maxlen -= 11 + endif + return maxlen +endfunction + + + +let &cpo = s:save_cpo +unlet s:save_cpo + +" vim:set et ts=2 sts=2 sw=2 tw=0: diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/easymotion.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/easymotion.vim new file mode 100644 index 0000000..d428cc2 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/easymotion.vim @@ -0,0 +1,339 @@ +let s:plugin_name = expand(':t:r') +let s:vital_base_dir = expand(':h') +let s:project_root = expand(':h:h:h') +let s:is_vital_vim = s:plugin_name is# 'vital' + +let s:loaded = {} +let s:cache_sid = {} + +" function() wrapper +if v:version > 703 || v:version == 703 && has('patch1170') + function! s:_function(fstr) abort + return function(a:fstr) + endfunction +else + function! s:_SID() abort + return matchstr(expand(''), '\zs\d\+\ze__SID$') + endfunction + let s:_s = '' . s:_SID() . '_' + function! s:_function(fstr) abort + return function(substitute(a:fstr, 's:', s:_s, 'g')) + endfunction +endif + +function! vital#{s:plugin_name}#new() abort + return s:new(s:plugin_name) +endfunction + +function! vital#{s:plugin_name}#import(...) abort + if !exists('s:V') + let s:V = s:new(s:plugin_name) + endif + return call(s:V.import, a:000, s:V) +endfunction + +let s:Vital = {} + +function! s:new(plugin_name) abort + let base = deepcopy(s:Vital) + let base._plugin_name = a:plugin_name + return base +endfunction + +function! s:vital_files() abort + if !exists('s:vital_files') + let s:vital_files = map( + \ s:is_vital_vim ? s:_global_vital_files() : s:_self_vital_files(), + \ 'fnamemodify(v:val, ":p:gs?[\\\\/]?/?")') + endif + return copy(s:vital_files) +endfunction +let s:Vital.vital_files = s:_function('s:vital_files') + +function! s:import(name, ...) abort dict + let target = {} + let functions = [] + for a in a:000 + if type(a) == type({}) + let target = a + elseif type(a) == type([]) + let functions = a + endif + unlet a + endfor + let module = self._import(a:name) + if empty(functions) + call extend(target, module, 'keep') + else + for f in functions + if has_key(module, f) && !has_key(target, f) + let target[f] = module[f] + endif + endfor + endif + return target +endfunction +let s:Vital.import = s:_function('s:import') + +function! s:load(...) abort dict + for arg in a:000 + let [name; as] = type(arg) == type([]) ? arg[: 1] : [arg, arg] + let target = split(join(as, ''), '\W\+') + let dict = self + let dict_type = type({}) + while !empty(target) + let ns = remove(target, 0) + if !has_key(dict, ns) + let dict[ns] = {} + endif + if type(dict[ns]) == dict_type + let dict = dict[ns] + else + unlet dict + break + endif + endwhile + if exists('dict') + call extend(dict, self._import(name)) + endif + unlet arg + endfor + return self +endfunction +let s:Vital.load = s:_function('s:load') + +function! s:unload() abort dict + let s:loaded = {} + let s:cache_sid = {} + unlet! s:vital_files +endfunction +let s:Vital.unload = s:_function('s:unload') + +function! s:exists(name) abort dict + if a:name !~# '\v^\u\w*%(\.\u\w*)*$' + throw 'vital: Invalid module name: ' . a:name + endif + return s:_module_path(a:name) isnot# '' +endfunction +let s:Vital.exists = s:_function('s:exists') + +function! s:search(pattern) abort dict + let paths = s:_extract_files(a:pattern, self.vital_files()) + let modules = sort(map(paths, 's:_file2module(v:val)')) + return s:_uniq(modules) +endfunction +let s:Vital.search = s:_function('s:search') + +function! s:plugin_name() abort dict + return self._plugin_name +endfunction +let s:Vital.plugin_name = s:_function('s:plugin_name') + +function! s:_self_vital_files() abort + let builtin = printf('%s/__%s__/', s:vital_base_dir, s:plugin_name) + let installed = printf('%s/_%s/', s:vital_base_dir, s:plugin_name) + let base = builtin . ',' . installed + return split(globpath(base, '**/*.vim', 1), "\n") +endfunction + +function! s:_global_vital_files() abort + let pattern = 'autoload/vital/__*__/**/*.vim' + return split(globpath(&runtimepath, pattern, 1), "\n") +endfunction + +function! s:_extract_files(pattern, files) abort + let tr = {'.': '/', '*': '[^/]*', '**': '.*'} + let target = substitute(a:pattern, '\.\|\*\*\?', '\=tr[submatch(0)]', 'g') + let regexp = printf('autoload/vital/[^/]\+/%s.vim$', target) + return filter(a:files, 'v:val =~# regexp') +endfunction + +function! s:_file2module(file) abort + let filename = fnamemodify(a:file, ':p:gs?[\\/]?/?') + let tail = matchstr(filename, 'autoload/vital/_\w\+/\zs.*\ze\.vim$') + return join(split(tail, '[\\/]\+'), '.') +endfunction + +" @param {string} name e.g. Data.List +function! s:_import(name) abort dict + if has_key(s:loaded, a:name) + return copy(s:loaded[a:name]) + endif + let module = self._get_module(a:name) + if has_key(module, '_vital_created') + call module._vital_created(module) + endif + let export_module = filter(copy(module), 'v:key =~# "^\\a"') + " Cache module before calling module.vital_loaded() to avoid cyclic + " dependences but remove the cache if module._vital_loaded() fails. + " let s:loaded[a:name] = export_module + let s:loaded[a:name] = export_module + if has_key(module, '_vital_loaded') + try + call module._vital_loaded(vital#{s:plugin_name}#new()) + catch + unlet s:loaded[a:name] + throw 'vital: fail to call ._vital_loaded(): ' . v:exception + endtry + endif + return copy(s:loaded[a:name]) +endfunction +let s:Vital._import = s:_function('s:_import') + +" s:_get_module() returns module object wihch has all script local functions. +function! s:_get_module(name) abort dict + let funcname = s:_import_func_name(self.plugin_name(), a:name) + if s:_exists_autoload_func_with_source(funcname) + return call(funcname, []) + else + return s:_get_builtin_module(a:name) + endif +endfunction + +function! s:_get_builtin_module(name) abort + return s:sid2sfuncs(s:_module_sid(a:name)) +endfunction + +if s:is_vital_vim + " For vital.vim, we can use s:_get_builtin_module directly + let s:Vital._get_module = s:_function('s:_get_builtin_module') +else + let s:Vital._get_module = s:_function('s:_get_module') +endif + +function! s:_import_func_name(plugin_name, module_name) abort + return printf('vital#_%s#%s#import', a:plugin_name, s:_dot_to_sharp(a:module_name)) +endfunction + +function! s:_module_sid(name) abort + let path = s:_module_path(a:name) + if !filereadable(path) + throw 'vital: module not found: ' . a:name + endif + let vital_dir = s:is_vital_vim ? '__\w\+__' : printf('_\{1,2}%s\%%(__\)\?', s:plugin_name) + let base = join([vital_dir, ''], '[/\\]\+') + let p = base . substitute('' . a:name, '\.', '[/\\\\]\\+', 'g') + let sid = s:_sid(path, p) + if !sid + call s:_source(path) + let sid = s:_sid(path, p) + if !sid + throw printf('vital: cannot get from path: %s', path) + endif + endif + return sid +endfunction + +function! s:_module_path(name) abort + return get(s:_extract_files(a:name, s:vital_files()), 0, '') +endfunction + +function! s:_module_sid_base_dir() abort + return s:is_vital_vim ? &rtp : s:project_root +endfunction + +function! s:_dot_to_sharp(name) abort + return substitute(a:name, '\.', '#', 'g') +endfunction + +" It will sources autoload file if a given func is not already defined. +function! s:_exists_autoload_func_with_source(funcname) abort + if exists('*' . a:funcname) + " Return true if a given func is already defined + return 1 + endif + " source a file which may include a given func definition and try again. + let path = 'autoload/' . substitute(substitute(a:funcname, '#[^#]*$', '.vim', ''), '#', '/', 'g') + call s:_runtime(path) + return exists('*' . a:funcname) +endfunction + +function! s:_runtime(path) abort + execute 'runtime' fnameescape(a:path) +endfunction + +function! s:_source(path) abort + execute 'source' fnameescape(a:path) +endfunction + +" @vimlint(EVL102, 1, l:_) +" @vimlint(EVL102, 1, l:__) +function! s:_sid(path, filter_pattern) abort + let unified_path = s:_unify_path(a:path) + if has_key(s:cache_sid, unified_path) + return s:cache_sid[unified_path] + endif + for line in filter(split(s:_redir(':scriptnames'), "\n"), 'v:val =~# a:filter_pattern') + let [_, sid, path; __] = matchlist(line, '^\s*\(\d\+\):\s\+\(.\+\)\s*$') + if s:_unify_path(path) is# unified_path + let s:cache_sid[unified_path] = sid + return s:cache_sid[unified_path] + endif + endfor + return 0 +endfunction + +function! s:_redir(cmd) abort + let [save_verbose, save_verbosefile] = [&verbose, &verbosefile] + set verbose=0 verbosefile= + redir => res + silent! execute a:cmd + redir END + let [&verbose, &verbosefile] = [save_verbose, save_verbosefile] + return res +endfunction + +if filereadable(expand(':r') . '.VIM') " is case-insensitive or not + let s:_unify_path_cache = {} + " resolve() is slow, so we cache results. + " Note: On windows, vim can't expand path names from 8.3 formats. + " So if getting full path via and $HOME was set as 8.3 format, + " vital load duplicated scripts. Below's :~ avoid this issue. + function! s:_unify_path(path) abort + if has_key(s:_unify_path_cache, a:path) + return s:_unify_path_cache[a:path] + endif + let value = tolower(fnamemodify(resolve(fnamemodify( + \ a:path, ':p')), ':~:gs?[\\/]?/?')) + let s:_unify_path_cache[a:path] = value + return value + endfunction +else + function! s:_unify_path(path) abort + return resolve(fnamemodify(a:path, ':p:gs?[\\/]?/?')) + endfunction +endif + +" copied and modified from Vim.ScriptLocal +let s:SNR = join(map(range(len("\")), '"[\\x" . printf("%0x", char2nr("\"[v:val])) . "]"'), '') +function! s:sid2sfuncs(sid) abort + let fs = split(s:_redir(printf(':function /^%s%s_', s:SNR, a:sid)), "\n") + let r = {} + let pattern = printf('\m^function\s%d_\zs\w\{-}\ze(', a:sid) + for fname in map(fs, 'matchstr(v:val, pattern)') + let r[fname] = function(s:_sfuncname(a:sid, fname)) + endfor + return r +endfunction + +"" Return funcname of script local functions with SID +function! s:_sfuncname(sid, funcname) abort + return printf('%s_%s', a:sid, a:funcname) +endfunction + +if exists('*uniq') + function! s:_uniq(list) abort + return uniq(a:list) + endfunction +else + function! s:_uniq(list) abort + let i = len(a:list) - 1 + while 0 < i + if a:list[i] ==# a:list[i - 1] + call remove(a:list, i) + endif + let i -= 1 + endwhile + return a:list + endfunction +endif diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/easymotion.vital b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/easymotion.vital new file mode 100644 index 0000000..82ea097 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/autoload/vital/easymotion.vital @@ -0,0 +1,20 @@ +easymotion +882de6964d10595e839ccbcc0fb20b7ff14e43cb + +Over.Commandline.Base +Over.Commandline.Modules.Cancel +Over.Commandline.Modules.BufferComplete +Over.Commandline.Modules.Paste +Over.Commandline.Modules.KeyMapping +Over.Commandline.Modules.Doautocmd +Over.Commandline.Modules.CursorMove +Over.Commandline.Modules.Delete +Over.Commandline.Modules.Redraw +Over.Commandline.Modules.InsertRegister +Over.Commandline.Modules.History +Over.Commandline.Modules.NoInsert +Over.Commandline.Modules.Exit +Over.Commandline.Modules.DrawCommandline +Over.Commandline.Modules.ExceptionMessage +Over.Commandline.Modules.ExceptionExit +HitAHint.Motion diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/doc/easymotion.txt b/home-rc/dot-files/.vim/bundle/vim-easymotion/doc/easymotion.txt new file mode 100644 index 0000000..1998112 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/doc/easymotion.txt @@ -0,0 +1,1255 @@ +*easymotion.txt* Version 3.0 + + + ______ __ ___ __ _ + / ____/____ ________ __/ |/ /____ / /_(_)____ ____ + / __/ / __ `/ ___/ / / / /|_/ // __ \/ __/ // __ \/ __ \ + / /___ / /_/ (__ ) /_/ / / / // /_/ / /_/ // /_/ / / / / + /_____/ \__,_/____/\__, /_/ /_/ \____/\__/_/ \____/_/ /_/ + /____/ + - Vim motions on speed! + + +============================================================================== +CONTENTS *easymotion-contents* + + Introduction ....................... |easymotion-introduction| + Usage .............................. |easymotion-usage| + Default mappings ................ |easymotion-default-mappings| + More mappings ................... |easymotion-more-mappings| + Requirements ....................... |easymotion-requirements| + Configuration ...................... |easymotion-configuration| + EasyMotion_keys ................. |EasyMotion_keys| + EasyMotion_do_shade ............. |EasyMotion_do_shade| + EasyMotion_do_mapping ........... |EasyMotion_do_mapping| + EasyMotion_grouping ............. |EasyMotion_grouping| + EasyMotion_smartcase ............ |EasyMotion_smartcase| + EasyMotion_smartsign ............ |EasyMotion_smartsign| + EasyMotion_use_migemo ........... |EasyMotion_use_migemo| + EasyMotion_use_upper ........... |EasyMotion_use_upper| + EasyMotion_enter_jump_first ..... |EasyMotion_enter_jump_first| + EasyMotion_prompt ............... |EasyMotion_prompt| + EasyMotion_highlight ............ |EasyMotion_highlight| + EasyMotion_add_search_history ... |EasyMotion_add_search_history| + EasyMotion_off_screen_search .... |EasyMotion_off_screen_search| + EasyMotion_disable_two_key_combo. |EasyMotion_disable_two_key_combo| + EasyMotion_verbose .............. |EasyMotion_verbose| + Custom highlighting ............. |easymotion-custom-hl| + Custom mappings ................. |easymotion-custom-mappings| + Leader key .................. |easymotion-leader-key| + Custom keys ................. |easymotion-custom-keys| + Autocommands .................... |easymotion-autocommands| + License ............................ |easymotion-license| + Known bugs ......................... |easymotion-known-bugs| + Contributing ....................... |easymotion-contributing| + Credits ............................ |easymotion-credits| + +============================================================================== +Introduction *easymotion* *easymotion-introduction* + +EasyMotion provides a much simpler way to use some motions in vim. It takes +the out of w or f{char} by highlighting all possible +choices and allowing you to press one key to jump directly to the target. + +When one of the available motions is triggered, all visible text preceding or +following the cursor is faded, and motion targets are highlighted. + +============================================================================== +Usage *easymotion-usage* + +EasyMotion is triggered by one of the provided mappings (see +|easymotion-default-mappings| for details). + +Example: > + + Lorem ipsum dolor sit amet. + +Type w to trigger the word motion |w|. See +|easymotion-leader-key| for details about the leader key. When the +motion is triggered, the text is updated (no braces are actually added, +the text is highlighted in red by default): > + + Lorem {a}psum {b}olor {c}it {d}met. + +Press "c" to jump to the beginning of the word "sit": > + + Lorem ipsum dolor sit amet. + +Similarly, if you're looking for an "o", you can use the |f| motion. +Type fo, and all "o" characters are highlighted: > + + L{a}rem ipsum d{b}l{c}r sit amet. + +Press "b" to jump to the second "o": > + + Lorem ipsum dolor sit amet. + +And that's it! + +------------------------------------------------------------------------------ +Default mappings *easymotion-default-mappings* + +The default configuration defines the following mappings in normal, +visual and operator-pending mode if |g:EasyMotion_do_mapping| is on: + +Note: The default leader has been changed to to avoid + conflicts with other plugins you may have installed + + Default Mapping | Details + ---------------------|---------------------------------------------- + f{char} | Find {char} to the right. See |f|. + F{char} | Find {char} to the left. See |F|. + t{char} | Till before the {char} to the right. See |t|. + T{char} | Till after the {char} to the left. See |T|. + w | Beginning of word forward. See |w|. + W | Beginning of WORD forward. See |W|. + b | Beginning of word backward. See |b|. + B | Beginning of WORD backward. See |B|. + e | End of word forward. See |e|. + E | End of WORD forward. See |E|. + ge | End of word backward. See |ge|. + gE | End of WORD backward. See |gE|. + j | Line downward. See |j|. + k | Line upward. See |k|. + n | Jump to latest "/" or "?" forward. See |n|. + N | Jump to latest "/" or "?" backward. See |N|. + s | Find(Search) {char} forward and backward. + | See |f| and |F|. + +See |easymotion-leader-key| and |mapleader| for details about the leader key. +See |easymotion-custom-mappings| for customizing the default mappings. + +EasyMotion table *easymotion-plug-table* + + Mapping Table | Default + ---------------------|---------------------------------------------- + (easymotion-f) | f{char} + (easymotion-F) | F{char} + (easymotion-t) | t{char} + (easymotion-T) | T{char} + (easymotion-w) | w + (easymotion-W) | W + (easymotion-b) | b + (easymotion-B) | B + (easymotion-e) | e + (easymotion-E) | E + (easymotion-ge)| ge + (easymotion-gE)| gE + (easymotion-j) | j + (easymotion-k) | k + (easymotion-n) | n + (easymotion-N) | N + (easymotion-s) | s + + More Mapping Table | (No assignment by default) + ----------------------------------|--------------------------------- + (easymotion-bd-f) | See |(easymotion-s)| + (easymotion-bd-t) | See |(easymotion-bd-t)| + (easymotion-bd-w) | See |(easymotion-bd-w)| + (easymotion-bd-W) | See |(easymotion-bd-W)| + (easymotion-bd-e) | See |(easymotion-bd-e)| + (easymotion-bd-E) | See |(easymotion-bd-E)| + (easymotion-bd-jk) | See |(easymotion-bd-jk)| + (easymotion-bd-n) | See |(easymotion-bd-n)| + (easymotion-jumptoanywhere) | See |(easymotion-jumptoanywhere)| + (easymotion-repeat) | See |(easymotion-repeat)| + (easymotion-next) | See |(easymotion-next)| + (easymotion-prev) | See |(easymotion-prev)| + (easymotion-sol-j) | See |(easymotion-sol-j)| + (easymotion-sol-k) | See |(easymotion-sol-k)| + (easymotion-eol-j) | See |(easymotion-eol-j)| + (easymotion-eol-k) | See |(easymotion-eol-k)| + (easymotion-iskeyword-w) | See |(easymotion-iskeyword-w)| + (easymotion-iskeyword-b) | See |(easymotion-iskeyword-b)| + (easymotion-iskeyword-bd-w) | See |(easymotion-iskeyword-bd-w)| + (easymotion-iskeyword-e) | See |(easymotion-iskeyword-e)| + (easymotion-iskeyword-ge) | See |(easymotion-iskeyword-ge)| + (easymotion-iskeyword-bd-e) | See |(easymotion-iskeyword-bd-e)| + (easymotion-vim-n) | See |(easymotion-vim-n)| + (easymotion-vim-N) | See |(easymotion-vim-N)| + | + Within Line Motion | See |easymotion-within-line| + ----------------------------------|--------------------------------- + (easymotion-sl) | See |(easymotion-sl)| + (easymotion-fl) | See |(easymotion-fl)| + (easymotion-Fl) | See |(easymotion-Fl)| + (easymotion-bd-fl) | See |(easymotion-sl)| + (easymotion-tl) | See |(easymotion-tl)| + (easymotion-Tl) | See |(easymotion-Tl)| + (easymotion-bd-tl) | See |(easymotion-bd-tl)| + (easymotion-wl) | See |(easymotion-wl)| + (easymotion-bl) | See |(easymotion-bl)| + (easymotion-bd-wl) | See |(easymotion-bd-wl)| + (easymotion-el) | See |(easymotion-el)| + (easymotion-gel) | See |(easymotion-gel)| + (easymotion-bd-el) | See |(easymotion-bd-el)| + (easymotion-lineforward) | See |(easymotion-lineforward)| + (easymotion-linebackward) | See |(easymotion-linebackward)| + (easymotion-lineanywhere) | See |(easymotion-lineanywhere)| + | + Multi Input Find Motion | See |easymotion-multi-input| + ----------------------------------|--------------------------------- + (easymotion-s2) | See |(easymotion-s2)| + (easymotion-f2) | See |(easymotion-f2)| + (easymotion-F2) | See |(easymotion-F2)| + (easymotion-bd-f2) | See |(easymotion-s2)| + (easymotion-t2) | See |(easymotion-t2)| + (easymotion-T2) | See |(easymotion-T2)| + (easymotion-bd-t2) | See |(easymotion-bd-t2)| + | + (easymotion-sl2) | See |(easymotion-sl2)| + (easymotion-fl2) | See |(easymotion-fl2)| + (easymotion-Fl2) | See |(easymotion-Fl2)| + (easymotion-tl2) | See |(easymotion-tl2)| + (easymotion-Tl2) | See |(easymotion-Tl2)| + | + (easymotion-sn) | See |(easymotion-sn)| + (easymotion-fn) | See |(easymotion-fn)| + (easymotion-Fn) | See |(easymotion-Fn)| + (easymotion-bd-fn) | See |(easymotion-sn)| + (easymotion-tn) | See |(easymotion-tn)| + (easymotion-Tn) | See |(easymotion-Tn)| + (easymotion-bd-tn) | See |(easymotion-bd-tn)| + | + (easymotion-sln) | See |(easymotion-sln)| + (easymotion-fln) | See |(easymotion-fln)| + (easymotion-Fln) | See |(easymotion-Fln)| + (easymotion-bd-fln) | See |(easymotion-sln)| + (easymotion-tln) | See |(easymotion-tln)| + (easymotion-Tln) | See |(easymotion-Tln)| + (easymotion-bd-tln) | See |(easymotion-bd-tln)| + + Over Window Motion | (No assignment by default) + ----------------------------------|--------------------------------- + (easymotion-overwin-f) | See |(easymotion-overwin-f)| + (easymotion-overwin-f2) | See |(easymotion-overwin-f2)| + (easymotion-overwin-line) | See |(easymotion-overwin-line)| + (easymotion-overwin-w) | See |(easymotion-overwin-w)| + +------------------------------------------------------------------------------ +More mappings *easymotion-more-mappings* + +These mappings are not mapped by Default. + +Bidirection ~ + + Note: bd is short for bidirectional + +(easymotion-s) *(easymotion-s)* + *(easymotion-bd-f)* + Find {char} to bidirection(forward and backward at the same + time.) See |f| & |F|. + +(easymotion-bd-t) *(easymotion-bd-t)* + Till before & after the {char}. See |t| & |T|. + +(easymotion-bd-w) *(easymotion-bd-w)* + Beginning of word forward and backward. See |w| & |b|. + +(easymotion-bd-W) *(easymotion-bd-W)* + Beginning of WORD forward and backward. See |W| & |B|. + +(easymotion-bd-e) *(easymotion-bd-e)* + End of word forward and backward. See |e| & |ge|. + +(easymotion-bd-E) *(easymotion-bd-E)* + End of WORD forward and backward. See |E| & |gE|. + +(easymotion-bd-jk) *(easymotion-bd-jk)* + Line downward and upward. See |j| & |k|. + +(easymotion-bd-n) *(easymotion-bd-n)* + Jump to latest "/" or "?" forward. See |n| & |N|. + + *easymotion-overwin-motions* +Overwin Motions~ + +Overwin motions supports moving cursor across/over |window|. Since it +doesn't make sense that moving cursor to other window while |Visual| or +|Operator-pending| mode, overwin motions only provides mappings for |Normal| +mode. Please use |nmap| to use overwin motions. overwin motions only +supports bi-directional motions. + +(easymotion-overwin-f){char} *n_(easymotion-overwin-f)* + Like |(easymotion-s)| or |(easymotion-bd-f)|, but + supports moving cursor to other window. > + nmap f (easymotion-overwin-f) + xmap f (easymotion-bd-f) + omap f (easymotion-bd-f) +< +(easymotion-overwin-f2){char}{char} *n_(easymotion-overwin-f2)* + Like |(easymotion-s2)| or |(easymotion-bd-f2)|, + but supports moving cursor to other window. > + nmap s (easymotion-overwin-f2) + xmap s (easymotion-bd-f2) + omap s (easymotion-bd-f2) +< +(easymotion-overwin-line) *n_(easymotion-overwin-line)* + Like |(easymotion-bd-jk)| but supports moving cursor to + other window. > + nmap L (easymotion-overwin-line) + xmap L (easymotion-bd-jk) + omap L (easymotion-bd-jk) +< +(easymotion-overwin-w) *n_(easymotion-overwin-w)* + Like |(easymotion-bd-w)| but supports moving cursor to + other window. > + nmap w (easymotion-overwin-w) + xmap w (easymotion-bd-w) + omap w (easymotion-bd-w) +< +For overwin n-character find motions~ + *easymotion-do-not-support-overwin-n-char-motions* + Overwin n-character find motions is equivalent to + *(easymotion-overwin-sn)* (doesn't exist. It's like + |(easymotion-sn)| but supports moving cursor to other + window). + EasyMotion itself doesn't support this mapping, but with + |incsearch.vim|[1] and incsearch-easymotion.vim[2], you can get + equivalent mappings. incsearch.vim is more compatible with + Vim's default search and it works with EasyMotion. + + [1] https://github.com/haya14busa/incsearch.vim + [2] https://github.com/haya14busa/incsearch-easymotion.vim +> + " You can use other keymappings like instead of if you want to + " use these mappings as default search and somtimes want to move cursor with + " EasyMotion. + function! s:incsearch_config(...) abort + return incsearch#util#deepextend(deepcopy({ + \ 'modules': [incsearch#config#easymotion#module({'overwin': 1)], + \ 'keymap': { + \ "\": '(easymotion)' + \ }, + \ 'is_expr': 0 + \ }), get(a:, 1, {})) + endfunction + + noremap / incsearch#go(incsearch_config()) + noremap ? incsearch#go(incsearch_config({'command': '?'})) + noremap g/ incsearch#go(incsearch_config({'is_stay': 1})) +< + *easymotion-overwin-limitation* +Since archtecture of overwin motions is different from other easymotion +motions, there are some limitations. + + 1. Highlight for target is always EasyMotionTarget (|EasyMotion_highlight|) + even for two key targets. + +Jump To Anywhere ~ + +(easymotion-jumptoanywhere) *(easymotion-jumptoanywhere)* + JumpToAnywhere motion! + Default: Beginning and End of word, Camelcase, after '_', + and after '#'. + You can modify this motion behavior by vimrc + + |g:EasyMotion_re_anywhere|: *g:EasyMotion_re_anywhere* +> + let g:EasyMotion_re_anywhere = '\v' . + \ '(<.|^$)' . '|' . + \ '(.>|^$)' . '|' . + \ '(\l)\zs(\u)' . '|' . + \ '(_\zs.)' . '|' . + \ '(#\zs.)' +< + Modified example: +> + let g:EasyMotion_re_anywhere = '\v' . + \ '(<.|^)' . '|' . + \ '(<.|.$)' . '|' . + \ '(\l)\zs(\u)' . '|' . +< +Repeat ~ + +(easymotion-repeat) *(easymotion-repeat)* + Repeat last motion! + + Repeat last motion type including input target character. + Nothing will happen when previous motion doesn't exist. + + Last Find Motion~ + With a Find motion (e.g. |(easymotion-s)| ), type `` + without input characters to invoke the last find motion. This does + not repeat the motion type (e.g. other word motion, + (easymotion-j) etc...) only input characters. + +(easymotion-next) *(easymotion-next)* +(easymotion-prev) *(easymotion-prev)* + + Jump to next/previous match. This is the only motion that can move to + off-screen locations. With set |'wrapscan'| enabled, this motion will + also wrap around the end of the file. During this motion, matched + text is highlighted. If you don't want highlighting, set + |g:EasyMotion_move_highlight| to 0. + + Example: +> + nmap ; (easymotion-next) + nmap , (easymotion-prev) +< + This feature is inspired by and based on vim-sneak. vim-sneak can be + downloaded here: https://github.com/justinmk/vim-sneak + +EasyMotion dot repeat~ + *easymotion-dotrepeat* *easymotion-textobject* + + This feature requires tpope/vim-repeat + https://github.com/tpope/vim-repeat + + All motions support '.' repeat. + + Example: +> + " vimrc: + omap z (easymotion-t) + let g:EasyMotion_keys='hklyuiopnm,qwertzxcvbasdgjf;' +< + Text sample: +> + {cursor}Lorem ipsum dolor sit ame*t*, consectetur adipisicing eli*t*, + sed do eiusmod tempor +< + type `dzt` and type first target marker(in this case, `h`) +> + {cursor}*t*, consectetur adipisicing eli*t,* sed do eiusmod tempor +< + from here type '`.`' and you get: +> + *t,* sed do eiusmod tempor +< + +JK Motion ~ + *easymotion-jk-motion* + +JK motion option *(easymotion-j)* *(easymotion-k)* + *g:EasyMotion_startofline* + + The default behavior of the |j| and |k| keys is to move your cursor to + the start of the line. Set this option to 0 to force the cursor to stay + in the same column. If you want to use both movements as separate + mappings, set |'g:EasyMotion_startofline'| to 0 and map + |(easymotion-sol-j)| & |(easymotion-sol-k)| to the start + of line mapping: +> + let g:EasyMotion_startofline = 0 # keep cursor colum JK motion + map J (easymotion-sol-j) + map K (easymotion-sol-k) +< +Default: 1 + +Start of Line JK motion *(easymotion-sol-j)* *(easymotion-sol-k)* + *(easymotion-sol-bd-jk)* + + Start of line J/K motion + Example: +> + map J (easymotion-sol-j) + map K (easymotion-sol-k) +< +End of Line JK motion *(easymotion-eol-j)* *(easymotion-eol-k)* + *(easymotion-eol-bd-jk)* + + End of line J/K motion + Example: +> + map J (easymotion-eol-j) + map K (easymotion-eol-K) +< + +iskeyword compatible word motions *(easymotion-iskeyword-w)* + *(easymotion-iskeyword-b)* + *(easymotion-iskeyword-bd-w)* + *(easymotion-iskeyword-e)* + *(easymotion-iskeyword-ge)* + *(easymotion-iskeyword-bd-e)* + Default word motions which EasyMotion provide is not completely + compatible with |iskeyword| options. But if you make default word + motion completely compatible with it, there will be so many targets + that they maybe annoy you, so provide |iskeyword| compatible word + motions with another || mappings. + + Example: +> + map w (easymotion-iskeyword-w) + map b (easymotion-iskeyword-b) +< + NOTE: Within line motions are compatible with |iskeyword| by default. + +Search motion respect previous direction + + (easymotion-vim-n) *(easymotion-vim-n)* + (easymotion-vim-N) *(easymotion-vim-N)* + + This is vim compatible |n| & |N| easymotion. Unlike |(easymotion-n)| + and |(easymotion-N)| 's direction is always forward or backward, + these motions consider previous search direction. + +Within line motion ~ + *easymotion-within-line* + +(easymotion-sl) *(easymotion-sl)* + *(easymotion-bd-fl)* + This function is same as |(easymotion-s)|, except the range + is limited to the current cursor line. + +(easymotion-fl) *(easymotion-fl)* + This function is same as |(easymotion-f)|, except the range + is limited to the current cursor line. + +(easymotion-Fl) *(easymotion-Fl)* + This function is same as |(easymotion-F)|, except the range + is limited to the current cursor line. + +(easymotion-tl) *(easymotion-tl)* + This function is same as |(easymotion-t)|, except the + range is limited to the current cursor line. + +(easymotion-Tl) *(easymotion-Tl)* + This function is same as |(easymotion-T)|, except the + range is limited to the current cursor line. + +(easymotion-bd-tl) *(easymotion-bd-tl)* + This function is same as |(easymotion-bd-t)|, except the + range is limited to the current cursor line. + +(easymotion-wl) *(easymotion-wl)* + This function is same as |(easymotion-iskeyword-w)|, + except the range is limited to the current cursor line. + +(easymotion-bl) *(easymotion-bl)* + This function is same as |(easymotion-iskeyword-b)|, + except the range is limited to the current cursor line. + +(easymotion-bd-wl) *(easymotion-bd-wl)* + This function is same as |(easymotion-iskeyword-bd-w)|, + except the range is limited to the current cursor line. + +(easymotion-el) *(easymotion-el)* + This function is same as |(easymotion-iskeyword-e)|, + except the range is limited to the current cursor line. + +(easymotion-gel) *(easymotion-gel)* + This function is same as |(easymotion-iskeyword-ge)|, + except the range is limited to the current cursor line. + +(easymotion-bd-el) *(easymotion-bd-el)* + This function is same as |(easymotion-iskeyword-bd-e)|, + except the range is limited to the current cursor line. + +(easymotion-lineforward) *(easymotion-lineforward)* + This function is similar to + |(easymotion-jumptoanywhere)|, except the range is + limited to the current cursor line in the forward direction. + +(easymotion-linebackward) *(easymotion-linebackward)* + This function is similar to + |(easymotion-jumptoanywhere)|, except the range is + limited to the current cursor line in the backward direction. + +(easymotion-lineanywhere) *(easymotion-lineanywhere)* + This function is same as |(easymotion-jumptoanywhere)|, + but limited to within the current cursor line. + + You can customize the behavior of this function in your + vimrc. + + |g:EasyMotion_re_line_anywhere|: *g:EasyMotion_re_line_anywhere* + + Default: +> + let g:EasyMotion_re_line_anywhere = '\v' . + \ '(<.|^$)' . '|' . + \ '(.>|^$)' . '|' . + \ '(\l)\zs(\u)' . '|' . + \ '(_\zs.)' . '|' . + \ '(#\zs.)' +< + Modified example: +> + let g:EasyMotion_re_line_anywhere = '\v' . + \ '(<.|^)' . '|' . + \ '(>.|.$)' . '|' . + \ '(\l)\zs(\u)' . '|' . + +Multi Input Find Motion!~ +All Find motions (s,f,F,t,T,sl,fl,Fl,tl,Tl, see below) support this feature! +(|l| means within line motion) + *easymotion-multi-input* *easymotion-two-key* *easymotion-{find}n* + *(easymotion-{find}n)* *(easymotion-{find}2)* + *(easymotion-s2)* *(easymotion-f2)* *(easymotion-F2)* + *(easymotion-t2)* *(easymotion-T2)* + *(easymotion-bd-f2)* *(easymotion-bd-t2)* + *(easymotion-sl2)* *(easymotion-fl2)* *(easymotion-Fl2)* + *(easymotion-tl2)* *(easymotion-Tl2)* + *(easymotion-bd-fl2)* *(easymotion-bd-tl2)* + + *(easymotion-sn)* *(easymotion-fn)* *(easymotion-Fn)* + *(easymotion-tn)* *(easymotion-Tn)* *(easymotion-bd-tn)* + *(easymotion-sln)* *(easymotion-fln)* *(easymotion-Fln)* + *(easymotion-tln)* *(easymotion-Tln)* *(easymotion-bd-tln)* + +EasyMotion provide another find motion by multi input target. + +Example: +> + nmap s (easymotion-s2) + xmap s (easymotion-s2) + omap z (easymotion-s2) + nmap s (easymotion-sn) + xmap s (easymotion-sn) + omap z (easymotion-sn) +< +If you like typing two or more characters as targets, similar to vim-smalls +or vim-seek/vim-sneak, |EasyMotion| also provide this feature. With the above +keymapping, + + Invoke EasyMotion by two character: + + s{char}{char} (Type s{char} to use just one {char} is also allowed) + + And you can use as many target characters as you like: + + s{char}{char}{char}... + + You can use to delete while typing, and Vim's default |n| & |N| + keymappings works after this motion(|(easymotion-sn)|) to move next or + previous matches. + + Note: the 'n' key motion provides incremental highlighting. If you don't + want to highlight incrementally, set |g:EasyMotion_inc_highlight| + to 0. +> + let g:EasyMotion_inc_highlight = 0 +< + +Find Motion Command Line~ + *easymotion-command-line* + EasyMotion has own command line for find motions, especially for + 'n' key motion(e.g. |(easymotion-sn)|). This command is inspired + by over.vim and actually uses over.vim's library. over.vim can be + downloaded here: + + https://github.com/osyo-manga/vim-over + + Library: https://github.com/osyo-manga/vital-over + + Note: These settings are experimental. They may be changed in the near + future. + + Default Command Line Mappings~ + Most default mappings work the same as the default command line mappings + of Vim. See |cmdline.txt| + + Key Mappings | Details + ----------------------- |---------------------------------------------- + | Execute EasyMotion. + or | Cancel + or | Cursor right + or | Cursor left + or | cursor to beginning of command-line + or | cursor to end of command-line + or | Delete one character + | Delete one character at the cursor pos + | Delete the word before the cursor + | Delete all entered characters before the cursor + or | Recall older (previous) search from history + or | Recall more recent (next) search from history + {0-9a-z"%#:-=.} | Insert Register. See |c_Ctrl-R| + | Insert the Word under cursor + | Insert the |WORD| under cursor + | Insert the Filename under cursor + ------------------------|--------------------------------------- + (paste) | Paste yanked text to the command line + | Default: + (buffer-complete) | Completion of buffer text Default: + *(em-scroll-f)* | Scroll window forward & jump to the next match + | Default: + *(em-scroll-b)* | Scroll window backward & jump to previous match + | Default: + *(em-jumpback)* | Jump back original cursor position like + | Default: + *(em-openallfold)* | Open all fold + | Default: + + Customize Command Line Mappings~ + *EMCommandLineNoreMap* + + You can use |EMCommandLineNoreMap| (like |cnoremap|) to customize find + motion command line key mappings in your vimrc. This mapping is always + nonrecursive, so you should map to |(em-scroll-f)| and not . + + Example: +> + " == EM is short for EasyMotion + " Enter by to excute faster & easily + EMCommandLineNoreMap + EMCommandLineNoreMap + " Enter by `;` to excute faster & easily + EMCommandLineNoreMap ; + EMCommandLineNoreMap ; + " Buffer Completion with Ctrl-D + EMCommandLineNoreMap (buffer-complete) +< + *EMCommandLineMap* + *EMCommandLineUnMap* + EasyMotion also provide |EMCommandLineMap| (like |cmap|) and + |EMCommandLineUnMap| (like |cunmap|), but you probably don't need + these commands because there is no case where it should require + recursive mappings. + + Note(again): These settings, especially the keymappings are + __EXPERIMENTAL__. They could be changed in the near future. However, they + work well and are very useful, so I've released them anyway for now. + +============================================================================== +Requirements *easymotion-requirements* + +EasyMotion needs at least vim 7.3 to run without problems. +Active development and testing is done with vim 7.4 starting from the 2.0 +release of EasyMotion. + +Vi-compatible mode must be disabled. + +If your vim version is causing you problems with using this plugin, feel free +to open an issue on github! + +Link: https://github.com/easymotion/vim-easymotion/issues + +============================================================================== +Configuration *easymotion-configuration* + +EasyMotion will work fine without any configuration, but you can override the +default behavior by setting configuration variables globally in your |vimrc| +file. + +Example (this will change the target keys and disable shading): > + + let g:EasyMotion_keys = '1234567890' + let g:EasyMotion_do_shade = 0 + +------------------------------------------------------------------------------ +EasyMotion_keys *EasyMotion_keys* + *g:EasyMotion_keys* + +Set the keys to be used for motion targets. You can have as many (or few) +keys as you want. It's recommended to add as many keys as you are comfortable +typing, because here's a lower chance that the motion targets will be grouped +if many keys are available. However, this has its limits; most people find it +easier to type 2 lowercase keys than to chord a key with shift, so you may +want to leave out keys that are harder to type, like capital letters. +EasyMotion also uses the last keys to group targets, so it's recommended to +set the last keys to ones that are easier to type, like `f`,`j`,`;`, etc. + +Default: 'asdghklqwertyuiopzxcvbnmfj;' + +Example: +> + " Lower a-z + let g:EasyMotion_keys = 'abcdefghijklmnopqrstuvwxyz' + " a-z & A-Z + 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' + " a-z & A-Z & 0-9 + 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' + " qwerty + 'asdfghjkl;qwertyuiopzxcvbnm' + " You can use non-ascii, multibyte key characters as well + 'asdfghjkl;qwertyuiopzxcvbnmèòàùì' +< + +------------------------------------------------------------------------------ +EasyMotion_do_shade *EasyMotion_do_shade* + *g:EasyMotion_do_shade* + +The default behavior is to shade the text following the cursor (forward +motions), preceding the cursor (backward motions), or on either side of the +cursor (bidirectional motions) to make the motion targets more visible. Set +this option to 0 if you want to disable text shading. + +Default: 1 + +------------------------------------------------------------------------------ +EasyMotion_do_mapping *EasyMotion_do_mapping* + *g:EasyMotion_do_mapping* + +Set this option to 0 if you want to disable the default mappings. See +|easymotion-default-mappings| for details about the default mappings. + +Note: If you disable this option, you'll have to map the motions yourself. + See |easymotion-custom-mappings| for customizing the default mappings. + +Default: 1 + +------------------------------------------------------------------------------ +EasyMotion_grouping *EasyMotion_grouping* + *g:EasyMotion_grouping* + +When there are too many possible targets on the screen, the results have to be +grouped. This configuration option lets you change which grouping algorithm +you want to use. There are two grouping algorithms available: + + * Single-key priority (value: 1) + ------------------- + + This algorithm prioritizes single-key jumps for the targets closest to + the cursor and only groups the last jump targets to maximize the amount + of single-key jumps. + + This algorithm works recursively and will work with as few keys as two. + + Example (with |EasyMotion_keys| = "abcdef"): > + + x x x x x x x x x +< + The |w| motion is triggered: > + + a b c d e f f f f + ^ ^ ^ ^ ^ Direct jump to target + ^ ^ ^ ^ Enter group "f" +< + * Original (value: 2) + -------- + + This is the original algorithm which always groups all targets if there + are too many possible motion targets. + + Example (with |EasyMotion_keys| = "abcdef"): > + + x x x x x x x x x +< + The |w| motion is triggered: > + + a a a a a a b b b + ^ ^ ^ ^ ^ ^ Enter group "a" + ^ ^ ^ Enter group "b" + +Default: 1 + +------------------------------------------------------------------------------ +Smartcase *EasyMotion_smartcase* + *g:EasyMotion_smartcase* + +Matching target keys by smartcase. You can type target keys more lazily. + +Add following description in your vimrc: > + + let g:EasyMotion_smartcase = 1 + +Default:0 + +------------------------------------------------------------------------------ +Smartsign *EasyMotion_smartsign* + *g:EasyMotion_use_smartsign_us* + *g:EasyMotion_use_smartsign_ja* + +Matching signs target keys by smartcase like. E.g. type '1' and it matches +both '1' and '!' in Find motion. + +This feature depends on your keyboard layout, so you must choose which +keyboard layout you use. + +How to discriminate: + Shift-2 = @ -> US layout + Shift-2 = " -> JP layout + +> + let g:EasyMotion_use_smartsign_us = 1 +< + or +> + let g:EasyMotion_use_smartsign_jp = 1 +< + +Default: 0 + +------------------------------------------------------------------------------ +Migemo *EasyMotion_use_migemo* + *g:EasyMotion_use_migemo* + +|Easymotion| can match multibyte Japanese character with alphabetical input. +For example, 'fa' can search 'あ'. This feature doesn't +require |cmigemo| because |Easymotion| already includes basic regex patterns +generated by cmigemo. + +See http://0xcc.net/migemo/ if you want to know more about migemo. + +Add following line to your vimrc to enable this option: > + + let g:EasyMotion_use_migemo = 1 + +Default:0 + +This feature is based on rhysd(@Linda_pp)'s clever-f script, +which can be downloaded here: + +https://github.com/rhysd/clever-f.vim + +------------------------------------------------------------------------------ +Show target key by upper letter *EasyMotion_use_upper* + *g:EasyMotion_use_upper* + +With this option enabled, |Easymotion| will shows target labels with +uppercase letters, but allow you to type it in lowercase and have Easymotion +automatically convert it uppercase. + +This feature improves targets' readability. + +Example: > + + Lorem ipsum dolor sit amet. + +Type w and the text is updated: > + + Lorem {A}psum {B}olor {C}it {D}met. + +Press "c" (<- lowercase!) to jump to the beginning of the word "sit": > + + Lorem ipsum dolor sit amet. + +Add following description in your vimrc to enable this: > + + let g:EasyMotion_use_upper = 1 + let g:EasyMotion_keys = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ;' + +Default:0 + +Note: Make sure |g:EasyMotion_keys| doesn't include lowercase + +This feature is inspired by t9md's vim-smalls, which can be downloaded here: + +https://github.com/t9md/vim-smalls + +------------------------------------------------------------------------------ + Jump to first match by Enter or Space *EasyMotion_enter_jump_first* + *g:EasyMotion_enter_jump_first* + *EasyMotion_space_jump_first* + *g:EasyMotion_space_jump_first* + +Type Enter or Space key and jump to first match (first letter of +|g:EasyMotion_keys| ). + +Set this option to 1 if you want to enable this feature. + +Example: +> + let g:EasyMotion_enter_jump_first = 1 + let g:EasyMotion_space_jump_first = 1 +< +Default: 0 + + +Customize command line prompt *EasyMotion_prompt* + *g:EasyMotion_prompt* + + Use this command to customize the command line prompt message in find + motion. `{n}` is how many characters you type, and if {n} == 1 `(s)` will + be ignored. + +Sample: +> + let g:EasyMotion_prompt = '{n}>>> ' +< +Default: +> + let g:EasyMotion_prompt = 'Search for {n} character(s): ' +< + This message will be: + |(easymotion-s)| -> 'Search for 1 character: ' + |(easymotion-s2)| -> 'Search for 2 characters: ' + |(easymotion-sn)| -> 'Search for characters: ' + +Customize highlight behavior *EasyMotion_highlight* + *g:EasyMotion_inc_highlight* + + Using the 'n' key find motion (e.g. |(easymotion-sn)|), EasyMotion + by default incrementally highlights matched text. If you don't want this + feature, set this option to 0 +> + let g:EasyMotion_inc_highlight = 0 +< + Default: 1 + + *g:EasyMotion_move_highlight* + + By default, when using |(easymotion-next)| and/or + |(easymotion-prev)|, EasyMotion highlights matched text until the + cursor moves, enters insert mode, or leaves the buffer. If you don't want + this feature, set this option to 0. +> + let g:EasyMotion_move_highlight = 0 +< + Default: 1 + + *g:EasyMotion_landing_highlight* + + If you want to keep highlights temporarily after EasyMotion + jumps to a destination (with timing set to + |g:EasyMotion_move_highlight|), set this option to 0. +> + let g:EasyMotion_landing_highlight = 1 +< + Default: 0 + +EasyMotion_add_search_history *g:EasyMotion_add_search_history* + + If you set this option to 1, the 'n' key find motion will add the + inputted pattern to vim default search history. If you want to disable + this feature, set this value to 0. +> + let g:EasyMotion_add_search_history = 0 +< + Default: 1 + +EasyMotion_off_screen_search *g:EasyMotion_off_screen_search* + + If you set this option to 1, the 'n' key find motion will search patterns + even outside the current screen range. If you want to disable this + feature, set this value to 0. +> + let g:EasyMotion_off_screen_search = 0 +< + Default: 1 + +EasyMotion_disable_two_key_combo *g:EasyMotion_disable_two_key_combo* + + If you set this option to 1, you can disable the two key combo feature. +> + let g:EasyMotion_disable_two_key_combo = 1 +< + Default: 0 + +EasyMotion_verbose *g:EasyMotion_verbose* + + If you set this option to 0, you can disable all the messages the plugin + creates, such as "EasyMotion: Jumping to [l,c]" and "EasyMotion: + Cancelled". +> + let g:EasyMotion_verbose = 0 +< + Default: 1 + +------------------------------------------------------------------------------ +Custom highlighting *easymotion-custom-hl* + +The default EasyMotion configuration uses two highlighting groups that link +to groups with default values. The highlighting groups are: + + * EasyMotionTarget + + Highlights motion targets, the default value is bold red + + * EasyMotionTarget2First + * EasyMotionTarget2Second + + Highlights motion targets, when target is two keys + + * EasyMotionShade + + Highlights shaded text, the default value is dark gray + + * EasyMotionIncSearch + * EasyMotionMoveHL + + Highlights matched pattern of "/" command. + + +There are two ways to override the default colors: + + 1) Set the highlighting in your color scheme + + This will only affect a single color scheme. The default red/gray colors + will be used if you change the color scheme to one that doesn't assign + any EasyMotion colors. + + Example: > + + hi EasyMotionTarget ctermbg=none ctermfg=green + hi EasyMotionShade ctermbg=none ctermfg=blue + + hi EasyMotionTarget2First ctermbg=none ctermfg=red + hi EasyMotionTarget2Second ctermbg=none ctermfg=lightred + + hi EasyMotionMoveHL ctermbg=green ctermfg=black + hi EasyMotionIncSearch ctermbg=green ctermfg=black +< + 2) Set the highlighting in your vimrc + + This is ideal if you want to link the colors to highlighting groups that + are available in almost every color scheme, e.g. |ErrorMsg| (usually + bright red) and Comment (usually faded). You can be sure that the + color scheme's colors will be used instead of the default red/gray + if you choose this option. + + Example: > + + hi link EasyMotionTarget ErrorMsg + hi link EasyMotionShade Comment + + hi link EasyMotionTarget2First MatchParen + hi link EasyMotionTarget2Second MatchParen + + hi link EasyMotionMoveHL Search + hi link EasyMotionIncSearch Search +< + +Use CSApprox *EasyMotion_force_csapprox* + *g:EasyMotion_force_csapprox* + if you install CSApprox & want to use gui color for EasyMotion, set this + option to 1. +> + let g:EasyMotion_force_csapprox = 1 +< + Default: 0 + +------------------------------------------------------------------------------ +Custom mappings *easymotion-custom-mappings* + +EasyMotion allows you to customize all default mappings to avoid conflicts +with existing mappings. It is possible to change the default leader key +of all mappings to another key or sequence. It is also possible to fine +tune the plugin to your need by changing every single sequence. + +Leader key *EasyMotion_leader_key* *easymotion-leader-key* + *(easymotion-prefix)* + +The default leader key can be changed with the |(easymotion-prefix)| + +Set this keymapping to the key sequence to use as the prefix of the mappings +described in |easymotion-default-mappings|. + +Note: The default leader key has been changed to '' to +avoid conflicts with other plugins. You can revert to the original +leader by setting this keymapping in your vimrc: > + + map (easymotion-prefix) +< +Default: '' + +Custom Keys *easymotion-custom-keys* + +All custom mappings follow the same format: > + + (easymotion-{motion}) +< +Example: > + + map s (easymotion-s) + map _f (easymotion-f) + map (easymotion-T) +< +See |easymotion-plug-table| for a table of motions that can be mapped +and their default values. + +------------------------------------------------------------------------------ +Autocommands *easymotion-autocommands* + *EasyMotionPromptBegin* *EasyMotionPromptEnd* + +EasyMotion invokes two |User| autocommands, |EasyMotionPromptBegin| and +|EasyMotionPromptEnd|, so you can temporarily disable your linter to avoid +annoying syntax errors. + +EasyMotionPromptBegin Before the content of buffer is changed with + markers. If EasyMotion directly jumps to the + target (no prompts given), this autocommand will + not be executed. + +EasyMotionPromptEnd After the content of buffer and the undo tree are + restored. + +Example with coc.nvim: > + + autocmd User EasyMotionPromptBegin silent! CocDisable + autocmd User EasyMotionPromptEnd silent! CocEnable +< + +============================================================================== +License *easymotion-license* + +License: MIT license + +Copyright (c) 2014-2016 Kim Silkebækken, haya14busa + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +============================================================================== +Known bugs *easymotion-known-bugs* + +See: https://github.com/easymotion/vim-easymotion/issues + +Pull Requests are welcome! :) + +============================================================================== +Contributing *easymotion-contributing* + +If you experience any bugs or have feature requests, please open an issue on +GitHub. Fork the source repository on GitHub and send a pull request if you +have any code improvements. + +Author: Kim Silkebækken + haya14busa (since version 2.0) +Source repository: https://github.com/easymotion/vim-easymotion + + +============================================================================== +Credits *easymotion-credits* + +- Ben Boeckel: ge and WORD motions +- Drew Neil: operator-pending mappings +- Rob O'Dwyer: customizable mappings without giving up all defaults +- Michel D'Hooge: customizable leader +- Maxime Bourget: search motion, improved JK motion behavior +- Kearn Holliday: fix jumplist issues +- Shougo Matsushita: fix CSApprox issue +- supasorn: two key combos and bidirectional motion +- mtth: startofline(keep column) +- bootleq: fixed bufname bug +- mattn: fix multibyte handling +- yuex: fix visual mode selection bug (o command) + +and more!: https://github.com/easymotion/vim-easymotion/graphs/contributors + +EasyMotion is based on Bartlomiej Podolak's great PreciseJump script, which +can be downloaded here: + +http://www.vim.org/scripts/script.php?script_id=3437 + +Special Thanks for other plugins and the authors:~ +Migemo feature: + - Author: rhysd(@Linda_pp) + - https://github.com/rhysd/clever-f.vim +Show uppercase feature: + - Author: t9md + - https://github.com/t9md/vim-smalls +Find motion command line: + - Author: osyo-manga + - https://github.com/osyo-manga/vim-over + - Library: https://github.com/osyo-manga/vital-over +2-key find motion: + - Authors: goldfeld & justinmk + - https://github.com/goldfeld/vim-seek + - https://github.com/justinmk/vim-sneak +Next/Previous motion: + - Author: justinmk + - https://github.com/justinmk/vim-sneak +Dot repeat feature: + - Author: tpope + - https://github.com/tpope/vim-repeat + +============================================================================== +vim:tw=78:sw=4:ts=8:ft=help:norl: diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/plugin/EasyMotion.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/plugin/EasyMotion.vim new file mode 100644 index 0000000..ade2b41 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/plugin/EasyMotion.vim @@ -0,0 +1,290 @@ +scriptencoding utf-8 +" EasyMotion - Vim motions on speed! +" +" Author: Kim Silkebækken +" haya14busa +" Source: https://github.com/easymotion/vim-easymotion +" == Script initialization {{{ +if expand("%:p") ==# expand(":p") + unlet! g:EasyMotion_loaded +endif +if exists('g:EasyMotion_loaded') || &compatible || version < 703 + finish +endif + +let g:EasyMotion_loaded = 1 +" }}} + +" == Saving 'cpoptions' {{{ +let s:save_cpo = &cpo +set cpo&vim +" }}} + +" == Default configuration {{{ +" -- Option ------------------------------ {{{ +let g:EasyMotion_keys = get(g:, + \ 'EasyMotion_keys', 'asdghklqwertyuiopzxcvbnmfj;') + " \ 'EasyMotion_keys', 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ') +let g:EasyMotion_do_mapping = get(g: , 'EasyMotion_do_mapping' , 1) +let g:EasyMotion_do_shade = get(g: , 'EasyMotion_do_shade' , 1) +let g:EasyMotion_grouping = get(g: , 'EasyMotion_grouping' , 1) +let g:EasyMotion_startofline = get(g: , 'EasyMotion_startofline' , 1) +let g:EasyMotion_smartcase = get(g: , 'EasyMotion_smartcase' , 0) +let g:EasyMotion_skipfoldedline = get(g: , 'EasyMotion_skipfoldedline' , 1) +let g:EasyMotion_use_migemo = get(g: , 'EasyMotion_use_migemo' , 0) +let g:EasyMotion_use_upper = get(g: , 'EasyMotion_use_upper' , 0) +let g:EasyMotion_enter_jump_first = get(g: , 'EasyMotion_enter_jump_first' , 0) +let g:EasyMotion_space_jump_first = get(g: , 'EasyMotion_space_jump_first' , 0) +let g:EasyMotion_inc_highlight = get(g: , 'EasyMotion_inc_highlight' , 1) +let g:EasyMotion_move_highlight = get(g: , 'EasyMotion_move_highlight' , 1) +let g:EasyMotion_landing_highlight = get(g: , 'EasyMotion_landing_highlight' , 0) +let g:EasyMotion_cursor_highlight = get(g: , 'EasyMotion_cursor_highlight' , 1) +let g:EasyMotion_use_regexp = get(g: , 'EasyMotion_use_regexp' , 1) +let g:EasyMotion_add_search_history = get(g: , 'EasyMotion_add_search_history' , 1) +let g:EasyMotion_off_screen_search = get(g: , 'EasyMotion_off_screen_search' , 1) +let g:EasyMotion_force_csapprox = get(g: , 'EasyMotion_force_csapprox' , 0) +let g:EasyMotion_show_prompt = get(g: , 'EasyMotion_show_prompt' , 1) +let g:EasyMotion_verbose = get(g: , 'EasyMotion_verbose' , 1) +let g:EasyMotion_prompt = + \ get(g: , 'EasyMotion_prompt' , 'Search for {n} character(s): ') +let g:EasyMotion_command_line_key_mappings = + \ get(g: , 'EasyMotion_command_line_key_mappings' , {}) +let g:EasyMotion_disable_two_key_combo = + \ get(g: , 'EasyMotion_disable_two_key_combo' , 0) + +"}}} + +" }}} + +" == Mapping {{{ +" Note: bd is short for bidirectional +" l is short for (within) line + +function! s:motion_map_helper(motions) "{{{ + for [name, dict] in items(a:motions) + let mapargs = [] + let xmapargs = [] + if dict.fnc ==# 'S' || dict.fnc ==# 'SL' || dict.fnc ==# 'T' || dict.fnc ==# 'TL' + let mapargs += [dict.cnt, 0, dict.direction] + let xmapargs += [dict.cnt, 1, dict.direction] + elseif dict.fnc ==# 'Search' + let mapargs += [0, dict.direction, dict.respect_direction] + let xmapargs += [1, dict.direction, dict.respect_direction] + else + let mapargs += [0, dict.direction] + let xmapargs += [1, dict.direction] + endif + + silent exec 'noremap (easymotion-'.name.')' . + \ ' :call EasyMotion#' . dict.fnc . '('. join(mapargs, ',') . ')' + silent exec 'xnoremap (easymotion-'.name.')' . + \ ' :call EasyMotion#' . dict.fnc . '('. join(xmapargs, ',') . ')' + " Example: + " noremap (easymotion-f2) :call EasyMotion#S(2,1,0) + " xnoremap (easymotion-f2) :call EasyMotion#S(2,1,0) + endfor +endfunction "}}} + +" Find Motion: {{{ +call s:motion_map_helper({ + \ 'f' : {'fnc' : 'S' , 'cnt' : 1, 'direction' : 0}, + \ 'F' : {'fnc' : 'S' , 'cnt' : 1, 'direction' : 1}, + \ 's' : {'fnc' : 'S' , 'cnt' : 1, 'direction' : 2}, + \ 'bd-f' : {'fnc' : 'S' , 'cnt' : 1, 'direction' : 2}, + \ 't' : {'fnc' : 'T' , 'cnt' : 1, 'direction' : 0}, + \ 'T' : {'fnc' : 'T' , 'cnt' : 1, 'direction' : 1}, + \ 'bd-t' : {'fnc' : 'T' , 'cnt' : 1, 'direction' : 2}, + \ 'fl' : {'fnc' : 'SL' , 'cnt' : 1, 'direction' : 0}, + \ 'Fl' : {'fnc' : 'SL' , 'cnt' : 1, 'direction' : 1}, + \ 'sl' : {'fnc' : 'SL' , 'cnt' : 1, 'direction' : 2}, + \ 'bd-fl' : {'fnc' : 'SL' , 'cnt' : 1, 'direction' : 2}, + \ 'tl' : {'fnc' : 'TL' , 'cnt' : 1, 'direction' : 0}, + \ 'Tl' : {'fnc' : 'TL' , 'cnt' : 1, 'direction' : 1}, + \ 'bd-tl' : {'fnc' : 'TL' , 'cnt' : 1, 'direction' : 2}, + \ + \ 'f2' : {'fnc' : 'S' , 'cnt' : 2, 'direction' : 0}, + \ 'F2' : {'fnc' : 'S' , 'cnt' : 2, 'direction' : 1}, + \ 's2' : {'fnc' : 'S' , 'cnt' : 2, 'direction' : 2}, + \ 'bd-f2' : {'fnc' : 'S' , 'cnt' : 2, 'direction' : 2}, + \ 't2' : {'fnc' : 'T' , 'cnt' : 2, 'direction' : 0}, + \ 'T2' : {'fnc' : 'T' , 'cnt' : 2, 'direction' : 1}, + \ 'bd-t2' : {'fnc' : 'T' , 'cnt' : 2, 'direction' : 2}, + \ 'fl2' : {'fnc' : 'SL' , 'cnt' : 2, 'direction' : 0}, + \ 'Fl2' : {'fnc' : 'SL' , 'cnt' : 2, 'direction' : 1}, + \ 'sl2' : {'fnc' : 'SL' , 'cnt' : 2, 'direction' : 2}, + \ 'bd-fl2' : {'fnc' : 'SL' , 'cnt' : 2, 'direction' : 2}, + \ 'tl2' : {'fnc' : 'TL' , 'cnt' : 2, 'direction' : 0}, + \ 'Tl2' : {'fnc' : 'TL' , 'cnt' : 2, 'direction' : 1}, + \ 'bd-tl2' : {'fnc' : 'TL' , 'cnt' : 2, 'direction' : 2}, + \ + \ 'fn' : {'fnc' : 'S' , 'cnt' : -1, 'direction' : 0}, + \ 'Fn' : {'fnc' : 'S' , 'cnt' : -1, 'direction' : 1}, + \ 'sn' : {'fnc' : 'S' , 'cnt' : -1, 'direction' : 2}, + \ 'bd-fn' : {'fnc' : 'S' , 'cnt' : -1, 'direction' : 2}, + \ 'tn' : {'fnc' : 'T' , 'cnt' : -1, 'direction' : 0}, + \ 'Tn' : {'fnc' : 'T' , 'cnt' : -1, 'direction' : 1}, + \ 'bd-tn' : {'fnc' : 'T' , 'cnt' : -1, 'direction' : 2}, + \ 'fln' : {'fnc' : 'SL' , 'cnt' : -1, 'direction' : 0}, + \ 'Fln' : {'fnc' : 'SL' , 'cnt' : -1, 'direction' : 1}, + \ 'sln' : {'fnc' : 'SL' , 'cnt' : -1, 'direction' : 2}, + \ 'bd-fln' : {'fnc' : 'SL' , 'cnt' : -1, 'direction' : 2}, + \ 'tln' : {'fnc' : 'TL' , 'cnt' : -1, 'direction' : 0}, + \ 'Tln' : {'fnc' : 'TL' , 'cnt' : -1, 'direction' : 1}, + \ 'bd-tln' : {'fnc' : 'TL' , 'cnt' : -1, 'direction' : 2}, + \ }) + +nnoremap (easymotion-overwin-f) :call EasyMotion#OverwinF(1) +nnoremap (easymotion-overwin-f2) :call EasyMotion#OverwinF(2) +nnoremap (easymotion-overwin-line) :call EasyMotion#overwin#line() +nnoremap (easymotion-overwin-w) :call EasyMotion#overwin#w() + +"}}} + +" -- Word Motion {{{ +call s:motion_map_helper({ + \ 'w' : {'fnc' : 'WB' , 'direction' : 0}, + \ 'b' : {'fnc' : 'WB' , 'direction' : 1}, + \ 'bd-w' : {'fnc' : 'WB' , 'direction' : 2}, + \ 'W' : {'fnc' : 'WBW', 'direction' : 0}, + \ 'B' : {'fnc' : 'WBW', 'direction' : 1}, + \ 'bd-W' : {'fnc' : 'WBW', 'direction' : 2}, + \ 'iskeyword-w' : {'fnc' : 'WBK', 'direction' : 0}, + \ 'iskeyword-b' : {'fnc' : 'WBK', 'direction' : 1}, + \ 'iskeyword-bd-w' : {'fnc' : 'WBK', 'direction' : 2}, + \ + \ 'e' : {'fnc' : 'E' , 'direction' : 0}, + \ 'ge' : {'fnc' : 'E' , 'direction' : 1}, + \ 'bd-e' : {'fnc' : 'E' , 'direction' : 2}, + \ 'E' : {'fnc' : 'EW' , 'direction' : 0}, + \ 'gE' : {'fnc' : 'EW' , 'direction' : 1}, + \ 'bd-E' : {'fnc' : 'EW' , 'direction' : 2}, + \ 'iskeyword-e' : {'fnc' : 'EK' , 'direction' : 0}, + \ 'iskeyword-ge' : {'fnc' : 'EK' , 'direction' : 1}, + \ 'iskeyword-bd-e' : {'fnc' : 'EK' , 'direction' : 2}, + \ }) +"}}} + +" -- JK Motion {{{ +call s:motion_map_helper({ + \ 'j' : {'fnc' : 'JK' , 'direction' : 0}, + \ 'k' : {'fnc' : 'JK' , 'direction' : 1}, + \ 'bd-jk' : {'fnc' : 'JK' , 'direction' : 2}, + \ 'sol-j' : {'fnc' : 'Sol', 'direction' : 0}, + \ 'sol-k' : {'fnc' : 'Sol', 'direction' : 1}, + \ 'sol-bd-jk' : {'fnc' : 'Sol', 'direction' : 2}, + \ 'eol-j' : {'fnc' : 'Eol', 'direction' : 0}, + \ 'eol-k' : {'fnc' : 'Eol', 'direction' : 1}, + \ 'eol-bd-jk' : {'fnc' : 'Eol', 'direction' : 2}, + \ }) +"}}} + +" -- Search Motion {{{ +call s:motion_map_helper({ + \ 'n' : {'fnc' : 'Search', 'direction': 0, 'respect_direction': 0}, + \ 'N' : {'fnc' : 'Search', 'direction': 1, 'respect_direction': 0}, + \ 'bd-n' : {'fnc' : 'Search', 'direction': 2, 'respect_direction': 0}, + \ 'vim-n' : {'fnc' : 'Search', 'direction': 0, 'respect_direction': 1}, + \ 'vim-N' : {'fnc' : 'Search', 'direction': 1, 'respect_direction': 1}, + \ }) +"}}} + +" -- Jump To Anywhere Motion {{{ +call s:motion_map_helper({ + \ 'jumptoanywhere' : {'fnc' : 'JumpToAnywhere', 'direction': 2}, + \ }) +"}}} + +" -- Line Motion {{{ +call s:motion_map_helper({ + \ 'wl' : {'fnc' : 'WBL', 'direction': 0}, + \ 'bl' : {'fnc' : 'WBL', 'direction': 1}, + \ 'bd-wl' : {'fnc' : 'WBL', 'direction': 2}, + \ 'el' : {'fnc' : 'EL' , 'direction': 0}, + \ 'gel' : {'fnc' : 'EL' , 'direction': 1}, + \ 'bd-el' : {'fnc' : 'EL' , 'direction': 2}, + \ 'lineforward' : {'fnc' : 'LineAnywhere', 'direction': 0}, + \ 'linebackward' : {'fnc' : 'LineAnywhere', 'direction': 1}, + \ 'lineanywhere' : {'fnc' : 'LineAnywhere', 'direction': 2}, + \ }) +"}}} + +" -- Next, Previous Motion {{{ +noremap (easymotion-next) + \ :call EasyMotion#NextPrevious(0,0) +xnoremap (easymotion-next) + \ :call EasyMotion#NextPrevious(1,0) + +noremap (easymotion-prev) + \ :call EasyMotion#NextPrevious(0,1) +xnoremap (easymotion-prev) + \ :call EasyMotion#NextPrevious(1,1) +"}}} + +" -- Repeat Motion {{{ +noremap (easymotion-repeat) + \ :call EasyMotion#Repeat(0) +xnoremap (easymotion-repeat) + \ :call EasyMotion#Repeat(1) + +noremap (easymotion-dotrepeat) + \ :call EasyMotion#DotRepeat() +"}}} + +noremap (easymotion-activate) :call EasyMotion#activate(0) +xnoremap (easymotion-activate) :call EasyMotion#activate(1) +" }}} + +" == Default key mapping {{{ +if g:EasyMotion_do_mapping == 1 + " Prepare Prefix: {{{ + if exists('g:EasyMotion_leader_key') + exec 'map ' . g:EasyMotion_leader_key . ' (easymotion-prefix)' + else + if !hasmapto('(easymotion-prefix)') + map (easymotion-prefix) + endif + endif + "}}} + + function! s:default_mapping(motions, do_mapping) "{{{ + for motion in a:motions + " Mapping {{{ + if exists('g:EasyMotion_mapping_' . motion) + " Backward compatible mapping [deprecated] + silent exec 'map ' . + \ eval('g:EasyMotion_mapping_' . motion) . ' (easymotion-' . motion . ')' + elseif a:do_mapping + \ && !hasmapto('(easymotion-' . motion . ')') + \ && empty(maparg('(easymotion-prefix)' . motion, 'nov')) + + " Do mapping + silent exec 'map ' . + \'(easymotion-prefix)' . motion . ' (easymotion-' . motion . ')' + endif "}}} + endfor + endfunction "}}} + + " Default Mapping: + call s:default_mapping( + \ ['f', 'F', 's', 't', 'T', + \ 'w', 'W', 'b', 'B', 'e', 'E', 'ge', 'gE', + \ 'j', 'k', 'n', 'N'], g:EasyMotion_do_mapping) +endif "}}} + +" == CommandLine Mapping {{{ +command! -nargs=* +\ EMCommandLineNoreMap +\ call EasyMotion#command_line#cnoremap([]) +command! -nargs=* +\ EMCommandLineMap +\ call EasyMotion#command_line#cmap([]) +command! -nargs=1 +\ EMCommandLineUnMap +\ call EasyMotion#command_line#cunmap() +"}}} + +" == Restore 'cpoptions' {{{ +let &cpo = s:save_cpo +unlet s:save_cpo +" }}} +" vim: fdm=marker:et:ts=4:sw=4:sts=4 diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/t/compare_movements_spec.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/t/compare_movements_spec.vim new file mode 100644 index 0000000..0ea6341 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/t/compare_movements_spec.vim @@ -0,0 +1,274 @@ +"============================================================================= +" FILE: t/compare_movements_spec.vim +" AUTHOR: YggdrasiI +" Test: https://github.com/kana/vim-vspec +" Description: EasyMotion keyword movement test with vim-vspec +" License: MIT license {{{ +" Permission is hereby granted, free of charge, to any person obtaining +" a copy of this software and associated documentation files (the +" "Software"), to deal in the Software without restriction, including +" without limitation the rights to use, copy, modify, merge, publish, +" distribute, sublicense, and/or sell copies of the Software, and to +" permit persons to whom the Software is furnished to do so, subject to +" the following conditions: +" +" The above copyright notice and this permission notice shall be included +" in all copies or substantial portions of the Software. +" +" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +" IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +" CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +" TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +" SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +" }}} +"============================================================================= + +" Setup {{{ +let s:root_dir = matchstr(system('git rev-parse --show-cdup'), '[^\n]\+') + +" The consumed time depends from the length of the text and could be really high +" on vimdoc pages. (See it 'Loop through Vim help buffer and compare movements') +" Reduce this value to stop CompareMovements(...) before it reached the end of the +" buffer. +let s:maximal_number_of_compared_movments = 10000 +execute 'set' 'rtp +=./'.s:root_dir +runtime! plugin/EasyMotion.vim +" }}} + +" Functions for Test {{{ +function! AddLine(str) + put =a:str +endfunction + +function! CursorPos() + return [line('.'), col('.'), getline('.')[col('.')-1]] +endfunction + +" Nested normal to avoid throwing readonly errors. They abort the testing. +function TryNormal(str) + try + exec 'normal ' . a:str + catch /^Vim\%((\a\+)\)\=:E21/ + endtry + return 0 +endfunction + +let s:to_cursor = {} +function! s:to_cursor.match(actual, expected) + return a:actual == a:expected +endfunction + +" Add metadata about failure. +function! s:to_cursor.failure_message_for_should(actual, expected) + Expect a:actual[0] > 0 + Expect a:expected[0] > 0 + Expect a:actual[0] <= getpos('$')[1] + Expect a:expected[0] <= getpos('$')[1] + Expect a:actual[1] > 0 + Expect a:expected[1] > 0 + + let line1 = getline(a:actual[0]) + let line2 = getline(a:expected[0]) + " Change char on cursor to '█'. + let line1 = strpart(l:line1, 0, a:actual[1]-1) + \ . '█' + \ . strpart(l:line1, a:actual[1]) + let line2 = strpart(l:line2, 0, a:expected[1]-1) + \ . '█' + \ . strpart(l:line2, a:expected[1]) + " Separation of both cases with \n would be nice, but + " vim-vspec allow oneliners as return string, only. + let msg = 'Line ' . string(a:actual[0]) . ": '" . l:line1 + \ . "',\x09\x09 Line " . string(a:expected[0]) . ": '" . l:line2 . "'\x0a" + return l:msg +endfunction + +function! CompareMovements(movement1, movement2, backward) + let jumpmarks = [ + \ [a:movement1, []], + \ [a:movement2, []], + \ ] + + " Loop through current buffer in both variants {{ + for [l:handler, l:list] in l:jumpmarks + if a:backward == 1 + let last_line = line('$') + let last_char = len(getline(l:last_line)) + call cursor(l:last_line, l:last_char) + else + call cursor([1,1]) + endif + + let lastpos = [0,0] + + " Centralize line. Otherwise, Easymotion functions aborts + " at the end of the (virtual) window. + call TryNormal('zz') + call TryNormal(l:handler) + let curpos = getpos(".")[1:2] + + while l:lastpos != l:curpos + let list += [l:curpos] + let lastpos = l:curpos + call TryNormal('zz') + call TryNormal(l:handler) + let curpos = getpos(".")[1:2] + " Abort after a fixed number of steps. + if len(l:list) > s:maximal_number_of_compared_movments + break + endif + endwhile + endfor + " }} + + " The resulting lists are stored in l:jumpmarks[*][1], now. + let [l:cursor_positions1, l:cursor_positions2] = [ l:jumpmarks[0][1], l:jumpmarks[1][1] ] + + if l:cursor_positions1 == l:cursor_positions2 + return 0 + endif + + " Search for first unmatching position. {{ + let index = 0 + let len = min([len(l:cursor_positions2), len(l:cursor_positions1)]) + while l:index < l:len + Expect l:cursor_positions2[l:index] to_cursor l:cursor_positions1[l:index] + let index += 1 + endwhile + + " Collision with begin or end of file or while loop aborts to early. + if a:backward == 1 + Expect join([a:movement2, ': File begin reached after ', len(l:cursor_positions2), ' steps.']) + \ == join([a:movement1, ': File begin reached after ', len(l:cursor_positions1), ' steps.']) + else + Expect l:cursor_positions2[l:index-1] to_cursor l:cursor_positions1[l:index] + Expect join([a:movement2, ': File end reached after ', len(l:cursor_positions2), ' steps.']) + \ == join([a:movement1, ': File end reached after ', len(l:cursor_positions1), ' steps.']) + endif + " }} + + return -1 +endfunction + +" Hand crafted text with rare cases +function! InsertTestText1() + + " Blanks at document begin + call AddLine('') + call AddLine(' ') + call AddLine('') + + call AddLine('scriptencoding utf-8') + + " '^\s*[not-\k]'-case + call AddLine('!foo') + call AddLine(' !bar') + + call AddLine('s! ') + + " Blanks at document end + call AddLine('') + call AddLine(' ') + call AddLine('') +endfunction + +"}}} + +"Keyword word motion {{{ +describe 'Keyword word motion' + before + new + resize 10 + nmap a + let g:EasyMotion_keys = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' + let g:EasyMotion_maximal_jumpmarks = 2 " Error for value 1 unanalyzed. + nmap w (easymotion-iskeyword-w) + nmap b (easymotion-iskeyword-b) + nmap e (easymotion-iskeyword-e) + nmap ge (easymotion-iskeyword-ge) + nmap W (easymotion-W) + nmap B (easymotion-B) + nmap E (easymotion-E) + nmap gE (easymotion-gE) + call EasyMotion#init() + call vspec#customize_matcher('to_cursor', s:to_cursor) + end + + after + close! + end + + it 'Simple test to check setup of this test' + " Check if a is remapped to to avoid start of insert mode. + normal aa\ + Expect getline(1) == '' + + call AddLine('word') + Expect CompareMovements('w', 'w', 0) == 0 + Expect CompareMovements('w', '\wa', 0) == 0 + Expect CompareMovements('b', '\ba', 1) == 0 + Expect CompareMovements('e', '\ea', 0) == 0 + Expect CompareMovements('ge', '\gea', 1) == 0 + Expect CompareMovements('W', '\Wa', 0) == 0 + Expect CompareMovements('B', '\Ba', 1) == 0 + Expect CompareMovements('E', '\Ea', 0) == 0 + Expect CompareMovements('gE', '\gEa', 1) == 0 + end + + it 'w' + call InsertTestText1() + Expect CompareMovements('w', '\wa', 0) == 0 + end + + it 'b' + call InsertTestText1() + Expect CompareMovements('b', '\ba', 1) == 0 + end + + it 'e' + call InsertTestText1() + Expect CompareMovements('e', '\ea', 0) == 0 + end + + it 'ge' + call InsertTestText1() + Expect CompareMovements('ge', '\gea', 1) == 0 + end + + it 'W' + call InsertTestText1() + Expect CompareMovements('W', 'W', 0) == 0 + end + + it 'B' + call InsertTestText1() + Expect CompareMovements('B', 'B', 1) == 0 + end + + it 'E' + call InsertTestText1() + Expect CompareMovements('E', 'E', 0) == 0 + end + + it 'gE' + call InsertTestText1() + Expect CompareMovements('gE', 'gE', 1) == 0 + end + + " Really time consuming test... + "it 'Loop through Vim help buffer and compare movements' + " help motion.txt + " Expect expand('%:t') ==# 'motion.txt' + " "Optional: Copy text into editable buffer + " exec "normal! Gygg\cP" + " Expect CompareMovements('w', '\wa', 0) == 0 + "end + +end +"}}} + +" __END__ {{{ +" vim: fdm=marker:et:ts=4:sw=4:sts=4 +" }}} diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/t/easymotion_spec.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/t/easymotion_spec.vim new file mode 100644 index 0000000..df808a3 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/t/easymotion_spec.vim @@ -0,0 +1,1471 @@ +"============================================================================= +" FILE: t/easymotion_spec.vim +" AUTHOR: haya14busa +" Test: https://github.com/kana/vim-vspec +" Refer: https://github.com/rhysd/clever-f.vim +" Description: EasyMotion test with vim-vspec +" License: MIT license {{{ +" Permission is hereby granted, free of charge, to any person obtaining +" a copy of this software and associated documentation files (the +" "Software"), to deal in the Software without restriction, including +" without limitation the rights to use, copy, modify, merge, publish, +" distribute, sublicense, and/or sell copies of the Software, and to +" permit persons to whom the Software is furnished to do so, subject to +" the following conditions: +" +" The above copyright notice and this permission notice shall be included +" in all copies or substantial portions of the Software. +" +" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +" IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +" CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +" TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +" SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +" }}} +"============================================================================= + +" Avoid source test files {{{ +if expand("%:p") ==# expand(":p") + finish +endif +"}}} + +let s:root_dir = matchstr(system('git rev-parse --show-cdup'), '[^\n]\+') +execute 'set' 'rtp +=./'.s:root_dir +runtime! plugin/EasyMotion.vim + +" Default settings {{{ +describe 'Default settings' + it 'provide default mappings for find motion' + " Find Motion: {{{ + " s + Expect maparg('(easymotion-s)', 'n') ==# ':call EasyMotion#S(1,0,2)' + Expect maparg('(easymotion-s)', 'o') ==# ':call EasyMotion#S(1,0,2)' + Expect maparg('(easymotion-s)', 'v') ==# ':call EasyMotion#S(1,1,2)' + " f + Expect maparg('(easymotion-f)', 'n') ==# ':call EasyMotion#S(1,0,0)' + Expect maparg('(easymotion-f)', 'o') ==# ':call EasyMotion#S(1,0,0)' + Expect maparg('(easymotion-f)', 'v') ==# ':call EasyMotion#S(1,1,0)' + " F + Expect maparg('(easymotion-F)', 'n') ==# ':call EasyMotion#S(1,0,1)' + Expect maparg('(easymotion-F)', 'o') ==# ':call EasyMotion#S(1,0,1)' + Expect maparg('(easymotion-F)', 'v') ==# ':call EasyMotion#S(1,1,1)' + " bd-f + Expect maparg('(easymotion-bd-f)', 'n') ==# maparg('(easymotion-s)', 'n') + Expect maparg('(easymotion-bd-f)', 'o') ==# maparg('(easymotion-s)', 'o') + Expect maparg('(easymotion-bd-f)', 'v') ==# maparg('(easymotion-s)', 'v') + " t + Expect maparg('(easymotion-t)', 'n') ==# ':call EasyMotion#T(1,0,0)' + Expect maparg('(easymotion-t)', 'o') ==# ':call EasyMotion#T(1,0,0)' + Expect maparg('(easymotion-t)', 'v') ==# ':call EasyMotion#T(1,1,0)' + " T + Expect maparg('(easymotion-T)', 'n') ==# ':call EasyMotion#T(1,0,1)' + Expect maparg('(easymotion-T)', 'o') ==# ':call EasyMotion#T(1,0,1)' + Expect maparg('(easymotion-T)', 'v') ==# ':call EasyMotion#T(1,1,1)' + " bd-t + Expect maparg('(easymotion-bd-t)', 'n') ==# ':call EasyMotion#T(1,0,2)' + Expect maparg('(easymotion-bd-t)', 'o') ==# ':call EasyMotion#T(1,0,2)' + Expect maparg('(easymotion-bd-t)', 'v') ==# ':call EasyMotion#T(1,1,2)' + " sl + Expect maparg('(easymotion-sl)', 'n') ==# ':call EasyMotion#SL(1,0,2)' + Expect maparg('(easymotion-sl)', 'o') ==# ':call EasyMotion#SL(1,0,2)' + Expect maparg('(easymotion-sl)', 'v') ==# ':call EasyMotion#SL(1,1,2)' + " fl + Expect maparg('(easymotion-fl)', 'n') ==# ':call EasyMotion#SL(1,0,0)' + Expect maparg('(easymotion-fl)', 'o') ==# ':call EasyMotion#SL(1,0,0)' + Expect maparg('(easymotion-fl)', 'v') ==# ':call EasyMotion#SL(1,1,0)' + " Fl + Expect maparg('(easymotion-Fl)', 'n') ==# ':call EasyMotion#SL(1,0,1)' + Expect maparg('(easymotion-Fl)', 'o') ==# ':call EasyMotion#SL(1,0,1)' + Expect maparg('(easymotion-Fl)', 'v') ==# ':call EasyMotion#SL(1,1,1)' + " bd-fl + Expect maparg('(easymotion-bd-fl)', 'n') ==# maparg('(easymotion-sl)', 'n') + Expect maparg('(easymotion-bd-fl)', 'o') ==# maparg('(easymotion-sl)', 'o') + Expect maparg('(easymotion-bd-fl)', 'v') ==# maparg('(easymotion-sl)', 'v') + " tl + Expect maparg('(easymotion-tl)', 'n') ==# ':call EasyMotion#TL(1,0,0)' + Expect maparg('(easymotion-tl)', 'o') ==# ':call EasyMotion#TL(1,0,0)' + Expect maparg('(easymotion-tl)', 'v') ==# ':call EasyMotion#TL(1,1,0)' + " Tl + Expect maparg('(easymotion-Tl)', 'n') ==# ':call EasyMotion#TL(1,0,1)' + Expect maparg('(easymotion-Tl)', 'o') ==# ':call EasyMotion#TL(1,0,1)' + Expect maparg('(easymotion-Tl)', 'v') ==# ':call EasyMotion#TL(1,1,1)' + " bd-tl + Expect maparg('(easymotion-bd-tl)', 'n') ==# ':call EasyMotion#TL(1,0,2)' + Expect maparg('(easymotion-bd-tl)', 'o') ==# ':call EasyMotion#TL(1,0,2)' + Expect maparg('(easymotion-bd-tl)', 'v') ==# ':call EasyMotion#TL(1,1,2)' + "}}} + + " Two Char Find Motion: {{{ + " s2 + Expect maparg('(easymotion-s2)', 'n') ==# ':call EasyMotion#S(2,0,2)' + Expect maparg('(easymotion-s2)', 'o') ==# ':call EasyMotion#S(2,0,2)' + Expect maparg('(easymotion-s2)', 'v') ==# ':call EasyMotion#S(2,1,2)' + " f2 + Expect maparg('(easymotion-f2)', 'n') ==# ':call EasyMotion#S(2,0,0)' + Expect maparg('(easymotion-f2)', 'o') ==# ':call EasyMotion#S(2,0,0)' + Expect maparg('(easymotion-f2)', 'v') ==# ':call EasyMotion#S(2,1,0)' + " F2 + Expect maparg('(easymotion-F2)', 'n') ==# ':call EasyMotion#S(2,0,1)' + Expect maparg('(easymotion-F2)', 'o') ==# ':call EasyMotion#S(2,0,1)' + Expect maparg('(easymotion-F2)', 'v') ==# ':call EasyMotion#S(2,1,1)' + " bd-f2 + Expect maparg('(easymotion-bd-f2)', 'n') ==# maparg('(easymotion-s2)', 'n') + Expect maparg('(easymotion-bd-f2)', 'o') ==# maparg('(easymotion-s2)', 'o') + Expect maparg('(easymotion-bd-f2)', 'v') ==# maparg('(easymotion-s2)', 'v') + " t2 + Expect maparg('(easymotion-t2)', 'n') ==# ':call EasyMotion#T(2,0,0)' + Expect maparg('(easymotion-t2)', 'o') ==# ':call EasyMotion#T(2,0,0)' + Expect maparg('(easymotion-t2)', 'v') ==# ':call EasyMotion#T(2,1,0)' + " T2 + Expect maparg('(easymotion-T2)', 'n') ==# ':call EasyMotion#T(2,0,1)' + Expect maparg('(easymotion-T2)', 'o') ==# ':call EasyMotion#T(2,0,1)' + Expect maparg('(easymotion-T2)', 'v') ==# ':call EasyMotion#T(2,1,1)' + " sl2 + Expect maparg('(easymotion-sl2)', 'n') ==# ':call EasyMotion#SL(2,0,2)' + Expect maparg('(easymotion-sl2)', 'o') ==# ':call EasyMotion#SL(2,0,2)' + Expect maparg('(easymotion-sl2)', 'v') ==# ':call EasyMotion#SL(2,1,2)' + " bd-t2 + Expect maparg('(easymotion-bd-t2)', 'n') ==# ':call EasyMotion#T(2,0,2)' + Expect maparg('(easymotion-bd-t2)', 'o') ==# ':call EasyMotion#T(2,0,2)' + Expect maparg('(easymotion-bd-t2)', 'v') ==# ':call EasyMotion#T(2,1,2)' + " fl2 + Expect maparg('(easymotion-fl2)', 'n') ==# ':call EasyMotion#SL(2,0,0)' + Expect maparg('(easymotion-fl2)', 'o') ==# ':call EasyMotion#SL(2,0,0)' + Expect maparg('(easymotion-fl2)', 'v') ==# ':call EasyMotion#SL(2,1,0)' + " Fl2 + Expect maparg('(easymotion-Fl2)', 'n') ==# ':call EasyMotion#SL(2,0,1)' + Expect maparg('(easymotion-Fl2)', 'o') ==# ':call EasyMotion#SL(2,0,1)' + Expect maparg('(easymotion-Fl2)', 'v') ==# ':call EasyMotion#SL(2,1,1)' + " bd-fl2 + Expect maparg('(easymotion-bd-fl2)', 'n') ==# maparg('(easymotion-sl2)', 'n') + Expect maparg('(easymotion-bd-fl2)', 'o') ==# maparg('(easymotion-sl2)', 'o') + Expect maparg('(easymotion-bd-fl2)', 'v') ==# maparg('(easymotion-sl2)', 'v') + " tl2 + Expect maparg('(easymotion-tl2)', 'n') ==# ':call EasyMotion#TL(2,0,0)' + Expect maparg('(easymotion-tl2)', 'o') ==# ':call EasyMotion#TL(2,0,0)' + Expect maparg('(easymotion-tl2)', 'v') ==# ':call EasyMotion#TL(2,1,0)' + " Tl2 + Expect maparg('(easymotion-Tl2)', 'n') ==# ':call EasyMotion#TL(2,0,1)' + Expect maparg('(easymotion-Tl2)', 'o') ==# ':call EasyMotion#TL(2,0,1)' + Expect maparg('(easymotion-Tl2)', 'v') ==# ':call EasyMotion#TL(2,1,1)' + " bd-tl2 + Expect maparg('(easymotion-bd-tl2)', 'n') ==# ':call EasyMotion#TL(2,0,2)' + Expect maparg('(easymotion-bd-tl2)', 'o') ==# ':call EasyMotion#TL(2,0,2)' + Expect maparg('(easymotion-bd-tl2)', 'v') ==# ':call EasyMotion#TL(2,1,2)' + "}}} + + " Multi Char Find Motion: {{{ + " sn + Expect maparg('(easymotion-sn)', 'n') ==# ':call EasyMotion#S(-1,0,2)' + Expect maparg('(easymotion-sn)', 'o') ==# ':call EasyMotion#S(-1,0,2)' + Expect maparg('(easymotion-sn)', 'v') ==# ':call EasyMotion#S(-1,1,2)' + " fn + Expect maparg('(easymotion-fn)', 'n') ==# ':call EasyMotion#S(-1,0,0)' + Expect maparg('(easymotion-fn)', 'o') ==# ':call EasyMotion#S(-1,0,0)' + Expect maparg('(easymotion-fn)', 'v') ==# ':call EasyMotion#S(-1,1,0)' + " Fn + Expect maparg('(easymotion-Fn)', 'n') ==# ':call EasyMotion#S(-1,0,1)' + Expect maparg('(easymotion-Fn)', 'o') ==# ':call EasyMotion#S(-1,0,1)' + Expect maparg('(easymotion-Fn)', 'v') ==# ':call EasyMotion#S(-1,1,1)' + " bd-fn + Expect maparg('(easymotion-bd-fn)', 'n') ==# maparg('(easymotion-sn)', 'n') + Expect maparg('(easymotion-bd-fn)', 'o') ==# maparg('(easymotion-sn)', 'o') + Expect maparg('(easymotion-bd-fn)', 'v') ==# maparg('(easymotion-sn)', 'v') + " tn + Expect maparg('(easymotion-tn)', 'n') ==# ':call EasyMotion#T(-1,0,0)' + Expect maparg('(easymotion-tn)', 'o') ==# ':call EasyMotion#T(-1,0,0)' + Expect maparg('(easymotion-tn)', 'v') ==# ':call EasyMotion#T(-1,1,0)' + " Tn + Expect maparg('(easymotion-Tn)', 'n') ==# ':call EasyMotion#T(-1,0,1)' + Expect maparg('(easymotion-Tn)', 'o') ==# ':call EasyMotion#T(-1,0,1)' + Expect maparg('(easymotion-Tn)', 'v') ==# ':call EasyMotion#T(-1,1,1)' + " bd-tn + Expect maparg('(easymotion-bd-tn)', 'n') ==# ':call EasyMotion#T(-1,0,2)' + Expect maparg('(easymotion-bd-tn)', 'o') ==# ':call EasyMotion#T(-1,0,2)' + Expect maparg('(easymotion-bd-tn)', 'v') ==# ':call EasyMotion#T(-1,1,2)' + " sln + Expect maparg('(easymotion-sln)', 'n') ==# ':call EasyMotion#SL(-1,0,2)' + Expect maparg('(easymotion-sln)', 'o') ==# ':call EasyMotion#SL(-1,0,2)' + Expect maparg('(easymotion-sln)', 'v') ==# ':call EasyMotion#SL(-1,1,2)' + " fln + Expect maparg('(easymotion-fln)', 'n') ==# ':call EasyMotion#SL(-1,0,0)' + Expect maparg('(easymotion-fln)', 'o') ==# ':call EasyMotion#SL(-1,0,0)' + Expect maparg('(easymotion-fln)', 'v') ==# ':call EasyMotion#SL(-1,1,0)' + " Fln + Expect maparg('(easymotion-Fln)', 'n') ==# ':call EasyMotion#SL(-1,0,1)' + Expect maparg('(easymotion-Fln)', 'o') ==# ':call EasyMotion#SL(-1,0,1)' + Expect maparg('(easymotion-Fln)', 'v') ==# ':call EasyMotion#SL(-1,1,1)' + " bd-fln + Expect maparg('(easymotion-bd-fln)', 'n') ==# maparg('(easymotion-sln)', 'n') + Expect maparg('(easymotion-bd-fln)', 'o') ==# maparg('(easymotion-sln)', 'o') + Expect maparg('(easymotion-bd-fln)', 'v') ==# maparg('(easymotion-sln)', 'v') + " tln + Expect maparg('(easymotion-tln)', 'n') ==# ':call EasyMotion#TL(-1,0,0)' + Expect maparg('(easymotion-tln)', 'o') ==# ':call EasyMotion#TL(-1,0,0)' + Expect maparg('(easymotion-tln)', 'v') ==# ':call EasyMotion#TL(-1,1,0)' + " Tln + Expect maparg('(easymotion-Tln)', 'n') ==# ':call EasyMotion#TL(-1,0,1)' + Expect maparg('(easymotion-Tln)', 'o') ==# ':call EasyMotion#TL(-1,0,1)' + Expect maparg('(easymotion-Tln)', 'v') ==# ':call EasyMotion#TL(-1,1,1)' + " bd-tln + Expect maparg('(easymotion-bd-tln)', 'n') ==# ':call EasyMotion#TL(-1,0,2)' + Expect maparg('(easymotion-bd-tln)', 'o') ==# ':call EasyMotion#TL(-1,0,2)' + Expect maparg('(easymotion-bd-tln)', 'v') ==# ':call EasyMotion#TL(-1,1,2)' + "}}} + end + + it 'provide default mappings for regex motion' + "(is_visual, direction) + " direction: + " - 0: forward + " - 1: backward + " - 2: bi-direction + " Word Motion: {{{ + Expect maparg('(easymotion-w)', 'n') ==# ':call EasyMotion#WB(0,0)' + Expect maparg('(easymotion-w)', 'o') ==# ':call EasyMotion#WB(0,0)' + Expect maparg('(easymotion-w)', 'v') ==# ':call EasyMotion#WB(1,0)' + Expect maparg('(easymotion-b)', 'n') ==# ':call EasyMotion#WB(0,1)' + Expect maparg('(easymotion-b)', 'o') ==# ':call EasyMotion#WB(0,1)' + Expect maparg('(easymotion-b)', 'v') ==# ':call EasyMotion#WB(1,1)' + Expect maparg('(easymotion-bd-w)', 'n') ==# ':call EasyMotion#WB(0,2)' + Expect maparg('(easymotion-bd-w)', 'o') ==# ':call EasyMotion#WB(0,2)' + Expect maparg('(easymotion-bd-w)', 'v') ==# ':call EasyMotion#WB(1,2)' + " }}} + + " WORD Motion: {{{ + Expect maparg('(easymotion-W)', 'n') ==# ':call EasyMotion#WBW(0,0)' + Expect maparg('(easymotion-W)', 'o') ==# ':call EasyMotion#WBW(0,0)' + Expect maparg('(easymotion-W)', 'v') ==# ':call EasyMotion#WBW(1,0)' + Expect maparg('(easymotion-B)', 'n') ==# ':call EasyMotion#WBW(0,1)' + Expect maparg('(easymotion-B)', 'o') ==# ':call EasyMotion#WBW(0,1)' + Expect maparg('(easymotion-B)', 'v') ==# ':call EasyMotion#WBW(1,1)' + Expect maparg('(easymotion-bd-W)', 'n') ==# ':call EasyMotion#WBW(0,2)' + Expect maparg('(easymotion-bd-W)', 'o') ==# ':call EasyMotion#WBW(0,2)' + Expect maparg('(easymotion-bd-W)', 'v') ==# ':call EasyMotion#WBW(1,2)' + " }}} + + " Word Motion IsKeyWord: {{{ + Expect maparg('(easymotion-iskeyword-w)', 'n') ==# ':call EasyMotion#WBK(0,0)' + Expect maparg('(easymotion-iskeyword-w)', 'o') ==# ':call EasyMotion#WBK(0,0)' + Expect maparg('(easymotion-iskeyword-w)', 'v') ==# ':call EasyMotion#WBK(1,0)' + Expect maparg('(easymotion-iskeyword-b)', 'n') ==# ':call EasyMotion#WBK(0,1)' + Expect maparg('(easymotion-iskeyword-b)', 'o') ==# ':call EasyMotion#WBK(0,1)' + Expect maparg('(easymotion-iskeyword-b)', 'v') ==# ':call EasyMotion#WBK(1,1)' + Expect maparg('(easymotion-iskeyword-bd-w)', 'n') ==# ':call EasyMotion#WBK(0,2)' + Expect maparg('(easymotion-iskeyword-bd-w)', 'o') ==# ':call EasyMotion#WBK(0,2)' + Expect maparg('(easymotion-iskeyword-bd-w)', 'v') ==# ':call EasyMotion#WBK(1,2)' + " }}} + + " End Of Word Motion: {{{ + Expect maparg('(easymotion-e)', 'n') ==# ':call EasyMotion#E(0,0)' + Expect maparg('(easymotion-e)', 'o') ==# ':call EasyMotion#E(0,0)' + Expect maparg('(easymotion-e)', 'v') ==# ':call EasyMotion#E(1,0)' + Expect maparg('(easymotion-ge)', 'n') ==# ':call EasyMotion#E(0,1)' + Expect maparg('(easymotion-ge)', 'o') ==# ':call EasyMotion#E(0,1)' + Expect maparg('(easymotion-ge)', 'v') ==# ':call EasyMotion#E(1,1)' + Expect maparg('(easymotion-bd-e)', 'n') ==# ':call EasyMotion#E(0,2)' + Expect maparg('(easymotion-bd-e)', 'o') ==# ':call EasyMotion#E(0,2)' + Expect maparg('(easymotion-bd-e)', 'v') ==# ':call EasyMotion#E(1,2)' + " }}} + + " END OF WORD Motion: {{{ + Expect maparg('(easymotion-E)', 'n') ==# ':call EasyMotion#EW(0,0)' + Expect maparg('(easymotion-E)', 'o') ==# ':call EasyMotion#EW(0,0)' + Expect maparg('(easymotion-E)', 'v') ==# ':call EasyMotion#EW(1,0)' + Expect maparg('(easymotion-gE)', 'n') ==# ':call EasyMotion#EW(0,1)' + Expect maparg('(easymotion-gE)', 'o') ==# ':call EasyMotion#EW(0,1)' + Expect maparg('(easymotion-gE)', 'v') ==# ':call EasyMotion#EW(1,1)' + Expect maparg('(easymotion-bd-E)', 'n') ==# ':call EasyMotion#EW(0,2)' + Expect maparg('(easymotion-bd-E)', 'o') ==# ':call EasyMotion#EW(0,2)' + Expect maparg('(easymotion-bd-E)', 'v') ==# ':call EasyMotion#EW(1,2)' + " }}} + + " End Of Word Motion IsKeyWord: {{{ + Expect maparg('(easymotion-iskeyword-e)', 'n') ==# ':call EasyMotion#EK(0,0)' + Expect maparg('(easymotion-iskeyword-e)', 'o') ==# ':call EasyMotion#EK(0,0)' + Expect maparg('(easymotion-iskeyword-e)', 'v') ==# ':call EasyMotion#EK(1,0)' + Expect maparg('(easymotion-iskeyword-ge)', 'n') ==# ':call EasyMotion#EK(0,1)' + Expect maparg('(easymotion-iskeyword-ge)', 'o') ==# ':call EasyMotion#EK(0,1)' + Expect maparg('(easymotion-iskeyword-ge)', 'v') ==# ':call EasyMotion#EK(1,1)' + Expect maparg('(easymotion-iskeyword-bd-e)', 'n') ==# ':call EasyMotion#EK(0,2)' + Expect maparg('(easymotion-iskeyword-bd-e)', 'o') ==# ':call EasyMotion#EK(0,2)' + Expect maparg('(easymotion-iskeyword-bd-e)', 'v') ==# ':call EasyMotion#EK(1,2)' + " }}} + + " JK Motion: {{{ + " default + Expect maparg('(easymotion-j)', 'n') ==# ':call EasyMotion#JK(0,0)' + Expect maparg('(easymotion-j)', 'o') ==# ':call EasyMotion#JK(0,0)' + Expect maparg('(easymotion-j)', 'v') ==# ':call EasyMotion#JK(1,0)' + Expect maparg('(easymotion-k)', 'n') ==# ':call EasyMotion#JK(0,1)' + Expect maparg('(easymotion-k)', 'o') ==# ':call EasyMotion#JK(0,1)' + Expect maparg('(easymotion-k)', 'v') ==# ':call EasyMotion#JK(1,1)' + Expect maparg('(easymotion-bd-jk)', 'n') ==# ':call EasyMotion#JK(0,2)' + Expect maparg('(easymotion-bd-jk)', 'o') ==# ':call EasyMotion#JK(0,2)' + Expect maparg('(easymotion-bd-jk)', 'v') ==# ':call EasyMotion#JK(1,2)' + " start of line + Expect maparg('(easymotion-sol-j)', 'n') ==# ':call EasyMotion#Sol(0,0)' + Expect maparg('(easymotion-sol-j)', 'o') ==# ':call EasyMotion#Sol(0,0)' + Expect maparg('(easymotion-sol-j)', 'v') ==# ':call EasyMotion#Sol(1,0)' + Expect maparg('(easymotion-sol-k)', 'n') ==# ':call EasyMotion#Sol(0,1)' + Expect maparg('(easymotion-sol-k)', 'o') ==# ':call EasyMotion#Sol(0,1)' + Expect maparg('(easymotion-sol-k)', 'v') ==# ':call EasyMotion#Sol(1,1)' + Expect maparg('(easymotion-sol-bd-jk)', 'n') ==# ':call EasyMotion#Sol(0,2)' + Expect maparg('(easymotion-sol-bd-jk)', 'o') ==# ':call EasyMotion#Sol(0,2)' + Expect maparg('(easymotion-sol-bd-jk)', 'v') ==# ':call EasyMotion#Sol(1,2)' + " end of line + Expect maparg('(easymotion-eol-j)', 'n') ==# ':call EasyMotion#Eol(0,0)' + Expect maparg('(easymotion-eol-j)', 'o') ==# ':call EasyMotion#Eol(0,0)' + Expect maparg('(easymotion-eol-j)', 'v') ==# ':call EasyMotion#Eol(1,0)' + Expect maparg('(easymotion-eol-k)', 'n') ==# ':call EasyMotion#Eol(0,1)' + Expect maparg('(easymotion-eol-k)', 'o') ==# ':call EasyMotion#Eol(0,1)' + Expect maparg('(easymotion-eol-k)', 'v') ==# ':call EasyMotion#Eol(1,1)' + Expect maparg('(easymotion-eol-bd-jk)', 'n') ==# ':call EasyMotion#Eol(0,2)' + Expect maparg('(easymotion-eol-bd-jk)', 'o') ==# ':call EasyMotion#Eol(0,2)' + Expect maparg('(easymotion-eol-bd-jk)', 'v') ==# ':call EasyMotion#Eol(1,2)' + " }}} + + " Search Motion: {{{ + Expect maparg('(easymotion-n)', 'n') ==# ':call EasyMotion#Search(0,0,0)' + Expect maparg('(easymotion-n)', 'o') ==# ':call EasyMotion#Search(0,0,0)' + Expect maparg('(easymotion-n)', 'v') ==# ':call EasyMotion#Search(1,0,0)' + Expect maparg('(easymotion-N)', 'n') ==# ':call EasyMotion#Search(0,1,0)' + Expect maparg('(easymotion-N)', 'o') ==# ':call EasyMotion#Search(0,1,0)' + Expect maparg('(easymotion-N)', 'v') ==# ':call EasyMotion#Search(1,1,0)' + Expect maparg('(easymotion-bd-n)', 'n') ==# ':call EasyMotion#Search(0,2,0)' + Expect maparg('(easymotion-bd-n)', 'o') ==# ':call EasyMotion#Search(0,2,0)' + Expect maparg('(easymotion-bd-n)', 'v') ==# ':call EasyMotion#Search(1,2,0)' + + " respect previous direction + Expect maparg('(easymotion-vim-n)', 'n') ==# ':call EasyMotion#Search(0,0,1)' + Expect maparg('(easymotion-vim-n)', 'o') ==# ':call EasyMotion#Search(0,0,1)' + Expect maparg('(easymotion-vim-n)', 'v') ==# ':call EasyMotion#Search(1,0,1)' + Expect maparg('(easymotion-vim-N)', 'n') ==# ':call EasyMotion#Search(0,1,1)' + Expect maparg('(easymotion-vim-N)', 'o') ==# ':call EasyMotion#Search(0,1,1)' + Expect maparg('(easymotion-vim-N)', 'v') ==# ':call EasyMotion#Search(1,1,1)' + " }}} + + " JumpToAnywhere Motion: {{{ + Expect maparg('(easymotion-jumptoanywhere)', 'n') + \ ==# ':call EasyMotion#JumpToAnywhere(0,2)' + Expect maparg('(easymotion-jumptoanywhere)', 'o') + \ ==# ':call EasyMotion#JumpToAnywhere(0,2)' + Expect maparg('(easymotion-jumptoanywhere)', 'v') + \ ==# ':call EasyMotion#JumpToAnywhere(1,2)' + " }}} + + " Repeat Motion: {{{ + " (is_visual) + Expect maparg('(easymotion-repeat)', 'n') + \ ==# ':call EasyMotion#Repeat(0)' + Expect maparg('(easymotion-repeat)', 'o') + \ ==# ':call EasyMotion#Repeat(0)' + Expect maparg('(easymotion-repeat)', 'v') + \ ==# ':call EasyMotion#Repeat(1)' + Expect maparg('(easymotion-dotrepeat)', 'n') + \ ==# ':call EasyMotion#DotRepeat()' + Expect maparg('(easymotion-dotrepeat)', 'o') + \ ==# ':call EasyMotion#DotRepeat()' + Expect maparg('(easymotion-dotrepeat)', 'v') + \ ==# ':call EasyMotion#DotRepeat()' + " }}} + + " Next, Previous motion {{{ + Expect maparg('(easymotion-next)', 'n') + \ ==# ':call EasyMotion#NextPrevious(0,0)' + Expect maparg('(easymotion-next)', 'o') + \ ==# ':call EasyMotion#NextPrevious(0,0)' + Expect maparg('(easymotion-next)', 'v') + \ ==# ':call EasyMotion#NextPrevious(1,0)' + + Expect maparg('(easymotion-prev)', 'n') + \ ==# ':call EasyMotion#NextPrevious(0,1)' + Expect maparg('(easymotion-prev)', 'o') + \ ==# ':call EasyMotion#NextPrevious(0,1)' + Expect maparg('(easymotion-prev)', 'v') + \ ==# ':call EasyMotion#NextPrevious(1,1)' + " }}} + + " Line Motion: {{{ + " word + Expect maparg('(easymotion-wl)', 'n') ==# ':call EasyMotion#WBL(0,0)' + Expect maparg('(easymotion-wl)', 'o') ==# ':call EasyMotion#WBL(0,0)' + Expect maparg('(easymotion-wl)', 'v') ==# ':call EasyMotion#WBL(1,0)' + Expect maparg('(easymotion-bl)', 'n') ==# ':call EasyMotion#WBL(0,1)' + Expect maparg('(easymotion-bl)', 'o') ==# ':call EasyMotion#WBL(0,1)' + Expect maparg('(easymotion-bl)', 'v') ==# ':call EasyMotion#WBL(1,1)' + Expect maparg('(easymotion-bd-wl)', 'n') ==# ':call EasyMotion#WBL(0,2)' + Expect maparg('(easymotion-bd-wl)', 'o') ==# ':call EasyMotion#WBL(0,2)' + Expect maparg('(easymotion-bd-wl)', 'v') ==# ':call EasyMotion#WBL(1,2)' + " end of word + Expect maparg('(easymotion-el)', 'n') ==# ':call EasyMotion#EL(0,0)' + Expect maparg('(easymotion-el)', 'o') ==# ':call EasyMotion#EL(0,0)' + Expect maparg('(easymotion-el)', 'v') ==# ':call EasyMotion#EL(1,0)' + Expect maparg('(easymotion-gel)', 'n') ==# ':call EasyMotion#EL(0,1)' + Expect maparg('(easymotion-gel)', 'o') ==# ':call EasyMotion#EL(0,1)' + Expect maparg('(easymotion-gel)', 'v') ==# ':call EasyMotion#EL(1,1)' + Expect maparg('(easymotion-bd-el)', 'n') ==# ':call EasyMotion#EL(0,2)' + Expect maparg('(easymotion-bd-el)', 'o') ==# ':call EasyMotion#EL(0,2)' + Expect maparg('(easymotion-bd-el)', 'v') ==# ':call EasyMotion#EL(1,2)' + " LineAnywhere + Expect maparg('(easymotion-lineforward)', 'n') + \ ==# ':call EasyMotion#LineAnywhere(0,0)' + Expect maparg('(easymotion-lineforward)', 'o') + \ ==# ':call EasyMotion#LineAnywhere(0,0)' + Expect maparg('(easymotion-lineforward)', 'v') + \ ==# ':call EasyMotion#LineAnywhere(1,0)' + Expect maparg('(easymotion-linebackward)', 'n') + \ ==# ':call EasyMotion#LineAnywhere(0,1)' + Expect maparg('(easymotion-linebackward)', 'o') + \ ==# ':call EasyMotion#LineAnywhere(0,1)' + Expect maparg('(easymotion-linebackward)', 'v') + \ ==# ':call EasyMotion#LineAnywhere(1,1)' + Expect maparg('(easymotion-lineanywhere)', 'n') + \ ==# ':call EasyMotion#LineAnywhere(0,2)' + Expect maparg('(easymotion-lineanywhere)', 'o') + \ ==# ':call EasyMotion#LineAnywhere(0,2)' + Expect maparg('(easymotion-lineanywhere)', 'v') + \ ==# ':call EasyMotion#LineAnywhere(1,2)' + " }}} + + " Activate {{{ + Expect maparg('(easymotion-activate)', 'n') + \ ==# ':call EasyMotion#activate(0)' + Expect maparg('(easymotion-activate)', 'o') + \ ==# ':call EasyMotion#activate(0)' + Expect maparg('(easymotion-activate)', 'v') + \ ==# ':call EasyMotion#activate(1)' + " }}} + end + + it 'provide autoload functions' + try + " load autoload functions + runtime autoload/EasyMotion.vim + runtime autoload/EasyMotion/helper.vim + runtime autoload/EasyMotion/cmigemo.vim + runtime autoload/EasyMotion/init.vim + runtime autoload/EasyMotion/sticky_table.vim + catch + endtry + " autoload/EasyMotion.vim {{{ + Expect exists('*EasyMotion#hoge') ==# 0 + Expect exists('*EasyMotion#S') ==# 1 + Expect exists('*EasyMotion#T') ==# 1 + Expect exists('*EasyMotion#WB') ==# 1 + Expect exists('*EasyMotion#WBW') ==# 1 + Expect exists('*EasyMotion#E') ==# 1 + Expect exists('*EasyMotion#EW') ==# 1 + Expect exists('*EasyMotion#JK') ==# 1 + Expect exists('*EasyMotion#Sol') ==# 1 + Expect exists('*EasyMotion#Eol') ==# 1 + Expect exists('*EasyMotion#Search') ==# 1 + Expect exists('*EasyMotion#JumpToAnywhere') ==# 1 + Expect exists('*EasyMotion#SL') ==# 1 + Expect exists('*EasyMotion#TL') ==# 1 + Expect exists('*EasyMotion#WBL') ==# 1 + Expect exists('*EasyMotion#EL') ==# 1 + Expect exists('*EasyMotion#LineAnywhere') ==# 1 + Expect exists('*EasyMotion#Repeat') ==# 1 + Expect exists('*EasyMotion#NextPrevious') ==# 1 + Expect exists('*EasyMotion#DotRepeat') ==# 1 + "}}} + end + + it 'provide variables to customize EasyMotion' + " Option {{{ + Expect g:EasyMotion_keys ==# 'asdghklqwertyuiopzxcvbnmfj;' + " Expect g:EasyMotion_keys ==# 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' + Expect g:EasyMotion_do_mapping ==# 1 + Expect g:EasyMotion_do_shade ==# 1 + Expect g:EasyMotion_grouping ==# 1 + Expect g:EasyMotion_startofline ==# 1 + Expect g:EasyMotion_smartcase ==# 0 + Expect g:EasyMotion_skipfoldedline ==# 1 + Expect g:EasyMotion_use_migemo ==# 0 + Expect g:EasyMotion_use_upper ==# 0 + Expect g:EasyMotion_enter_jump_first ==# 0 + Expect g:EasyMotion_space_jump_first ==# 0 + Expect g:EasyMotion_show_prompt ==# 1 + Expect g:EasyMotion_inc_highlight ==# 1 + Expect g:EasyMotion_move_highlight ==# 1 + Expect g:EasyMotion_landing_highlight ==# 0 + Expect g:EasyMotion_cursor_highlight ==# 1 + Expect g:EasyMotion_use_regexp ==# 1 + Expect g:EasyMotion_add_search_history ==# 1 + Expect g:EasyMotion_off_screen_search ==# 1 + Expect g:EasyMotion_prompt ==# 'Search for {n} character(s): ' + Expect g:EasyMotion_command_line_key_mappings ==# {} + Expect g:EasyMotion_force_csapprox ==# 0 + Expect g:EasyMotion_disable_two_key_combo ==# 0 + " }}} + + " highlight {{{ + Expect g:EasyMotion_hl_group_target ==# 'EasyMotionTarget' + Expect g:EasyMotion_hl2_first_group_target ==# 'EasyMotionTarget2First' + Expect g:EasyMotion_hl2_second_group_target ==# 'EasyMotionTarget2Second' + Expect g:EasyMotion_hl_group_shade ==# 'EasyMotionShade' + " }}} + end +end +"}}} + +function! AddLine(str) + put! =a:str +endfunction + +function! CursorPos() + return [line('.'), col('.'), getline('.')[col('.')-1]] +endfunction + +" s, f, F, t and T mappings {{{ +describe 's, f, F, t and T mappings' + + before + new + let g:EasyMotion_keys = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' + map s (easymotion-s) + map f (easymotion-f) + map F (easymotion-F) + map t (easymotion-t) + map T (easymotion-T) + call EasyMotion#init() + call AddLine('poge huga hiyo poyo') + end + + after + close! + end + + " s {{{ + it 'provide improved forward search like builtin f & F' + normal! 0 + let l = line('.') + Expect CursorPos() == [l,1,'p'] + normal sha + Expect CursorPos() == [l,6,'h'] + Expect CursorPos() != [l,1,'h'] + + normal! 0 + let l = line('.') + Expect CursorPos() == [l,1,'p'] + normal shb + Expect CursorPos() == [l,11,'h'] + + normal sh + Expect CursorPos() == [l,6,'h'] + + normal! $ + let l = line('.') + Expect CursorPos() == [l,19,'o'] + + normal spc + Expect CursorPos() == [l,19,'o'] + + normal spb + Expect CursorPos() == [l,1,'p'] + end + "}}} + " f {{{ + it 'provide improved backward search like builtin f' + normal! 0 + let l = line('.') + Expect CursorPos() == [l,1,'p'] + + normal fha + Expect CursorPos() == [l,6,'h'] + Expect CursorPos() != [l,1,'h'] + + normal! 0 + let l = line('.') + Expect CursorPos() == [l,1,'p'] + normal fhb + Expect CursorPos() == [l,11,'h'] + + normal fh + Expect CursorPos() == [l,11,'h'] + + end + " "}}} + " F {{{ + it 'provide improved backward search like builtin F' + normal! $ + let l = line('.') + Expect CursorPos() == [l,19,'o'] + + normal Fpa + Expect CursorPos() == [l,16,'p'] + + normal! $ + normal Fpc + Expect CursorPos() == [l,19,'o'] + + normal Fpb + Expect CursorPos() == [l,1,'p'] + end + " "}}} + " t {{{ + it 'provide t mapping like builtin t' + normal! 0 + let l = line('.') + Expect CursorPos() == [l,1,'p'] + Expect CursorPos() != [l,10,'a'] + + normal tha + Expect CursorPos() == [l,5,' '] + + normal! 0 + normal thb + Expect CursorPos() == [l,10,' '] + + normal! 0 + normal thc + Expect CursorPos() == [l,1,'p'] + end + " }}} + " T {{{ + it 'provide T mapping like builtin T' + normal! $ + let l = line('.') + Expect CursorPos() == [l,19,'o'] + Expect CursorPos() != [l,18,'a'] + + normal Toa + Expect CursorPos() == [l,18,'y'] + + normal! $ + normal Tob + Expect CursorPos() == [l,15,' '] + + normal Toa + Expect CursorPos() == [l,3,'g'] + + normal! $ + normal Tod + Expect CursorPos() == [l,19,'o'] + + normal Toc + Expect CursorPos() == [l,3,'g'] + end + "}}} + " visual + it 'have different context in normal mode and visual mode' + let l = line('.') + Expect CursorPos() == [l, 1, 'p'] + + normal foa + Expect CursorPos() == [l, 2, 'o'] + + normal vfha + Expect CursorPos() == [l, 6, 'h'] + + normal fha + Expect CursorPos() == [l, 11, 'h'] + + normal! d + Expect getline('.') == "piyo poyo" + Expect CursorPos() == [l, 2, 'i'] + + normal! dfpa + Expect getline('.') == "poyo" + Expect CursorPos() == [l, 2, 'o'] + end +end +"}}} + +" a non-existent char {{{ +describe 'a non-existent char' + + before + new + let g:EasyMotion_keys = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' + map s (easymotion-s) + map f (easymotion-f) + map F (easymotion-F) + map t (easymotion-t) + map T (easymotion-T) + call EasyMotion#init() + call AddLine('poge huga hiyo poyo') + end + + after + close! + end + + " makes no change {{{ + it 'makes no change' + normal! 0 + let origin = CursorPos() + + normal fd + Expect CursorPos() == origin + normal f1 + Expect CursorPos() == origin + normal f) + Expect CursorPos() == origin + normal f^ + Expect CursorPos() == origin + normal fm + Expect CursorPos() == origin + end + "}}} +end +"}}} + +" when target is in other line, s, f and F mappings {{{ +describe 'when target is in other line, s, f and F mappings' + before + new + let g:EasyMotion_keys = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' + map s (easymotion-s) + map f (easymotion-f) + map F (easymotion-F) + map t (easymotion-t) + map T (easymotion-T) + call EasyMotion#init() + call AddLine('foo bar baz') " L2 + call AddLine('poge huga hiyo poyo') " L1 + " '1234567890123456789' + normal! gg0 + end + + after + close! + end + + " move cursor forward across lines {{{ + it 'move cursor forward & backward across lines' + normal! 0 + let l = line('.') + Expect col('.') == 1 + + normal saa + Expect CursorPos() == [l, 9, 'a'] + + normal saa + Expect CursorPos() == [l+1, 6, 'a'] + + normal sob + Expect CursorPos() == [l+1, 2, 'o'] + + normal! gg0 + let l = line('.') + Expect col('.') == 1 + + normal faa + Expect CursorPos() == [l, 9, 'a'] + + normal faa + Expect CursorPos() == [l+1, 6, 'a'] + + normal faa + Expect CursorPos() == [l+1, 10, 'a'] + + normal Faa + Expect CursorPos() == [l+1, 6, 'a'] + + normal Faa + Expect CursorPos() == [l, 9, 'a'] + end + " }}} +end +"}}} + +" Multibyte characters {{{ +describe 'Multibyte characters' + + before + new + let g:EasyMotion_keys = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' + map s (easymotion-s) + map f (easymotion-f) + map F (easymotion-F) + map t (easymotion-t) + map T (easymotion-T) + call EasyMotion#init() + call AddLine('ビムかわいいよzビムx') + call AddLine('foo bar baz') + normal! gg + end + + after + close! + end + + " is supported "{{{ + it 'is supported' + normal! gg0 + let l = line('.') + + normal fza + Expect CursorPos() == [l, 11, 'z'] + Expect CursorPos() != [l, 1, '2'] + + normal fz + Expect CursorPos() == [l+1, 22, 'z'] + + normal! h + normal fxa + Expect CursorPos() == [l+1, 29, 'x'] + end + " }}} + +end +"}}} + +" EasyMotion#helper#include_multibyte_char {{{ +describe 'EasyMotion#helper#include_multibyte_char' + + it 'return true when the argument includes multibyte char' + Expect EasyMotion#helper#include_multibyte_char("あいうえお") ==# 1 + Expect EasyMotion#helper#include_multibyte_char("aiueoあ") ==# 1 + Expect EasyMotion#helper#include_multibyte_char("123ABC45") ==# 1 + end + + it 'return false when the argument does not include multibyte char' + Expect EasyMotion#helper#include_multibyte_char("aiueo") ==# 0 + Expect EasyMotion#helper#include_multibyte_char("this_is_a_pen.") ==# 0 + Expect EasyMotion#helper#include_multibyte_char("!#$%&'()'") ==# 0 + Expect EasyMotion#helper#include_multibyte_char("") ==# 0 + end + +end +"}}} + +" migemo support {{{ +describe 'migemo support' + + before + new + let g:EasyMotion_keys = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' + let g:EasyMotion_use_migemo = 1 + map s (easymotion-s) + map f (easymotion-f) + map F (easymotion-F) + map t (easymotion-t) + map T (easymotion-T) + call EasyMotion#init() + call AddLine('はー,ビムかわいいよビム') + normal! gg0 + end + + after + close! + let g:clever_f_use_migemo = 0 + end + + " makes f and F mapping match multibyte characters {{{ + it 'makes f and F mapping match multibyte characters' + normal fba + Expect col('.') == 10 + normal fb + Expect col('.') == 31 + normal Fb + Expect col('.') == 10 + normal $ + normal Fba + Expect col('.') == 31 + normal Fb + Expect col('.') == 10 + end + " }}} + + " makes t and T mapping match multibyte characters {{{ + it 'makes t and T mapping match multibyte characters' + normal tba + Expect col('.') == 7 + normal tb + Expect col('.') == 28 + normal Tb + Expect col('.') == 13 + normal $ + normal Tba + Expect col('.') == 13 + normal tb + Expect col('.') == 28 + end + " }}} + +end +"}}} + +" g:EasyMotion_smartcase {{{ +describe 'g:EasyMotion_smartcase' + + before + new + let g:EasyMotion_keys = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' + map s (easymotion-s) + map f (easymotion-f) + map F (easymotion-F) + map t (easymotion-t) + map T (easymotion-T) + call EasyMotion#init() + call AddLine('poHe huga Hiyo hoyo: poyo();') + 1234567890123456789012345678 + normal! gg0 + let g:EasyMotion_smartcase = 1 + end + + after + close! + let g:EasyMotion_smartcase = 0 + end + + " makes f smart case {{{ + it 'makes f smart case' + normal fha + Expect col('.') == 3 + normal fha + Expect col('.') == 6 + normal fha + Expect col('.') == 11 + normal fh + Expect col('.') == 16 + normal Fha + Expect col('.') == 11 + + normal! 0 + normal fHa + Expect col('.') == 3 + normal fH + Expect col('.') == 11 + normal fHa + Expect col('.') == 11 + normal FH + Expect col('.') == 3 + end + "}}} + + " makes t smart case {{{ + it 'makes t smart case' + normal! $ + normal Tha + Expect col('.') == 17 + normal Tha + Expect col('.') == 12 + normal Tha + Expect col('.') == 7 + normal Th + Expect col('.') == 4 + normal tha + Expect col('.') == 5 + + normal! $ + normal THa + Expect col('.') == 12 + normal TH + Expect col('.') == 4 + normal tH + Expect col('.') == 10 + end + " }}} + + " makes no effect on searching signs {{{ + it 'makes no effect on searching signs' + normal! 0 + normal f; + Expect col('.') == 28 + normal! 0 + normal f: + Expect col('.') == 20 + normal f: + Expect col('.') == 20 + end + " }}} +end +"}}} + +" g:EasyMotion_smartsign {{{ +describe 'g:EasyMotion_smartsign' + + before + new + let g:EasyMotion_keys = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' + map s (easymotion-s) + map f (easymotion-f) + map F (easymotion-F) + map t (easymotion-t) + map T (easymotion-T) + call EasyMotion#init() + call AddLine('poHe huga Hiyo hoyo: poyo();') + " 1234567890123456789012345678 + normal! gg0 + let g:EasyMotion_smartcase = 1 + let g:EasyMotion_use_smartsign_us = 1 + end + + after + close! + let g:EasyMotion_smartcase = 0 + let g:EasyMotion_use_smartsign_us = 0 + end + + " makes f smart sign {{{ + it 'makes f smart case' + normal! 0 + normal f; + Expect col('.') == 1 + normal f;a + Expect col('.') == 20 + normal f; + Expect col('.') == 28 + + normal! 0 + normal f: + Expect col('.') == 20 + normal f: + Expect col('.') == 20 + end + "}}} + + " makes t,T smart sign {{{ + it 'makes t,T smart case' + normal! 0 + normal t; + Expect col('.') == 1 + normal t;a + Expect col('.') == 19 + normal t; + Expect col('.') == 27 + normal! $ + Expect col('.') == 28 + normal T; + Expect col('.') == 21 + end + "}}} +end +"}}} + +" Next & Previous {{{ +describe '(easymotion-next) & (easymotion-prev)' + before + new + let g:EasyMotion_keys = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' + map s (easymotion-s) + map ; (easymotion-next) + map , (easymotion-prev) + set wrapscan + call EasyMotion#init() + call AddLine('poge huga hiyo poyo') + " 1234567890123456789 + end + + after + close! + end + + " provide next & previous motion to replace `;`, `,` {{{ + it 'provide next & previous motion to replace `;`, `,`' + normal! 0 + let l = line('.') + Expect CursorPos() == [l,1,'p'] + normal sha + Expect CursorPos() == [l,6,'h'] + + normal ; + Expect CursorPos() == [l,11,'h'] + + normal , + Expect CursorPos() == [l,6,'h'] + + " wrapscan + normal , + Expect CursorPos() == [l,11,'h'] + normal ; + Expect CursorPos() == [l,6,'h'] + + normal! $ + let l = line('.') + Expect CursorPos() == [l,19,'o'] + + normal , + Expect CursorPos() == [l,11,'h'] + + end + "}}} + + " next & previous motion count {{{ + it 'next & previous motion count' + normal! 0 + let l = line('.') + Expect CursorPos() == [l,1,'p'] + normal sha + Expect CursorPos() == [l,6,'h'] + + normal ; + Expect CursorPos() == [l,11,'h'] + + normal 2, + Expect CursorPos() == [l,11,'h'] + + " wrapscan + normal 4, + Expect CursorPos() == [l,11,'h'] + normal 3; + Expect CursorPos() == [l,6,'h'] + + normal! $ + let l = line('.') + Expect CursorPos() == [l,19,'o'] + + normal , + Expect CursorPos() == [l,11,'h'] + + end + "}}} +end +"}}} + +" Jumplist {{{ +describe 'EasyMotion is jump motion' + before + new + let g:EasyMotion_keys = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' + map s (easymotion-s) + call EasyMotion#init() + call AddLine('poge huga hiyo poyo') + " 1234567890123456789 + end + + after + close! + end + + " could jump back to previous location {{{ + it ' could jump back to previous location' + normal! 0 + let l = line('.') + Expect CursorPos() == [l,1,'p'] + normal sha + Expect CursorPos() == [l,6,'h'] + + exec "normal! \" + Expect CursorPos() == [l,1,'p'] + + normal! `` + Expect CursorPos() == [l,6,'h'] + normal! `` + Expect CursorPos() == [l,1,'p'] + normal! `` + Expect CursorPos() == [l,6,'h'] + + normal! $ + Expect CursorPos() == [l,19,'o'] + normal spa + Expect CursorPos() == [l,16,'p'] + exec "normal! \" + Expect CursorPos() == [l,19,'o'] + end + "}}} +end +"}}} + +" Regexp {{{ +describe 'EasyMotion regexp' + before + new + let g:EasyMotion_keys = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' + let g:EasyMotion_use_regexp = 1 + map s (easymotion-sn) + call EasyMotion#init() + call AddLine('poge1 2huga 3hiyo 4poyo') + " 12345678901234567890123 + end + + after + let g:EasyMotion_use_regexp = 0 + close! + end + + " could jump back to previous location {{{ + it 'provide regexp motion' + normal! 0 + let l = line('.') + Expect CursorPos() == [l,1,'p'] + exe "normal s\\d\a" + Expect CursorPos() == [l,5,'1'] + + normal! 0 + Expect CursorPos() == [l,1,'p'] + exe "normal s\\d\c" + Expect CursorPos() == [l,13,'3'] + + exe "normal s\$\a" + Expect CursorPos() == [l,23,'o'] + + exe "normal s\^\b" + Expect CursorPos() == [l,1,'p'] + end + "}}} +end +"}}} + +" bi-directional t motion {{{ +describe 'bi-directional t motion' + before + new + let g:EasyMotion_keys = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' + let g:EasyMotion_use_regexp = 1 + map t (easymotion-bd-t) + call EasyMotion#init() + call AddLine('poge1 2huga 3hiyo 4poyo') + " 12345678901234567890123 + end + + after + let g:EasyMotion_use_regexp = 0 + close! + end + + " provide bidirectional motion with one key mapping {{{ + it 'provide bidirectional motion with one key mapping' + normal! 0 + let l = line('.') + Expect CursorPos() == [l,1,'p'] + normal thb + Expect CursorPos() == [l,13,'3'] + + normal! h + Expect CursorPos() == [l,12,' '] + + normal thb + Expect CursorPos() == [l,9,'u'] + + end + "}}} +end +"}}} + +" off-screen search {{{ +describe 'off-screen search' + before + new + let g:EasyMotion_keys = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' + let g:EasyMotion_off_screen_search = 1 + map s/ (easymotion-sn) + map f/ (easymotion-fn) + map F/ (easymotion-Fn) + map t/ (easymotion-tn) + map T/ (easymotion-Tn) + call EasyMotion#init() + call AddLine('deco-chan deco-chan') + call AddLine('vim') + for i in range(50) + call AddLine('poge1 2huga 3hiyo 4poyo') + endfor + " 12345678901234567890123 + end + + after + let g:EasyMotion_off_screen_search = 0 + close! + end + + " provide search with off-screen range {{{ + it 'provide search with off-screen range' + normal! gg0 + let l = line('.') + Expect CursorPos() == [l,1,'p'] + + exec "normal s/vim\" + Expect CursorPos() == [51,1,'v'] + + normal! gg0 + exec "normal f/im\" + Expect CursorPos() == [51,2,'i'] + + set wrapscan + Expect &wrapscan == 1 + normal! gg0 + exec "normal F/im\" + Expect CursorPos() == [51,2,'i'] + + " Cancel + normal! gg0 + exec "normal s/vim\" + Expect CursorPos() == [l,1,'p'] + + " Label + normal! gg0 + exec "normal s/deco-chan\\" + Expect CursorPos() == [l,1,'p'] + + normal! gg0 + exec "normal s/deco-chan\a" + Expect CursorPos() == [52,1,'d'] + + normal! gg0 + exec "normal s/deco-chan\b" + Expect CursorPos() == [52,11,'d'] + + normal! gg0 + exec "normal t/chan\a" + Expect CursorPos() == [52,5,'-'] + + normal! gg0 + exec "normal t/chan\b" + Expect CursorPos() == [52,15,'-'] + + end + "}}} +end + +describe 'dot notoff-screen search' + before + new + let g:EasyMotion_keys = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' + let g:EasyMotion_off_screen_search = 0 + map s/ (easymotion-sn) + call EasyMotion#init() + call AddLine('deco-chan deco-chan') + call AddLine('vim') + for i in range(50) + call AddLine('poge1 2huga 3hiyo 4poyo') + endfor + " 12345678901234567890123 + end + + after + close! + end + + " provide search with off-screen range {{{ + it 'provide search with off-screen range' + normal! gg0 + let l = line('.') + Expect CursorPos() == [l,1,'p'] + + exec "normal s/vim\" + Expect CursorPos() != [51,1,'v'] + Expect CursorPos() == [l,1,'p'] + end + "}}} +end +"}}} + +" off-screen search scroll {{{ +describe 'off-screen search scroll' + before + new + let g:EasyMotion_keys = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' + let g:EasyMotion_off_screen_search = 1 + map / (easymotion-sn) + call EasyMotion#init() + call AddLine('deco-chan deco-chan') + call AddLine('vim') + for i in range(500) + call AddLine('poge1 2huga 3hiyo 4poyo') + endfor + call AddLine('deco-chan deco-chan') + " 12345678901234567890123 + end + + after + let g:EasyMotion_off_screen_search = 0 + close! + end + + " provide scroll {{{ + it 'provide scroll' + normal! gg0 + let l = line('.') + Expect CursorPos() == [l,1,'d'] + + normal! gg0 + exec "normal /deco-chan\" + Expect CursorPos() == [l,11,'d'] + + normal! gg0 + exec "normal /deco-chan\\a" + Expect CursorPos() == [503,1,'d'] + + end + "}}} +end +"}}} + +"Word motion {{{ +describe 'Word motion' + before + new + let g:EasyMotion_keys = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' + map w (easymotion-w) + map b (easymotion-b) + map w (easymotion-iskeyword-w) + map b (easymotion-iskeyword-b) + call EasyMotion#init() + call AddLine('vim vim vim') + call AddLine('poge1 2huga 3hiyo 4poyo 5:test') + " 12345678901234567890123 + " 0 1 2 3 + " 123456789012345678901234567890 + " poge1 2huga 3hiyo 4poyo 5:test + " vim vim vim + end + + after + close! + end + + " Word motion {{ + it 'Word motion' + normal! 0 + let l = line('.') + Expect CursorPos() == [l,1,'p'] + normal wc + Expect CursorPos() == [l,19,'4'] + + normal bb + Expect CursorPos() == [l,7,'2'] + + normal! 0 + Expect CursorPos() == [l,1,'p'] + + normal wh + Expect CursorPos() == [2,9,'v'] + normal bh + Expect CursorPos() == [l,1,'p'] + end + "}} +end + +describe 'Verbose' + before + new + map s (easymotion-s) + map f (easymotion-f) + map F (easymotion-F) + map t (easymotion-t) + map T (easymotion-T) + call EasyMotion#init() + call AddLine('some words in the sentence') + end + + after + close! + end + + it 'Verbose global variable' + Expect g:EasyMotion_verbose ==# 1 + end + + it 'Turned On' + let g:EasyMotion_verbose = 1 + let &verbosefile = tempname() + normal sa + " TODO: l:tmp_name_verbose should have one line + end + it 'Turned Off' + let g:EasyMotion_verbose = 0 + let &verbosefile = &verbosefile + normal s_ + " TODO: l:tmp_name_not_verbose should have no lines + end +end +"}}} + +" vim: fdm=marker:et:ts=4:sw=4:sts=4 diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/t/operator_pending_spec.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/t/operator_pending_spec.vim new file mode 100644 index 0000000..80a0999 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/t/operator_pending_spec.vim @@ -0,0 +1,110 @@ +"============================================================================= +" FILE: t/operator_pending_spec.vim +" AUTHOR: haya14busa +" License: MIT license {{{ +" Permission is hereby granted, free of charge, to any person obtaining +" a copy of this software and associated documentation files (the +" "Software"), to deal in the Software without restriction, including +" without limitation the rights to use, copy, modify, merge, publish, +" distribute, sublicense, and/or sell copies of the Software, and to +" permit persons to whom the Software is furnished to do so, subject to +" the following conditions: +" +" The above copyright notice and this permission notice shall be included +" in all copies or substantial portions of the Software. +" +" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +" IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +" CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +" TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +" SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +" }}} +"============================================================================= + +" Avoid source test files {{{ +if expand("%:p") ==# expand(":p") + finish +endif +"}}} + +" Setup {{{ +let s:root_dir = matchstr(system('git rev-parse --show-cdup'), '[^\n]\+') +execute 'set' 'rtp +=./'.s:root_dir +runtime! plugin/EasyMotion.vim +"}}} + +" Functions for Test {{{ +function! AddLine(str) + put! =a:str +endfunction + +function! CursorPos() + return [line('.'), col('.'), getline('.')[col('.')-1]] +endfunction +"}}} + + +" NOTE: +" I cannot test inclusive motion because mode() doesn't works well with +" vim-vspec + +" word motions {{{ +describe 'word motions' + before + new + let g:EasyMotion_keys = '123456789' + omap f (easymotion-f) + omap w (easymotion-w) + omap b (easymotion-b) + call EasyMotion#init() + call AddLine('vim deco vim deco vim deco') + " 123456789012345678901234567890 + end + + after + close! + end + + it '(easymotion-w)' + " Default position + normal! 0 + let l = line('.') + Expect CursorPos() == [l,1,'v'] + + normal dw1 + Expect CursorPos() == [l,1,'d'] + normal! u + normal! 0 + Expect CursorPos() == [l,1,'v'] + + normal dw2 + Expect CursorPos() == [l,1,'v'] + normal! 0 + normal! u + normal! 0 + Expect CursorPos() == [l,1,'v'] + end + + it '(easymotion-b)' + " Default position + normal! $ + let l = line('.') + Expect CursorPos() == [l,26,'o'] + + normal db1 + Expect CursorPos() == [l,23,'o'] + normal! u + normal! $ + Expect CursorPos() == [l,26,'o'] + + normal db2 + Expect CursorPos() == [l,19,'o'] + normal! u + normal! $ + Expect CursorPos() == [l,26,'o'] + end +end +"}}} + diff --git a/home-rc/dot-files/.vim/bundle/vim-easymotion/t/smartsign_spec.vim b/home-rc/dot-files/.vim/bundle/vim-easymotion/t/smartsign_spec.vim new file mode 100644 index 0000000..20fbb05 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-easymotion/t/smartsign_spec.vim @@ -0,0 +1,575 @@ +"============================================================================= +" FILE: t/smartsign_spec.vim +" AUTHOR: haya14busa +" License: MIT license {{{ +" Permission is hereby granted, free of charge, to any person obtaining +" a copy of this software and associated documentation files (the +" "Software"), to deal in the Software without restriction, including +" without limitation the rights to use, copy, modify, merge, publish, +" distribute, sublicense, and/or sell copies of the Software, and to +" permit persons to whom the Software is furnished to do so, subject to +" the following conditions: +" +" The above copyright notice and this permission notice shall be included +" in all copies or substantial portions of the Software. +" +" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +" IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +" CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +" TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +" SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +" }}} +"============================================================================= + +" Test for `smartsign` feature for find motions + +" Avoid source test files {{{ +if expand("%:p") ==# expand(":p") + finish +endif +"}}} + +" Setup {{{ +let s:root_dir = matchstr(system('git rev-parse --show-cdup'), '[^\n]\+') +execute 'set' 'rtp +=./'.s:root_dir +runtime! plugin/EasyMotion.vim +"}}} + +" Functions for Test {{{ +function! AddLine(str) + put! =a:str +endfunction + +function! CursorPos() + return [line('.'), col('.'), getline('.')[col('.')-1]] +endfunction +"}}} + +" Smartsign configulation {{{ +describe 'Smartsign configulation' + it 'provide default dictionary' + let smartdict_us = g:EasyMotion#sticky_table#us + let smartdict_jp = g:EasyMotion#sticky_table#jp + Expect smartdict_us !=# {} + Expect smartdict_jp !=# {} + end +end +"}}} + +" Basic Smartsign feature with 1-key findmotions with US layout {{{ +describe 'Basic Smartsign feature with 1-key findmotions with US layout' + before + new + let g:EasyMotion_keys = '123456789' + let g:EasyMotion_use_smartsign_us = 1 + map s (easymotion-s) + call EasyMotion#init() + call AddLine(' -_ =+ ;: [{ ]} `~ ''" \|') + call AddLine(' 1! 2@ 3# 4$ 5% 6^ 7& 8* 9( 0)') + call AddLine(' ,< .> /?') + " 123456789012345678901234567890 + " 1 2 3 + " + " ',' : '<', '.' : '>', '/' : '?', + " '1' : '!', '2' : '@', '3' : '#', '4' : '$', '5' : '%', + " '6' : '^', '7' : '&', '8' : '*', '9' : '(', '0' : ')', '-' : '_', '=' : '+', + " ';' : ':', '[' : '{', ']' : '}', '`' : '~', "'" : "\"", '\' : '|', + end + + after + close! + end + + it 'works well for all sign as a target char' + " Default position + normal! 0 + let l = line('.') + Expect CursorPos() == [l,1,' '] + + " ,< + normal s,1 + Expect CursorPos() == [l,2,','] + normal! 0 + normal s,2 + Expect CursorPos() == [l,3,'<'] + normal! 0 + normal s<1 + Expect CursorPos() == [l,3,'<'] + normal! 0 + normal s,3 + Expect CursorPos() == [l,1,' '] + normal! 0 + + " .> + normal s.1 + Expect CursorPos() == [l,5,'.'] + normal! 0 + normal s.2 + Expect CursorPos() == [l,6,'>'] + normal! 0 + normal s>1 + Expect CursorPos() == [l,6,'>'] + normal! 0 + normal s.3 + Expect CursorPos() == [l,1,' '] + normal! 0 + + " /? + normal s/1 + Expect CursorPos() == [l,8,'/'] + normal! 0 + normal s/2 + Expect CursorPos() == [l,9,'?'] + normal! 0 + normal s?1 + Expect CursorPos() == [l,9,'?'] + normal! 0 + normal s/3 + Expect CursorPos() == [l,1,' '] + normal! 0 + + " 1! + normal s11 + Expect CursorPos() == [l+1,2,'1'] + normal! 0 + normal s12 + Expect CursorPos() == [l+1,3,'!'] + normal! 0 + normal s!1 + Expect CursorPos() == [l+1,3,'!'] + normal! 0 + normal s13 + Expect CursorPos() == [l+1,1,' '] + normal! 0 + + " 2@ + normal s21 + Expect CursorPos() == [l+1,5,'2'] + normal! 0 + normal s22 + Expect CursorPos() == [l+1,6,'@'] + normal! 0 + normal s@1 + Expect CursorPos() == [l+1,6,'@'] + normal! 0 + normal s23 + Expect CursorPos() == [l+1,1,' '] + normal! 0 + + " 3# + normal s31 + Expect CursorPos() == [l+1,8,'3'] + normal! 0 + normal s32 + Expect CursorPos() == [l+1,9,'#'] + normal! 0 + normal s#1 + Expect CursorPos() == [l+1,9,'#'] + normal! 0 + normal s33 + Expect CursorPos() == [l+1,1,' '] + normal! 0 + + " 4$ + normal s41 + Expect CursorPos() == [l+1,11,'4'] + normal! 0 + normal s42 + Expect CursorPos() == [l+1,12,'$'] + normal! 0 + normal s$1 + Expect CursorPos() == [l+1,12,'$'] + normal! 0 + normal s43 + Expect CursorPos() == [l+1,1,' '] + normal! 0 + + " 5% + normal s51 + Expect CursorPos() == [l+1,14,'5'] + normal! 0 + normal s52 + Expect CursorPos() == [l+1,15,'%'] + normal! 0 + normal s%1 + Expect CursorPos() == [l+1,15,'%'] + normal! 0 + normal s53 + Expect CursorPos() == [l+1,1,' '] + normal! 0 + + " 6^ + normal s61 + Expect CursorPos() == [l+1,17,'6'] + normal! 0 + normal s62 + Expect CursorPos() == [l+1,18,'^'] + normal! 0 + normal s^1 + Expect CursorPos() == [l+1,18,'^'] + normal! 0 + normal s63 + Expect CursorPos() == [l+1,1,' '] + normal! 0 + + " 7& + normal s71 + Expect CursorPos() == [l+1,20,'7'] + normal! 0 + normal s72 + Expect CursorPos() == [l+1,21,'&'] + normal! 0 + normal s&1 + Expect CursorPos() == [l+1,21,'&'] + normal! 0 + normal s73 + Expect CursorPos() == [l+1,1,' '] + normal! 0 + + " 8* + normal s81 + Expect CursorPos() == [l+1,23,'8'] + normal! 0 + normal s82 + Expect CursorPos() == [l+1,24,'*'] + normal! 0 + normal s*1 + Expect CursorPos() == [l+1,24,'*'] + normal! 0 + normal s83 + Expect CursorPos() == [l+1,1,' '] + normal! 0 + + " 9( + normal s91 + Expect CursorPos() == [l+1,26,'9'] + normal! 0 + normal s92 + Expect CursorPos() == [l+1,27,'('] + normal! 0 + normal s(1 + Expect CursorPos() == [l+1,27,'('] + normal! 0 + normal s93 + Expect CursorPos() == [l+1,1,' '] + normal! 0 + + " 0) + normal s01 + Expect CursorPos() == [l+1,29,'0'] + normal! 0 + normal s02 + Expect CursorPos() == [l+1,30,')'] + normal! 0 + normal s)1 + Expect CursorPos() == [l+1,30,')'] + normal! 0 + normal s03 + Expect CursorPos() == [l+1,1,' '] + normal! 0 + + " -_ + normal s-1 + Expect CursorPos() == [l+2,2,'-'] + normal! 0 + normal s-2 + Expect CursorPos() == [l+2,3,'_'] + normal! 0 + normal s_1 + Expect CursorPos() == [l+2,3,'_'] + normal! 0 + normal s-3 + Expect CursorPos() == [l+2,1,' '] + normal! 0 + + " =+ + normal s=1 + Expect CursorPos() == [l+2,5,'='] + normal! 0 + normal s=2 + Expect CursorPos() == [l+2,6,'+'] + normal! 0 + normal s+1 + Expect CursorPos() == [l+2,6,'+'] + normal! 0 + normal s=3 + Expect CursorPos() == [l+2,1,' '] + normal! 0 + + " ;: + normal s;1 + Expect CursorPos() == [l+2,8,';'] + normal! 0 + normal s;2 + Expect CursorPos() == [l+2,9,':'] + normal! 0 + normal s:1 + Expect CursorPos() == [l+2,9,':'] + normal! 0 + normal s;3 + Expect CursorPos() == [l+2,1,' '] + normal! 0 + + " [{ + normal s[1 + Expect CursorPos() == [l+2,11,'['] + normal! 0 + normal s[2 + Expect CursorPos() == [l+2,12,'{'] + normal! 0 + normal s{1 + Expect CursorPos() == [l+2,12,'{'] + normal! 0 + normal s[3 + Expect CursorPos() == [l+2,1,' '] + normal! 0 + + " ]} + normal s]1 + Expect CursorPos() == [l+2,14,']'] + normal! 0 + normal s]2 + Expect CursorPos() == [l+2,15,'}'] + normal! 0 + normal s}1 + Expect CursorPos() == [l+2,15,'}'] + normal! 0 + normal s]3 + Expect CursorPos() == [l+2,1,' '] + normal! 0 + + " `~ + normal s`1 + Expect CursorPos() == [l+2,17,'`'] + normal! 0 + normal s`2 + Expect CursorPos() == [l+2,18,'~'] + normal! 0 + normal s~1 + Expect CursorPos() == [l+2,18,'~'] + normal! 0 + normal s`3 + Expect CursorPos() == [l+2,1,' '] + normal! 0 + + " '" + normal s'1 + Expect CursorPos() == [l+2,20,''''] + normal! 0 + normal s'2 + Expect CursorPos() == [l+2,21,'"'] + normal! 0 + normal s"1 + Expect CursorPos() == [l+2,21,'"'] + normal! 0 + normal s'3 + Expect CursorPos() == [l+2,1,' '] + normal! 0 + + " \| + normal s\1 + Expect CursorPos() == [l+2,23,'\'] + normal! 0 + normal s\2 + Expect CursorPos() == [l+2,24,'|'] + normal! 0 + normal s|1 + Expect CursorPos() == [l+2,24,'|'] + normal! 0 + normal s\3 + Expect CursorPos() == [l+2,1,' '] + normal! 0 + end +end +"}}} + +" Smartsign with 2-key find motions with US layout {{{ +describe 'Smartsign with 2-key find motions with US layout' + before + new + let g:EasyMotion_keys = '123456789' + let g:EasyMotion_use_smartsign_us = 1 + map s (easymotion-s2) + call EasyMotion#init() + call AddLine(' -_ =+ ;: [{ ]} `~ ''" \|') + call AddLine(' 1! 2@ 3# 4$ 5% 6^ 7& 8* 9( 0)') + call AddLine(' ,< .> /?') + call AddLine(' -_ =+ ;: [{ ]} `~ ''" \|') + call AddLine(' 1! 2@ 3# 4$ 5% 6^ 7& 8* 9( 0)') + call AddLine(' ,< .> /?') + " 123456789012345678901234567890 + " 1 2 3 + end + + after + close! + end + + it 'works well' + " Default position + normal! 0 + let l = line('.') + Expect CursorPos() == [l,1,' '] + + " ,< + normal s,,1 + Expect CursorPos() == [l,2,','] + normal! 0 + Expect CursorPos() == [l,1,' '] + normal s,,3 + Expect CursorPos() == [l,1,' '] + normal! 0 + normal s, 1 + Expect CursorPos() == [l,3,'<'] + normal! 0 + normal s<<1 + Expect CursorPos() == [l,1,' '] + normal! 0 + normal s,<1 + Expect CursorPos() == [l,2,','] + normal! 0 + normal s<,1 + Expect CursorPos() == [l,1,' '] + normal! 0 + end + it ': s,,3' + normal! 0 + let l = line('.') + Expect CursorPos() == [l,1,' '] + normal s,,3 + Expect CursorPos() == [l,1,' '] + normal! 0 + end + + it 'escape * asterisc #151' + normal! 0 + let l = line('.') + Expect CursorPos() == [l,1,' '] + normal s1*22 + Expect CursorPos() == [l,1,' '] + normal! 0 + normal s8*1 + Expect CursorPos() == [l+1,23,'8'] + normal! 0 + normal s881 + Expect CursorPos() == [l+1,23,'8'] + normal! 0 + normal s**1 + Expect CursorPos() == [l+1,1,' '] + normal! 0 + normal s*81 + Expect CursorPos() == [l+1,1,' '] + normal! 0 + end +end +"}}} + +" Smartsign with 2-key find motions with JP layout {{{ +describe 'Smartsign with 2-key find motions with JP layout' + before + new + let g:EasyMotion_keys = '123456789' + let g:EasyMotion_use_smartsign_jp = 1 + map s (easymotion-s2) + call EasyMotion#init() + call AddLine(' -= ^~ ;+ :* [{ ]} @` \|') + call AddLine(' 1! 2" 3# 4$ 5% 6& 7'' 8( 9) 0_') + call AddLine(' ,< .> /?') + call AddLine(' -= ^~ ;+ :* [{ ]} @` \|') + call AddLine(' 1! 2" 3# 4$ 5% 6& 7'' 8( 9) 0_') + call AddLine(' ,< .> /?') + " 123456789012345678901234567890 + " 1 2 3 + " + "',' : '<', '.' : '>', '/' : '?', + "'1' : '!', '2' : '"', '3' : '#', '4' : '$', '5' : '%', + "'6' : '&', '7' : "'", '8' : '(', '9' : ')', '0' : '_', '-' : '=', '^' : '~', + "';' : '+', ':' : '*', '[' : '{', ']' : '}', '@' : '`', '\' : '|', + " + end + + after + close! + end + + it 'works well' + " Default position + normal! 0 + let l = line('.') + Expect CursorPos() == [l,1,' '] + + " ,< + normal s,,1 + Expect CursorPos() == [l,2,','] + normal! 0 + Expect CursorPos() == [l,1,' '] + normal s,,3 + Expect CursorPos() == [l,1,' '] + normal! 0 + normal s, 1 + Expect CursorPos() == [l,3,'<'] + normal! 0 + normal s<<1 + Expect CursorPos() == [l,1,' '] + normal! 0 + normal s,<1 + Expect CursorPos() == [l,2,','] + normal! 0 + normal s<,1 + Expect CursorPos() == [l,1,' '] + normal! 0 + end + it ': s,,3' + normal! 0 + let l = line('.') + Expect CursorPos() == [l,1,' '] + normal s,,3 + Expect CursorPos() == [l,1,' '] + normal! 0 + end +end +"}}} + +" Smartsign with n-key find search motions {{{ +describe 'Smartsign with n-key find search motions' + before + new + let g:EasyMotion_keys = '123456789' + let g:EasyMotion_use_smartsign_jp = 1 + map / (easymotion-sn) + call EasyMotion#init() + call AddLine(' -= ^~ ;+ :* [{ ]} @` \|') + call AddLine(' 1! 2" 3# 4$ 5% 6& 7'' 8( 9) 0_') + call AddLine(' ,< .> /?') + call AddLine(' -= ^~ ;+ :* [{ ]} @` \|') + call AddLine(' 1! 2" 3# 4$ 5% 6& 7'' 8( 9) 0_') + call AddLine(' ,< .> /?') + end + + after + close! + end + + it 'do not work' + " Default position + normal! 0 + let l = line('.') + Expect CursorPos() == [l,1,' '] + + " ,< + normal /,,1 + Expect CursorPos() == [l,1,' '] + normal! 0 + normal /,<1 + Expect CursorPos() == [l,1,' '] + normal! 0 + end +end +"}}} + +" __END__ {{{ +" vim: expandtab softtabstop=4 shiftwidth=4 +" vim: foldmethod=marker +" }}} diff --git a/home-rc/dot-files/.vim/bundle/vim-fugitive/.gitattributes b/home-rc/dot-files/.vim/bundle/vim-fugitive/.gitattributes new file mode 100644 index 0000000..50afa41 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-fugitive/.gitattributes @@ -0,0 +1,2 @@ +.git* export-ignore +*.markdown export-ignore diff --git a/home-rc/dot-files/.vim/bundle/vim-fugitive/.github/FUNDING.yml b/home-rc/dot-files/.vim/bundle/vim-fugitive/.github/FUNDING.yml new file mode 100644 index 0000000..e2a49d1 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-fugitive/.github/FUNDING.yml @@ -0,0 +1,2 @@ +github: tpope +custom: ["https://www.paypal.me/vimpope"] diff --git a/home-rc/dot-files/.vim/bundle/vim-fugitive/.gitignore b/home-rc/dot-files/.vim/bundle/vim-fugitive/.gitignore new file mode 100644 index 0000000..0a56e3f --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-fugitive/.gitignore @@ -0,0 +1 @@ +/doc/tags diff --git a/home-rc/dot-files/.vim/bundle/vim-fugitive/CONTRIBUTING.markdown b/home-rc/dot-files/.vim/bundle/vim-fugitive/CONTRIBUTING.markdown new file mode 100644 index 0000000..843bbe6 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-fugitive/CONTRIBUTING.markdown @@ -0,0 +1,24 @@ +Before reporting a bug, you should try stripping down your Vim configuration +and removing other plugins. The sad truth about VimScript is that it is +fraught with incompatibilities waiting to happen. I'm happy to work around +them where I can, but it's up to you to isolate the conflict. + +Fugitive is particularly prone to regressions due to Git version issues, +platform issues, and interactions with other plugins. I end up bisecting a +lot more than other projects, and thus I'm especially meticulous here about +maintaining a clean, readable, history. Squash and force push any requested +changes to a pull request. And if your [commit message +sucks](https://commit.style), I'm not going to accept it. Period. + +If your contribution involves adding a configuration option, you are going to +need a very compelling justification for it. Options add a maintenance +burden, support burden, and documentation bloat, and oftentimes can be +achieved much more simply with a custom map or autocommand. If your option +controls an underlying Git command, ask yourself why Git itself does not offer +such configuration. + +Beyond that, don't be shy about asking before patching. What takes you hours +might take me minutes simply because I have both domain knowledge and a +perverse knowledge of VimScript so vast that many would consider it a symptom +of mental illness. On the flip side, some ideas I'll reject no matter how +good the implementation is. "Send a patch" is an edge case answer in my book. diff --git a/home-rc/dot-files/.vim/bundle/vim-fugitive/README.markdown b/home-rc/dot-files/.vim/bundle/vim-fugitive/README.markdown new file mode 100644 index 0000000..3dc4e6c --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-fugitive/README.markdown @@ -0,0 +1,137 @@ +# fugitive.vim + +Fugitive is the premier Vim plugin for Git. Or maybe it's the premier Git +plugin for Vim? Either way, it's "so awesome, it should be illegal". That's +why it's called Fugitive. + +The crown jewel of Fugitive is `:Git` (or just `:G`), which calls any +arbitrary Git command. If you know how to use Git at the command line, you +know how to use `:Git`. It's vaguely akin to `:!git` but with numerous +improvements: + +* The default behavior is to directly echo the command's output. Quiet + commands like `:Git add` avoid the dreaded "Press ENTER or type command to + continue" prompt. +* `:Git commit`, `:Git rebase -i`, and other commands that invoke an editor do + their editing in the current Vim instance. +* `:Git diff`, `:Git log`, and other verbose, paginated commands have their + output loaded into a temporary buffer. Force this behavior for any command + with `:Git --paginate` or `:Git -p`. +* `:Git blame` uses a temporary buffer with maps for additional triage. Press + enter on a line to view the commit where the line changed, or `g?` to see + other available maps. Omit the filename argument and the currently edited + file will be blamed in a vertical, scroll-bound split. +* `:Git mergetool` and `:Git difftool` load their changesets into the quickfix + list. +* Called with no arguments, `:Git` opens a summary window with dirty files and + unpushed and unpulled commits. Press `g?` to bring up a list of maps for + numerous operations including diffing, staging, committing, rebasing, and + stashing. (This is the successor to the old `:Gstatus`.) +* This command (along with all other commands) always uses the current + buffer's repository, so you don't need to worry about the current working + directory. + +Additional commands are provided for higher level operations: + +* View any blob, tree, commit, or tag in the repository with `:Gedit` (and + `:Gsplit`, etc.). For example, `:Gedit HEAD~3:%` loads the current file as + it existed 3 commits ago. +* `:Gdiffsplit` (or `:Gvdiffsplit`) brings up the staged version of the file + side by side with the working tree version. Use Vim's diff handling + capabilities to apply changes to the staged version, and write that buffer + to stage the changes. You can also give an arbitrary `:Gedit` argument to + diff against older versions of the file. +* `:Gread` is a variant of `git checkout -- filename` that operates on the + buffer rather than the file itself. This means you can use `u` to undo it + and you never get any warnings about the file changing outside Vim. +* `:Gwrite` writes to both the work tree and index versions of a file, making + it like `git add` when called from a work tree file and like `git checkout` + when called from the index or a blob in history. +* `:Ggrep` is `:grep` for `git grep`. `:Glgrep` is `:lgrep` for the same. +* `:GMove` does a `git mv` on the current file and changes the buffer name to + match. `:GRename` does the same with a destination filename relative to the + current file's directory. +* `:GDelete` does a `git rm` on the current file and simultaneously deletes + the buffer. `:GRemove` does the same but leaves the (now empty) buffer + open. +* `:GBrowse` to open the current file on the web front-end of your favorite + hosting provider, with optional line range (try it in visual mode). Plugins + are available for popular providers such as [GitHub][rhubarb.vim], + [GitLab][fugitive-gitlab.vim], [Bitbucket][fubitive.vim], + [Gitee][fugitive-gitee.vim], [Pagure][pagure], + [Phabricator][vim-phabricator], [Azure DevOps][fugitive-azure-devops.vim], + and [sourcehut][srht.vim]. + +[rhubarb.vim]: https://github.com/tpope/vim-rhubarb +[fugitive-gitlab.vim]: https://github.com/shumphrey/fugitive-gitlab.vim +[fubitive.vim]: https://github.com/tommcdo/vim-fubitive +[fugitive-gitee.vim]: https://github.com/linuxsuren/fugitive-gitee.vim +[pagure]: https://github.com/FrostyX/vim-fugitive-pagure +[vim-phabricator]: https://github.com/jparise/vim-phabricator +[fugitive-azure-devops.vim]: https://github.com/cedarbaum/fugitive-azure-devops.vim +[srht.vim]: https://git.sr.ht/~willdurand/srht.vim + +Add `%{FugitiveStatusline()}` to `'statusline'` to get an indicator +with the current branch in your statusline. + +For more information, see `:help fugitive`. + +## Screencasts + +* [A complement to command line git](http://vimcasts.org/e/31) +* [Working with the git index](http://vimcasts.org/e/32) +* [Resolving merge conflicts with vimdiff](http://vimcasts.org/e/33) +* [Browsing the git object database](http://vimcasts.org/e/34) +* [Exploring the history of a git repository](http://vimcasts.org/e/35) + +## Installation + +Install using your favorite package manager, or use Vim's built-in package +support: + + mkdir -p ~/.vim/pack/tpope/start + cd ~/.vim/pack/tpope/start + git clone https://tpope.io/vim/fugitive.git + vim -u NONE -c "helptags fugitive/doc" -c q + +## FAQ + +> What happened to the dispatch.vim backed asynchronous `:Gpush` and +> `:Gfetch`? + +This behavior was divisive, confusing, and complicated inputting passwords, so +it was removed. Use `:Git! push` to use Fugitive's own asynchronous +execution, or retroactively make `:Git push` asynchronous by pressing +`CTRL-D`. + +> Why am I getting `core.worktree is required when using an external Git dir`? + +Git generally sets `core.worktree` for you automatically when necessary, but +if you're doing something weird, or using a third-party tool that does +something weird, you may need to set it manually: + + git config core.worktree "$PWD" + +This may be necessary even when simple `git` commands seem to work fine +without it. + +> So I have a symlink and... + +Stop. Just stop. If Git won't deal with your symlink, then Fugitive won't +either. Consider using a [plugin that resolves +symlinks](https://github.com/aymericbeaumet/symlink.vim), or even better, +using fewer symlinks. + +## Self-Promotion + +Like fugitive.vim? Follow the repository on +[GitHub](https://github.com/tpope/vim-fugitive) and vote for it on +[vim.org](http://www.vim.org/scripts/script.php?script_id=2975). And if +you're feeling especially charitable, follow [tpope](http://tpo.pe/) on +[Twitter](http://twitter.com/tpope) and +[GitHub](https://github.com/tpope). + +## License + +Copyright (c) Tim Pope. Distributed under the same terms as Vim itself. +See `:help license`. diff --git a/home-rc/dot-files/.vim/bundle/vim-fugitive/autoload/fugitive.vim b/home-rc/dot-files/.vim/bundle/vim-fugitive/autoload/fugitive.vim new file mode 100644 index 0000000..827c265 --- /dev/null +++ b/home-rc/dot-files/.vim/bundle/vim-fugitive/autoload/fugitive.vim @@ -0,0 +1,8127 @@ +" Location: autoload/fugitive.vim +" Maintainer: Tim Pope + +" The functions contained within this file are for internal use only. For the +" official API, see the commented functions in plugin/fugitive.vim. + +if exists('g:autoloaded_fugitive') + finish +endif +let g:autoloaded_fugitive = 1 + +" Section: Utility + +function! s:function(name) abort + return function(substitute(a:name,'^s:',matchstr(expand(''), '.*\zs\d\+_'),'')) +endfunction + +function! s:sub(str,pat,rep) abort + return substitute(a:str,'\v\C'.a:pat,a:rep,'') +endfunction + +function! s:gsub(str,pat,rep) abort + return substitute(a:str,'\v\C'.a:pat,a:rep,'g') +endfunction + +function! s:Uniq(list) abort + let i = 0 + let seen = {} + while i < len(a:list) + let str = string(a:list[i]) + if has_key(seen, str) + call remove(a:list, i) + else + let seen[str] = 1 + let i += 1 + endif + endwhile + return a:list +endfunction + +function! s:JoinChomp(list) abort + if empty(a:list[-1]) + return join(a:list[0:-2], "\n") + else + return join(a:list, "\n") + endif +endfunction + +function! s:winshell() abort + return has('win32') && &shellcmdflag !~# '^-' +endfunction + +function! s:WinShellEsc(arg) abort + if type(a:arg) == type([]) + return join(map(copy(a:arg), 's:WinShellEsc(v:val)')) + elseif a:arg =~# '^[A-Za-z0-9_/:.-]\+$' + return a:arg + else + return '"' . s:gsub(s:gsub(a:arg, '"', '""'), '\%', '"%"') . '"' + endif +endfunction + +function! s:shellesc(arg) abort + if type(a:arg) == type([]) + return join(map(copy(a:arg), 's:shellesc(v:val)')) + elseif a:arg =~# '^[A-Za-z0-9_/:.-]\+$' + return a:arg + elseif s:winshell() + return '"' . s:gsub(s:gsub(a:arg, '"', '""'), '\%', '"%"') . '"' + else + return shellescape(a:arg) + endif +endfunction + +function! s:fnameescape(file) abort + if type(a:file) == type([]) + return join(map(copy(a:file), 's:fnameescape(v:val)')) + else + return fnameescape(a:file) + endif +endfunction + +function! fugitive#UrlDecode(str) abort + return substitute(a:str, '%\(\x\x\)', '\=iconv(nr2char("0x".submatch(1)), "utf-8", "latin1")', 'g') +endfunction + +function! s:UrlEncode(str) abort + return substitute(a:str, '[%#?&;+=\<> [:cntrl:]]', '\=printf("%%%02X", char2nr(submatch(0)))', 'g') +endfunction + +function! s:PathUrlEncode(str) abort + return substitute(a:str, '[%#?[:cntrl:]]', '\=printf("%%%02X", char2nr(submatch(0)))', 'g') +endfunction + +function! s:PathJoin(prefix, str) abort + if a:prefix =~# '://' + return a:prefix . s:PathUrlEncode(a:str) + else + return a:prefix . a:str + endif +endfunction + +function! s:throw(string) abort + throw 'fugitive: '.a:string +endfunction + +function! s:VersionCheck() abort + if v:version < 704 + return 'return ' . string('echoerr "fugitive: Vim 7.4 or newer required"') + elseif empty(fugitive#GitVersion()) + let exe = get(s:GitCmd(), 0, '') + if len(exe) && !executable(exe) + return 'return ' . string('echoerr "fugitive: cannot find ' . string(exe) . ' in PATH"') + endif + return 'return ' . string('echoerr "fugitive: cannot execute Git"') + elseif !fugitive#GitVersion(1, 8, 5) + return 'return ' . string('echoerr "fugitive: Git 1.8.5 or newer required"') + else + return '' + endif +endfunction + +let s:worktree_error = "core.worktree is required when using an external Git dir" +function! s:DirCheck(...) abort + let vcheck = s:VersionCheck() + if !empty(vcheck) + return vcheck + endif + let dir = call('FugitiveGitDir', a:000) + if !empty(dir) && FugitiveWorkTree(dir, 1) is# 0 + return 'return ' . string('echoerr "fugitive: ' . s:worktree_error . '"') + elseif !empty(dir) + return '' + elseif empty(bufname('')) + return 'return ' . string('echoerr "fugitive: working directory does not belong to a Git repository"') + else + return 'return ' . string('echoerr "fugitive: file does not belong to a Git repository"') + endif +endfunction + +function! s:Mods(mods, ...) abort + let mods = substitute(a:mods, '\C', '', '') + let mods = mods =~# '\S$' ? mods . ' ' : mods + if a:0 && mods !~# '\<\%(aboveleft\|belowright\|leftabove\|rightbelow\|topleft\|botright\|tab\)\>' + if a:1 ==# 'Edge' + if mods =~# '\' ? &splitright : &splitbelow + let mods = 'botright ' . mods + else + let mods = 'topleft ' . mods + endif + else + let mods = a:1 . ' ' . mods + endif + endif + return substitute(mods, '\s\+', ' ', 'g') +endfunction + +if exists('+shellslash') + + let s:dir_commit_file = '\c^fugitive://\%(/[^/]\@=\)\=\(.\{-1,\}\)//\%(\(\x\{40,\}\|[0-3]\)\(/.*\)\=\)\=$' + + function! s:Slash(path) abort + return tr(a:path, '\', '/') + endfunction + + function! s:VimSlash(path) abort + return tr(a:path, '\/', &shellslash ? '//' : '\\') + endfunction + +else + + let s:dir_commit_file = '\c^fugitive://\(.\{-\}\)//\%(\(\x\{40,\}\|[0-3]\)\(/.*\)\=\)\=$' + + function! s:Slash(path) abort + return a:path + endfunction + + function! s:VimSlash(path) abort + return a:path + endfunction + +endif + +function! s:AbsoluteVimPath(...) abort + if a:0 && type(a:1) == type('') + let path = a:1 + else + let path = bufname(a:0 && a:1 > 0 ? a:1 : '') + if getbufvar(a:0 && a:1 > 0 ? a:1 : '', '&buftype') !~# '^\%(nowrite\|acwrite\)\=$' + return path + endif + endif + if s:Slash(path) =~# '^/\|^\a\+:' + return path + else + return getcwd() . matchstr(getcwd(), '[\\/]') . path + endif +endfunction + +function! s:Resolve(path) abort + let path = resolve(a:path) + if has('win32') + let path = s:VimSlash(fnamemodify(fnamemodify(path, ':h'), ':p') . fnamemodify(path, ':t')) + endif + return path +endfunction + +function! s:FileIgnoreCase(for_completion) abort + return (exists('+fileignorecase') && &fileignorecase) + \ || (a:for_completion && exists('+wildignorecase') && &wildignorecase) +endfunction + +function! s:cpath(path, ...) abort + if s:FileIgnoreCase(0) + let path = s:VimSlash(tolower(a:path)) + else + let path = s:VimSlash(a:path) + endif + return a:0 ? path ==# s:cpath(a:1) : path +endfunction + +let s:quote_chars = { + \ "\007": 'a', "\010": 'b', "\011": 't', "\012": 'n', "\013": 'v', "\014": 'f', "\015": 'r', + \ '"': '"', '\': '\'} + +let s:unquote_chars = { + \ 'a': "\007", 'b': "\010", 't': "\011", 'n': "\012", 'v': "\013", 'f': "\014", 'r': "\015", + \ '"': '"', '\': '\'} + +function! s:Quote(string) abort + let string = substitute(a:string, "[\001-\037\"\\\177]", '\="\\" . get(s:quote_chars, submatch(0), printf("%03o", char2nr(submatch(0))))', 'g') + if string !=# a:string + return '"' . string . '"' + else + return string + endif +endfunction + +function! fugitive#Unquote(string) abort + let string = substitute(a:string, "\t*$", '', '') + if string =~# '^".*"$' + return substitute(string[1:-2], '\\\(\o\o\o\|.\)', '\=get(s:unquote_chars, submatch(1), iconv(nr2char("0" . submatch(1)), "utf-8", "latin1"))', 'g') + else + return string + endif +endfunction + +let s:executables = {} + +function! s:executable(binary) abort + if !has_key(s:executables, a:binary) + let s:executables[a:binary] = executable(a:binary) + endif + return s:executables[a:binary] +endfunction + +if !exists('s:temp_scripts') + let s:temp_scripts = {} +endif +function! s:TempScript(...) abort + let body = join(a:000, "\n") + if !has_key(s:temp_scripts, body) + let s:temp_scripts[body] = tempname() . '.sh' + endif + let temp = s:temp_scripts[body] + if !filereadable(temp) + call writefile(['#!/bin/sh'] + a:000, temp) + endif + return FugitiveGitPath(temp) +endfunction + +function! s:DoAutocmd(...) abort + return join(map(copy(a:000), "'doautocmd ' . v:val"), '|') +endfunction + +function! s:Map(mode, lhs, rhs, ...) abort + let maps = [] + let defer = a:0 && a:1 =~# '' || get(g:, 'fugitive_defer_to_existing_maps') + let flags = substitute(a:0 ? a:1 : '', '', '', '') . (a:rhs =~# '' ? '' : '