1
0
Fork 0
mirror of https://github.com/shlomif/PySolFC.git synced 2025-04-05 00:02:29 -04:00

Added an alternate toolkit kivy (based on SDL2) that can be used instead of tk.

Added scripts to build an android app.
This commit is contained in:
lb@lb520 2018-02-22 12:10:33 +01:00 committed by Shlomi Fish
parent 1dc5367d62
commit b5ef9b6214
323 changed files with 10875 additions and 63 deletions

View file

@ -4,7 +4,7 @@
## code
##
include pysol.py setup.py setup_osx.py setup.cfg MANIFEST.in Makefile
include COPYING README.md AUTHORS
include COPYING README.md AUTHORS README.android README.kivy
#recursive-include pysollib *.py
include pysollib/*.py pysollib/macosx/*.py pysollib/configobj/*.py
include pysollib/winsystems/*.py
@ -18,6 +18,9 @@ graft data/themes
recursive-exclude data/themes *.py
include scripts/build.bat scripts/create_iss.py scripts/mahjongg_utils.py
include scripts/pygettext.py scripts/all_games.py scripts/cardset_viewer.py
include android/*.py
include android/mk*
include android/debian/*
#graft data/plugins
##
## data - docs

View file

@ -5,7 +5,8 @@ override PYSOL_DEBUG=1
PYSOLLIB_FILES=pysollib/tk/*.py pysollib/tile/*.py pysollib/*.py \
pysollib/games/*.py pysollib/games/special/*.py \
pysollib/games/ultra/*.py pysollib/games/mahjongg/*.py
pysollib/games/ultra/*.py pysollib/games/mahjongg/*.py \
pysollib/kivy/*.py
.PHONY : all install dist all_games_html rules pot mo

89
README.android Normal file
View file

@ -0,0 +1,89 @@
Prerequisites (needs root):
On a 'freshly installed' Ubuntu 16.04 (32bit), the following
additional packages had to be installed:
- python-setuptools
- javasdk (ubuntu: default jdk)
- cython (ubuntu: cython)
- pip (ubuntu: python-pip)
- pexpect (ubuntu: python-pexpect)
- zlib headers (ubuntu: zlib1g-dev)
- virtualenv (python-virtualenv)
- zip,unzip
On a freshly installed debian stretch/xfce:
-> consult script files in directory android/debian.
On a 'simple' gentoo installation the following packages had to be
installed in addition:
- dev-python/pip
- dev-python/virtualenv
- dev-python/cython
- dev-media-libs/libsdl2
- dev-media-libs/sdl2-image
- dev-media-libs/sdl2-mixer
- dev-media-libs/sdl2-ttf
- dev-media-libs/gstreamer
- dev-vcs/git
- dev-java/ant
and python modules:
- python3 -m pip install requests --user.
- python3 -m pip install clint --user.
NOTES:
1) This information is supplied to give you a hint, when running into
problems.
2) All builds need an working (fairly fast) internet connection and
6 GB of free disk space.
Build with 'python-for-android' (as user):
go to the android directory, then
$ ./mkp4a.init [<sdkdir>] [<ndkdir>] # prepare sdk and p4a installation
$ ./mkkeystore # if you want to build a release version.
$ ./mkp4a.debug # build debug apk
$ ./mkp4a.release <passwd1> [<passwd2>] # build release apk
$ ./mkp4a.unsigned # build an unsigned release apk
The build system will download all required additional
packages (such as the android sdk and more). Do the first build will
take a while. All in all you will need up to 6 GB of free disk space.
If you have Android Studio installed, you may call mkp4a.init
with optional parameter <sdk-dir> and ev. in addition as
second parameter <ndk-dir> (if not default) to prevent them
from downloading a new. (Note that currently android ndk version
should be less 14, otherwise the build will fail).
Resulted apks will appear in directory android.
Cardsets:
Cardsets should be installed in ${HOME}/.PySolFC/cardsets/. On an
android device this is equivalent to /sdcard/.PySolFC/cardsets/.
Cardsets must use the bmp image format. Use scripts/cardsetsgiftobmp
(on a linux system) to convert them, before copying to the device.
Possible known build issues:
2) for android ndk: needs a Version <=13 (because needs ant support).
3) python-for-android, on downloading recipes:
('CA CERTIFICATE VALIDATION FAILED' when downloading python.2.7 or
some 'recipes')
Solution:
Try the download address with firefox. if it works, view the
site certificate and download (export) it from the browser.
Copy the resulting *.crt to /usr/local/ca-certificates and
run update-ca-certificates.

48
README.kivy Normal file
View file

@ -0,0 +1,48 @@
Introduction
------------
This is a (inofficial) Fork of the PysolFC-2.0 open source project
(http://pysolfc.sourceforge.net)
Early investigations of the code showed, that it would not be
a too big effort to replace or add a new user interface (UI).
The new UI using kivy has been designed to meet requirments
of tablet and smartphone devices. Most of the functionality
of the original version has been maintained
The new UI is selected via a new commandline option '--kivy'.
Original user interfaces will continue to work. To run the
kivy version call:
$ python pysol.py --kivy
Images
------
Original images supplied by the collection are of type
gif. In kivy that image type loads very slow. Also many
cards cannot be loaded, because of decoding errors.
To prevent from these problems, the kivy version was
modified to not read any gif images.
Some cardsets have been translated to png, a format
that is processed by both the tcl and the kivy version.
Some others, for which transparency information is not
processed correctly even from png images, have been translated
to the bmp image format (while keeping their gif variant for
the tcl version). bmp format is only processed by the
kivy version.
Additional cardsets are available from the SourceForge
project. To use them with kivy, they need to be converted to
bmp format. A shell script 'cardsetsgiftobmp' has been added
to the scripts directory (needs bash and ImageMagick).
For all gif-images in directories data/images and data/tiles
a duplicate image in png format has been added too.
LB170321.

View file

@ -44,6 +44,19 @@ $ python pysol.py
After following steps similar to these (on
[Mageia Linux](http://www.mageia.org/) ):
## Alternate toolkit.
- Python2 (2.7 or later)
- Kivy (10.0 or later)
- Features:
- Sound support integrated.
- Android apk build support.
- Running from source without installation:
$ python2 pysol.py --kivy
#### Step 1 - install the dependencies
On Mageia you can do:

19
android/debian/README Normal file
View file

@ -0,0 +1,19 @@
Actions to take upon a freshly installed Debian stretch/xfce (virtualbox).
Do something like:
user$ su
- enter root password.
root$ ./apt-install.sh
- .... some output.
root$ exit
user$ ./pip-install.sh
- .....some output.
Now all required packages are installed to proceed with the
android build.
LB170709.

12
android/debian/apt-installs.sh Executable file
View file

@ -0,0 +1,12 @@
#!/bin/bash
# als root ausführen!
apt-get install -y mercurial git default-jdk
apt-get install -y cython cython3
apt-get install -y python3-pip
apt-get install -y python3-yaml
apt-get install -y virtualenv
apt-get install -y pkg-config
apt-get install -y automake autoconf libtool
apt-get install -y zlib1g-dev
apt-get install -y libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev

8
android/debian/pip-installs.sh Executable file
View file

@ -0,0 +1,8 @@
#!/bin/bash
# als user installieren !
python3 -m pip install --user pyasn1
python3 -m pip install --user pyasn1_modules
python3 -m pip install --user requests
python3 -m pip install --user clint

240
android/initsdk.py Executable file
View file

@ -0,0 +1,240 @@
#! /usr/bin/env python3
# -*- coding: iso-8859-1 -*-
import sys
import os
import requests
import logging
import hashlib
import glob
from zipfile import ZipFile, ZipInfo
from clint.textui import progress
cachefiles = [
('https://dl.google.com/android/repository/platform-tools-latest-linux.zip',
'',
'platform-tools'),
('https://dl.google.com/android/repository/tools_r25.2.5-linux.zip',
'577516819c8b5fae680f049d39014ff1ba4af870b687cab10595783e6f22d33e',
'tools'),
('https://dl.google.com/android/repository/android-19_r04.zip',
'5efc3a3a682c1d49128daddb6716c433edf16e63349f32959b6207524ac04039',
'platform'),
('https://dl.google.com/android/repository/build-tools_r26-linux.zip',
'7422682f92fb471d4aad4c053c9982a9a623377f9d5e4de7a73cd44ebf2f3c61',
'build-tools'),
('https://dl.google.com/'
'android/repository/android-ndk-r12b-linux-x86_64.zip',
'eafae2d614e5475a3bcfd7c5f201db5b963cc1290ee3e8ae791ff0c66757781e',
'ndk'),
]
# https://stackoverflow.com/questions/39296101:
class MyZipFile(ZipFile):
def extract(self, member, path=None, pwd=None):
if not isinstance(member, ZipInfo):
member = self.getinfo(member)
if path is None:
path = os.getcwd()
ret_val = self._extract_member(member, path, pwd)
attr = member.external_attr >> 16
os.chmod(ret_val, attr)
return ret_val
# Reused from fdroidserver:
def sha256_for_file(path):
with open(path, 'rb') as f:
s = hashlib.sha256()
while True:
data = f.read(4096)
if not data:
break
s.update(data)
return s.hexdigest()
# Adapted from fdroidserver:
def update_cache(cachedir, cachefiles):
for srcurl, shasum, typ in cachefiles:
filename = os.path.basename(srcurl)
local_filename = os.path.join(cachedir, filename)
if os.path.exists(local_filename):
local_length = os.path.getsize(local_filename)
else:
local_length = -1
if (typ == 'ndk') and (ndkloc is not None):
continue
elif (typ != 'tools') and (sdkloc is not None):
continue
resume_header = {}
download = True
try:
r = requests.head(srcurl, allow_redirects=True, timeout=60)
if r.status_code == 200:
content_length = int(r.headers.get('content-length'))
else:
content_length = local_length # skip the download
except requests.exceptions.RequestException as e:
content_length = local_length # skip the download
logger.warn('%s', e)
if local_length == content_length:
download = False
elif local_length > content_length:
logger.info('deleting corrupt file from cache: %s',
local_filename)
os.remove(local_filename)
logger.info("Downloading %s to cache", filename)
elif local_length > -1 and local_length < content_length:
logger.info("Resuming download of %s", local_filename)
resume_header = {
'Range': 'bytes=%d-%d' % (local_length, content_length)}
else:
logger.info("Downloading %s to cache", filename)
if download:
r = requests.get(srcurl, headers=resume_header,
stream=True, verify=False, allow_redirects=True)
content_length = int(r.headers.get('content-length'))
with open(local_filename, 'ab') as f:
for chunk in progress.bar(
r.iter_content(chunk_size=65536),
expected_size=(content_length / 65536) + 1):
if chunk: # filter out keep-alive new chunks
f.write(chunk)
if not shasum == '':
v = sha256_for_file(local_filename)
if v == shasum:
logger.info("Shasum verified for %s", local_filename)
else:
logger.critical(
"Invalid shasum of '%s' detected for %s", v, local_filename)
os.remove(local_filename)
sys.exit(1)
# Build the sdk from zips.
def build_sdk(sdkdir, cachedir, cachfiles):
for srcurl, shasum, typ in cachefiles:
filename = os.path.basename(srcurl)
local_filename = os.path.join(cachedir, filename)
if typ == 'tools':
if os.path.exists(local_filename):
print('Extract: %s' % local_filename)
zf = MyZipFile(local_filename)
zf.extractall(sdkdir)
elif typ == 'platform-tools':
if (sdkloc is None) and (os.path.exists(local_filename)):
print('Extract: %s' % local_filename)
zf = MyZipFile(local_filename)
zf.extractall(sdkdir)
else:
print('Link to: %s' % sdkloc)
os.symlink(sdkloc + '/platform-tools',
sdkdir + '/platform-tools')
elif typ == 'platform':
if (sdkloc is None) and (os.path.exists(local_filename)):
print('Extract: %s' % local_filename)
zf = MyZipFile(local_filename)
zf.extractall(sdkdir + '/platforms')
else:
print('Link to: %s' % sdkloc)
os.symlink(sdkloc + '/platforms', sdkdir + '/platforms')
elif typ == 'build-tools':
if (sdkloc is None) and (os.path.exists(local_filename)):
print('Extract: %s' % local_filename)
zf = MyZipFile(local_filename)
zf.extractall(sdkdir + '/build-tools')
else:
print('Link to: %s' % sdkloc)
os.symlink(sdkloc + '/build-tools', sdkdir + '/build-tools')
elif typ == 'ndk':
if ndkloc is None:
print('Extract: %s' % local_filename)
zf = MyZipFile(local_filename)
zf.extractall(sdkdir)
lst = glob.glob(sdkdir + '/*-ndk-*')
print(lst)
os.rename(lst[0], sdkdir + '/ndk-bundle')
else:
print('Link to: %s' % ndkloc)
os.symlink(ndkloc, sdkdir + '/ndk-bundle')
logger = logging.getLogger('prepare-fdroid-build')
logging.basicConfig(format='%(message)s', level=logging.INFO)
logger.setLevel(logging.INFO)
# command line arguments
sdkloc = None
ndkloc = None
if len(sys.argv) > 1:
sdkloc = sys.argv[1]
if (len(sdkloc) > 0) and (sdkloc[-1] == '/'):
sdkloc = sdkloc[:-1]
if not os.path.isdir(sdkloc):
sdkloc = None
if len(sys.argv) > 2:
ndkloc = sys.argv[2]
if (len(ndkloc) > 0) and (ndkloc[-1] == '/'):
ndkloc = ndkloc[:-1]
if not os.path.isdir(ndkloc):
ndkloc = None
fdroidmode = None
if len(sys.argv) > 3:
fdroidmode = sys.argv[3]
if (len(fdroidmode) > 0):
fdroidmode = '1'
if sdkloc == "":
sdkloc = None
if ndkloc == "":
ndkloc = None
logger.info('sdkloc = %s' % sdkloc)
logger.info('ndkloc = %s' % ndkloc)
# sdkloc and ndkloc already set by the user and fdroidmode:
# nothing to do.
if (sdkloc is not None) and (ndkloc is not None) and (fdroidmode is not None):
sys.exit(0)
# cache dir (using the same as in fdroidserver/buildserver)
cachedir = os.path.join(os.getenv('HOME'), '.cache', 'fdroidserver')
logger.info('cachedir name is: %s', cachedir)
if not os.path.exists(cachedir):
os.makedirs(cachedir, 0o755)
logger.info('created cachedir %s', cachedir)
# sdkdir location
sdkdir = os.path.join(os.getenv('HOME'), '.cache', 'sdk-for-p4a')
logger.info('sdkdir name is: %s', sdkdir)
if not os.path.exists(sdkdir):
os.makedirs(sdkdir, 0o755)
logger.debug('created sdkdir %s', sdkdir)
update_cache(cachedir, cachefiles)
build_sdk(sdkdir, cachedir, cachefiles)
else:
logger.info('sdkdir %s already exists', sdkdir)

37
android/main.py Executable file
View file

@ -0,0 +1,37 @@
#!/usr/bin/env python2.7
# ---------------------------------------------------------------------------
#
# PySol -- a Python Solitaire game
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; see the file COPYING.
# If not, write to the Free Software Foundation, Inc.,
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# ---------------------------------------------------------------------------
# Starter for kivy/android using buildozer: Needs an explizitly
# named main.py as startpoint.
import sys
if '--kivy' not in sys.argv:
sys.argv.append('--kivy')
runmain = True
if runmain:
from pysollib.init import init
init()
if runmain:
from pysollib.main import main
sys.exit(main(sys.argv))

17
android/mkkeystore Executable file
View file

@ -0,0 +1,17 @@
#!/bin/bash
# memo:
# keytool -genkey -v -keystore my-release-keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 12000
if [ ! -d bin ]
then
echo "mkdir bin"
mkdir bin
fi
if [ -f ./bin/keystore ]
then
echo "keystore is already defined"
else
keytool -genkey -v -keystore ./bin/keystore -alias python -keyalg RSA -keysize 2048 -validity 12000
fi

6
android/mkp4a.clean Executable file
View file

@ -0,0 +1,6 @@
#!/bin/bash
rm -rf tmp/*
python3 -m pythonforandroid.toolchain clean_dists
python3 -m pythonforandroid.toolchain clean_builds
rm -f *.apk

9
android/mkp4a.cleanall Executable file
View file

@ -0,0 +1,9 @@
#!/bin/bash
rm -rf tmp/*
rm -f *.apk
rm -rf ~/.local/share/python-for-android/packages
rm -rf ~/.local/share/python-for-android/build
rm -rf ~/.local/share/python-for-android/dists
python3 -m pip uninstall python-for-android -y
exit 0

23
android/mkp4a.debug Executable file
View file

@ -0,0 +1,23 @@
#!/bin/bash
version=`./version.py`
python3 -m pythonforandroid.toolchain apk \
--sdk-dir ${HOME}/.cache/sdk-for-p4a \
--ndk-dir ${HOME}/.cache/sdk-for-p4a/ndk-bundle \
--android-api 19 \
--ndk-version r12b \
--arch armeabi-v7a \
--dist-name pysolfc \
--name pysolfc \
--bootstrap=sdl2 \
--requirements kivy,hostpython2,random2 \
--minsdk 14 \
--private tmp/src \
--package org.lufebe16.gh.pysolfc \
--version ${version} \
--orientation sensor \
--color=always \
--icon tmp/src/data/images/misc/pysol01.png \
--presplash tmp/src/data/images/misc/pysol06.png \
--copy-libs

44
android/mkp4a.init Executable file
View file

@ -0,0 +1,44 @@
#!/bin/bash
echo '### prepare sdk'
./initsdk.py $1 $2 $3
echo '### install p4a'
#p4aversion='0.5.3p'
# Downloded file "https://github.com/kivy/python-for-android/archive/0.5.3.zip"
# Note: Minor fixes had to be added to version 0.5.3 in order to
# cooperate with fdroid.
#python3 -m pip install -q --user "./p4a/${p4aversion}.zip"
p4aversion='0.5.3'
python3 -m pip install -q --user "https://github.com/kivy/python-for-android/archive/${p4aversion}.zip"
echo '### prepare recipes'
if [ -d ./packages ]
then
echo '### copying recipes'
mkdir -p ${HOME}/.local/share/python-for-android
cp -a packages ${HOME}/.local/share/python-for-android/
fi
echo '### prepare source'
mkdir -p tmp
rm -rf tmp/src
# Easiest variant. But rsync may not be installed.
# rsync -a .. tmp/src --exclude android/tmp
# so:
mkdir -p ${HOME}/.local/tmp/src
cp -a .. ${HOME}/.local/tmp/src
mv ${HOME}/.local/tmp/src tmp/src
rm -rf tmp/src/android
rm -rf tmp/src/src
cp -a main.py tmp/src/main.py
echo '### end init'

63
android/mkp4a.release Executable file
View file

@ -0,0 +1,63 @@
#!/bin/bash
pass1=""
pass2=""
keyalias="python"
keystore="${PWD}/bin/keystore"
if [ $1 ]
then
pass1=$1
pass2=$1
else
echo "usage: ./mkp4a.release <keystore-password> [<keyalias-password>] [<keyalias>] [<keystore-path>]"
echo " (use ./mkkeystore to create one in default location)"
exit
fi
if [ $2 ]
then
pass2=$2
fi
if [ $3 ]
then
keyalias=$3
fi
if [ $4 ]
then
keystore=$4
fi
export P4A_RELEASE_KEYSTORE="$keystore"
export P4A_RELEASE_KEYSTORE_PASSWD="$pass1"
export P4A_RELEASE_KEYALIAS_PASSWD="$pass2"
export P4A_RELEASE_KEYALIAS="$keyalias"
version=`./version.py`
python3 -m pythonforandroid.toolchain apk \
--sdk-dir ${HOME}/.cache/sdk-for-p4a \
--ndk-dir ${HOME}/.cache/sdk-for-p4a/ndk-bundle \
--android-api 19 \
--ndk-version r12b \
--arch armeabi-v7a \
--dist-name pysolfc \
--name pysolfc \
--bootstrap=sdl2 \
--requirements kivy,hostpython2,random2 \
--release \
--sign \
--minsdk 14 \
--private tmp/src \
--package org.lufebe16.gh.pysolfc \
--version ${version} \
--orientation sensor \
--color=always \
--icon tmp/src/data/images/misc/pysol01.png \
--presplash tmp/src/data/images/misc/pysol06.png \
--copy-libs
# keystore options (instead environment vars):
#
# keystore: --keystore <file>
# key alias --signkey <keyalias>
# keystore passwd --keystorepw <pass1>
# key passwd --signkeypw <pass2>

56
android/mkp4a.unsigned Executable file
View file

@ -0,0 +1,56 @@
#!/bin/bash
echo '### p4a started'
# sdk-dir and nkd-dir from command line (fdroid mode)
sdkdir="${HOME}/.cache/sdk-for-p4a"
ndkdir="${HOME}/.cache/sdk-for-p4a/ndk-bundle"
if [ $1 ]
then
echo "set sdk to: $1"
sdkdir="$1"
fi
if [ $2 ]
then
echo "set ndk to: $2"
ndkdir="$2"
fi
echo '### run toolchain'
version=`./version.py`
python3 -m pythonforandroid.toolchain apk \
--sdk-dir ${sdkdir} \
--ndk-dir ${ndkdir} \
--android-api 19 \
--ndk-version r12b \
--arch armeabi-v7a \
--dist-name pysolfc \
--name pysolfc \
--bootstrap=sdl2 \
--requirements kivy,hostpython2,random2 \
--release \
--minsdk 14 \
--private tmp/src \
--package org.lufebe16.gh.pysolfc \
--version ${version} \
--orientation sensor \
--color=always \
--icon tmp/src/data/images/misc/pysol01.png \
--presplash tmp/src/data/images/misc/pysol06.png \
--copy-libs
# python3 -m pythonforandroid.toolchain apk
# ...
# --release #1
# --sign #2
# ...
#
# ad 1,2:
# ohne: -> debug version
# 1: -> release unsigned
# 1 und 2: -> release version.
echo '### p4a finished'

BIN
android/p4a/0.5.3p.zip Normal file

Binary file not shown.

33
android/version.py Executable file
View file

@ -0,0 +1,33 @@
#!/usr/bin/env python3
# ---------------------------------------------------------------------------
#
# PySol -- a Python Solitaire game
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; see the file COPYING.
# If not, write to the Free Software Foundation, Inc.,
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# ---------------------------------------------------------------------------
# import pychecker.checker
# Starter for kivy/android using buildozer: Needs an explizitly
# named main.py as startpoint.
if True:
import sys
sys.path.insert(0, '..')
if True:
from pysollib.settings import VERSION
print(VERSION)

Binary file not shown.

After

Width:  |  Height:  |  Size: 676 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 460 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 634 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 417 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 413 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 430 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 429 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 435 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 416 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 435 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 438 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 433 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 413 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 428 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 435 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 425 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 409 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 430 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 433 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 431 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 413 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 434 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 428 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 413 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 426 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 433 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 423 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 410 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 428 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 432 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 428 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 404 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 420 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 428 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 431 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 411 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 431 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 434 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 432 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 404 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 422 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 438 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 413 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 395 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 414 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 419 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 430 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 409 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 428 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 440 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 425 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 402 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 425 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 431 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 356 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 359 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 359 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 358 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 363 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 358 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 355 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 360 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 367 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 351 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 353 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 358 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 352 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 356 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 351 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 356 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 357 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 357 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 359 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 356 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 355 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 360 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 357 B

Some files were not shown because too many files have changed in this diff Show more