|
|
4c79b5 |
#!/bin/bash
|
|
|
4c79b5 |
#
|
|
|
4c79b5 |
# render_getIdentityDefs.sh -- This function provides shared variables
|
|
|
15b1d2 |
# re-definition for all rendition actions inside centos-art.sh script.
|
|
|
4c79b5 |
#
|
|
|
9f5f2e |
# Copyright (C) 2009-2011 Alain Reguera Delgado
|
|
|
4c79b5 |
#
|
|
|
7cd8e9 |
# This program is free software; you can redistribute it and/or
|
|
|
7cd8e9 |
# modify it under the terms of the GNU General Public License as
|
|
|
7cd8e9 |
# published by the Free Software Foundation; either version 2 of the
|
|
|
7cd8e9 |
# License, or (at your option) any later version.
|
|
|
4c79b5 |
#
|
|
|
4c79b5 |
# This program is distributed in the hope that it will be useful, but
|
|
|
4c79b5 |
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
4c79b5 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
4c79b5 |
# General Public License for more details.
|
|
|
4c79b5 |
#
|
|
|
4c79b5 |
# You should have received a copy of the GNU General Public License
|
|
|
4c79b5 |
# along with this program; if not, write to the Free Software
|
|
|
4c79b5 |
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
|
|
4c79b5 |
# USA.
|
|
|
4c79b5 |
#
|
|
|
4c79b5 |
# ----------------------------------------------------------------------
|
|
|
418249 |
# $Id$
|
|
|
4c79b5 |
# ----------------------------------------------------------------------
|
|
|
4c79b5 |
|
|
|
4c79b5 |
function render_getIdentityDefs {
|
|
|
4c79b5 |
|
|
|
4c79b5 |
# Define the translation file absolute path. Only if we have a
|
|
|
ecc4c5 |
# .png.sh extension at file's end we can consider that file as a
|
|
|
4c79b5 |
# translation file. Otherwise there is not translation file.
|
|
|
9b4d7d |
if [[ ${FILE} =~ "\.${EXTENSION}$" ]];then
|
|
|
9b4d7d |
TRANSLATION=${FILE}
|
|
|
4c79b5 |
else
|
|
|
4c79b5 |
TRANSLATION=`gettext "None"`
|
|
|
4c79b5 |
fi
|
|
|
4c79b5 |
|
|
|
07c2fe |
# Check translation file existence. This may seem unnecessary
|
|
|
4c79b5 |
# because we already built the file list using existent files.
|
|
|
07c2fe |
# But what happen if any of the files already loaded are removed
|
|
|
07c2fe |
# after being loaded? well, just skip it.
|
|
|
9b4d7d |
if [[ "$TRANSLATION" == `gettext "None"` ]];then
|
|
|
4c79b5 |
cli_printMessage "`gettext "None"`" "AsTranslationLine"
|
|
|
4c79b5 |
else
|
|
|
b76c02 |
cli_checkFiles "$TRANSLATION" 'fh'
|
|
|
5187da |
cli_printMessage "$TRANSLATION" 'AsTranslationLine'
|
|
|
4c79b5 |
fi
|
|
|
4c79b5 |
|
|
|
4c79b5 |
# Define the design template absolute path. This definition is
|
|
|
4c79b5 |
# done by interpreting the matching list and translation path
|
|
|
4c79b5 |
# information. This defintion needs to be coherent with those
|
|
|
8219f0 |
# defined in render_getFilesList function.
|
|
|
4c79b5 |
if [[ "${MATCHINGLIST}" != "" ]] \
|
|
|
4c79b5 |
&& [[ "${TRANSLATIONPATH}" == "" ]];then
|
|
|
4c79b5 |
|
|
|
4c79b5 |
# Remove the template (`Tpl/') string from FILE for those
|
|
|
15b1d2 |
# images based on design templates. This avoids the creation
|
|
|
15b1d2 |
# of an extra `Tpl' directory under Img. We want to save
|
|
|
15b1d2 |
# primary PNG file structure directly under Img/ not Img/Tpl/.
|
|
|
9b4d7d |
FILE=$(echo ${FILE} | sed -r "s!^${SVG}/!!")
|
|
|
4c79b5 |
|
|
|
4c79b5 |
# In this case just one primary image is rendered.
|
|
|
4c79b5 |
# Template points to the value passed in the template
|
|
|
4c79b5 |
# argument.
|
|
|
4c79b5 |
TEMPLATE=${MATCHINGLIST}
|
|
|
4c79b5 |
|
|
|
4c79b5 |
elif [[ "${MATCHINGLIST}" == "" ]] \
|
|
|
4c79b5 |
&& [[ "${TRANSLATIONPATH}" == "" ]];then
|
|
|
4c79b5 |
|
|
|
4c79b5 |
# Remove the template (`Tpl/') string from FILE for those
|
|
|
15b1d2 |
# images based on design templates. This avoids the creation
|
|
|
15b1d2 |
# of an extra `Tpl' directory under Img. We want to save
|
|
|
15b1d2 |
# primary PNG file structure directly under Img/ not Img/Tpl/.
|
|
|
9b4d7d |
FILE=$(echo ${FILE} | sed -r "s!^${SVG}/!!")
|
|
|
4c79b5 |
|
|
|
4c79b5 |
# In this case one primary image is rendered for each
|
|
|
4c79b5 |
# design template. Template absolute path points to a
|
|
|
4c79b5 |
# design template (see LOCATION's definition).
|
|
|
9b4d7d |
TEMPLATE=${FILE}
|
|
|
4c79b5 |
|
|
|
4c79b5 |
elif [[ "${MATCHINGLIST}" == "" ]] \
|
|
|
4c79b5 |
&& [[ "${TRANSLATIONPATH}" != "" ]];then
|
|
|
4c79b5 |
|
|
|
4c79b5 |
# In this case translation files are applied to design
|
|
|
4c79b5 |
# templates with the same name (without extension). One
|
|
|
4c79b5 |
# primary image is rendered for each translation file
|
|
|
ecc4c5 |
# matching. Template and translation files use the same path
|
|
|
ecc4c5 |
# and name relative to their PARENTDIR. Translations use
|
|
|
ecc4c5 |
# .png.sh extension and templates .svg extension.
|
|
|
9b4d7d |
TEMPLATE=$(echo ${FILE} | sed -r "s!.*/${PARENTDIR}/(.*)!\1!" \
|
|
|
9b4d7d |
| sed -r "s/\.${EXTENSION}$/.svg/")
|
|
|
4c79b5 |
|
|
|
4c79b5 |
elif [[ "${MATCHINGLIST}" != "" ]] \
|
|
|
4c79b5 |
&& [[ "${TRANSLATIONPATH}" != "" ]];then
|
|
|
9b4d7d |
|
|
|
4c79b5 |
# Create a template and translation matching list. With this
|
|
|
15b1d2 |
# configuration we can optimize the rendition process for
|
|
|
4c79b5 |
# artworks like Anaconda progress slides and installation
|
|
|
4c79b5 |
# media, where many translation files apply one unique design
|
|
|
4c79b5 |
# template file.
|
|
|
4c79b5 |
#
|
|
|
4c79b5 |
# Previous to this feature, there was one (repeated) design
|
|
|
4c79b5 |
# template for each design holding the same design in all
|
|
|
4c79b5 |
# cases, basically a raw copy. This structure is very hard to
|
|
|
4c79b5 |
# maintain so it was reduced and optimized as we described
|
|
|
4c79b5 |
# above.
|
|
|
4c79b5 |
#
|
|
|
4c79b5 |
# The idea is to create a link and customizable relation
|
|
|
4c79b5 |
# between translation files and design template files in
|
|
|
15b1d2 |
# pre-rendition configuration scripts and then interpret it
|
|
|
4c79b5 |
# here.
|
|
|
4c79b5 |
#
|
|
|
4c79b5 |
# This way we pretend to eliminate duplicated design templates
|
|
|
ecc4c5 |
# saying something like translation 1.png.sh, 2.png.sh,
|
|
|
ecc4c5 |
# 3.png.sh, 4.png.sh, and 5.png.sh apply to the single design
|
|
|
ecc4c5 |
# template A.svg. Or, 1.png.sh, 3.png.sh, 4.png.sh to A.svg
|
|
|
ecc4c5 |
# and 2.png.sh and 5.png.sh to B.svg.
|
|
|
4c79b5 |
#
|
|
|
4c79b5 |
# Possible configuration 1: In this first case,
|
|
|
4c79b5 |
# translation files and design templates share a common
|
|
|
4c79b5 |
# portion of the path. Sometimes, we call this common
|
|
|
4c79b5 |
# portion of path the ``bond path''. This configuration is
|
|
|
4c79b5 |
# strictly used under the following situations:
|
|
|
4c79b5 |
#
|
|
|
4c79b5 |
# 1. There are too many translation files to apply to a
|
|
|
4c79b5 |
# single design template. This is the case of Brands
|
|
|
15b1d2 |
# artworks (see: trunk/Identity/Brands) rendition, where it
|
|
|
15b1d2 |
# is very difficult to maintain the relation list of design
|
|
|
15b1d2 |
# templates and translation files. E.g.:
|
|
|
4c79b5 |
#
|
|
|
4c79b5 |
# bond/path/template.svg: \
|
|
|
ecc4c5 |
# bond/path/translation1.png.sh \
|
|
|
ecc4c5 |
# bond/path/translation2.png.sh
|
|
|
4c79b5 |
#
|
|
|
4c79b5 |
# 2. Translation files are under a directory with the same
|
|
|
4c79b5 |
# name of that used in the design template. All translation
|
|
|
4c79b5 |
# files inside this directory will be applied to the single
|
|
|
4c79b5 |
# design template that has the same name of the directory
|
|
|
4c79b5 |
# containing the translation files. E.g.:
|
|
|
4c79b5 |
#
|
|
|
4c79b5 |
# bond/path/green.svg: \
|
|
|
ecc4c5 |
# bond/path/green/translation1.png.sh \
|
|
|
ecc4c5 |
# bond/path/green/translation2.png.sh
|
|
|
4c79b5 |
#
|
|
|
9b4d7d |
BOND=$(echo $TRANSLATION \
|
|
|
9b4d7d |
| sed -r "s/^.*\/$PARENTDIR\/(.+)\/.*\.${EXTENSION}$/\1/")
|
|
|
4c79b5 |
|
|
|
4c79b5 |
# If there is no template at this point, start reducing the
|
|
|
4c79b5 |
# bond path and try to use the result as template. This is
|
|
|
4c79b5 |
# needed in those cases where you have a directory structure
|
|
|
4c79b5 |
# with various levels of translations inside it and want to
|
|
|
4c79b5 |
# apply the last available design template that match to all
|
|
|
4c79b5 |
# translation files in the directory structure.
|
|
|
4c79b5 |
if [[ ! -f "$SVG/${BOND}.svg" ]];then
|
|
|
4c79b5 |
until [[ -f "$SVG/${BOND}.svg" ]] ;do
|
|
|
4c79b5 |
[[ $BOND =~ '^(\.|/)$' ]] && break
|
|
|
4c79b5 |
BOND=$(dirname $BOND)
|
|
|
4c79b5 |
done
|
|
|
4c79b5 |
fi
|
|
|
4c79b5 |
|
|
|
4c79b5 |
# Possible configuration 2: If no template is found using the
|
|
|
4c79b5 |
# previous bond paths reduction, then lets look using design
|
|
|
4c79b5 |
# template and translation file base name bond only. Use this
|
|
|
4c79b5 |
# configuration as much as possible. Note that it is much
|
|
|
4c79b5 |
# more flexible than possible configuration 1.
|
|
|
4c79b5 |
#
|
|
|
15b1d2 |
# In this configuration, the pre-rendition configuration takes
|
|
|
4c79b5 |
# the following form:
|
|
|
4c79b5 |
#
|
|
|
4c79b5 |
# template.svg: \
|
|
|
ecc4c5 |
# translation1.png.sh \
|
|
|
ecc4c5 |
# translation2.png.sh
|
|
|
4c79b5 |
#
|
|
|
4c79b5 |
if [[ ! -f "$SVG/${BOND}.svg" ]];then
|
|
|
4c79b5 |
BOND=$(basename $TRANSLATION)
|
|
|
4c79b5 |
fi
|
|
|
4c79b5 |
|
|
|
4c79b5 |
# Possible configuration 2.1: If not design template was found
|
|
|
4c79b5 |
# with the .svg extension, lets try design template without
|
|
|
15b1d2 |
# extension. This configuration is useful to render plain text
|
|
|
15b1d2 |
# files that doesn't use an extension (e.g., see inside
|
|
|
07c2fe |
# `trunk/Identity/Release' directory structure).
|
|
|
4c79b5 |
#
|
|
|
4c79b5 |
# template: \
|
|
|
ecc4c5 |
# translation1.png.sh \
|
|
|
ecc4c5 |
# translation2.png.sh
|
|
|
4c79b5 |
#
|
|
|
4c79b5 |
if [[ ! -f "$SVG/${BOND}.svg" ]] \
|
|
|
4c79b5 |
&& [[ ! -f $SVG/{$BOND} ]];then
|
|
|
4c79b5 |
BOND=$(basename $TRANSLATION)
|
|
|
4c79b5 |
fi
|
|
|
4c79b5 |
|
|
|
4c79b5 |
# Define design template applying bond filtering.
|
|
|
4c79b5 |
TEMPLATE=$(echo "${MATCHINGLIST}" \
|
|
|
4c79b5 |
| egrep "$BOND" \
|
|
|
4c79b5 |
| cut -d: -f1 \
|
|
|
4c79b5 |
| sort )
|
|
|
4c79b5 |
|
|
|
4c79b5 |
# Sometimes one BOND pattern can match more than one design
|
|
|
4c79b5 |
# template (i.e. 2c-tm pattern match in: 2c-tm, 2c-tmd,
|
|
|
4c79b5 |
# 2c-tmdr). It makes no sence to apply one translation file
|
|
|
4c79b5 |
# to many differnt design templates at the same time. This
|
|
|
4c79b5 |
# way we need to reduce the design templates found to just
|
|
|
4c79b5 |
# one, the one matching the BOND translation path exactly,
|
|
|
ecc4c5 |
# without .png.sh extension.
|
|
|
4c79b5 |
if [[ $(echo "$TEMPLATE" | wc -l ) -gt 1 ]];then
|
|
|
4c79b5 |
|
|
|
ecc4c5 |
# Remove `.png.sh' extension from BOND. This is required
|
|
|
ecc4c5 |
# in order to build the BOND design template correctly.
|
|
|
9b4d7d |
BOND=$(echo $BOND | sed -r "s/\.${EXTENSION}$//")
|
|
|
4c79b5 |
|
|
|
4c79b5 |
# Reduce template designs found to match BOND design
|
|
|
4c79b5 |
# template. Take into account design templates extensions.
|
|
|
4c79b5 |
TEMPLATE=$(echo "$TEMPLATE" \
|
|
|
9b4d7d |
| egrep "${BOND}(\.${EXTENSION})?$")
|
|
|
4c79b5 |
|
|
|
4c79b5 |
fi
|
|
|
4c79b5 |
|
|
|
4c79b5 |
# Sometimes we need to apply all translation files to a single
|
|
|
4c79b5 |
# design template. At this point, if there is no design
|
|
|
4c79b5 |
# template available yet, look inside matching list and use
|
|
|
4c79b5 |
# its value as design template for all translation files.
|
|
|
4c79b5 |
if [[ "$TEMPLATE" == '' ]] \
|
|
|
4c79b5 |
&& [[ "$MATCHINGLIST" =~ '^[[:alnum:][:digit:][:punct:]]+(\.svg|\.html|\.htm)?$' ]];then
|
|
|
4c79b5 |
TEMPLATE="$MATCHINGLIST"
|
|
|
4c79b5 |
fi
|
|
|
4c79b5 |
|
|
|
4c79b5 |
# If there is no template found at this point, we need to
|
|
|
4c79b5 |
# prevent an empty template from being used. It is a missing
|
|
|
15b1d2 |
# assignment definition in the pre-rendition script surely.
|
|
|
4c79b5 |
if [[ "$TEMPLATE" == '' ]];then
|
|
|
9b4d7d |
cli_printMessage "`eval_gettext "There is no design template defined for \\\`\\\${FILE}'."`" 'AsErrorLine'
|
|
|
1f1b3c |
cli_printMessage "$(caller)" "AsToKnowMoreLine"
|
|
|
4c79b5 |
fi
|
|
|
4c79b5 |
|
|
|
4c79b5 |
fi
|
|
|
4c79b5 |
|
|
|
4c79b5 |
# Remove any release number from design template's path. Release
|
|
|
4c79b5 |
# directories are used under Translations structure only.
|
|
|
4c79b5 |
# Removing release numbers from design template path makes
|
|
|
4c79b5 |
# possible to match many release-specific translations to the same
|
|
|
4c79b5 |
# design template. There is no need to duplicate the release
|
|
|
4c79b5 |
# structure inside design template structure.
|
|
|
9b4d7d |
TEMPLATE=$(echo $TEMPLATE | sed -r "s!^$(cli_getPathComponent '--release-pattern')/!!")
|
|
|
4c79b5 |
|
|
|
4c79b5 |
# Remove any language from design template's path. Language
|
|
|
4c79b5 |
# code directories are used under Translation structure only.
|
|
|
4c79b5 |
# Removing language code directories from design template path
|
|
|
4c79b5 |
# makes possible to match many language translations to the
|
|
|
4c79b5 |
# same design templates. There is no need to duplicate
|
|
|
4c79b5 |
# language code directories inside design template structure.
|
|
|
4c79b5 |
if [[ $TEMPLATE =~ '^[[:alpha:]]{2}(_[[:alpha:]]{2}){,1}/' ]];then
|
|
|
4c79b5 |
|
|
|
4c79b5 |
# It seems like the first directory referes to a language
|
|
|
4c79b5 |
# code. At this point we check if that value is a valid
|
|
|
4c79b5 |
# language code.
|
|
|
4c79b5 |
if [[ "$(cli_getLangCodes $(echo $TEMPLATE | cut -d/ -f1))" != '' ]];then
|
|
|
4c79b5 |
|
|
|
4c79b5 |
# The value is a valid language code. Remove it from path
|
|
|
4c79b5 |
# so design template path can be built correctly.
|
|
|
4c79b5 |
TEMPLATE=$(echo $TEMPLATE | sed "s!$(echo $TEMPLATE | cut -d/ -f1)/!!")
|
|
|
4c79b5 |
|
|
|
4c79b5 |
fi
|
|
|
4c79b5 |
fi
|
|
|
9b4d7d |
|
|
|
07c2fe |
# Redefine design template using absolute path.
|
|
|
4c79b5 |
if [[ -f $SVG/$(basename $TEMPLATE) ]];then
|
|
|
4c79b5 |
# Generally, template files are stored one level inside
|
|
|
4c79b5 |
# Tpl/ directory.
|
|
|
4c79b5 |
TEMPLATE=$SVG/$(basename $TEMPLATE)
|
|
|
4c79b5 |
else
|
|
|
4c79b5 |
# Others, template designs may be stored some levels inside
|
|
|
4c79b5 |
# the template structure. At this point, we look deeper inside
|
|
|
4c79b5 |
# template's directory structure and redefine template path.
|
|
|
4c79b5 |
# Avoid using duplicated names inside template directory
|
|
|
4c79b5 |
# structure. If there are duplicate names, the first one in
|
|
|
4c79b5 |
# the list is used and the rest is discarded.
|
|
|
4c79b5 |
TEMPLATE=$(find $SVG -regextype posix-egrep -regex \
|
|
|
4c79b5 |
".*/${TEMPLATE}" | sort | head -n 1)
|
|
|
4c79b5 |
fi
|
|
|
9b4d7d |
|
|
|
e4d34a |
# Check existence of TEMPLATE file. If design template doesn't
|
|
|
e4d34a |
# exist we cannot render it; in such case, stop working for it and
|
|
|
e4d34a |
# try the next one in the list.
|
|
|
b76c02 |
cli_checkFiles "$TEMPLATE" 'f'
|
|
|
ecc4c5 |
cli_printMessage "$TEMPLATE" 'AsDesignLine'
|
|
|
4c79b5 |
|
|
|
4c79b5 |
# Get relative path to file. The path string (stored in FILE) has
|
|
|
4c79b5 |
# two parts: 1. the variable path and 2. the common path. The
|
|
|
4c79b5 |
# variable path is before the common point in the path string. The
|
|
|
4c79b5 |
# common path is after the common point in the path string. The
|
|
|
4c79b5 |
# common point is the name of the parent directory (stored in
|
|
|
4c79b5 |
# PARENTDIR).
|
|
|
4c79b5 |
#
|
|
|
ecc4c5 |
# trunk/Script/Bas.../Config/Firstboot/3/splash-small.png.sh
|
|
|
4c79b5 |
# -------------------------^| the |^------------^
|
|
|
4c79b5 |
# variable path | common | common path
|
|
|
4c79b5 |
# -------------------------v| point | v------------v
|
|
|
ecc4c5 |
# trunk/Identity/Themes/M.../Firstboot/Img/3/splash-small.png
|
|
|
4c79b5 |
#
|
|
|
4c79b5 |
# What we do here is remove the varibale path, the common point,
|
|
|
4c79b5 |
# and the file extension parts in the string holding the path
|
|
|
4c79b5 |
# retrived from translations structure. Then we use the common
|
|
|
4c79b5 |
# path as relative path to the image file.
|
|
|
4c79b5 |
#
|
|
|
9b4d7d |
# The `.sh' file extension is removed from the common path.
|
|
|
9b4d7d |
# Instead we use the previous extension, defined in the
|
|
|
9b4d7d |
# translation files, as file extension. For example, if the
|
|
|
9b4d7d |
# translation file is file.png.sh, the final file would be
|
|
|
9b4d7d |
# file.png. Likewise, if the translation file is file.txt.sh, the
|
|
|
9b4d7d |
# final file would be file.txt.
|
|
|
4c79b5 |
#
|
|
|
15b1d2 |
# When we render using renderImage function, the structure of
|
|
|
4c79b5 |
# files under Img/ directory will be the same of that used after
|
|
|
4c79b5 |
# the common point in its related Translations or Template
|
|
|
4c79b5 |
# directory depending in which one was taken as reference when
|
|
|
4c79b5 |
# LOCATION variable was defined.
|
|
|
9b4d7d |
FILE=$(echo ${FILE} \
|
|
|
4c79b5 |
| sed -r "s!.*${PARENTDIR}/!!" \
|
|
|
9b4d7d |
| sed -r "s/\.sh$//")
|
|
|
4c79b5 |
|
|
|
076a85 |
# Re-define directory absolute path of final output directory. As
|
|
|
076a85 |
# convenction, when we produce content in English language, we do
|
|
|
076a85 |
# not add a laguage directory to organize content. However, when
|
|
|
076a85 |
# we produce content in a language different from English we do
|
|
|
076a85 |
# use language-specific directory to organize content.
|
|
|
076a85 |
if [[ $(cli_getCurrentLocale) =~ '^en' ]];then
|
|
|
9b4d7d |
DIRNAME=$IMG/$(dirname ${FILE})
|
|
|
076a85 |
else
|
|
|
9b4d7d |
DIRNAME=$IMG/$(dirname ${FILE})/$(cli_getCurrentLocale)
|
|
|
076a85 |
fi
|
|
|
4c79b5 |
|
|
|
4c79b5 |
# Check existence of output image directory.
|
|
|
4c79b5 |
if [[ ! -d $DIRNAME ]];then
|
|
|
4c79b5 |
mkdir -p $DIRNAME
|
|
|
4c79b5 |
fi
|
|
|
076a85 |
|
|
|
4c79b5 |
# Define absolute path to file.
|
|
|
9b4d7d |
FILE=$(echo $DIRNAME/$(basename ${FILE}) | sed -r 's!/\./!/!')
|
|
|
4c79b5 |
|
|
|
4c79b5 |
# Define instance name.
|
|
|
93705a |
INSTANCE=$(cli_getTemporalFile $TEMPLATE)
|
|
|
4c79b5 |
|
|
|
4c79b5 |
# Remove template instance if it is already present.
|
|
|
4c79b5 |
if [[ -a $INSTANCE ]];then
|
|
|
4c79b5 |
rm $INSTANCE
|
|
|
4c79b5 |
fi
|
|
|
4c79b5 |
|
|
|
ecc4c5 |
# Create the design template instance.
|
|
|
ecc4c5 |
cat $TEMPLATE > $INSTANCE
|
|
|
076a85 |
|
|
|
ecc4c5 |
# Replace translation markers with appropriate information.
|
|
|
b46d06 |
render_doIdentityTMarkers
|
|
|
7ac81d |
|
|
|
4c79b5 |
}
|