From e31055bc04c1a307b889052dd1d1ba28a29e6bda Mon Sep 17 00:00:00 2001 From: Ted Kulp Date: Mon, 18 Jul 2022 07:40:19 -0400 Subject: [PATCH] Lots of updates --- .Brewfile | 29 ++-- .config/lvim/config.lua | 286 ++++++++++++++++++++++++++++---------- .config/yadm/encrypt | 6 + .config/zsh/fnm.zsh | 2 +- .config/zsh/git.zsh | 27 +++- .config/zsh/keychain.zsh | 1 - .config/zsh/nvm.zsh | 28 ++-- .gitconfig | 2 +- .local/share/yadm/archive | Bin 5437 -> 6134 bytes .tmux.conf.local | 5 +- .zshrc | 8 +- 11 files changed, 281 insertions(+), 113 deletions(-) create mode 100644 .config/yadm/encrypt delete mode 120000 .config/zsh/keychain.zsh diff --git a/.Brewfile b/.Brewfile index cf66bd1..baeb0a2 100644 --- a/.Brewfile +++ b/.Brewfile @@ -15,23 +15,21 @@ tap "turbot/tap" tap "warrensbox/tap" brew "ack" brew "amazon-ecs-cli" +brew "asciinema" brew "gdbm" brew "readline" brew "xz" brew "autojump" brew "automake" brew "autossh" -brew "libffi" -brew "glib" -brew "cairo" -brew "gobject-introspection" -brew "harfbuzz" -brew "pillow" brew "awscli" brew "bash" brew "bat" brew "bison" brew "blueutil" +brew "libffi" +brew "glib" +brew "cairo" brew "cheat" brew "consul" brew "coreutils" @@ -40,10 +38,14 @@ brew "erlang" brew "elixir" brew "exa" brew "expect" +brew "fasd" brew "fd" +brew "gobject-introspection" +brew "harfbuzz" brew "ffmpeg" brew "ffsend" brew "findutils" +brew "fnm" brew "fpp" brew "fzf" brew "gdk-pixbuf" @@ -68,11 +70,13 @@ brew "htop" brew "hub" brew "imagemagick" brew "jq" +brew "kubectx" brew "lazygit" brew "libyaml" brew "lynx" brew "markdown" brew "mas" +brew "minikube" brew "mkvtoolnix" brew "mongosh" brew "mono" @@ -86,6 +90,7 @@ brew "nnn" brew "nvm" brew "openjdk" brew "pandoc" +brew "pillow" brew "pinentry-mac" brew "ruby-build" brew "rbenv" @@ -100,13 +105,13 @@ brew "starship" brew "stylua" brew "teensy_loader_cli" brew "terraform-ls" -brew "tfenv" +brew "thefuck" brew "the_platinum_searcher" brew "the_silver_searcher" brew "tldr" brew "tmux" brew "tmux-xpanes" -brew "tmuxinator" +brew "tmuxinator", link: false brew "tmuxinator-completion", link: false brew "tree" brew "ttyrec" @@ -144,6 +149,7 @@ cask "docker" cask "dropbox" cask "firefox" cask "font-fira-code-nerd-font" +cask "font-hack-nerd-font" cask "font-noto-nerd-font" cask "fork" cask "google-chrome" @@ -177,20 +183,15 @@ cask "swiftbar" cask "synergy" cask "telegram" cask "vagrant" -cask "virtualbox" -cask "virtualbox-extension-pack" cask "visual-studio-code" cask "vlc" cask "whatsapp" -cask "zoomus" -mas "Compressor", id: 424390742 +cask "zoom" mas "Craft", id: 1487937127 mas "Drafts", id: 1435957248 mas "EOBD-Facile", id: 976630793 -mas "Final Cut Pro", id: 424389933 mas "Greenshot", id: 1103915944 mas "Pixelmator", id: 407963104 mas "Sequel Ace", id: 1518036000 mas "Tailscale", id: 1475387142 mas "Todoist", id: 585829637 -mas "Xcode", id: 497799835 diff --git a/.config/lvim/config.lua b/.config/lvim/config.lua index 9c9c30d..37cc940 100644 --- a/.config/lvim/config.lua +++ b/.config/lvim/config.lua @@ -12,16 +12,17 @@ an executable lvim.log.level = "warn" lvim.format_on_save = true lvim.colorscheme = "onedarker" -vim.opt.clipboard = "unnamed,unnamedplus" +-- to disable icons and use a minimalist setup, uncomment the following +-- lvim.use_icons = false -- keymappings [view all the defaults by pressing Lk] lvim.leader = "space" -- add your own keymapping lvim.keys.normal_mode[""] = ":w" -- unmap a default keymapping --- lvim.keys.normal_mode[""] = "" --- edit a default keymapping --- lvim.keys.normal_mode[""] = ":q" +-- vim.keymap.del("n", "") +-- override a default keymapping +-- lvim.keys.normal_mode[""] = ":q" -- or vim.keymap.set("n", "", ":q" ) -- Change Telescope navigation to use j and k for navigation and n and p for history in both input and normal mode. -- we use protected-mode (pcall) just in case the plugin wasn't loaded yet. @@ -41,21 +42,45 @@ lvim.builtin.telescope.defaults.mappings = { }, } +lvim.builtin.telescope.on_config_done = function(telescope) + telescope.setup{ + extensions = { + project = { + base_dirs = { + -- {path = '~/src', max_depth = 1}, + -- {path = '~/src/tmp', max_depth = 1}, + -- {path = '~/src/omuras/code', max_depth = 1}, + {path = '~/src'}, + {path = '~/src/tmp'}, + {path = '~/src/omuras/code'}, + {path = '~/org'}, + }, + hidden_files = true, + } + } + } + + pcall(telescope.load_extension, "file-browser") + pcall(telescope.load_extension, "project") +end + -- Use which-key to add extra bindings with the leader-key prefix --- lvim.builtin.which_key.mappings["P"] = { "Telescope projects", "Projects" } +lvim.builtin.which_key.mappings["P"] = { "Telescope projects", "Projects" } -- lvim.builtin.which_key.mappings["t"] = { -- name = "+Trouble", -- r = { "Trouble lsp_references", "References" }, -- f = { "Trouble lsp_definitions", "Definitions" }, --- d = { "Trouble lsp_document_diagnostics", "Diagnostics" }, +-- d = { "Trouble document_diagnostics", "Diagnostics" }, -- q = { "Trouble quickfix", "QuickFix" }, -- l = { "Trouble loclist", "LocationList" }, --- w = { "Trouble lsp_workspace_diagnostics", "Diagnostics" }, +-- w = { "Trouble workspace_diagnostics", "Wordspace Diagnostics" }, -- } -- TODO: User Config for predefined plugins -- After changing plugin config exit and reopen LunarVim, Run :PackerInstall :PackerCompile -lvim.builtin.dashboard.active = true +lvim.builtin.alpha.active = true +lvim.builtin.alpha.mode = "dashboard" +lvim.builtin.notify.active = true lvim.builtin.terminal.active = true lvim.builtin.nvimtree.setup.view.side = "left" lvim.builtin.nvimtree.show_icons.git = 0 @@ -69,33 +94,38 @@ lvim.builtin.treesitter.ensure_installed = { "lua", "python", "typescript", + "tsx", "css", "rust", "java", "yaml", - "go", } lvim.builtin.treesitter.ignore_install = { "haskell" } lvim.builtin.treesitter.highlight.enabled = true +lvim.builtin.project.active = false -lvim.lsp.automatic_servers_installation = true +lvim.lsp.null_ls.setup.timeout_ms = 30000 -- generic LSP settings -- ---@usage disable automatic installation of servers -- lvim.lsp.automatic_servers_installation = false --- ---@usage Select which servers should be configured manually. Requires `:LvimCacheRest` to take effect. --- See the full default list `:lua print(vim.inspect(lvim.lsp.override))` --- vim.list_extend(lvim.lsp.override, { "pyright" }) - --- ---@usage setup a server -- see: https://www.lunarvim.org/languages/#overriding-the-default-configuration +-- ---configure a server manually. !!Requires `:LvimCacheReset` to take effect!! +-- ---see the full default list `:lua print(vim.inspect(lvim.lsp.automatic_configuration.skipped_servers))` +-- vim.list_extend(lvim.lsp.automatic_configuration.skipped_servers, { "pyright" }) -- local opts = {} -- check the lspconfig documentation for a list of all possible options --- require("lvim.lsp.manager").setup("pylsp", opts) +-- require("lvim.lsp.manager").setup("pyright", opts) --- you can set a custom on_attach function that will be used for all the language servers --- See +-- ---remove a server from the skipped list, e.g. eslint, or emmet_ls. !!Requires `:LvimCacheReset` to take effect!! +-- ---`:LvimInfo` lists which server(s) are skiipped for the current filetype +-- vim.tbl_map(function(server) +-- return server ~= "emmet_ls" +-- end, lvim.lsp.automatic_configuration.skipped_servers) + +-- -- you can set a custom on_attach function that will be used for all the language servers +-- -- See -- lvim.lsp.on_attach_callback = function(client, bufnr) -- local function buf_set_option(...) -- vim.api.nvim_buf_set_option(bufnr, ...) @@ -103,32 +133,18 @@ lvim.lsp.automatic_servers_installation = true -- --Enable completion triggered by -- buf_set_option("omnifunc", "v:lua.vim.lsp.omnifunc") -- end --- you can overwrite the null_ls setup table (useful for setting the root_dir function) --- lvim.lsp.null_ls.setup = { --- root_dir = require("lspconfig").util.root_pattern("Makefile", ".git", "node_modules"), --- } --- or if you need something more advanced --- lvim.lsp.null_ls.setup.root_dir = function(fname) --- if vim.bo.filetype == "javascript" then --- return require("lspconfig/util").root_pattern("Makefile", ".git", "node_modules")(fname) --- or require("lspconfig/util").path.dirname(fname) --- elseif vim.bo.filetype == "php" then --- return require("lspconfig/util").root_pattern("Makefile", ".git", "composer.json")(fname) or vim.fn.getcwd() --- else --- return require("lspconfig/util").root_pattern("Makefile", ".git")(fname) or require("lspconfig/util").path.dirname(fname) --- end --- end -- -- set a formatter, this will override the language server formatting capabilities (if it exists) -- local formatters = require "lvim.lsp.null-ls.formatters" -- formatters.setup { --- { exe = "black", filetypes = { "python" } }, --- { exe = "isort", filetypes = { "python" } }, +-- { command = "black", filetypes = { "python" } }, +-- { command = "isort", filetypes = { "python" } }, -- { --- exe = "prettier", +-- -- each formatter accepts a list of options identical to https://github.com/jose-elias-alvarez/null-ls.nvim/blob/main/doc/BUILTINS.md#Configuration +-- command = "prettier", -- ---@usage arguments to pass to the formatter -- -- these cannot contain whitespaces, options such as `--line-width 80` become either `{'--line-width', '80'}` or `{'--line-width=80'}` --- args = { "--print-with", "100" }, +-- extra_args = { "--print-with", "100" }, -- ---@usage specify which filetypes to enable. By default a providers will attach to all the filetypes it supports. -- filetypes = { "typescript", "typescriptreact" }, -- }, @@ -137,15 +153,16 @@ lvim.lsp.automatic_servers_installation = true -- -- set additional linters -- local linters = require "lvim.lsp.null-ls.linters" -- linters.setup { --- { exe = "flake8", filetypes = { "python" } }, +-- { command = "flake8", filetypes = { "python" } }, -- { --- exe = "shellcheck", +-- -- each linter accepts a list of options identical to https://github.com/jose-elias-alvarez/null-ls.nvim/blob/main/doc/BUILTINS.md#Configuration +-- command = "shellcheck", -- ---@usage arguments to pass to the formatter -- -- these cannot contain whitespaces, options such as `--line-width 80` become either `{'--line-width', '80'}` or `{'--line-width=80'}` --- args = { "--severity", "warning" }, +-- extra_args = { "--severity", "warning" }, -- }, -- { --- exe = "codespell", +-- command = "codespell", -- ---@usage specify which filetypes to enable. By default a providers will attach to all the filetypes it supports. -- filetypes = { "javascript", "python" }, -- }, @@ -161,11 +178,22 @@ lvim.lsp.automatic_servers_installation = true -- } -- Autocommands (https://neovim.io/doc/user/autocmd.html) --- lvim.autocommands.custom_groups = { --- { "BufWinEnter", "*.lua", "setlocal ts=8 sw=8" }, --- } +-- vim.api.nvim_create_autocmd("BufEnter", { +-- pattern = { "*.json", "*.jsonc" }, +-- -- enable wrap mode for json files only +-- command = "setlocal wrap", +-- }) +-- vim.api.nvim_create_autocmd("FileType", { +-- pattern = "zsh", +-- callback = function() +-- -- let treesitter use bash highlight for zsh files as well +-- require("nvim-treesitter.highlight").attach(0, "bash") +-- end, lvim.plugins = { + { + "dracula/vim", + }, { "tpope/vim-surround", keys = { "c", "d", "y" }, @@ -239,40 +267,140 @@ lvim.plugins = { "p00f/nvim-ts-rainbow", }, { "tpope/vim-repeat" }, - { - "monaqa/dial.nvim", - event = "BufRead", - config = function() - local dial = require("dial") - vim.cmd([[ - nmap (dial-increment) - nmap (dial-decrement) - vmap (dial-increment) - vmap (dial-decrement) - vmap g (dial-increment-additional) - vmap g (dial-decrement-additional) - ]]) + -- { + -- "monaqa/dial.nvim", + -- event = "BufRead", + -- config = function() + -- local dial = require("dial") + -- vim.cmd([[ + -- nmap (dial-increment) + -- nmap (dial-decrement) + -- vmap (dial-increment) + -- vmap (dial-decrement) + -- vmap g (dial-increment-additional) + -- vmap g (dial-decrement-additional) + -- ]]) - dial.augends["custom#boolean"] = dial.common.enum_cyclic({ - name = "boolean", - strlist = { "true", "false" }, - }) - table.insert(dial.config.searchlist.normal, "custom#boolean") + -- dial.augends["custom#boolean"] = dial.common.enum_cyclic({ + -- name = "boolean", + -- strlist = { "true", "false" }, + -- }) + -- table.insert(dial.config.searchlist.normal, "custom#boolean") - -- For Languages which prefer True/False, e.g. python. - dial.augends["custom#Boolean"] = dial.common.enum_cyclic({ - name = "Boolean", - strlist = { "True", "False" }, - }) - table.insert(dial.config.searchlist.normal, "custom#Boolean") - end, - }, + -- -- For Languages which prefer True/False, e.g. python. + -- dial.augends["custom#Boolean"] = dial.common.enum_cyclic({ + -- name = "Boolean", + -- strlist = { "True", "False" }, + -- }) + -- table.insert(dial.config.searchlist.normal, "custom#Boolean") + -- end, + -- }, + -- { + -- "mrjones2014/dash.nvim", + -- run = "make install", + -- }, { - "mrjones2014/dash.nvim", - run = "make install", + "nvim-orgmode/orgmode", + config = function() + require('orgmode').setup{ + org_blank_before_new_entry = { + heading = false, + plain_list_item = false, + } + } + end, + }, + -- { + -- "dhruvasagar/vim-table-mode", + -- }, + { + "akinsho/org-bullets.nvim", + setup = function() + symbols = { "◉", "○", "✸", "✿" } + end + }, + { + "nvim-telescope/telescope-project.nvim", + event = "BufWinEnter", + setup = function() + vim.cmd [[packadd telescope.nvim]] + end, + }, + { + "nvim-telescope/telescope-file-browser.nvim", + }, + { + "ray-x/lsp_signature.nvim", + event = "BufRead", + config = function() + require "lsp_signature".setup() + end + }, + { + "folke/trouble.nvim", + cmd = "TroubleToggle", + }, + { + "rmagatti/goto-preview", + config = function() + require('goto-preview').setup { + width = 120; -- Width of the floating window + height = 25; -- Height of the floating window + default_mappings = true; -- Bind default mappings + debug = false; -- Print debug information + opacity = nil; -- 0-100 opacity level of the floating window where 100 is fully transparent. + post_open_hook = nil;-- A function taking two arguments, a buffer and a window to be ran as a hook. + -- You can use "default_mappings = true" setup option + -- Or explicitly set keybindings + vim.cmd("nnoremap gPd lua require('goto-preview').goto_preview_definition()"); + vim.cmd("nnoremap gPi lua require('goto-preview').goto_preview_implementation()"); + vim.cmd("nnoremap gPc lua require('goto-preview').close_all_win()"); + } + end, }, } + + +lvim.builtin.which_key.mappings["t"] = { + name = "Diagnostics", + t = { "TroubleToggle", "trouble" }, + w = { "TroubleToggle workspace_diagnostics", "workspace" }, + d = { "TroubleToggle document_diagnostics", "document" }, + q = { "TroubleToggle quickfix", "quickfix" }, + l = { "TroubleToggle loclist", "loclist" }, + r = { "TroubleToggle lsp_references", "references" }, +} + +-- org mode +local parser_config = require "nvim-treesitter.parsers".get_parser_configs() +parser_config.org = { + install_info = { + url = 'https://github.com/milisims/tree-sitter-org', + revision = 'f110024d539e676f25b72b7c80b0fd43c34264ef', + files = {'src/parser.c', 'src/scanner.cc'}, + }, + filetype = 'org', +} + +require('orgmode').setup_ts_grammar() + +require'nvim-treesitter.configs'.setup { + -- If TS highlights are not enabled at all, or disabled via `disable` prop, highlighting will fallback to default Vim syntax highlighting + highlight = { + enable = true, + disable = {'org'}, -- Remove this to use TS highlighter for some of the highlights (Experimental) + additional_vim_regex_highlighting = {'org'}, -- Required since TS highlighter doesn't support all syntax features (conceal) + }, + ensure_installed = {'org'}, -- Or run :TSUpdate org +} + +require('orgmode').setup({ + org_agenda_files = {'~/org/**/*'}, + org_default_notes_file = '~/org/refile.org', +}) + +-- javascript/typescript local formatters = require "lvim.lsp.null-ls.formatters" formatters.setup { { @@ -293,7 +421,6 @@ formatters.setup { }, } --- set additional linters local linters = require "lvim.lsp.null-ls.linters" linters.setup { { @@ -301,3 +428,16 @@ linters.setup { filetypes = { "typescript", "typescriptreact", "javascript", "javascriptreact" }, }, } + +lvim.builtin.which_key.mappings["P"] = { "lua require'telescope'.extensions.project.project{ display_type = 'full' }", "Projects" } +lvim.builtin.which_key.mappings['`'] = { ":edit #", "Last Buffer" } +lvim.builtin.which_key.mappings['lP'] = { "lua require('goto-preview').goto_preview_definition()", "Goto Preview" } +-- lvim.builtin.which_key.mappings["P"] = { "Telescope project", "Projects" } + +-- term stuff (there is probably something better) +-- vim.api.nvim_set_keymap("n", "t", [[vnew term://zsh | vertical resize 87 ]], +-- {silent = true}) -- term over right + +-- vertical terminal +-- vim.api.nvim_set_keymap("n", "t", [[ split term://zsh | resize 28 ]], +-- {silent = true}) -- term bottom diff --git a/.config/yadm/encrypt b/.config/yadm/encrypt new file mode 100644 index 0000000..be06428 --- /dev/null +++ b/.config/yadm/encrypt @@ -0,0 +1,6 @@ +.config/zsh/dockerhub.zsh +.config/zsh/fpp.zsh +.config/zsh/github.zsh +.config/zsh/wizehive.zsh +.ssh/id_rsa +.ssh/id_rsa_tedkulp_old diff --git a/.config/zsh/fnm.zsh b/.config/zsh/fnm.zsh index 3d4955d..1410908 100644 --- a/.config/zsh/fnm.zsh +++ b/.config/zsh/fnm.zsh @@ -1,5 +1,5 @@ export PATH=/home/ted/.fnm:$PATH -eval "`fnm env`" +eval "$(fnm env --use-on-cd)" autoload -U add-zsh-hook _fnm_autoload_hook () { diff --git a/.config/zsh/git.zsh b/.config/zsh/git.zsh index 95f9eb5..9d78f41 100644 --- a/.config/zsh/git.zsh +++ b/.config/zsh/git.zsh @@ -1,16 +1,33 @@ alias ghm='git push heroku master' alias gpp='git pull origin "(git_current_branch)" && git push origin "(git_current_branch)"' +alias gfap='git pull --all -p' + +function gctest () { + local branch="${1:-master}" + + git merge --no-commit --no-ff $1 + git merge --abort +} function grcl () { local branch="${1:-master}" - echo git checkout $branch - echo git pull - echo git remote prune origin - echo git branch -avv | grep "gone]" | awk '{ print $1 }' | xargs git branch -d; + git checkout $branch + gfap + git remote prune origin + git branch -avv | grep "gone]" | awk '{ print $1 }' | xargs git branch -d; } -alias gie='git init && git commit --allow-empty -m "Initial commit"' +unset gie +function gie () { + local email="${1:-ted@tedkulp.com}" + + git init + git config user.email "$email" + git commit --allow-empty -m "Initial Commit" +} + +# alias gie='git init && git commit --allow-empty -m "Initial commit"' # alias __git-checkout_main=_git_checkout # compdef _git grcl=git-checkout diff --git a/.config/zsh/keychain.zsh b/.config/zsh/keychain.zsh deleted file mode 120000 index b5b4c54..0000000 --- a/.config/zsh/keychain.zsh +++ /dev/null @@ -1 +0,0 @@ -keychain.zsh##os.WSL \ No newline at end of file diff --git a/.config/zsh/nvm.zsh b/.config/zsh/nvm.zsh index d85ef6c..df3ba51 100644 --- a/.config/zsh/nvm.zsh +++ b/.config/zsh/nvm.zsh @@ -2,21 +2,21 @@ # declare -a NODE_GLOBALS=(`find $NVM_DIR/versions/node -maxdepth 3 -type l -wholename '*/bin/*' | xargs -n1 basename | sort | uniq`) -NODE_GLOBALS+=("node") -NODE_GLOBALS+=("nvm") +# NODE_GLOBALS+=("node") +# NODE_GLOBALS+=("nvm") -load_nvm () { - if [ -s "$NVM_DIR/nvm.sh" ]; then - # These are the ones when using curl install - [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm - [ -s "$NVM_DIR/bash_completion" ] && . "$NVM_DIR/bash_completion" # This loads nvm bash_completion - elif [ -x "$(command -v brew)" ]; then - export NVM_PREFIX=$(brew --prefix nvm) - # These are the homebrew ones - [ -s "$NVM_PREFIX/nvm.sh" ] && . "/usr/local/opt/nvm/nvm.sh" # This loads nvm - [ -s "$NVM_PREFIX/etc/bash_completion.d/nvm" ] && . "/usr/local/opt/nvm/etc/bash_completion.d/nvm" # This loads nvm bash_completion - fi -} +# load_nvm () { +# if [ -s "$NVM_DIR/nvm.sh" ]; then +# # These are the ones when using curl install +# [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm +# [ -s "$NVM_DIR/bash_completion" ] && . "$NVM_DIR/bash_completion" # This loads nvm bash_completion +# elif [ -x "$(command -v brew)" ]; then +# export NVM_PREFIX=$(brew --prefix nvm) +# # These are the homebrew ones +# [ -s "$NVM_PREFIX/nvm.sh" ] && . "/usr/local/opt/nvm/nvm.sh" # This loads nvm +# [ -s "$NVM_PREFIX/etc/bash_completion.d/nvm" ] && . "/usr/local/opt/nvm/etc/bash_completion.d/nvm" # This loads nvm bash_completion +# fi +# } # for cmd in "${NODE_GLOBALS[@]}"; do # eval "${cmd}(){ unset -f ${NODE_GLOBALS}; load_nvm; ${cmd} \$@ }" diff --git a/.gitconfig b/.gitconfig index 886bc04..2b568b0 100644 --- a/.gitconfig +++ b/.gitconfig @@ -1,6 +1,6 @@ [user] name = Ted Kulp - email = ted@tedkulp.com + email = ted.kulp@wizehive.com gmail = tedkulp@gmail.com signingKey = AE6B007E2FAB1C94319C7C09FD56BE79CDAE7895 [commit] diff --git a/.local/share/yadm/archive b/.local/share/yadm/archive index 597c08ed7ed7b22ff74a390a70219fdc4733477d..002ddf763fb42f138db4be31daa84bf2d9d29fa4 100644 GIT binary patch literal 6134 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 I&fy$qV^Z1nKL7v# literal 5437 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