TSG-23335 TFE适配AArch64架构

This commit is contained in:
luwenpeng
2024-11-13 15:08:03 +08:00
parent 595167dcf8
commit 2e69e0edd8
18 changed files with 191 additions and 93 deletions

View File

@@ -3,7 +3,8 @@ variables:
BUILD_PADDING_PREFIX: /tmp/padding_for_CPACK_RPM_BUILD_SOURCE_DIRS_PREFIX_PREFIX_PREFIX_PREFIX_PREFIX_PREFIX/
INSTALL_PREFIX: "/opt/tsg/tfe"
TESTING_VERSION_BUILD: 0
BUILD_IMAGE_CENTOS8: "git.mesalab.cn:7443/mesa_platform/build-env:rockylinux"
BUILD_IMAGE_X86_64_EL8: "git.mesalab.cn:7443/mesa_platform/build-env:rockylinux"
BUILD_IMAGE_AARCH64_EL9: "git.mesalab.cn:7443/mesa_platform/build-env:rocky9-aarch64"
stages:
- build
@@ -17,9 +18,112 @@ stages:
- yum makecache
- yum install -y elfutils-libelf-devel
.build_by_travis_for_centos8:
###############################################################################
# compile for el9
###############################################################################
.build_by_travis_for_aarch64_el9:
stage: build
image: $BUILD_IMAGE_CENTOS8
image: $BUILD_IMAGE_AARCH64_EL9
extends: .build_before_script
script:
- dnf install -y libmnl-devel
- dnf install -y libnfnetlink-devel
- dnf install -y clang
- dnf install -y llvm
- dnf install -y libbpf-devel
- dnf install -y liburing-devel
- ./ci/travis.sh
tags:
- tsg-os-builder-aarch64
branch_build_debug_for_aarch64_el9:
extends: .build_by_travis_for_aarch64_el9
variables:
BUILD_TYPE: Debug
except:
- /^develop-.*$/i
- /^release-.*$/i
- tags
branch_build_release_for_aarch64_el9:
variables:
BUILD_TYPE: RelWithDebInfo
extends: .build_by_travis_for_aarch64_el9
except:
- /^develop-.*$/i
- /^release-.*$/i
- tags
develop_build_debug_for_aarch64_el9:
extends: .build_by_travis_for_aarch64_el9
variables:
TESTING_VERSION_BUILD: 1
BUILD_TYPE: Debug
# ASAN_OPTION: ADDRESS
PACKAGE: 1
PULP3_REPO_NAME: tfe-testing-aarch64.el9
PULP3_DIST_NAME: tfe-testing-aarch64.el9
artifacts:
name: "tfe-develop-$CI_COMMIT_REF_NAME-debug"
paths:
- build/*.rpm
only:
- /^develop-.*$/i
- /^release-.*$/i
develop_build_release_for_aarch64_el9:
extends: .build_by_travis_for_aarch64_el9
variables:
TESTING_VERSION_BUILD: 1
# ASAN_OPTION: ADDRESS
BUILD_TYPE: RelWithDebInfo
PACKAGE: 1
PULP3_REPO_NAME: tfe-testing-aarch64.el9
PULP3_DIST_NAME: tfe-testing-aarch64.el9
artifacts:
name: "tfe-develop-$CI_COMMIT_REF_NAME-release"
paths:
- build/*.rpm
only:
- /^develop-.*$/i
- /^release-.*$/i
release_build_debug_for_aarch64_el9:
variables:
BUILD_TYPE: Debug
PACKAGE: 1
PULP3_REPO_NAME: tfe-stable-aarch64.el9
PULP3_DIST_NAME: tfe-stable-aarch64.el9
extends: .build_by_travis_for_aarch64_el9
artifacts:
name: "tfe-install-$CI_COMMIT_REF_NAME-debug"
paths:
- build/*.rpm
only:
- tags
release_build_release_for_aarch64_el9:
variables:
BUILD_TYPE: RelWithDebInfo
PACKAGE: 1
PULP3_REPO_NAME: tfe-stable-aarch64.el9
PULP3_DIST_NAME: tfe-stable-aarch64.el9
extends: .build_by_travis_for_aarch64_el9
artifacts:
name: "tfe-install-$CI_COMMIT_REF_NAME-release"
paths:
- build/*.rpm
only:
- tags
###############################################################################
# compile for el8
###############################################################################
.build_by_travis_for_x86_64_el8:
stage: build
image: $BUILD_IMAGE_X86_64_EL8
extends: .build_before_script
script:
- dnf --enablerepo=powertools install -y libmnl-devel
@@ -32,12 +136,9 @@ stages:
tags:
- share
###############################################################################
# compile use image: build-env:rockylinux
###############################################################################
branch_build_debug_for_centos8:
extends: .build_by_travis_for_centos8
branch_build_debug_for_x86_64_el8:
extends: .build_by_travis_for_x86_64_el8
variables:
BUILD_TYPE: Debug
except:
@@ -45,20 +146,19 @@ branch_build_debug_for_centos8:
- /^release-.*$/i
- tags
branch_build_release_for_centos8:
branch_build_release_for_x86_64_el8:
variables:
BUILD_TYPE: RelWithDebInfo
extends: .build_by_travis_for_centos8
extends: .build_by_travis_for_x86_64_el8
except:
- /^develop-.*$/i
- /^release-.*$/i
- tags
develop_build_debug_for_centos8:
extends: .build_by_travis_for_centos8
develop_build_debug_for_x86_64_el8:
extends: .build_by_travis_for_x86_64_el8
variables:
TESTING_VERSION_BUILD: 1
#UPLOAD_SYMBOL_FILES: 1
BUILD_TYPE: Debug
# ASAN_OPTION: ADDRESS
PACKAGE: 1
@@ -72,11 +172,10 @@ develop_build_debug_for_centos8:
- /^develop-.*$/i
- /^release-.*$/i
develop_build_release_for_centos8:
extends: .build_by_travis_for_centos8
develop_build_release_for_x86_64_el8:
extends: .build_by_travis_for_x86_64_el8
variables:
TESTING_VERSION_BUILD: 1
#UPLOAD_SYMBOL_FILES: 1
# ASAN_OPTION: ADDRESS
BUILD_TYPE: RelWithDebInfo
PACKAGE: 1
@@ -90,14 +189,13 @@ develop_build_release_for_centos8:
- /^develop-.*$/i
- /^release-.*$/i
release_build_debug_for_centos8:
release_build_debug_for_x86_64_el8:
variables:
#UPLOAD_SYMBOL_FILES: 1
BUILD_TYPE: Debug
PACKAGE: 1
PULP3_REPO_NAME: tfe-stable-x86_64.el8
PULP3_DIST_NAME: tfe-stable-x86_64.el8
extends: .build_by_travis_for_centos8
extends: .build_by_travis_for_x86_64_el8
artifacts:
name: "tfe-install-$CI_COMMIT_REF_NAME-debug"
paths:
@@ -105,14 +203,13 @@ release_build_debug_for_centos8:
only:
- tags
release_build_release_for_centos8:
release_build_release_for_x86_64_el8:
variables:
BUILD_TYPE: RelWithDebInfo
#UPLOAD_SYMBOL_FILES: 1
PACKAGE: 1
PULP3_REPO_NAME: tfe-stable-x86_64.el8
PULP3_DIST_NAME: tfe-stable-x86_64.el8
extends: .build_by_travis_for_centos8
extends: .build_by_travis_for_x86_64_el8
artifacts:
name: "tfe-install-$CI_COMMIT_REF_NAME-release"
paths:

View File

@@ -10,7 +10,7 @@ set(CMAKE_CXX_STANDARD 11)
set(CMAKE_C_STANDARD 11)
if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mavx2")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
elseif (CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")

View File

@@ -55,11 +55,42 @@ struct bpf_obj_ctx *bpf_obj_load(const char *obj_file, uint32_t queue_num, uint3
bpf_config_set_hash_mode(&ctx->config, hash_mode);
bpf_config_set_debug_log(&ctx->config, debug_log);
#if (LIBBPF_MAJOR_VERSION > 0 || (LIBBPF_MAJOR_VERSION == 0 && LIBBPF_MINOR_VERSION >= 7))
struct bpf_program *prog;
ctx->prog_obj = bpf_object__open_file(ctx->obj_file, NULL);
if (ctx->prog_obj == NULL)
{
printf("ERROR: Unable to open bpf object %s, %s.\n", ctx->obj_file, strerror(errno));
goto error;
}
prog = bpf_object__find_program_by_name(ctx->prog_obj, "bpf_tun_rss_steering");
if (!prog)
{
printf("ERROR: Unable to get bpf program from object %s, %s.\n", ctx->obj_file, strerror(errno));
goto error;
}
bpf_program__set_type(prog, BPF_PROG_TYPE_SOCKET_FILTER);
if (bpf_object__load(ctx->prog_obj))
{
printf("ERROR: Unable to load bpf object %s, %s.\n", ctx->obj_file, strerror(errno));
goto error;
}
ctx->prog_fd = bpf_program__fd(prog);
if (ctx->prog_fd < 0)
{
printf("ERROR: Unable to get bpf program fd from object %s, %s.\n", ctx->obj_file, strerror(errno));
goto error;
}
#else
if (bpf_prog_load(ctx->obj_file, BPF_PROG_TYPE_SOCKET_FILTER, &ctx->prog_obj, &ctx->prog_fd) < 0)
{
printf("ERROR: Unable to load bpf object %s, %s.\n", ctx->obj_file, strerror(errno));
goto error;
}
#endif
if (bpf_config_update_map(&ctx->config, ctx->prog_obj) == -1)
{

View File

@@ -33,13 +33,19 @@ env | sort
: "${COMPILER_IS_GNUCXX:=OFF}"
# Install dependency from YUM
yum install -y mrzcpd-corei7-4.* numactl-devel zlib-devel librdkafka-devel-1.2.2.1218b3c-1.el8.x86_64 librdkafka-1.2.2.1218b3c-1.el8.x86_64 systemd-devel
yum install -y libcjson-devel libmaatframe-devel libMESA_field_stat2-devel libfieldstat4-devel libMESA_handle_logger-devel libelua-devel
yum install -y libMESA_htable-devel libMESA_prof_load-devel libwiredcfg-devel libWiredLB-devel sapp-devel libbreakpad_mini-devel
if [[ `arch` =~ 'x86_64' ]];then
yum install -y mrzcpd-corei7
elif [[ `arch` =~ 'aarch64' ]];then
yum install -y mrzcpd
fi
yum install -y numactl-devel zlib-devel librdkafka-devel librdkafka systemd-devel
yum install -y libcjson-devel libmaatframe-devel libfieldstat4-devel libMESA_handle_logger-devel libelua-devel
yum install -y libMESA_htable-devel libMESA_prof_load-devel sapp-devel libbreakpad_mini-devel
yum install -y libasan
yum install -y numactl-libs # required by mrzcpd
yum install -y libibverbs # required by mrzcpd
yum install -y libuuid-devel
yum install -y perl
if [ $ASAN_OPTION ];then
source /opt/rh/devtoolset-7/enable
@@ -62,11 +68,4 @@ if [ -n "${PACKAGE}" ]; then
make package
cp ~/rpm_upload_tools.py ./
python3 rpm_upload_tools.py ${PULP3_REPO_NAME} ${PULP3_DIST_NAME} *.rpm
fi
if [ -n "${UPLOAD_SYMBOL_FILES}" ]; then
rpm -i tfe*debuginfo*.rpm
ls -ahl /usr/lib/debug/opt/tsg/tfe/bin/
cp /usr/lib/debug/opt/tsg/tfe/bin/tfe*debug /tmp/tfe.debuginfo.${CI_COMMIT_SHORT_SHA}
sentry-cli upload-dif -t elf /tmp/tfe.debuginfo.${CI_COMMIT_SHORT_SHA}
fi
fi

View File

@@ -1,4 +0,0 @@
%systemd_post tfe-env.service tfe-env-tun-mode.service tfe.service
%sysctl_apply
%tmpfiles_create
/sbin/ldconfig

View File

@@ -1,4 +0,0 @@
%systemd_postun_with_restart tfe-env.service tfe-env-tun-mode.service tfe.service
%sysctl_apply
%tmpfiles_create
/sbin/ldconfig

View File

@@ -1,3 +0,0 @@
%systemd_preun tfe-env.service tfe-env-tun-mode.service tfe.service
%sysctl_apply
%tmpfiles_create

View File

@@ -25,8 +25,7 @@ target_link_libraries(tfe pthread dl nfnetlink
cjson
libcurl-static
hiredis-static
MESA_htable wiredcfg
MESA_field_stat
MESA_htable
fieldstat4
breakpad_mini
${SYSTEMD_LIBRARIES})

View File

@@ -12,4 +12,3 @@
#include <tfe_utils.h>
#include <MESA/MESA_handle_logger.h>
#include <MESA/MESA_prof_load.h>
#include <MESA/wired_cfg.h>

View File

@@ -3,7 +3,7 @@
static const char base64[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
static const char index_64[128] =
static const signed char index_64[128] =
{
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,

View File

@@ -43,13 +43,13 @@ enum _log_action
#define get_time_ms(tv) ((long long)(tv.tv_sec) * 1000 + (long long)(tv.tv_usec) / 1000)
#include "uuid_v4.h"
UUIDv4::UUIDGenerator<std::mt19937_64> uuidGenerator;
// #include "uuid_v4.h"
// UUIDv4::UUIDGenerator<std::mt19937_64> uuidGenerator;
void get_http_body_uuid(char *uuid)
{
UUIDv4::UUID uid = uuidGenerator.getUUID();
uid.str(uuid);
// UUIDv4::UUID uid = uuidGenerator.getUUID();
// uid.str(uuid);
return;
}

View File

@@ -2417,7 +2417,7 @@ static int http2_server_on_data_chunk_recv(nghttp2_session *session, uint8_t fla
if (req->h2_payload.encode_type != HTTP2_CONTENT_ENCODING_NONE){
ret = http2_decompress_stream(input, input_len, &uncompr, &uncompr_len,
&req->h2_payload.inflate, req->h2_payload.encode_type);
if (((ret == Z_STREAM_END) || (ret == Z_OK)) && uncompr > 0){
if (((ret == Z_STREAM_END) || (ret == Z_OK)) && uncompr_len > 0){
input = (const uint8_t*)uncompr;
input_len = uncompr_len;
}

62
vendor/CMakeLists.txt vendored
View File

@@ -3,10 +3,16 @@
include(ExternalProject)
### OpenSSL 1.1.1
if (CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64")
set(OPENSSL_COMPILE_ARCH linux-x86_64)
elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64")
set(OPENSSL_COMPILE_ARCH linux-aarch64)
endif()
ExternalProject_Add(OpenSSL PREFIX openssl
URL ${CMAKE_CURRENT_SOURCE_DIR}/openssl-1.1.1l.tar.gz
URL_MD5 ac0d4387f3ba0ad741b0580dd45f6ff3
CONFIGURE_COMMAND ./Configure enable-ssl3 enable-ssl3-method enable-weak-ssl-ciphers linux-x86_64 --prefix=<INSTALL_DIR> --openssldir=<INSTALL_DIR>/lib/ssl
CONFIGURE_COMMAND ./Configure enable-ssl3 enable-ssl3-method enable-weak-ssl-ciphers ${OPENSSL_COMPILE_ARCH} --prefix=<INSTALL_DIR> --openssldir=<INSTALL_DIR>/lib/ssl
enable-ec_nistp_64_gcc_128 no-shared
BUILD_COMMAND ${MAKE_COMMAND}
INSTALL_COMMAND make install_sw
@@ -122,8 +128,6 @@ set_property(TARGET gmock PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${INSTALL_DIR}/
set(MESA_FRAMEWORK_LIB_DIR /opt/MESA/lib)
set(MESA_FRAMEWORK_INCLUDE_DIR /opt/MESA/include)
set(MRZCPD_LIB_DIR /opt/tsg/mrzcpd/corei7/lib)
set(MRZCPD_INCLUDE_DIR /opt/tsg/mrzcpd/corei7/include)
add_library(MESA_handle_logger SHARED IMPORTED GLOBAL)
set_property(TARGET MESA_handle_logger PROPERTY IMPORTED_LOCATION ${MESA_FRAMEWORK_LIB_DIR}/libMESA_handle_logger.so)
@@ -133,38 +137,30 @@ add_library(MESA_prof_load SHARED IMPORTED GLOBAL)
set_property(TARGET MESA_prof_load PROPERTY IMPORTED_LOCATION ${MESA_FRAMEWORK_LIB_DIR}/libMESA_prof_load.so)
set_property(TARGET MESA_prof_load PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${MESA_FRAMEWORK_INCLUDE_DIR})
add_library(wiredcfg SHARED IMPORTED GLOBAL)
set_property(TARGET wiredcfg PROPERTY IMPORTED_LOCATION ${MESA_FRAMEWORK_LIB_DIR}/libwiredcfg.so)
set_property(TARGET wiredcfg PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${MESA_FRAMEWORK_INCLUDE_DIR})
add_library(MESA_htable SHARED IMPORTED GLOBAL)
set_property(TARGET MESA_htable PROPERTY IMPORTED_LOCATION ${MESA_FRAMEWORK_LIB_DIR}/libMESA_htable.so)
set_property(TARGET MESA_htable PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${MESA_FRAMEWORK_INCLUDE_DIR})
add_library(wiredLB SHARED IMPORTED GLOBAL)
set_property(TARGET wiredLB PROPERTY IMPORTED_LOCATION ${MESA_FRAMEWORK_LIB_DIR}/libWiredLB.so)
set_property(TARGET wiredLB PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${MESA_FRAMEWORK_INCLUDE_DIR})
add_library(maatframe SHARED IMPORTED GLOBAL)
set_property(TARGET maatframe PROPERTY IMPORTED_LOCATION ${MESA_FRAMEWORK_LIB_DIR}/libmaatframe.so)
set_property(TARGET maatframe PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${MESA_FRAMEWORK_INCLUDE_DIR})
add_library(MESA_field_stat SHARED IMPORTED GLOBAL)
set_property(TARGET MESA_field_stat PROPERTY IMPORTED_LOCATION ${MESA_FRAMEWORK_LIB_DIR}/libMESA_field_stat2.so)
set_property(TARGET MESA_field_stat PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${MESA_FRAMEWORK_INCLUDE_DIR})
add_library(fieldstat4 SHARED IMPORTED GLOBAL)
set_property(TARGET fieldstat4 PROPERTY IMPORTED_LOCATION ${MESA_FRAMEWORK_LIB_DIR}/libfieldstat4.so)
set_property(TARGET fieldstat4 PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${MESA_FRAMEWORK_INCLUDE_DIR})
add_library(rdkafka SHARED IMPORTED GLOBAL)
set_property(TARGET rdkafka PROPERTY IMPORTED_LOCATION ${MESA_FRAMEWORK_LIB_DIR}/librdkafka.so)
set_property(TARGET rdkafka PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${MESA_FRAMEWORK_INCLUDE_DIR}/MESA)
add_library(tsglua SHARED IMPORTED GLOBAL)
set_property(TARGET tsglua PROPERTY IMPORTED_LOCATION ${MESA_FRAMEWORK_LIB_DIR}/libelua.so)
set_property(TARGET tsglua PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${MESA_FRAMEWORK_INCLUDE_DIR})
# MRZCPD
if (CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64")
set(MRZCPD_LIB_DIR /opt/tsg/mrzcpd/corei7/lib)
set(MRZCPD_INCLUDE_DIR /opt/tsg/mrzcpd/corei7/include)
elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64")
set(MRZCPD_LIB_DIR /opt/tsg/mrzcpd/aarch64/lib)
set(MRZCPD_INCLUDE_DIR /opt/tsg/mrzcpd/aarch64/include)
endif()
add_library(mrzcpd SHARED IMPORTED GLOBAL)
set_property(TARGET mrzcpd PROPERTY IMPORTED_LOCATION ${MRZCPD_LIB_DIR}/libmarsio.so)
set_property(TARGET mrzcpd PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${MRZCPD_INCLUDE_DIR})
@@ -189,28 +185,16 @@ add_dependencies(cjson cJSON)
set_property(TARGET cjson PROPERTY IMPORTED_LOCATION ${INSTALL_DIR}/lib64/libcjson.a)
set_property(TARGET cjson PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${INSTALL_DIR}/include)
#### librdkafka
#ExternalProject_Add(librdkafka PREFIX librdkafka
# URL ${CMAKE_CURRENT_SOURCE_DIR}/librdkafka-0.11.5.tar.gz
# URL_MD5 90bb43499252317ae55723d32ccacf18
# CONFIGURE_COMMAND ./configure --prefix=<INSTALL_DIR>
# BUILD_IN_SOURCE 1)
#ExternalProject_Get_Property(librdkafka INSTALL_DIR)
#file(MAKE_DIRECTORY ${INSTALL_DIR}/include)
#
#add_library(librdkafka-static STATIC IMPORTED GLOBAL)
#add_dependencies(librdkafka-static librdkafka)
#set_property(TARGET librdkafka-static PROPERTY IMPORTED_LOCATION ${INSTALL_DIR}/lib/librdkafka.a)
#set_property(TARGET librdkafka-static PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${INSTALL_DIR}/include)
#set_property(TARGET librdkafka-static PROPERTY INTERFACE_LINK_LIBRARIES ssl crypto sasl2 m z dl pthread rt)
### ctemplate
if (CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64")
set(CTEMPLATE_COMPILE_ARCH x86_64)
elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64")
set(CTEMPLATE_COMPILE_ARCH arm)
endif()
ExternalProject_Add(ctemplate PREFIX ctemplate
URL ${CMAKE_CURRENT_SOURCE_DIR}/ctemplate-2.3.tar.gz
URL_MD5 3b91f3c1e7aa55cb4c2957acf77d6b9a
PATCH_COMMAND patch -p1 < ${CMAKE_CURRENT_LIST_DIR}/patch/compile_ctemplate_use_centos8_with_gcc7.patch
BUILD_COMMAND sh autogen.sh
CONFIGURE_COMMAND ./configure --prefix=<INSTALL_DIR>
URL ${CMAKE_CURRENT_SOURCE_DIR}/ctemplate-ctemplate-2.4.tar.gz
URL_MD5 4dae8e9d3329d20826a94dcc092ce65e
CONFIGURE_COMMAND sh autogen.sh && ./configure --prefix=<INSTALL_DIR> --build=${CTEMPLATE_COMPILE_ARCH}
BUILD_IN_SOURCE 1)
ExternalProject_Get_Property(ctemplate INSTALL_DIR)

Binary file not shown.

Binary file not shown.

BIN
vendor/ctemplate-ctemplate-2.4.tar.gz vendored Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.