2012-08-21 12:10:37 +04:00
|
|
|
# Copyright (C) 2011 Urabe, Shyouhei. All rights reserved.
|
|
|
|
#
|
|
|
|
# This file is a part of the programming language Ruby. Permission is hereby
|
|
|
|
# granted, to either redistribute or modify this file, provided that the
|
|
|
|
# conditions mentioned in the file COPYING are met. Consult the file for
|
|
|
|
# details.
|
2012-05-21 07:45:52 +04:00
|
|
|
|
2012-08-21 12:10:37 +04:00
|
|
|
# This is a Travis-CI build configuration file. The list of configurations
|
|
|
|
# available is located in
|
|
|
|
#
|
|
|
|
# http://about.travis-ci.org/docs/user/build-configuration/
|
|
|
|
#
|
|
|
|
# and as Ruby itself is a project written in C language,
|
|
|
|
#
|
|
|
|
# http://about.travis-ci.org/docs/user/languages/c/
|
|
|
|
#
|
|
|
|
# is also a good place to look at.
|
2011-11-26 10:26:44 +04:00
|
|
|
|
2012-08-21 12:10:37 +04:00
|
|
|
language: c
|
2018-11-14 03:43:45 +03:00
|
|
|
|
2018-11-13 05:03:33 +03:00
|
|
|
dist: xenial
|
2018-11-14 03:43:45 +03:00
|
|
|
|
2018-11-13 05:03:33 +03:00
|
|
|
osx_image: xcode10.1
|
2018-11-14 03:43:45 +03:00
|
|
|
|
2018-01-26 06:54:55 +03:00
|
|
|
sudo: false
|
2018-11-14 03:43:45 +03:00
|
|
|
|
2018-11-14 07:50:59 +03:00
|
|
|
git:
|
|
|
|
quiet: true
|
|
|
|
|
2018-10-17 17:09:24 +03:00
|
|
|
addons:
|
|
|
|
apt:
|
|
|
|
config:
|
|
|
|
retries: true
|
|
|
|
update: true
|
|
|
|
sources:
|
|
|
|
- ubuntu-toolchain-r-test
|
|
|
|
packages:
|
|
|
|
- gcc-8
|
|
|
|
- libffi-dev
|
|
|
|
- libgdbm-dev
|
|
|
|
- libgmp-dev
|
|
|
|
- libjemalloc-dev
|
|
|
|
- libncurses5-dev
|
|
|
|
- libncursesw5-dev
|
|
|
|
- libreadline6-dev
|
|
|
|
- libssl-dev
|
|
|
|
- libyaml-dev
|
|
|
|
- openssl
|
|
|
|
- valgrind
|
|
|
|
- zlib1g-dev
|
|
|
|
homebrew:
|
|
|
|
packages:
|
|
|
|
- gdbm
|
|
|
|
- gmp
|
|
|
|
- libffi
|
2018-10-17 18:13:36 +03:00
|
|
|
- openssl@1.1
|
2018-10-17 17:09:24 +03:00
|
|
|
- zlib
|
2018-11-15 05:25:25 +03:00
|
|
|
- ccache
|
|
|
|
|
|
|
|
cache:
|
|
|
|
ccache: true
|
|
|
|
directories:
|
|
|
|
- "$HOME/config_2nd"
|
2018-11-14 03:43:45 +03:00
|
|
|
|
2018-11-13 07:55:43 +03:00
|
|
|
env:
|
|
|
|
global:
|
|
|
|
- "CONFIGURE_TTY=no"
|
2018-11-15 05:25:25 +03:00
|
|
|
- "CCACHE_COMPILERCHECK=none"
|
|
|
|
- "CCACHE_NOCOMPRESS=1"
|
|
|
|
- "CCACHE_MAXSIZE=512Mi"
|
2018-11-15 10:37:05 +03:00
|
|
|
- >-
|
|
|
|
NPROC="`case ${TRAVIS_OS_NAME} in
|
|
|
|
osx) sysctl -n hw.activecpu ;;
|
|
|
|
linux) nproc ;;
|
|
|
|
esac`"
|
|
|
|
# JOBS and SETARCH are overridden when necessary; see below.
|
|
|
|
- "JOBS=-j$((1+${NPROC}))"
|
|
|
|
- "SETARCH="
|
2018-11-14 03:43:45 +03:00
|
|
|
|
2018-11-06 04:36:20 +03:00
|
|
|
.org.ruby-lang.ci.matrix-definitions:
|
|
|
|
|
|
|
|
- &cron-only
|
|
|
|
if: (type = cron) AND (branch = trunk) AND (fork = false)
|
|
|
|
|
|
|
|
- &make-test-only
|
|
|
|
script:
|
2018-11-13 10:17:02 +03:00
|
|
|
- "$SETARCH make -s test TESTOPTS=\"${TESTOPTS=$JOBS -q --tty=no}\""
|
2018-11-06 04:36:20 +03:00
|
|
|
|
|
|
|
- &linux
|
|
|
|
os: linux
|
|
|
|
compiler: gcc-8
|
|
|
|
|
|
|
|
- &osx
|
|
|
|
os: osx
|
|
|
|
compiler: clang
|
|
|
|
before_install:
|
|
|
|
- /usr/local/opt/openssl@1.1/bin/openssl version
|
|
|
|
|
|
|
|
# --------
|
|
|
|
|
|
|
|
- &x86_64-linux
|
|
|
|
name: x86_64-linux
|
|
|
|
<<: *linux
|
|
|
|
|
|
|
|
- &jemalloc
|
|
|
|
name: --with-jemalloc
|
|
|
|
<<: *linux
|
|
|
|
<<: *cron-only
|
|
|
|
env:
|
|
|
|
- "CONFIG_FLAG='--with-gmp --with-jemalloc --with-valgrind'"
|
|
|
|
|
|
|
|
- &VM_CHECK_MODE
|
|
|
|
name: VM_CHECK_MODE=3
|
|
|
|
<<: *linux
|
|
|
|
<<: *cron-only
|
|
|
|
<<: *make-test-only
|
|
|
|
env:
|
2018-11-19 09:52:54 +03:00
|
|
|
- "cppflags=-DVM_CHECK_MODE=0x0003"
|
2018-11-06 04:36:20 +03:00
|
|
|
|
2018-11-06 06:06:33 +03:00
|
|
|
- &FIBER_USE_sjlj
|
|
|
|
name: FIBER_USE_NATIVE=0
|
|
|
|
<<: *linux
|
|
|
|
<<: *cron-only
|
|
|
|
env:
|
2018-11-19 09:52:54 +03:00
|
|
|
- "cppflags=-DFIBER_USE_NATIVE=0"
|
2018-11-06 06:06:33 +03:00
|
|
|
|
2018-11-06 04:36:20 +03:00
|
|
|
- &TOKEN_THREADED_CODE
|
|
|
|
name: TOKEN_THREADED_CODE
|
|
|
|
<<: *linux
|
|
|
|
<<: *cron-only
|
|
|
|
<<: *make-test-only
|
|
|
|
env:
|
2018-11-19 09:52:54 +03:00
|
|
|
- "cppflags=-DOPT_THREADED_CODE=1"
|
2018-11-06 04:36:20 +03:00
|
|
|
|
|
|
|
- &CALL_THREADED_CODE
|
|
|
|
name: CALL_THREADED_CODE
|
|
|
|
<<: *linux
|
|
|
|
<<: *cron-only
|
|
|
|
<<: *make-test-only
|
|
|
|
env:
|
2018-11-19 09:52:54 +03:00
|
|
|
- "cppflags=-DOPT_THREADED_CODE=2"
|
2018-11-06 04:36:20 +03:00
|
|
|
|
|
|
|
- &NO_THREADED_CODE
|
|
|
|
name: NO_THREADED_CODE
|
|
|
|
<<: *linux
|
|
|
|
<<: *cron-only
|
|
|
|
<<: *make-test-only
|
|
|
|
env:
|
2018-11-19 09:52:54 +03:00
|
|
|
- "cppflags=-DOPT_THREADED_CODE=3"
|
2018-11-06 04:36:20 +03:00
|
|
|
|
|
|
|
- &ASAN
|
|
|
|
name: -fsanitize=address
|
|
|
|
<<: *linux
|
|
|
|
#<<: *cron-only
|
|
|
|
<<: *make-test-only
|
|
|
|
compiler: clang
|
|
|
|
env:
|
|
|
|
- "ASAN_OPTIONS=detect_leaks=0"
|
2018-11-19 09:52:54 +03:00
|
|
|
- "cflags='-march=native -fsanitize=address -fno-omit-frame-pointer'"
|
|
|
|
- "debugflags=-ggdb3"
|
|
|
|
- "optflags='-O1'"
|
2018-11-06 04:36:20 +03:00
|
|
|
- "LD=clang"
|
|
|
|
- "LDFLAGS=-fsanitize=address"
|
|
|
|
|
|
|
|
- &MSAN
|
|
|
|
name: -fsanitize=memory
|
|
|
|
<<: *linux
|
|
|
|
#<<: *cron-only
|
|
|
|
<<: *make-test-only
|
|
|
|
compiler: clang
|
|
|
|
env:
|
2018-11-19 09:52:54 +03:00
|
|
|
- "cflags='-fsanitize=memory'"
|
2018-11-06 04:36:20 +03:00
|
|
|
- "LD=clang"
|
|
|
|
- "LDFLAGS=-fsanitize=memory"
|
|
|
|
|
|
|
|
- &UBSAN
|
|
|
|
name: -fsanitize=undefined
|
|
|
|
<<: *linux
|
|
|
|
#<<: *cron-only
|
|
|
|
<<: *make-test-only
|
|
|
|
compiler: clang
|
|
|
|
env:
|
2018-11-19 09:52:54 +03:00
|
|
|
- "cflags='-fsanitize=undefined,integer,nullability -fno-omit-frame-pointer'"
|
|
|
|
- "cppflags='-DUNALIGNED_WORD_ACCESS=0'"
|
|
|
|
- "debugflags='-ggdb3'"
|
|
|
|
- "optflags='-O1 -march=native'"
|
2018-11-06 04:36:20 +03:00
|
|
|
- "LD=clang"
|
|
|
|
- "LDFLAGS=-fsanitize=undefined,integer,nullability"
|
|
|
|
|
|
|
|
- &i686-linux
|
|
|
|
name: i686-linux
|
|
|
|
<<: *linux
|
|
|
|
sudo: required
|
|
|
|
env:
|
2018-11-15 05:25:25 +03:00
|
|
|
- "GCC_FLAGS=-m32"
|
2018-11-19 09:52:54 +03:00
|
|
|
- "debugflags='-g0'"
|
2018-11-06 04:36:20 +03:00
|
|
|
- "SETARCH='setarch i686 --verbose --3gb'"
|
|
|
|
addons:
|
|
|
|
apt:
|
|
|
|
config:
|
|
|
|
retries: true
|
|
|
|
update: true
|
|
|
|
sources:
|
|
|
|
- ubuntu-toolchain-r-test
|
|
|
|
packages:
|
|
|
|
- gcc-8-multilib
|
|
|
|
- libffi-dev:i386
|
|
|
|
- libffi6:i386
|
|
|
|
- libgdbm-dev:i386
|
|
|
|
- libgdbm3:i386
|
|
|
|
- libncurses5-dev:i386
|
|
|
|
- libncurses5:i386
|
|
|
|
- libncursesw5-dev:i386
|
|
|
|
- libreadline6-dev:i386
|
|
|
|
- libreadline6:i386
|
|
|
|
- libssl-dev:i386
|
|
|
|
- libssl1.0.0:i386
|
|
|
|
- linux-libc-dev:i386
|
|
|
|
- zlib1g-dev:i386
|
|
|
|
- zlib1g:i386
|
|
|
|
|
|
|
|
- &pedanticism
|
|
|
|
name: "-ansi -pedantic"
|
|
|
|
<<: *linux
|
|
|
|
<<: *make-test-only
|
2018-11-15 05:25:25 +03:00
|
|
|
compiler: clang
|
2018-11-06 04:36:20 +03:00
|
|
|
env:
|
2018-11-15 05:25:25 +03:00
|
|
|
- "GCC_FLAGS='-ansi -Werror=pedantic -pedantic-errors -std=iso9899:1990'"
|
2018-11-06 04:36:20 +03:00
|
|
|
- "CONFIG_FLAG="
|
|
|
|
- "JOBS="
|
|
|
|
# construct warnflags (using bashism...)
|
|
|
|
before_install: |
|
|
|
|
warnflags_array=(
|
|
|
|
-Wall
|
|
|
|
-Wextra
|
|
|
|
-Werror=declaration-after-statement
|
|
|
|
-Werror=deprecated-declarations
|
|
|
|
-Werror=division-by-zero
|
|
|
|
-Werror=extra-tokens
|
|
|
|
-Werror=implicit-function-declaration
|
|
|
|
-Werror=implicit-int
|
|
|
|
-Werror=long-long
|
|
|
|
-Werror=pointer-arith
|
|
|
|
-Werror=shorten-64-to-32
|
|
|
|
-Werror=write-strings
|
|
|
|
-Wmissing-noreturn
|
|
|
|
-Wno-constant-logical-operand
|
|
|
|
-Wno-missing-field-initializers
|
|
|
|
-Wno-overlength-strings
|
|
|
|
-Wno-parentheses-equality
|
|
|
|
-Wno-self-assign
|
|
|
|
-Wno-tautological-compare
|
|
|
|
-Wno-unused-local-typedef
|
|
|
|
-Wno-unused-parameter
|
|
|
|
-Wunused-variable
|
|
|
|
)
|
|
|
|
CONFIG_FLAG_ARRAY=(
|
2018-11-19 12:42:10 +03:00
|
|
|
warnflags="${warnflags_array[*]}"
|
2018-11-06 04:36:20 +03:00
|
|
|
LDFLAGS=-Wno-unused-command-line-argument)
|
|
|
|
|
|
|
|
- &rubyspec
|
2018-11-08 08:34:36 +03:00
|
|
|
name: ruby/spec on Ruby 2.3 # to ensure version guards are correctly added
|
2018-11-06 04:36:20 +03:00
|
|
|
<<: *linux
|
|
|
|
language: ruby
|
|
|
|
rvm: 2.3.8
|
|
|
|
addons:
|
|
|
|
apt:
|
|
|
|
packages:
|
|
|
|
before_install:
|
|
|
|
install:
|
|
|
|
before_script: chmod -R u+w spec/ruby
|
|
|
|
# -j randomly hangs. Using -fs to make sure we can know problematic spec on failure.
|
|
|
|
script: ruby -C spec/ruby ../mspec/bin/mspec -fs .
|
|
|
|
|
|
|
|
- &x86_64-darwin17
|
|
|
|
name: x86_64-darwin17
|
|
|
|
<<: *osx
|
|
|
|
env:
|
|
|
|
- "CONFIG_FLAG='--with-opt-dir=/usr/local/opt/openssl@1.1:/usr/local/opt/zlib'"
|
2018-11-14 02:06:49 +03:00
|
|
|
- "TEST_ALL_OPTS=\"$JOBS -q --tty=no --excludes=\\$(TESTSDIR)/excludes/_travis/osx\""
|
2018-11-06 04:36:20 +03:00
|
|
|
|
|
|
|
- &universal-darwin17
|
|
|
|
name: uinversal.x86_64h-darwin17
|
|
|
|
<<: *osx
|
|
|
|
<<: *cron-only
|
|
|
|
<<: *make-test-only
|
|
|
|
env:
|
|
|
|
- "CONFIG_FLAG='--with-arch=x86_64h,x86_64,i386'"
|
2018-11-14 02:06:49 +03:00
|
|
|
- "TEST_ALL_OPTS=\"$JOBS -q --tty=no --excludes=\\$(TESTSDIR)/excludes/_travis/osx\""
|
2018-11-06 04:36:20 +03:00
|
|
|
|
2018-09-09 15:48:33 +03:00
|
|
|
matrix:
|
|
|
|
include:
|
2018-10-23 17:10:12 +03:00
|
|
|
# to reduce time for finishing all jobs, run the slowest osx build first.
|
2018-11-06 04:36:20 +03:00
|
|
|
- <<: *x86_64-darwin17
|
|
|
|
- <<: *x86_64-linux
|
|
|
|
- <<: *i686-linux
|
|
|
|
- <<: *jemalloc
|
|
|
|
- <<: *pedanticism
|
|
|
|
- <<: *ASAN
|
|
|
|
- <<: *MSAN
|
|
|
|
- <<: *UBSAN
|
|
|
|
- <<: *VM_CHECK_MODE
|
2018-11-06 06:06:33 +03:00
|
|
|
- <<: *FIBER_USE_sjlj
|
2018-11-06 04:36:20 +03:00
|
|
|
- <<: *TOKEN_THREADED_CODE
|
|
|
|
- <<: *CALL_THREADED_CODE
|
|
|
|
- <<: *NO_THREADED_CODE
|
|
|
|
- <<: *rubyspec
|
|
|
|
allow_failures:
|
|
|
|
- name: uinversal.x86_64h-darwin17
|
|
|
|
- name: -fsanitize=address
|
|
|
|
- name: -fsanitize=memory
|
2018-11-06 04:45:09 +03:00
|
|
|
- name: -fsanitize=undefined
|
2018-11-06 04:36:20 +03:00
|
|
|
fast_finish: true
|
2014-09-20 06:55:27 +04:00
|
|
|
|
2012-08-21 12:10:37 +04:00
|
|
|
before_script:
|
2018-11-15 10:37:05 +03:00
|
|
|
- "echo JOBS=${JOBS} SETARCH=${SETARCH}"
|
2018-10-19 10:26:48 +03:00
|
|
|
- "$SETARCH uname -a"
|
|
|
|
- "$SETARCH uname -r"
|
2014-08-20 12:37:54 +04:00
|
|
|
- "rm -fr .ext autom4te.cache"
|
2016-01-13 06:22:36 +03:00
|
|
|
- "echo $TERM"
|
2017-05-23 15:42:40 +03:00
|
|
|
- "> config.status"
|
|
|
|
- "sed -f tool/prereq.status Makefile.in common.mk > Makefile"
|
|
|
|
- "make update-config_files"
|
2017-03-24 05:44:21 +03:00
|
|
|
- "make touch-unicode-files"
|
2017-05-27 06:14:04 +03:00
|
|
|
- "make -s $JOBS srcs UNICODE_FILES=."
|
2017-05-23 15:42:40 +03:00
|
|
|
- "rm config.status Makefile rbconfig.rb .rbconfig.time"
|
2018-11-15 05:25:25 +03:00
|
|
|
- |-
|
|
|
|
if [ -d ~/config_2nd ]; then
|
|
|
|
cp -pr ~/config_2nd build
|
|
|
|
else
|
|
|
|
mkdir build
|
|
|
|
fi
|
|
|
|
- "mkdir config_1st config_2nd"
|
2017-05-23 16:18:45 +03:00
|
|
|
- "chmod -R a-w ."
|
2018-11-15 05:25:25 +03:00
|
|
|
- "chmod -R u+w build config_1st config_2nd"
|
2017-05-23 15:42:40 +03:00
|
|
|
- "cd build"
|
2018-11-15 05:25:25 +03:00
|
|
|
- "ccache --show-stats"
|
|
|
|
- |-
|
|
|
|
case "$CC" in
|
|
|
|
gcc*) the_gcc=(ccache $CC ${GCC_FLAGS[@]} -fno-diagnostics-color) ;;
|
|
|
|
clang*) the_gcc=(ccache $CC ${GCC_FLAGS[@]} -fno-color-diagnostics) ;;
|
|
|
|
esac
|
2018-11-19 06:08:32 +03:00
|
|
|
- |-
|
2018-11-15 05:25:25 +03:00
|
|
|
$SETARCH ../configure -C --disable-install-doc --prefix=/tmp/ruby-prefix --with-gcc="${the_gcc[*]}" $CONFIG_FLAG "${CONFIG_FLAG_ARRAY[@]}"
|
2017-05-23 15:42:40 +03:00
|
|
|
- "cp -pr config.cache config.status .ext/include ../config_1st"
|
2018-10-19 10:26:48 +03:00
|
|
|
- "$SETARCH make reconfig"
|
2017-05-23 15:42:40 +03:00
|
|
|
- "cp -pr config.cache config.status .ext/include ../config_2nd"
|
|
|
|
- "(cd .. && exec diff -ru config_1st config_2nd)"
|
2018-11-15 10:37:05 +03:00
|
|
|
- |-
|
2018-11-15 05:25:25 +03:00
|
|
|
chmod u+w ..
|
|
|
|
rm -r ~/config_2nd
|
|
|
|
mv ../config_2nd ~
|
|
|
|
chmod u-w ..
|
2018-10-19 10:26:48 +03:00
|
|
|
- "$SETARCH make -s $JOBS && make install"
|
2018-11-15 05:25:25 +03:00
|
|
|
- "ccache --show-stats"
|
2016-09-28 04:49:16 +03:00
|
|
|
|
2013-04-18 17:55:45 +04:00
|
|
|
script:
|
2018-11-13 07:55:43 +03:00
|
|
|
- "$SETARCH make -s test TESTOPTS=\"${TESTOPTS=$JOBS -q --tty=no}\""
|
|
|
|
- "$SETARCH make -s test-all -o exts TESTOPTS=\"${TEST_ALL_OPTS=$TESTOPTS}\""
|
2018-11-12 11:18:35 +03:00
|
|
|
- "$SETARCH make -s test-spec MSPECOPT=-ff" # not using `-j` because sometimes `mspec -j` silently dies
|
2012-08-21 12:10:37 +04:00
|
|
|
|
|
|
|
# Branch matrix. Not all branches are Travis-ready so we limit branches here.
|
2013-04-18 22:04:11 +04:00
|
|
|
branches:
|
|
|
|
only:
|
|
|
|
- trunk
|
2015-12-24 21:37:43 +03:00
|
|
|
- ruby_2_3
|
2016-12-23 19:09:09 +03:00
|
|
|
- ruby_2_4
|
2017-12-25 10:56:46 +03:00
|
|
|
- ruby_2_5
|
2016-03-07 11:17:02 +03:00
|
|
|
- /^feature\//
|
|
|
|
- /^bug\//
|
2018-09-09 15:48:32 +03:00
|
|
|
- /^travis-/
|
2012-08-03 11:41:18 +04:00
|
|
|
|
2012-08-21 12:10:37 +04:00
|
|
|
# We want to be notified when something happens.
|
2013-04-18 22:04:11 +04:00
|
|
|
notifications:
|
|
|
|
irc:
|
|
|
|
channels:
|
2016-10-05 15:36:40 +03:00
|
|
|
- "chat.freenode.net#ruby-core"
|
|
|
|
- "chat.freenode.net#ruby-ja"
|
2013-04-18 22:04:11 +04:00
|
|
|
on_success: change # [always|never|change] # default: always
|
2016-01-12 20:10:27 +03:00
|
|
|
on_failure: always # [always|never|change] # default: always
|
2013-04-18 22:04:11 +04:00
|
|
|
template:
|
|
|
|
- "%{message} by @%{author}: See %{build_url}"
|
2012-08-21 12:10:37 +04:00
|
|
|
|
2017-07-27 14:56:54 +03:00
|
|
|
slack:
|
2018-01-05 09:18:57 +03:00
|
|
|
rooms:
|
2018-02-11 09:33:45 +03:00
|
|
|
- secure: i1GLETSKye85ea6dGNA3MxI/5myChmMFiZtBd5C69xK+s1sBFqEgOSbaSf9KHc0CYrHVyNhQMaZRruieV7xS+6Pfs0Zvxf1DO6QQTWC2KhkqwFDLvZncAzjoyASdR90hbr+iRPOngQ+HJuE94zemALAwEqNAinzA74PMiJXktqY= # ruby:<token>#commits
|
|
|
|
- secure: ah7UEHBvncXT7bM5mvYIQAO+tIyV/wl7nXLb7wQD16dO2v8Gragy0mWjB79Q09hrrMGmp6H9bCDpdGS80boIA5EHaHoG4QaP0i9bsSt8U2AMWgZtfyIgQKJ4H2kXkGlrjO+AXTgnIkP7LNjdgAVUUTGQPb26T3QmoN2Splt+fIQ= # ruby:<token>#alerts
|
2017-07-27 14:56:54 +03:00
|
|
|
on_pull_requests: false
|
|
|
|
on_success: change
|
|
|
|
on_failure: always
|
2015-03-20 11:43:23 +03:00
|
|
|
|
2017-08-02 05:19:04 +03:00
|
|
|
email:
|
|
|
|
- ko1c-failure@atdot.net
|
|
|
|
|
2012-08-21 12:10:37 +04:00
|
|
|
# Local Variables:
|
|
|
|
# mode: YAML
|
|
|
|
# coding: utf-8-unix
|
|
|
|
# indent-tabs-mode: nil
|
|
|
|
# tab-width: 4
|
|
|
|
# fill-column: 79
|
|
|
|
# default-justification: full
|
|
|
|
# End:
|