mirror of
https://github.com/cmderdev/cmder.git
synced 2025-06-12 20:47:59 +08:00
Merge branch 'development' into release-1.3
This commit is contained in:
@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<key name="Software">
|
||||
<key name="ConEmu">
|
||||
<key name=".Vanilla" modified="2015-05-17 22:10:27" build="150513">
|
||||
<key name=".Vanilla" modified="2015-11-24 14:43:35" build="151119">
|
||||
<value name="ColorTable00" type="dword" data="00222827"/>
|
||||
<value name="ColorTable01" type="dword" data="009e5401"/>
|
||||
<value name="ColorTable02" type="dword" data="0004aa74"/>
|
||||
@ -72,7 +72,7 @@
|
||||
<value name="StartType" type="hex" data="02"/>
|
||||
<value name="CmdLine" type="string" data=""/>
|
||||
<value name="StartTasksFile" type="string" data=""/>
|
||||
<value name="StartTasksName" type="string" data="{cmd}"/>
|
||||
<value name="StartTasksName" type="string" data="{cmd::Cmder}"/>
|
||||
<value name="StartFarFolders" type="hex" data="00"/>
|
||||
<value name="StartFarEditors" type="hex" data="00"/>
|
||||
<value name="StoreTaskbarkTasks" type="hex" data="00"/>
|
||||
@ -123,12 +123,12 @@
|
||||
<value name="ColorKeyTransparent" type="hex" data="00"/>
|
||||
<value name="ColorKeyValue" type="dword" data="00010101"/>
|
||||
<value name="UseCurrentSizePos" type="hex" data="01"/>
|
||||
<value name="WindowMode" type="dword" data="0000051f"/>
|
||||
<value name="WindowMode" type="dword" data="00000520"/>
|
||||
<value name="ConWnd Width" type="dword" data="0000006f"/>
|
||||
<value name="ConWnd Height" type="dword" data="0000001a"/>
|
||||
<value name="Cascaded" type="hex" data="01"/>
|
||||
<value name="ConWnd X" type="dword" data="000003f8"/>
|
||||
<value name="ConWnd Y" type="dword" data="00000143"/>
|
||||
<value name="ConWnd X" type="dword" data="000000c5"/>
|
||||
<value name="ConWnd Y" type="dword" data="00000089"/>
|
||||
<value name="16bit Height" type="dword" data="00000000"/>
|
||||
<value name="AutoSaveSizePos" type="hex" data="00"/>
|
||||
<value name="IntegralSize" type="hex" data="00"/>
|
||||
@ -483,51 +483,89 @@
|
||||
<value name="DndLKey" type="hex" data="00"/>
|
||||
<value name="DndRKey" type="hex" data="a2"/>
|
||||
<value name="WndDragKey" type="dword" data="00121101"/>
|
||||
<key name="Tasks" modified="2015-05-17 22:10:27" build="150513">
|
||||
<value name="Count" type="dword" data="00000003"/>
|
||||
<key name="Task1" modified="2015-05-17 22:10:27" build="150513">
|
||||
<value name="Name" type="string" data="{cmd}"/>
|
||||
<value name="GuiArgs" type="string" data="/icon "%CMDER_ROOT%\cmder.exe""/>
|
||||
<key name="Tasks" modified="2015-11-24 14:43:35" build="151119">
|
||||
<value name="Count" type="dword" data="00000008"/>
|
||||
<key name="Task1" modified="2015-11-24 14:49:10" build="151119">
|
||||
<value name="Name" type="string" data="{cmd::Cmder as Admin}"/>
|
||||
<value name="GuiArgs" type="string" data=" /icon "%CMDER_ROOT%\icons\cmder.ico""/>
|
||||
<value name="Cmd1" type="string" data="*cmd /k "%ConEmuDir%\..\init.bat" -new_console:d:%USERPROFILE%"/>
|
||||
<value name="Active" type="dword" data="00000000"/>
|
||||
<value name="Count" type="dword" data="00000001"/>
|
||||
<value name="Hotkey" type="dword" data="00000000"/>
|
||||
<value name="Flags" type="dword" data="00000000"/>
|
||||
</key>
|
||||
<key name="Task2" modified="2015-11-24 14:49:10" build="151119">
|
||||
<value name="Name" type="string" data="{cmd::Cmder}"/>
|
||||
<value name="GuiArgs" type="string" data=" /icon "%CMDER_ROOT%\icons\cmder.ico""/>
|
||||
<value name="Cmd1" type="string" data="cmd /k "%ConEmuDir%\..\init.bat" -new_console:d:%USERPROFILE%"/>
|
||||
<value name="Active" type="dword" data="00000000"/>
|
||||
<value name="Count" type="dword" data="00000001"/>
|
||||
<value name="Hotkey" type="dword" data="00000000"/>
|
||||
<value name="Flags" type="dword" data="00000000"/>
|
||||
</key>
|
||||
<key name="Task2" modified="2015-05-17 22:10:27" build="150513">
|
||||
<value name="Name" type="string" data="{PowerShell}"/>
|
||||
<value name="GuiArgs" type="string" data="/icon "%CMDER_ROOT%\cmder.exe""/>
|
||||
<value name="Cmd1" type="string" data="PowerShell -ExecutionPolicy Bypass -NoLogo -NoProfile -NoExit -Command "Invoke-Expression '. ''%ConEmuDir%\..\profile.ps1'''" -new_console:d:"%USERPROFILE%""/>
|
||||
<value name="Active" type="dword" data="00000000"/>
|
||||
<value name="Count" type="dword" data="00000001"/>
|
||||
<key name="Task3" modified="2015-11-24 14:49:10" build="151119">
|
||||
<value name="Name" type="string" data="{Powershell::PowerShell as Admin}"/>
|
||||
<value name="Hotkey" type="dword" data="00000000"/>
|
||||
<value name="Flags" type="dword" data="00000000"/>
|
||||
</key>
|
||||
<key name="Task3" modified="2015-05-17 22:10:27" build="150513">
|
||||
<value name="Name" type="string" data="{PowerShell as Admin}"/>
|
||||
<value name="Hotkey" type="dword" data="00000000"/>
|
||||
<value name="GuiArgs" type="string" data="/icon "%CMDER_ROOT%\cmder.exe""/>
|
||||
<value name="GuiArgs" type="string" data=" /icon "%CMDER_ROOT%\icons\cmder.ico""/>
|
||||
<value name="Cmd1" type="string" data="*PowerShell -ExecutionPolicy Bypass -NoLogo -NoProfile -NoExit -Command "Invoke-Expression '. ''%ConEmuDir%\..\profile.ps1'''" -new_console:d:"%USERPROFILE%""/>
|
||||
<value name="Active" type="dword" data="00000000"/>
|
||||
<value name="Count" type="dword" data="00000001"/>
|
||||
<value name="Flags" type="dword" data="00000000"/>
|
||||
</key>
|
||||
<key name="Task4" modified="2015-02-24 18:49:50" build="140707">
|
||||
<value name="Name" type="string" data="{git sh}"/>
|
||||
<key name="Task4" modified="2015-11-24 14:49:10" build="151119">
|
||||
<value name="Name" type="string" data="{Powershell::Powershell}"/>
|
||||
<value name="Hotkey" type="dword" data="00000000"/>
|
||||
<value name="GuiArgs" type="string" data=" /icon "%CMDER_ROOT%\cmder.exe""/>
|
||||
<value name="Cmd1" type="string" data="cmd /k "%ConEmuDir%\..\init.bat & %CMDER_ROOT%\vendor\git-for-windows\bin\bash --login -i" -new_console:d:%USERPROFILE%"/>
|
||||
<value name="GuiArgs" type="string" data=" /icon "%CMDER_ROOT%\icons\cmder.ico""/>
|
||||
<value name="Cmd1" type="string" data="PowerShell -ExecutionPolicy Bypass -NoLogo -NoProfile -NoExit -Command "Invoke-Expression '. ''%ConEmuDir%\..\profile.ps1'''" -new_console:d:"%USERPROFILE%""/>
|
||||
<value name="Cmd2" type="string" data="%CMDER_ROOT%\vendor\git-for-windows\git-bash.exe"/>
|
||||
<value name="Active" type="dword" data="00000000"/>
|
||||
<value name="Count" type="dword" data="00000001"/>
|
||||
<value name="Flags" type="dword" data="00000000"/>
|
||||
</key>
|
||||
<key name="Task5" modified="2015-11-24 14:49:10" build="151119">
|
||||
<value name="Name" type="string" data="{bash::mintty as Admin}"/>
|
||||
<value name="Flags" type="dword" data="00000000"/>
|
||||
<value name="Hotkey" type="dword" data="00000000"/>
|
||||
<value name="GuiArgs" type="string" data="/icon "%ConEmuDir%\..\git-for-windows\usr\share\git\git-for-windows.ico""/>
|
||||
<value name="Cmd1" type="string" data="*%ConEmuDir%\..\git-for-windows\usr\bin\mintty.exe /bin/bash -l -new_console:d:%USERPROFILE%"/>
|
||||
<value name="Active" type="dword" data="00000000"/>
|
||||
<value name="Count" type="dword" data="00000001"/>
|
||||
</key>
|
||||
<key name="Task6" modified="2015-11-24 14:49:10" build="151119">
|
||||
<value name="Name" type="string" data="{bash::mintty}"/>
|
||||
<value name="Flags" type="dword" data="00000000"/>
|
||||
<value name="Hotkey" type="dword" data="00000000"/>
|
||||
<value name="GuiArgs" type="string" data="/icon "%ConEmuDir%\..\git-for-windows\usr\share\git\git-for-windows.ico""/>
|
||||
<value name="Cmd1" type="string" data="%ConEmuDir%\..\git-for-windows\usr\bin\mintty.exe /bin/bash -l -new_console:d:%userProfile%"/>
|
||||
<value name="Active" type="dword" data="00000000"/>
|
||||
<value name="Count" type="dword" data="00000001"/>
|
||||
<value name="Cmd2" type="string" data="%CMDER_ROOT%vendor\git-for-windows\usr\bin\mintty.exe /bin/bash -l -new_console:d:%userProfile%"/>
|
||||
</key>
|
||||
<key name="Task7" modified="2015-11-24 14:49:10" build="151119">
|
||||
<value name="Name" type="string" data="{bash::bash as Admin}"/>
|
||||
<value name="Flags" type="dword" data="00000000"/>
|
||||
<value name="Hotkey" type="dword" data="00000000"/>
|
||||
<value name="GuiArgs" type="string" data=" /icon "%CMDER_ROOT%\icons\cmder.ico""/>
|
||||
<value name="Active" type="dword" data="00000000"/>
|
||||
<value name="Count" type="dword" data="00000001"/>
|
||||
<value name="Cmd1" type="string" data="*cmd /c "%ConEmuDir%\..\git-for-windows\bin\bash --login -i" -new_console:d:%USERPROFILE%"/>
|
||||
</key>
|
||||
<key name="Task8" modified="2015-11-24 14:49:10" build="151119">
|
||||
<value name="Name" type="string" data="{bash::bash}"/>
|
||||
<value name="Flags" type="dword" data="00000000"/>
|
||||
<value name="Hotkey" type="dword" data="00000000"/>
|
||||
<value name="GuiArgs" type="string" data=" /icon "%CMDER_ROOT%\icons\cmder.ico""/>
|
||||
<value name="Cmd1" type="string" data="cmd /c "%ConEmuDir%\..\git-for-windows\bin\bash --login -i" -new_console:d:%USERPROFILE%"/>
|
||||
<value name="Active" type="dword" data="00000000"/>
|
||||
<value name="Count" type="dword" data="00000001"/>
|
||||
</key>
|
||||
</key>
|
||||
|
||||
<key name="Apps" modified="2015-05-17 22:10:27" build="150513">
|
||||
<key name="Apps" modified="2015-11-24 14:49:10" build="151119">
|
||||
<value name="Count" type="dword" data="00000000"/>
|
||||
</key>
|
||||
<key name="Colors" modified="2015-05-17 22:10:27" build="150513">
|
||||
<key name="Palette1" modified="2015-05-17 22:10:27" build="150513">
|
||||
<key name="Colors" modified="2015-11-24 14:49:10" build="151119">
|
||||
<key name="Palette1" modified="2015-11-24 14:49:10" build="151119">
|
||||
<value name="Name" type="string" data="Monokai"/>
|
||||
<value name="ExtendColors" type="hex" data="00"/>
|
||||
<value name="ExtendColorIdx" type="hex" data="0e"/>
|
||||
@ -628,7 +666,7 @@
|
||||
<value name="StatusBar.Hide.Dpi" type="hex" data="01"/>
|
||||
<value name="TabFlashChanged" type="dword" data="00000008"/>
|
||||
<value name="TabModifiedSuffix" type="string" data="[*]"/>
|
||||
<key name="HotKeys" modified="2015-05-17 22:10:27" build="150513">
|
||||
<key name="HotKeys" modified="2015-11-24 14:43:35" build="151119">
|
||||
<value name="KeyMacroVersion" type="hex" data="02"/>
|
||||
<value name="Multi.Modifier" type="dword" data="00000011"/>
|
||||
<value name="Multi.ArrowsModifier" type="dword" data="0000005b"/>
|
||||
@ -805,7 +843,20 @@
|
||||
<value name="DndLKey" type="hex" data="00"/>
|
||||
<value name="DndRKey" type="hex" data="a2"/>
|
||||
<value name="WndDragKey" type="dword" data="00121101"/>
|
||||
<value name="Multi.Unfasten" type="dword" data="00000000"/>
|
||||
<value name="Key.DebugProcess" type="dword" data="00105b44"/>
|
||||
<value name="Key.DumpProcess" type="dword" data="00000000"/>
|
||||
<value name="Key.DumpTree" type="dword" data="00000000"/>
|
||||
</key>
|
||||
<value name="StartCreateDelay" type="dword" data="00000064"/>
|
||||
<value name="DefaultTerminalDebugLog" type="hex" data="00"/>
|
||||
<value name="LastMonitor" type="string" data="0,0,1920,1020"/>
|
||||
<value name="Restore2ActiveMon" type="hex" data="00"/>
|
||||
<value name="DownShowExOnTopMessage" type="hex" data="00"/>
|
||||
<value name="EnvironmentSet" type="multi"/>
|
||||
<value name="Update.InetTool" type="hex" data="00"/>
|
||||
<value name="Update.InetToolCmd" type="string" data=""/>
|
||||
<value name="SuppressBells" type="hex" data="01"/>
|
||||
</key>
|
||||
</key>
|
||||
</key>
|
||||
|
@ -1,3 +1,14 @@
|
||||
## Config
|
||||
|
||||
All config files must be in this folder. If there is no option to create or read from this folder directly, it must be hardlinked.
|
||||
All config files must be in this folder. If there is no option to set this folder
|
||||
directly, it has to be hardlinked.
|
||||
|
||||
* `aliases`: aliases in cmd; called form vendor\init.bat; autocreated from
|
||||
`vendor\aliases.example`.
|
||||
* `*.lua`: clink completitions and prompt filters; called from vendor\cmder.lua after all
|
||||
other prompt filter and clink completitons are initialized; add your own.
|
||||
* `user_profile.{sh|bat|ps1}: startup files for bash|cmd|powershell tasks; called from their
|
||||
respective startup scripts in `vendor\`; autocreated on first start of such a task
|
||||
* `.history`: the current commandline history; autoupdated on close
|
||||
* `settings`: settings for readline; overwritten on update
|
||||
* `ConEmu.xml`: settings from ConEmu (=the UI of cmder -> Preferences); overwritten on update
|
||||
|
@ -1,7 +0,0 @@
|
||||
e.=explorer .
|
||||
gl=git log --oneline --all --graph --decorate $*
|
||||
ls=ls --show-control-chars -F --color $*
|
||||
pwd=cd
|
||||
clear=cls
|
||||
history=cat %CMDER_ROOT%\config\.history
|
||||
unalias=alias /d $1
|
191
config/cmder.lua
191
config/cmder.lua
@ -1,191 +0,0 @@
|
||||
function lambda_prompt_filter()
|
||||
clink.prompt.value = string.gsub(clink.prompt.value, "{lamb}", "λ")
|
||||
end
|
||||
|
||||
---
|
||||
-- Resolves closest directory location for specified directory.
|
||||
-- Navigates subsequently up one level and tries to find specified directory
|
||||
-- @param {string} path Path to directory will be checked. If not provided
|
||||
-- current directory will be used
|
||||
-- @param {string} dirname Directory name to search for
|
||||
-- @return {string} Path to specified directory or nil if such dir not found
|
||||
local function get_dir_contains(path, dirname)
|
||||
|
||||
-- return parent path for specified entry (either file or directory)
|
||||
local function pathname(path)
|
||||
local prefix = ""
|
||||
local i = path:find("[\\/:][^\\/:]*$")
|
||||
if i then
|
||||
prefix = path:sub(1, i-1)
|
||||
end
|
||||
return prefix
|
||||
end
|
||||
|
||||
-- Navigates up one level
|
||||
local function up_one_level(path)
|
||||
if path == nil then path = '.' end
|
||||
if path == '.' then path = clink.get_cwd() end
|
||||
return pathname(path)
|
||||
end
|
||||
|
||||
-- Checks if provided directory contains git directory
|
||||
local function has_specified_dir(path, specified_dir)
|
||||
if path == nil then path = '.' end
|
||||
local found_dirs = clink.find_dirs(path..'/'..specified_dir)
|
||||
if #found_dirs > 0 then return true end
|
||||
return false
|
||||
end
|
||||
|
||||
-- Set default path to current directory
|
||||
if path == nil then path = '.' end
|
||||
|
||||
-- If we're already have .git directory here, then return current path
|
||||
if has_specified_dir(path, dirname) then
|
||||
return path..'/'..dirname
|
||||
else
|
||||
-- Otherwise go up one level and make a recursive call
|
||||
local parent_path = up_one_level(path)
|
||||
if parent_path == path then
|
||||
return nil
|
||||
else
|
||||
return get_dir_contains(parent_path, dirname)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function get_hg_dir(path)
|
||||
return get_dir_contains(path, '.hg')
|
||||
end
|
||||
|
||||
local function get_git_dir(path)
|
||||
return get_dir_contains(path, '.git')
|
||||
end
|
||||
|
||||
---
|
||||
-- Find out current branch
|
||||
-- @return {false|mercurial branch name}
|
||||
---
|
||||
function get_hg_branch()
|
||||
for line in io.popen("hg branch 2>nul"):lines() do
|
||||
local m = line:match("(.+)$")
|
||||
if m then
|
||||
return m
|
||||
end
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
---
|
||||
-- Get the status of working dir
|
||||
-- @return {bool}
|
||||
---
|
||||
function get_hg_status()
|
||||
for line in io.popen("hg status"):lines() do
|
||||
return false
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
function hg_prompt_filter()
|
||||
|
||||
-- Colors for mercurial status
|
||||
local colors = {
|
||||
clean = "\x1b[1;37;40m",
|
||||
dirty = "\x1b[31;1m",
|
||||
}
|
||||
|
||||
if get_hg_dir() then
|
||||
-- if we're inside of mercurial repo then try to detect current branch
|
||||
local branch = get_hg_branch()
|
||||
if branch then
|
||||
-- Has branch => therefore it is a mercurial folder, now figure out status
|
||||
if get_hg_status() then
|
||||
color = colors.clean
|
||||
else
|
||||
color = colors.dirty
|
||||
end
|
||||
|
||||
clink.prompt.value = string.gsub(clink.prompt.value, "{hg}", color.."("..branch..")")
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
-- No mercurial present or not in mercurial file
|
||||
clink.prompt.value = string.gsub(clink.prompt.value, "{hg}", "")
|
||||
return false
|
||||
end
|
||||
|
||||
---
|
||||
-- Find out current branch
|
||||
-- @return {nil|git branch name}
|
||||
---
|
||||
function get_git_branch(git_dir)
|
||||
local git_dir = git_dir or get_git_dir()
|
||||
|
||||
-- If git directory not found then we're probably outside of repo
|
||||
-- or something went wrong. The same is when head_file is nil
|
||||
local head_file = git_dir and io.open(git_dir..'/HEAD')
|
||||
if not head_file then return end
|
||||
|
||||
local HEAD = head_file:read()
|
||||
head_file:close()
|
||||
|
||||
-- if HEAD matches branch expression, then we're on named branch
|
||||
-- otherwise it is a detached commit
|
||||
local branch_name = HEAD:match('ref: refs/heads/(.+)')
|
||||
return branch_name or 'HEAD detached at '..HEAD:sub(1, 7)
|
||||
end
|
||||
|
||||
---
|
||||
-- Get the status of working dir
|
||||
-- @return {bool}
|
||||
---
|
||||
function get_git_status()
|
||||
return os.execute("git diff --quiet --ignore-submodules HEAD 2>nul")
|
||||
end
|
||||
|
||||
function git_prompt_filter()
|
||||
|
||||
-- Colors for git status
|
||||
local colors = {
|
||||
clean = "\x1b[1;37;40m",
|
||||
dirty = "\x1b[31;1m",
|
||||
}
|
||||
|
||||
local git_dir = get_git_dir()
|
||||
if git_dir then
|
||||
-- if we're inside of git repo then try to detect current branch
|
||||
local branch = get_git_branch(git_dir)
|
||||
if branch then
|
||||
-- Has branch => therefore it is a git folder, now figure out status
|
||||
if get_git_status() then
|
||||
color = colors.clean
|
||||
else
|
||||
color = colors.dirty
|
||||
end
|
||||
|
||||
clink.prompt.value = string.gsub(clink.prompt.value, "{git}", color.."("..branch..")")
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
-- No git present or not in git file
|
||||
clink.prompt.value = string.gsub(clink.prompt.value, "{git}", "")
|
||||
return false
|
||||
end
|
||||
|
||||
clink.prompt.register_filter(lambda_prompt_filter, 40)
|
||||
clink.prompt.register_filter(hg_prompt_filter, 50)
|
||||
clink.prompt.register_filter(git_prompt_filter, 50)
|
||||
|
||||
local completions_dir = clink.get_env('CMDER_ROOT')..'/vendor/clink-completions/'
|
||||
for _,lua_module in ipairs(clink.find_files(completions_dir..'*.lua')) do
|
||||
-- Skip files that starts with _. This could be useful if some files should be ignored
|
||||
if not string.match(lua_module, '^_.*') then
|
||||
local filename = completions_dir..lua_module
|
||||
-- use dofile instead of require because require caches loaded modules
|
||||
-- so config reloading using Alt-Q won't reload updated modules.
|
||||
dofile(filename)
|
||||
end
|
||||
end
|
@ -1,43 +0,0 @@
|
||||
# name: Ctrl-D exits
|
||||
# type: bool
|
||||
# Ctrl-D exits the process when it is pressed on an empty line.
|
||||
ctrld_exits = 1
|
||||
|
||||
# name: Ctrl-C raises exception
|
||||
# type: bool
|
||||
# When Ctrl-C is pressed Clink will pass it thourgh to the parent by raising the
|
||||
# appropriate exception.
|
||||
passthrough_ctrlc = 1
|
||||
|
||||
# name: Esc clears line
|
||||
# type: bool
|
||||
# Clink clears the current line when Esc is pressed (unless Readline's Vi mode
|
||||
# is enabled).
|
||||
esc_clears_line = 1
|
||||
|
||||
# name: Match display colour
|
||||
# type: int
|
||||
# Colour to use when displaying matches. A value less than 0 will be the
|
||||
# opposite brightness of the default colour.
|
||||
match_colour = -1
|
||||
|
||||
# name: Executable match style
|
||||
# type: enum
|
||||
# Changes how Clink will match executables when there is no path separator on
|
||||
# the line. 0 = PATH only, 1 = PATH and CWD, 2 = PATH, CWD, and directories. In
|
||||
# all cases both executables and directories are matched when there is a path
|
||||
# separator present.
|
||||
exec_match_style = 2
|
||||
|
||||
# name: Prompt colour
|
||||
# type: int
|
||||
# Surrounds the prompt in ANSI escape codes to set the prompt's colour. Disabled
|
||||
# when the value is less than 0.
|
||||
prompt_colour = -1
|
||||
|
||||
# name: Auto-answer terminate prompt
|
||||
# type: enum
|
||||
# Automatically answers cmd.exe's 'Terminate batch job (Y/N)?' prompts. 0 =
|
||||
# disabled, 1 = answer 'Y', 2 = answer 'N'.
|
||||
terminate_autoanswer = 0
|
||||
|
Reference in New Issue
Block a user