oldbase=$base
oldpushbase=$pushbase
# transition old URLs
- if [ x"$base" = x"ssh://xonotic@push.git.xonotic.org/" ]; then
+ if [ x"$base" = x"ssh://xonotic@git.xonotic.org/" ]; then
base=ssh://xonotic@push.git.xonotic.org/
fi
+ if [ x"$pushbase" = x"ssh://xonotic@git.xonotic.org/" ]; then
+ pushbase=ssh://xonotic@push.git.xonotic.org/
+ fi
while :; do
if [ x"$1" = x"-N" ]; then
allow_pull=false
rm -f Xonotic/key_15.d0pk
{
verbose cd Xonotic/mapping
- verbose wget http://www.icculus.org/netradiant/files/netradiant-1.5.0-20110819.tar.bz2
- verbose wget http://www.icculus.org/netradiant/files/netradiant-1.5.0-20110819-win32-7z.exe
+ verbose wget http://www.icculus.org/netradiant/files/netradiant-1.5.0-20120114.tar.bz2
+ verbose wget http://www.icculus.org/netradiant/files/netradiant-1.5.0-20120114-win32-7z.exe
for X in *-7z.exe; do
7za x "$X"
rm -f "$X"
verbose export jpeg_qual_rgb=97
verbose export jpeg_qual_a=99
verbose export do_dds=false
- verbose export do_ogg=false
+ verbose export do_ogg=true
+ verbose export ogg_ogg=false
verbose export del_src=true
find . -type f -print0 | verbose xargs -0 "$d0"/misc/tools/cached-converter.sh
;;
verbose export do_dds=true
verbose export dds_flags=
verbose export do_ogg=true
+ verbose export ogg_ogg=false
verbose export del_src=true
find . -type f -print0 | verbose xargs -0 "$d0"/misc/tools/cached-converter.sh
;;
xonotic-*.pk3dir
*.pk3
-benchmark.log
+*.log
gfx
maps
scripts
: ${do_dds:=true}
: ${dds_tool:=compressonator-dxtc}
: ${do_ogg:=false}
-: ${ogg_qual:=1}
+: ${ogg_ogg:=true}
+: ${ogg_qual:=2}
: ${del_src:=false}
: ${git_src_repo:=}
: ${dds_noalpha:=dxt1}
will_jpeg=$do_jpeg
will_dds=$do_dds
will_ogg=$do_ogg
+ if ! $ogg_ogg; then
+ case "$f" in
+ *.ogg) will_ogg=false ;;
+ esac
+ fi
case "$f" in
./sounds/misc/talk*.wav) will_ogg=false ;; # engine "feature"
*_bump) will_dds=false ;;
--- /dev/null
+#!/bin/sh
+
+../midi2cfg-ng.pl ../midi2cfg-ng.conf foo180.mid 0 > ~/.xonotic/data/x.cfg
@echo off\r
\r
+if "%1" == "did-copy" goto copied\r
cd %~dp0\r
+rmdir /s /q %TEMP%\xonotic-rsync-updater\r
+mkdir %TEMP%\xonotic-rsync-updater\r
+for %%f in (*.exe *.dll *.bat) do copy /b %%f %TEMP%\xonotic-rsync-updater\\r
+%TEMP%\xonotic-rsync-updater\update-xonotic did-copy\r
+exit\r
\r
+:copied\r
set options=-Prtzil --executability --delete-after --delete-excluded --stats\r
\r
if exist Xonotic-low goto xonoticlow\r
:endxonotic\r
\r
set excludes=\r
+if not "%XONOTIC_INCLUDE_ALL%" == "" goto endbit\r
set excludes=%excludes% --exclude=/xonotic-linux*\r
set excludes=%excludes% --exclude=/xonotic-osx-*\r
set excludes=%excludes% --exclude=/Xonotic*.app\r
goto endbit\r
:endbit\r
\r
-rsync %options% %excludes% %url% %target%\r
-chmod -R a+x %target%\r
+for %%f in (*.exe *.dll) do copy /b %%f %TEMP%\xonotic-rsync-updater\\r
+%TEMP%\xonotic-rsync-updater\rsync %options% %excludes% %url% %target%\r
+%TEMP%\xonotic-rsync-updater\chmod -R a+x %target%\r
\r
:end\r
pause\r
+rmdir /s /q %TEMP%\xonotic-rsync-updater\r
fi
excludes=
-excludes="$excludes --exclude=/*.exe"
-excludes="$excludes --exclude=/fteqcc/*.exe"
-excludes="$excludes --exclude=/bin32"
-excludes="$excludes --exclude=/*.dll"
-excludes="$excludes --exclude=/bin64"
+if [ -z "$XONOTIC_INCLUDE_ALL" ]; then
+ excludes="$excludes --exclude=/*.exe"
+ excludes="$excludes --exclude=/fteqcc/*.exe"
+ excludes="$excludes --exclude=/bin32"
+ excludes="$excludes --exclude=/*.dll"
+ excludes="$excludes --exclude=/bin64"
-case `uname`:`uname -m` in
- Darwin:*)
- excludes="$excludes --exclude=/xonotic-linux*"
- excludes="$excludes --exclude=/fteqcc/fteqcc.linux*"
- ;;
- Linux:x86_64)
- excludes="$excludes --exclude=/Xonotic*.app"
- excludes="$excludes --exclude=/xonotic-osx-*"
- excludes="$excludes --exclude=/fteqcc/fteqcc.osx"
- if [ -z "$XONOTIC_INCLUDE_32BIT" ]; then
- excludes="$excludes --exclude=/xonotic-linux32-*"
- excludes="$excludes --exclude=/fteqcc/fteqcc.linux32"
- fi
- ;;
- Linux:i?86)
- excludes="$excludes --exclude=/Xonotic*.app"
- excludes="$excludes --exclude=/xonotic-osx-*"
- excludes="$excludes --exclude=/fteqcc/fteqcc.osx"
- excludes="$excludes --exclude=/xonotic-linux64-*"
- excludes="$excludes --exclude=/fteqcc/fteqcc.linux64"
- ;;
- *)
- echo >&2 "WARNING: Could not detect architecture - downloading all architectures"
- ;;
-esac
+ case `uname`:`uname -m` in
+ Darwin:*)
+ excludes="$excludes --exclude=/xonotic-linux*"
+ excludes="$excludes --exclude=/fteqcc/fteqcc.linux*"
+ ;;
+ Linux:x86_64)
+ excludes="$excludes --exclude=/Xonotic*.app"
+ excludes="$excludes --exclude=/xonotic-osx-*"
+ excludes="$excludes --exclude=/fteqcc/fteqcc.osx"
+ if [ -z "$XONOTIC_INCLUDE_32BIT" ]; then
+ excludes="$excludes --exclude=/xonotic-linux32-*"
+ excludes="$excludes --exclude=/fteqcc/fteqcc.linux32"
+ fi
+ ;;
+ Linux:i?86)
+ excludes="$excludes --exclude=/Xonotic*.app"
+ excludes="$excludes --exclude=/xonotic-osx-*"
+ excludes="$excludes --exclude=/fteqcc/fteqcc.osx"
+ excludes="$excludes --exclude=/xonotic-linux64-*"
+ excludes="$excludes --exclude=/fteqcc/fteqcc.linux64"
+ ;;
+ *)
+ echo >&2 "WARNING: Could not detect architecture - downloading all architectures"
+ ;;
+ esac
+fi
rsync $options $excludes "$url" "$target"
--- /dev/null
+@echo off\r
+\r
+cd %~dp0\r
+cd ..\..\..\r
+\r
+echo The Big Benchmark\r
+echo =================\r
+echo.\r
+if not exist all goto nogit\r
+echo For Git builds, please use the-big-benchmark.sh instead!\r
+goto end\r
+:nogit\r
+if "%1" == "" goto noarg\r
+set xonotic=%1\r
+goto postarg\r
+:noarg\r
+if "%ProgramFiles(x86)%" == "" goto bit32\r
+:bit64\r
+set xonotic=xonotic-x64.exe\r
+goto postarg\r
+:bit32\r
+set xonotic=xonotic.exe\r
+goto postarg\r
+:postarg\r
+\r
+if exist data\the-big-benchmark.log del data\the-big-benchmark.log\r
+if exist data\benchmark.log del data\benchmark.log\r
+if exist data\engine.log del data\engine.log\r
+set p=+r_texture_dds_load 1 +developer 1 -nohome -benchmarkruns 4 -benchmarkruns_skipfirst -benchmark demos/the-big-keybench.dem\r
+\r
+if exist data\benchmark.log del data\benchmark.log\r
+echo + %xonotic% %2 %3 %4 %5 %6 %7 %8 %9 +exec effects-omg.cfg %p% > data\engine.log\r
+%xonotic% %2 %3 %4 %5 %6 %7 %8 %9 +exec effects-omg.cfg %p% >> data\engine.log 2>&1\r
+find "]quit" data\engine.log >nul\r
+if not errorlevel 1 goto done\r
+type data\engine.log >> data\the-big-benchmark.log\r
+type data\benchmark.log >> data\the-big-benchmark.log\r
+\r
+if exist data\benchmark.log del data\benchmark.log\r
+echo + %xonotic% %2 %3 %4 %5 %6 %7 %8 %9 +exec effects-low.cfg %p% > data\engine.log\r
+%xonotic% %2 %3 %4 %5 %6 %7 %8 %9 +exec effects-low.cfg %p% >> data\engine.log 2>&1\r
+find "]quit" data\engine.log >nul\r
+if not errorlevel 1 goto done\r
+type data\engine.log >> data\the-big-benchmark.log\r
+type data\benchmark.log >> data\the-big-benchmark.log\r
+\r
+if exist data\benchmark.log del data\benchmark.log\r
+echo + %xonotic% %2 %3 %4 %5 %6 %7 %8 %9 +exec effects-med.cfg %p% > data\engine.log\r
+%xonotic% %2 %3 %4 %5 %6 %7 %8 %9 +exec effects-med.cfg %p% >> data\engine.log 2>&1\r
+find "]quit" data\engine.log >nul\r
+if not errorlevel 1 goto done\r
+type data\engine.log >> data\the-big-benchmark.log\r
+type data\benchmark.log >> data\the-big-benchmark.log\r
+\r
+if exist data\benchmark.log del data\benchmark.log\r
+echo + %xonotic% %2 %3 %4 %5 %6 %7 %8 %9 +exec effects-normal.cfg %p% > data\engine.log\r
+%xonotic% %2 %3 %4 %5 %6 %7 %8 %9 +exec effects-normal.cfg %p% >> data\engine.log 2>&1\r
+find "]quit" data\engine.log >nul\r
+if not errorlevel 1 goto done\r
+type data\engine.log >> data\the-big-benchmark.log\r
+type data\benchmark.log >> data\the-big-benchmark.log\r
+\r
+if exist data\benchmark.log del data\benchmark.log\r
+echo + %xonotic% %2 %3 %4 %5 %6 %7 %8 %9 +exec effects-high.cfg %p% > data\engine.log\r
+%xonotic% %2 %3 %4 %5 %6 %7 %8 %9 +exec effects-high.cfg %p% >> data\engine.log 2>&1\r
+find "]quit" data\engine.log >nul\r
+if not errorlevel 1 goto done\r
+type data\engine.log >> data\the-big-benchmark.log\r
+type data\benchmark.log >> data\the-big-benchmark.log\r
+\r
+if exist data\benchmark.log del data\benchmark.log\r
+echo + %xonotic% %2 %3 %4 %5 %6 %7 %8 %9 +exec effects-ultra.cfg %p% > data\engine.log\r
+%xonotic% %2 %3 %4 %5 %6 %7 %8 %9 +exec effects-ultra.cfg %p% >> data\engine.log 2>&1\r
+find "]quit" data\engine.log >nul\r
+if not errorlevel 1 goto done\r
+type data\engine.log >> data\the-big-benchmark.log\r
+type data\benchmark.log >> data\the-big-benchmark.log\r
+\r
+if exist data\benchmark.log del data\benchmark.log\r
+echo + %xonotic% %2 %3 %4 %5 %6 %7 %8 %9 +exec effects-ultimate.cfg %p% > data\engine.log\r
+%xonotic% %2 %3 %4 %5 %6 %7 %8 %9 +exec effects-ultimate.cfg %p% >> data\engine.log 2>&1\r
+find "]quit" data\engine.log >nul\r
+if not errorlevel 1 goto done\r
+type data\engine.log >> data\the-big-benchmark.log\r
+type data\benchmark.log >> data\the-big-benchmark.log\r
+\r
+:done\r
+\r
+if exist data\benchmark.log del data\benchmark.log\r
+if exist data\engine.log del data\engine.log\r
+\r
+if exist data\the-big-benchmark.log goto logisgood\r
+echo.\r
+echo The benchmark has been aborted. No log file has been written.\r
+goto end\r
+\r
+:logisgood\r
+echo.\r
+echo Please provide the the following info to the Xonotic developers:\r
+echo - CPU speed\r
+echo - memory size\r
+echo - graphics card (which vendor, which model)\r
+echo - operating system (including whether it is 32bit or 64bit)\r
+echo - graphics driver version\r
+echo - the file the-big-benchmark.log in the data directory\r
+echo.\r
+echo Thank you\r
+:end\r
+pause\r
--- /dev/null
+#!/bin/sh
+
+set -e
+
+if [ -d "${0%/*}" ]; then
+ cd "${0%/*}"
+fi
+cd ../../..
+
+echo "The Big Benchmark"
+echo " ================="
+echo
+if [ -f ./all ]; then
+ echo "WARNING: running this script will destroy ANY local changes you"
+ echo "might have on the repository that haven't been pushed or stored"
+ echo "in a local branch yet."
+ echo
+ if [ x"$1" != x"--yes" ]; then
+ echo "Are you absolutely sure you want to run this?"
+ echo
+ while :; do
+ echo -n "y/n: "
+ read -r yesno
+ case "$yesno" in
+ y)
+ break
+ ;;
+ n)
+ echo "Aborted."
+ exit 1
+ ;;
+ esac
+ done
+ fi
+fi
+
+if [ -f ./all ]; then
+ ./all clean -fU -m -r
+ ./all compile -r
+ export USE_GDB=no
+ set -- ./all run "$@"
+elif [ -z "$*" ]; then
+ case "`uname`" in
+ Darwin)
+ set -- ./Xonotic.app/Contents/MacOS/xonotic-osx-sdl
+ ;;
+ Linux)
+ set -- ./xonotic-linux-sdl.sh
+ ;;
+ *)
+ echo "OS not detected. Usage:"
+ echo " $0 how-to-run-xonotic"
+ echo "On Windows when using a release build or an autobuild,"
+ echo "use the-big-benchmark.bat instead!"
+ exit 1
+ ;;
+ esac
+fi
+rm -f data/the-big-benchmark.log
+rm -f data/benchmark.log
+rm -f data/engine.log
+p="+r_texture_dds_load 1 +developer 1 -nohome -benchmarkruns 4 -benchmarkruns_skipfirst -benchmark demos/the-big-keybench.dem"
+for e in omg low med normal high ultra ultimate; do
+ rm -f data/benchmark.log
+ echo + "$@" +exec effects-$e.cfg $p > data/engine.log
+ "$@" +exec effects-$e.cfg $p >>data/engine.log 2>&1 || true
+ if grep '\]quit' data/engine.log >/dev/null; then
+ break
+ fi
+ cat data/engine.log >> data/the-big-benchmark.log
+ cat data/benchmark.log >> data/the-big-benchmark.log
+done
+if [ -f ./all ]; then
+ ./all clean -r
+fi
+
+rm -f data/benchmark.log
+rm -f data/engine.log
+if ! [ -f data/the-big-benchmark.log ]; then
+ echo
+ echo "The benchmark has been aborted. No log file has been written."
+ exit
+fi
+
+echo
+echo "Please provide the the following info to the Xonotic developers:"
+echo " - CPU speed"
+echo " - memory size"
+echo " - graphics card (which vendor, which model)"
+echo " - operating system (including whether it is 32bit or 64bit)"
+echo " - graphics driver version"
+echo " - the file the-big-benchmark.log in the data directory"
+echo
+echo "Thank you"
elsif($_ eq '-sRGB')
{
push @{$options->{bsp}}, "-sRGBtex", "-sRGBcolor";
- push @{$options->{light}}, "-sRGBtex", "-sRGBcolor", "-sRGBlight";
+ push @{$options->{light}}, "-sRGBtex", "-sRGBcolor", "-sRGBlight"
+ if defined $options->{light};
}
elsif($_ eq '-nosRGB')
{
push @{$options->{bsp}}, "-nosRGBtex", "-nosRGBcolor";
- push @{$options->{light}}, "-nosRGBtex", "-nosRGBcolor", "-nosRGBlight";
+ push @{$options->{light}}, "-nosRGBtex", "-nosRGBcolor", "-nosRGBlight"
+ if defined $options->{light};
}
elsif($_ =~ /^--no(-.*)/)
{
fi
rm -rf ~/.xonotic
+ mkdir -p ~/.xonotic
(
cd ../..
if [ -n "$DISPLAY" ]; then
- misc/tools/xonotic-map-screenshot "$M" $screenshot_override +"scr_screenshot_name \"$M-\""
+ misc/tools/xonotic-map-screenshot "$M" $screenshot_override $DRIVERFLAGS +"scr_screenshot_name \"$M-\""
else
case "$DRIVER" in
gl)
;;
esac
fi
- )
+ ) >~/.xonotic/autoscreenshot.log 2>&1
if ! mv ~/.xonotic/data/screenshots "$M-$blobhash"; then
if [ -n "$IRCSPAM" ]; then
#ss2spam "$M" "$url$M-$blobhash/" "$REFNAME" "$commithash" 1 > "maps/$M.ircss"
fi
return 1
fi
+ mv ~/.xonotic/autoscreenshot.log "$M-$blobhash"/ || true
if [ -n "$IRCSPAM" ]; then
#ss2spam "$M" "$url$M-$blobhash/" "$REFNAME" "$commithash" 0 > "maps/$M.ircss"
ss2spam "$M" "$url?d" "$REFNAME" "$commithash" 0 > "maps/$M.ircss"
map=$1; shift
count=$1; shift
watchdog=$1; shift
-step=$1; shift
+dummy=$1; shift
# convert count to unary
count=`yes x | head -n "$count" | tr -cd x`
+'r_drawviewmodel 0' \
+'crosshair 0' \
+'sv_cheats 2' \
+ +'sv_gravity 0' \
+ +'r_nolerp 1' \
+ +'sv_clientcommand_antispam_time -999' \
+ +'sv_clientcommand_antispam_count 999' \
+'set catchme "catchme_"' \
+"alias catchme_$count \"quit\"" \
- +'alias "autoscreenshot" "$catchme; set catchme \"${catchme}x\"; impulse 911; defer '$step' \"screenshot; autoscreenshot\""' \
- +'alias cl_hook_gamestart_all "cmd join; defer 1 god; defer 2 noclip; defer 3 autoscreenshot"' \
+ +'alias NARF "sv_cmd nextframe cl_cmd nextframe sv_cmd nextframe cl_cmd nextframe $*"' \
+ +'alias ZORT "god; NARF EGAD"' \
+ +'alias EGAD "noclip; NARF POIT"' \
+ +'alias POIT "$catchme; set catchme \"${catchme}x\"; impulse 911; NARF TROZ"' \
+ +'alias TROZ "screenshot; NARF POIT"' \
+ +'alias cl_hook_gamestart_all "cmd join; defer 2 ZORT"' \
+"defer \"$watchdog\" quit" \
+"map \"$map\"" \
+'timelimit 0' \
$store{irc_nick} = "";
schedule sub {
my ($timer) = @_;
- out dp => 0, 'sv_cmd bans', 'status 1', 'log_dest_udp';
+ out dp => 0, 'sv_cmd banlist', 'status 1', 'log_dest_udp';
$store{status_waiting} = -1;
} => 1;
# this will clear irc_error_active
# not containing our own IP:port, or by rcon2irc_eval not being a defined command).
schedule sub {
my ($timer) = @_;
- out dp => 0, 'sv_cmd bans', 'status 1', 'log_dest_udp', 'rcon2irc_eval set dummy 1';
+ out dp => 0, 'sv_cmd banlist', 'status 1', 'log_dest_udp', 'rcon2irc_eval set dummy 1';
$store{status_waiting} = -1;
schedule $timer => (exists $store{dp_hostname} ? $config{dp_status_delay} : 1);;
} => 1;
//g_maplist_votable_abstain 0 // when 1, people get a "don't care" selection in the vote screen
//g_maplist_votable_nodetail 1 // when 1, people can't see how many voted for what (to thwart abusive "influential" first votes)
-//sv_vote_commands "restart fraglimit chmap gotomap nextmap endmatch reducematchtime extendmatchtime allready kick cointoss movetoteam_auto" // players can vote for those commands or use them if they are masters. You canm also add 'g_grappling_hook' for hook voting, and 'sv_fbskin_green sv_fbskin_red sv_fbskin_orange sv_fbskin_off' for fbskin voting.
-//sv_vote_master_commands "movetoteam_red movetoteam_blue movetoteam_yellow movetoteam_pink" // add commands masters can use if logged in or elected. You may want to put 'kickban' here, so masters can keep out punks. It may be good to also put "sv_status_privacy 0" then...
-//rcon_restricted_commands "restart fraglimit chmap gotomap endmatch reducematchtime extendmatchtime allready kick kickban \"sv_cmd bans\" \"sv_cmd unban\" status \"sv_cmd teamstatus\" movetoteam_auto movetoteam_red movetoteam_blue movetoteam_yellow movetoteam_pink" // commands for the (stronger) rcon restricted
+//sv_vote_commands "restart fraglimit chmap gotomap nextmap endmatch reducematchtime extendmatchtime allready kick cointoss movetoauto" // players can vote for those commands or use them if they are masters. You canm also add 'g_grappling_hook' for hook voting, and 'sv_fbskin_green sv_fbskin_red sv_fbskin_orange sv_fbskin_off' for fbskin voting.
+//sv_vote_master_commands "movetored movetoblue movetoyellow movetopink" // add commands masters can use if logged in or elected. You may want to put 'kickban' here, so masters can keep out punks. It may be good to also put "sv_status_privacy 0" then...
+//rcon_restricted_commands "restart fraglimit chmap gotomap endmatch reducematchtime extendmatchtime allready kick kickban \"sv_cmd bans\" \"sv_cmd unban\" status \"sv_cmd teamstatus\" movetoauto movetored movetoblue movetoyellow movetopink" // commands for the (stronger) rcon restricted
//sv_vote_call 1 // 0 will disable the normal voting
//sv_vote_master 1 // 0 will disable voting to become master, good if you prefer to use the master password instead
//sv_vote_master_password "" // when set, vlogin PWD will allow people to become master to run master commands directly using vdo
-//sv_vote_majority_factor 0.5 // 0.666 will require a 2/3 majority instead of a regular 1/2 one
-//sv_vote_simple_majority_factor 0 // 0.666 will win votes by a 2/3 majority of the VOTERS (not the players!)
+//sv_vote_majority_factor 0.5 // What percentage of the PLAYERS constitute a majority to win a vote? must be at least 0.5
+//sv_vote_majority_factor_of_voted 0 // What percentage of the VOTERS who already voted constitute a majority to win a vote? must be at least 0.5
// note: to JUST support simple majorities, set these two factors equal
//sv_maxidle 0 // idle time in seconds after which players will get kicked
+++ /dev/null
-#!/bin/sh
-
-set -e
-
-echo "The Big Benchmark"
-echo " ================="
-echo
-echo "WARNING: running this script will destroy ANY local changes you"
-echo "might have on the repository."
-echo
-if [ x"$1" != x"--yes" ]; then
- echo "Are you absolutely sure you want to run this?"
- echo
- while :; do
- echo -n "y/n: "
- read -r yesno
- case "$yesno" in
- y)
- break
- ;;
- n)
- echo "Aborted."
- exit 1
- ;;
- esac
- done
-fi
-
-set -x
-rm -f data/benchmark.log
-./all clean --reclone
-./all compile -r
-USE_GDB=no ./all run "$@" -nohome -benchmarkruns 3 -benchmark demos/the-big-keybench.dem +//div0-stable || true
-./all clean -r -f
-(
- cd darkplaces
- git checkout div0-stable-pred3d9 || git checkout -t origin/div0-stable-pred3d9 || exit 1
-)
-./all compile -r
-USE_GDB=no ./all run "$@" -nohome -benchmarkruns 3 -benchmark demos/the-big-keybench.dem +//div0-stable-pred3d9 || true
-./all clean -r -f -u
-set +x
-
-echo
-echo "Please provide the the following info to the Xonotic developers:"
-echo " - CPU speed"
-echo " - memory size"
-echo " - graphics card (which vendor, which model)"
-echo " - operating system (including whether it is 32bit or 64bit)"
-echo " - graphics driver version"
-echo " - the following info:"
-cat data/benchmark.log
-echo
-echo "Thank you"